# Beispiel für Modbus TCP



## philipp00 (20 Januar 2020)

Hallo zusammen 

Hat evtl. jemand ein Beispiel wie ich mit einem Modbus TCP Gateway kommunizieren kann über die Beckhoff Steuerung.
Habe dies leider noch nie gemacht.


Gruss

Philipp


----------



## Hack (20 Januar 2020)

Hallo,

reicht dir das im Infosys nicht aus?
https://infosys.beckhoff.com/conten...bus_tcp/192789899.html?id=1203919387334921116

Gruß


----------



## Guga (20 Januar 2020)

Was für ein Typ von Gateway? Modbus TCP nach Modbus seriell? 
Vielleicht auch noch den Typ/Hersteller?
In meiner Glaskugel ist nämlich leider ein echter Schneesturm.

Guga


----------



## philipp00 (21 Januar 2020)

Hallo zusammen 

Ich habe einen Modbus Gateway von Phoenix RTU auf TCP, nun möchte ich diesen in meine Steuerung integrieren.

Hab mich mal mit der Anleitung versucht, dabei bin ich nun auf folgendes Problem gestossen.
 - Die Installation der Datei funktioniert nicht (siehe Foto)

Kennt jemand dieses Problem oder verstehe ich dies falsch?

Gruss

Philipp


----------



## philipp00 (21 Januar 2020)

Folgender Zusatz noch, wir verwenden folgende CX5130-0155


----------



## oliver.tonn (21 Januar 2020)

Was für ein OS ist drauf, WES oder WEC?

Nachtrag: Hab gerade gesehen, dass es WEC ist. Das dürfte nur der Installer sein und nicht die Anwendung und das geht dann nicht, weil unter WEC nur Installer als CAB-Datei ausgeführt werden kann.

Von irgendwas mit Internetzugang gesendet.


----------



## philipp00 (21 Januar 2020)

Dank für das schnelle Feedback, ich hab auch Ordner mit einem CAB File leider bin ich nicht im Stande diese auszuführen das einen Instalaltion beginnt.


----------



## Guga (21 Januar 2020)

Die *.cab-Datei ist der Installer für das CE-System.
Also die Datei auf das CE-System kopieren (egal wohin) und ausführen. Du wirst dann gefragt wo du es installieren willst (einfach OK drücken) und im Anschluss wird die *.cab Datei gelöscht. Noch einmal das Gerät neustarten und fertig.

Guga


----------



## philipp00 (22 Januar 2020)

Guten Morgen



Kann es sein das sich diese Datei nicht ausführen lässt. da ich folgendes Betriebssystem habe?
Wie muss ich hier vorgehen?


----------



## Hack (22 Januar 2020)

Unter Windows 10 musst du die EXE installieren, die CAB Datei funktioniert dort nicht.
https://infosys.beckhoff.com/conten.../54043195819892363.html?id=126075699784805213


----------



## philipp00 (22 Januar 2020)

Danke für dein Feedback, aber ich glaub ich muss mal kurz erklären wie ich vorgegangen bin.
Ich habe das File TF6250 zu erst auf meinem PC installiert und dann auf der CX.
Dabei habe ich folgende Ordner erhalten (siehe Foto) 

Jetzt kommt mein Problem, so wie ich die Anleitung versteheh muss ich nun aus diesen 3 Ordner das passende Installationsfile finden, nur leider lässt sich keins ausführen.

Hoffe das hilft etwas weiter um mein Problem zulösen.

Gruss

Philipp


----------



## MasterOhh (22 Januar 2020)

Wenn du den Server schon auf dem CX installiert hast dann reicht das. Die .CAB Dateien sind nur für die Installation auf Steuerungen mit CE als OS.
Auf der CX sollte im TwinCAT Verzeichnis der Ordner "Functions" existieren. In diesem Ordner müsste dann der Ordner "TF6250-Modbus-TCP" enthalten sein. Da drin unter Win32/Server ist die TcModbusSrv.exe, die TwinCAT nutzt.

Wenn das alles auf der CX vorhanden ist, kannst du den Server über die entsprechenden FBs der Modbus TCP Bibliothek verwenden. (Lizenz bzw. 7-Tage Testlizenz vorher aktivieren)


----------



## philipp00 (22 Januar 2020)

Dies ist bei mir vorhanden, dann wurde der Server schon richtig installiert und kann verwendet werden.


----------



## philipp00 (23 Januar 2020)

Hatt jemand einen Idee, wieso ich einen Errormeldung erhalte?


----------



## philipp00 (23 Januar 2020)

Anbei noch der Printscreen.


----------



## philipp00 (24 Januar 2020)

Hallo zusammen 

Ich bin wieder einen Schritt weiter, leider sind nun die nächsten Fehlermeldungen aufgetretten.
- 1861   Timoout  (Ich denke hier Antwortet der Modbusgateway nicht in der angegeben Zeit)
- 32779 Dieser Fehler kommt, wenn ich die Timeout Zeit auf 5s setze.


----------



## philipp00 (24 Januar 2020)

Hab noch weitere infos gefunden, die evtl. zur auflösung dienen, siehe fotos von der Gateway Diagnose.


