TIA Modbus TCP mit verschiedenen Unit_IDs

risingStar

Level-2
Beiträge
22
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Community,
ich möchte mit einer S7-1212 Modbus Register auslesen. Dabei ist das Register vorerst gleich und nur die Unit_ID ändert sich. Zur Zeit kann ich das nur machen, wenn ich im InstanzDB des MB_Client die Unit_ID ändere, den Baustein neu lade und dann die Steuerung stoppe und wieder starte. Gibt es eine Möglichkeit, dass der Parameter Unit_ID an den MB_Client übergeben werden kann und dann das richtige Register ausgelesen wird?
Schönen heißen Nachmittag Friedrcih
 
Das sollte ohne Baustein laden und CPU-Stops gehen. Einfach direkt vor einem Kommunikationsauftrag die gewünschte Unit_ID in die Variable MB_Unit_ID im Instanz-DB schreiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort gestern. Leider fuktioniert das auch nicht so richtig. Der Modbus Client baut eine Verbindung auf (Status 7004). Bei der Umschaltung auf die erste MB_Unit_ID ist der Status 7004 und der Wert im Baustein 1 (ausgelesenes holding Register) ändert sich nicht. Nur bei der MB_Unit_ID 2 wird der MB Request true und der Status 0000. In den Datenbausteinen wird die MB_Unit_ID jeweils richtig gesetzt. Kann es sein, dass die Werte nicht in die Steuerung übernommen weren?
 

Anhänge

In den Datenbausteinen wird die MB_Unit_ID jeweils richtig gesetzt. Kann es sein, dass die Werte nicht in die Steuerung übernommen weren?
Nochmal:
Einfach direkt vor einem Kommunikationsauftrag die gewünschte Unit_ID in die Variable MB_Unit_ID im Instanz-DB schreiben.
z.B. im Programm mit MOVE oder in SCL "MB_CLIENT_DB".MB_Unit_ID := 2;

Falls du noch mehr Fragen hast, dann beantworte vorher:
Mit was für einem Modbus-Gerät kommunizierst du? Typ? Handbuch?
Mit welcher Programmiersprache programmierst du? KOP, FUP, SCL, ...?
Wie sieht dein Aufruf der MB_CLIENT-Instanz aus? Wie steuerst du den REQ? Zeige uns Bilder/Screenshots. Ich habe kein TIA V19, um dein Projekt zu öffnen.
 
Danke für die Die Modbusgeräte sind Siemens Stromzähler PAC 2200, welche über ein Weidmüller ModbusGateway ausgelesen werden (funktioniert, wenn die MB_ Unit_ID in den DB-Bausteinen überschrieben, neu geladen und Stop/Start betätigt werden). Das Modbusregister ist richtig und liefert die richtigen Daten. In weiterer Folge kommen noch Wärmemengenzähler von ista (Landis&Gyr) dazu.
Programmiersprache ist FUP

Ich hoffe, das hilft bei der Beurteilung weiter.

1751446892108.png
 

Anhänge

Zuviel Werbung?
-> Hier kostenlos registrieren
Machst du mehrere Modbus-Anfragen gleichzeitig und mit der selben MB_CLIENT-Instanz? Zumindest wegen dem Gateway zu mehreren ModbusRTU-Geräten (RS485?) geht das nicht. Die Aufträge müssen verriegelt/nacheinander abgearbeitet werden.
 
Ich wollte die Modbusanfragen der Reihe nach machen, durch Änderung der Unit_ID und neuerlichem Aufruf desMB Client. An einem Gateway hängen 4 PAC 2200. wahrscheinlich stelle ich mir das zu einfach vor.
Den Hinweis mit den Sentron Geräten muss ich noch durchlesen. Danke aber dafür.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

die Bibliothek solltest Du Dir auf jeden fall ansehen. Die Bausteine sind lesbar, so daß Du Dir dann Deine eigenen für die anderen Geräte danach erstellen kannst.

Ich vermute das Disconnect macht bei Dir Probleme. Da Du einen Flankenmerker verwendest, der nur einen Zyklus lang True ist, wird im nächsten Zyklus ModbusData.ClientData.request wieder zurückgesetzt und ModbusData.ClientData.disconnect gesetzt.

Gruß
 
