Beispiel für Modbus TCP

Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuletzt bearbeitet:
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.
 
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.
 
Hallo zusammen

Versuche Zählerwerte über einen Modbusschnittstelle ein zulesen, leider erhalte ich irgendwie spezielle Werte, sieht jemand den fehler den ich hier mache?
Modbus1.jpgModbus2.jpgModbus3.PNG
 
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.
 
Zuletzt bearbeitet:
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
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.
 
Zuletzt bearbeitet:
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
 
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.




ModbusLC.PNG
ModbusLC1.jpg

ModbusTW.jpg


ModbusTW1.jpg
 
Zurück
Oben