----------



## MasterOhh (24 Januar 2020)

Den Fehler 32779 (0x800B) gibt es laut Dokumentation nicht...

Kann es evtl. sein, das die serielle Seite von deinem Gateway Probleme macht?
Evtl. musst du die richtige UnitID angeben, weil an dem seriellen Strang des Gateways theoretisch mehrere Geräte hängen könnten.


----------



## philipp00 (27 Januar 2020)

Bin wieder etwas weiter gekommen bei meinem Modbus Problem.
Leider stehe ich nun vor dem nächsten Fehler, wahrscheindlich eher ein Verständnisproblem. 
Untenstehend zwei Printscreens, vom Code, sowie vom Datenblatt des Klappenantrieb.


----------



## MasterOhh (27 Januar 2020)

Laut Fehlercode hat du einen TimeOut. Hast du mal versucht die TimeOut Zeit etwas zu erhöhen?


----------



## philipp00 (27 Januar 2020)

ja, da hat sich nichts verändert, der Funktionsbaustein verbindet sich mit dem Modbus Gerät und geht auf Fehler nach der eingestellten Zeit.
Daher vermute ich das etwas mit den Register nicht passt.


----------



## MasterOhh (27 Januar 2020)

Du fragst 2 Register ab Adresse 0 ab. Das sollte laut deinem Datenblatt der Setpoint[%] und Override Control sein. 

Mir ist gerade aufgefallen, dass du FB_MBUdpReadRegs verwendest. Hat das einen Grund? Kann dein Gateway über UDP kommunizieren?
Versuche es mal mit FB_MBReadRegs.


----------



## philipp00 (27 Januar 2020)

Danke für deinen Input, stimmt ich habe fälschlicherweise den falschen FB verwendet.

Leider hat sich nicht viel verändert ausser der Fehlercode. ;-)


----------



## MasterOhh (27 Januar 2020)

Ich weiß nicht ob das mit dem Fehler Code 1794 (Ungültige Index-Gruppe) zusammenhängt, aber du fragst 10 Register ab (10 WORD) und willst diese in ein Array schreiben, das 3 WORD groß ist.


----------



## philipp00 (27 Januar 2020)

Hallo MasterOhh 

Besten Dank für dein Feedback, du hastest recht.


----------



## philipp00 (28 Januar 2020)

Danke für euer Hilfe, der Klappenantrieb funktioniert nun, kann diesen schon mal manuel ansteuern.

Gruss

Philipp


----------



## philipp00 (3 Februar 2020)

Leider ist bei mir trotzdem wieder ein kleines Problem aufgetaucht, wo ich nicht weiter komme, evtl. sieht jemand das Problem


----------



## philipp00 (7 Februar 2020)

Hallo zusammen 

Kann sein das ichn ein Register Problem habe?


----------



## MasterOhh (7 Februar 2020)

Was meinst du mit Registerproblem?

3x Register sind idR analoge Input Register. Die ließt du mit ReadInputRegs aus.
3x0001 -> 3x9999  = 30001 -> 39999

Viele Hersteller adressieren aber auch wie sie gerade lustig sind. Ich habe hier eine Kompressorensteuerung, da fangen die Register bei 0001h an und zählen dann einfach hoch, egal was da für Werte drin stehen.


----------



## philipp00 (7 Februar 2020)

Hallo MasterOhh

Das versuche ich auch mit diesem FB, siehe oben im Beitrag.
Leider ist mir nicht ganz klar wieso ich dei Fehlermeldung 32779 erhalte, habe gedacht das es evtl. am Register liegt.


----------



## MasterOhh (7 Februar 2020)

Hast du mal die Registeradresse 30001 versucht? 
Die Fehlermeldung 32779 ist leider nicht dokumentiert (liegt im Bereich von "Interner Fehler"). Ruf einfach beim Beckhoff Support an, wenn du wissen willst das die Meldung bedeutet.


----------



## philipp00 (7 Februar 2020)

Leider funktioniert dies mit dem Register 30001 auch nicht.


----------



## philipp00 (17 Juni 2020)

Hallo zusammen 

Versuche Zählerwerte über einen Modbusschnittstelle ein zulesen, leider erhalte ich irgendwie spezielle Werte, sieht jemand den fehler den ich hier mache?


----------



## oliver.tonn (17 Juni 2020)

philipp00 schrieb:


> Versuche Zählerwerte über einen Modbusschnittstelle ein zulesen, leider erhalte ich irgendwie spezielle Werte, sieht jemand den fehler den ich hier mache?


Ja, Du übersiehst, dass alle Daten mehr als ein Register benötigen und Du, wenn Du nur ein einzelnes WORD betrachtest nicht unbedingt was sinnvolles erhälst, außerdem müssen die Werte noch geteilt werden. Bei Deinem Beispiel fließt auf L1 ca. 5A und es liegen ca. 239V gegen N an.


----------



## philipp00 (17 Juni 2020)

Danke für deinen Input, dan nehme ich an das ich den Datentyp des Arrdata auf DINT setzten muss, jedoch sehe ich noch nicht ganz wie du auf die 239V kommst?


----------



