TIA MB_Client Lesen verschidener UnitIDs vom gleichen Server

wirehead

Level-2
Beiträge
72
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe Probleme mit MB_Client (V5.2 S7-1500).
Ich will Holding Register von einem Modbus Gateway (Victron GX Device) lesen, das Gateway stellt unter verschiedenen Unit IDs Holdingregister mit gleicher Adresse und Konfiguration zusammen. Ich stelle zum Server ein Verbindung her mit DISCONNECT=false, setze über MB_Unit_ID im Instanz DB die Unit ID von der ich lesen will und Starte mit REQ die Leseanfrage zu den Registern meiner Wahl. Um von der nächsten Unit_ID zu lesen warte ich auf "DONE" vom vorangegangenen Baustein, änder die MB_Unit_ID und starte wieder die Kommunikation mit REQ.

Bei UnitIDs mit Gleicher Holdingregister und Adressdaten kommt es nun dazu das der die Daten mal in den einen Puffer, mal in den anderen gelesen werden. Mein eindruck ist das es nicht ausreicht die Unit_ID vor dem Aufruf zu setzen und das es nur Glücksache ist ob die dann im Bausteinaufruf übernommen wird oder nicht.
Am Server hab ich dann Fehlermeldungen das z.B. In der UnitID XXX keine Register unter der angeforderten Adresse lesbar sind. Wenn die Adress und Registerkonfiguration aber bei mehreren gleichen Geräten auch gleich ist unterscheidet sich der Aufruf von MB_Client nur durch die geänderte MB_Unit_ID und dann entsteht auch kein Fehler im Server da die Register mit der gleichen Konfiguration bei mehreren Geräten verfügbar sind. Die Daten werden dann ohne Fehler in den falschen Puffer geschrieben. Das seh ich dann unter beobachten wenn die gelesenen Temperaturen zwichen zwei werten hin und her flackern.

Ich habe keine Dokumentation zu dem Verhalten von MB_Client gefunden wenn es um das ändern der UnitID geht, dabei ist das bei ModbusTCP Gateways generell ein essenzielles Ding.
Hat da schon jemand Erfahrung gesammelt??


Gruß
Torsten
 
Ich habe keine Erfahrung mit dem MB_Client von TIA. Doch für mich klingt das wie ein Bug. Was sagt denn der Siemens Support dazu?
Zwischen DONE/ERROR und dem nächsten REQ muß man die UnitID wechseln können. Vielleicht hat Siemens die UnitID versteckt, weil der Wechsel nicht funktioniert? ;)
Als Workaround könntest Du mal testen, ob es besser funktioniert, wenn Du bei jedem Wechsel der UnitID die Verbindung die Verbindung abbaust und wieder aufbaust.
Oder kann man mit mehreren Instanzen des MB_Client auf der selben Verbindung arbeiten?

Welche TIA-Version verwendest Du?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe das mit dem Umschalten schon etliche Male gemacht, z.B. wenn man ein Janitza Messgerät mit Modbus-TCP als Gateway zu unterlagerten RTU-Geräten verwendet. Zwischen dem Umschalten der Parameter für den MB_Client, habe ich aber immer einen Leerschritt nach DONE, wo der MB_CLient mit REQ=false aufgerufen wird. Dann setze ich die neuen Parameter und setze REQ=true. Allerdings habe ich an MB_DATA_PTR auch immer das gleiche Array, in der Schrittkette kopiere ich die Daten dann mit Fertigmeldung an die eigentliche Zieladresse.
 
Als Workaround könntest Du mal testen, ob es besser funktioniert, wenn Du bei jedem Wechsel der UnitID die Verbindung die Verbindung abbaust und wieder aufbaust.
Oder kann man mit mehreren Instanzen des MB_Client auf der selben Verbindung arbeiten?
Die Verbindung neu aufbauen wollte ich als nächstes probieren. Wäre aber eher die Notlösung.
Mit mehreren Instanzen auf eine IP Adresse zugreifen geht leider nicht.

Ich habe das mit dem Umschalten schon etliche Male gemacht, z.B. wenn man ein Janitza Messgerät mit Modbus-TCP als Gateway zu unterlagerten RTU-Geräten verwendet. Zwischen dem Umschalten der Parameter für den MB_Client, habe ich aber immer einen Leerschritt nach DONE, wo der MB_CLient mit REQ=false aufgerufen wird. Dann setze ich die neuen Parameter und setze REQ=true. Allerdings habe ich an MB_DATA_PTR auch immer das gleiche Array, in der Schrittkette kopiere ich die Daten dann mit Fertigmeldung an die eigentliche Zieladresse.
Das gibt mir Hoffnung, werde ich mal so umbauen und berichten.
Kommst du da klar ohne DISCONNECT= true dazwichen?

Gruß
Torsten
 
Das gibt mir Hoffnung, werde ich mal so umbauen und berichten.
Kommst du da klar ohne DISCONNECT= true dazwichen?
Ein disconnect habe ich noch nie benötigt. Wenn ich mich richtig erinnere ist der Aufruf ohne REQ nach dem DONE wichtig. Aber wie gesagt, die Beschaltung von DATA_PTR habe ich noch nie gewechselt Ich habe außerhalb einer Schrittkette einen einzigen MB_Client Aufruf, der jeden Zyklus aufgerufen wird. Nur die Parameter schalte ich entsprechend um, bis auf den DATA_PTR.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein disconnect habe ich noch nie benötigt. Wenn ich mich richtig erinnere ist der Aufruf ohne REQ nach dem DONE wichtig. Aber wie gesagt, die Beschaltung von DATA_PTR habe ich noch nie gewechselt Ich habe außerhalb einer Schrittkette einen einzigen MB_Client Aufruf, der jeden Zyklus aufgerufen wird. Nur die Parameter schalte ich entsprechend um, bis auf den DATA_PTR.
Hab ich auch schon so gelöst.
  1. Parameter versorgen
  2. 50ms Warten
  3. Req
  4. Warten auf Signalwechsel Done
  5. Daten in die Zieldaten übertragen
  6. Wartezeit
  7. -> 1
Timeout für Done und Fehlerhandling natürlich nicht vergessen.

Modbus ist so ziemlich das einfachste Protokoll, aber fast jeder implementiert es anders.
Gerade bei Wechselrichtern, PV-Speichern und ähnlichem gibt es tolle "Effekte".
Bis hin zum Reset weil man Parameter zu schnell abfragt. Lieber gemütlich alle 10s abfragen und dann schneller werden.
 
Hab das jetzt auch mal so aufgebaut das ich nur einen einzigen Aufruf vom MB_Client haben und nach jedem Parameterwechsel einen Zyklus warte bis ich REQ setze. Das läuft gut und schnell und alle Daten sind jetzt da wo sie sein sollen.
DATA_PTR lass ich auf ein Array zeigen das über verschiedene Struct AT Sichten mit MOVE in die Zielstruktur kopiert wird.
Ist mir noch ein wenig suspekt das mit AT Sichten zu machen, aber ich hab auch keine andere überzeugende Lösung gefunden.

Vielen dank für die Hilfe!

Gruß
Torsten
 
Zuletzt bearbeitet:
DATA_PTR lass ich auf ein Array zeigen das über verschiedene Struct AT Sichten mit MOVE in die Zielstruktur kopiert wird.
Ist mir noch ein wenig suspekt das mit AT Sichten zu machen, aber ich hab auch keine andere überzeugende Lösung gefunden.
Ist doch ok.
So ist strukturiert und nachvollziehbar.
 
Zurück
Oben