Ich habe die Abfrage von mehreren ModbusRTU Geräten hinter einem ModbusTCP-zu-RTU-Gateway noch nicht selbst mit S7-CPU ausprobiert, ich stelle mir das aber so vor:
1) MB_CLIENT stellt eine Verbindung zu dem ModbusTCP-Server (das Gateway) her (mit Unit_ID = 1 bzw. einer existierenden Geräteadresse)
2) dann immer reihum die Modbus Geräte mit wechselnden Unit_ID abfragen (jeweils neuer REQ) PS: die Unit_ID wäre da einfach nur ein Auftragsparameter wie z.B. die Registernummer
Ich wüsste nicht, wo da ein Disconnect nötig wäre.

Als Gateway kann man auch das sehr preisgünstige USR-DR302 verwenden - dazu gibt es schon einige Themen hier im Forum, vielleicht wurde da auch auf das Thema Unit_ID eingegangen? (Forumsuche bemühen)
 
Zuletzt bearbeitet:
Ich habe die Abfrage von mehreren ModbusRTU Geräten hinter einem ModbusTCP-zu-RTU-Gateway noch nicht selbst mit S7-CPU ausprobiert, ich stelle mir das aber so vor:
1) MB_CLIENT stellt eine Verbindung zu dem ModbusTCP-Server (das Gateway) her (mit Unit_ID = 1 bzw. einer existierenden Geräteadresse)
2) dann immer reihum die Modbus Geräte mit wechselnden Unit_ID abfragen (jeweils neuer REQ) PS: die Unit_ID wäre da einfach nur ein Auftragsparameter wie z.B. die Registernummer
Ich wüsste nicht, wo da ein Disconnect nötig wäre.

Als Gateway kann man auch das sehr preisgünstige USR-DR302 verwenden - dazu gibt es schon einige Themen hier im Forum, vielleicht wurde da auch auf das Thema Unit_ID eingegangen? (Forumsuche bemühen)
Mit den Gateways gibt's verschiedene Varianten und Konfigurationen.
Manche können die Geräte IDs unabhängig (parallel) auf Modbus-TCP Seite handeln. Andere können nur einen Auftrag handeln.
Disconnect kenne ich auch nicht. Teilweise gibt es aber Timing-Probleme mit zu schnellen Abfragen. Für die Abfragen ist ne kleine Schrittkette ganz praktisch.
Ist etwas Try- und Error gefragt. Im Zweifelsfall Wireshark zur Analyse verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Modbusgeräte sind Siemens Stromzähler PAC 2200, welche über ein Weidmüller ModbusGateway ausgelesen werden
Gibt es von Weidmüller nur ein ModbusGateway oder meinst du dieses hier:
IE-CS-MBGW-2TX-1COM Art.-Nr. 2682600000
Ich finde in der Dokumentation nichts, was gegen meine Ablaufbeschreibung von Beitrag #10 spricht ("die Unit_ID wäre da einfach nur ein Auftragsparameter")
Beschrieben ist der Gateway-Modus im Handbuch in den Kapiteln
• A5) Sample application for service mode ‘Modbus TCP Master to Serial Slave Gateway’
• 4.14 Modbus TCP Master to Serial Slave Gateway

Zyklisch reihum nacheinander Abfragen mehrerer (z.B. nicht zusammenhängender) Modbus-Register und/oder mehrerer Modbus-Geräte (verschiedene Unit_ID) ist eine typische Anwendung für Job Listen und Schrittketten. (Forumsuche: modbus jobliste) Es gibt es auch fertiges für TIA:
Arbeite mit mehreren "Jobs" oder einer "Jobliste" mit der selben MB_CLIENT-Instanz, d.h. nachdem ein Leseauftrag für einen Bereich abgeschlossen ist, ändere alle Auftragsparameter für den nächsten Bereich. Ein Beispiel für eine Jobliste kannst du z.B. hier finden:
Add-On-Bausteine für die Modbus/TCP-Kommunikation
 
Es ist der Weidmüller IE-CS-MBGW-2TX-1COM und die Einstellung ist nach A5) Modbus TCO Master to Serial Gateway.
Das Problem lag m.M. nicht am Gateway, da ich im Gatewaymonitor sehe, welche Daten an das Gateway angefragt, von diesem an die MB_Unit weitergeleitet, wieder von der MB_Unit empfangen und an die S7 zurückgegeben werden.
Inzwischen habe ich das disconnect wieder entfernt und es funktioniert auf einmal.

Besonders interessant ist der Hinweis auf die Joblisten.
Vielen Dank an alle für die hilfreichen Hinweise.
Friedrich
 
Zuletzt bearbeitet:
Zurück
Oben