## oliver.tonn (17 Juni 2020)

philipp00 schrieb:


> Danke für deinen Input, dan nehme ich an das ich den Datentyp des Arrdata auf DINT setzten muss, jedoch sehe ich noch nicht ganz wie du auf die 239V kommst?


Ganz so einfach wird das nicht. Die Register 0/1 - 12/13 sind UDINT, 14/15 - 30/31 DINT und der Rest LINT.
Zur Berechnung, in Register 0 steht 3 und in 1 steht 42011. 3 * 65536 (2^16) ergibt 196608 + 42011 ergibt 238.619 geteilt durch 1000 = ca. 238V.


----------



## philipp00 (17 Juni 2020)

Stimmt das mit den veschiednen Integer habe ich übersehen, kann so einfach nur blockweise die Register auslesen?
Zu deiner Berechnung möchte ich mich noch kurs absichern, ob ich das richtig verstehen.
Das erste Register zählt die Anzahl der Überläufe, sprich in diesem Beispiel 3x. Das zweite Register zeit den Restwert an und zu guter letzt muss der Wert durch den angegeben Teiler geteilt werden.
Verstehe ich das richtig?

Gruss

Philipp


----------



## oliver.tonn (17 Juni 2020)

philipp00 schrieb:


> Stimmt das mit den veschiednen Integer habe ich übersehen, kann so einfach nur blockweise die Register auslesen?



Du kannst Sie schon auf einmal auslesen in ein WORD-Array, damit da dann aber sinnvolle Zahlen draus werden müsstest Du Sie anschließend umkopieren. Soweit Du TwinCAT 3 einsetzt könntest Du dir auch eine Struktur mit den Variablen erstellen, gleiche Werte (z.B. Spannung L1 - L3 gegen N) auch als Array und dieses dann als Ziel angeben. Bei der Erstellung der Struktur musst Du nur darauf achten, dass Du über ein Pragma das Alignment auf 1 Byte setzt, damit keine Lücken zwischen den einzelnen Elementen entstehen.​


philipp00 schrieb:


> Zu deiner Berechnung möchte ich mich noch kurs absichern, ob ich das richtig verstehen.
> Das erste Register zählt die Anzahl der Überläufe, sprich in diesem Beispiel 3x. Das zweite Register zeit den Restwert an und zu guter letzt muss der Wert durch den angegeben Teiler geteilt werden.
> Verstehe ich das richtig?


Naja, Überlauf würde ich es jetzt nicht nennen. Der Wert der Übertragen wird ist ein UDINT hat also 32 Bit, die Du auf zwei WORD zu je 16 Bit aufteilst. Damit da wieder der richtige Wert in einer Variable vom Typ UDINT draus wird musst Du das höherwertige Word in die Variable packen und dann entweder mit 65536 multiplizieren oder die Bits um 16 Bit nach links schieben, anschließend das niederwertige Word dazu addieren.
Bei Werten mit Vorzeichen wird das noch etwas komplizierter, weil je nach Byteorder (Little Endian, Big Endian) die Daten Byteweise erst zusammengestückelt werden müssten.


----------



## philipp00 (17 Juni 2020)

Das mit der Struktur hört sich spannend an, da diese Funktion sich wiederholen wird. Leider habe deine Erklärung noch nicht ganz verstanden, aber werde mich mal damit beschäftigen und ansonsten gerne wieder melden.

Gruss

Philipp


----------



## philipp00 (15 Januar 2021)

Hallo zusammen 

Ich hab ein kleines Problem mit meiner Modbus TCP verbidung zwischen CX (Beckhoff) und meinem Ladecontroller.
Beim Aufruf erhalte ich folgende Fehlermeldeung 32770, dies wird als Socket-Handle ist ungültig (bei FB_SocketReceive, FB_SocketAccept, FB_SocketSend etc.) bezeichnet, kann es sein das ich Probleme mit dem modbus TCP Server habe.


----------



## Thruser (15 Januar 2021)

Hallo,

kenne mich mit Beckhoff nicht aus, aber wenn ich das her lese: https://infosys.beckhoff.com/englis...bussrv/html/TcModbusSrv_FB_MBReadRegs.htm&id= dann ist der Fehlercode 32770 = 0x8002 -          Invalid address or length

In Deiner Tabelle wird von Input gesprochen, Du liest hier aber Holding Registers (FC 03). Versuch es mal mit dem FUNCTION_BLOCK FB_MBReadInputRegs (Modbus function 4)

Gruß


----------



## philipp00 (27 Januar 2021)

Evtl. hat jemand eine Idee wie ich mit folgendem Wert (siehe Foto) auf ca. 230V komme.


----------



## philipp00 (27 Januar 2021)

Sprich es geht um das erste und zweite Register.


----------



## holgermaik (27 Januar 2021)

wie in #36 bereits beschrieben oder einfacher mit einer Union.
wäre 236,786 V


----------



## philipp00 (28 Januar 2021)

Stimmt das Thema hatten wir schon einmal, aber was mir nicht ganz klar ist wieso 65535 im Datenblatt ist angegeben das es sich um ein UInt32 handelt und nicht Uint16.


----------

