Modbus TCP - adhoc-Verbindungsaufbau

Hallo Admins,

Modbus wird in der Industrie für die Echtzeit-Kommunikation zwischen Steuerungen und Peripherie eingesetzt. Hier ist das übliche und auch in Symcon implementierte Verhalten gut einsetzbar.

  • Verbindung öffnen und offen halten
  • Daten austauschen.

In Symcon wollen wir Daten in größeren Zykluszeiten (einige Sekunden bis mehrere Minuten) erfassen, ohne dass es für diese Objekte direkte Echtzeitforderungen gibt. Hier ist es vorteilhaft, wenn eine Verbindung erst bei Datenanforderung geöffnet und nach erfolgtem Lesen wieder geschlossen würde. Dies verbessert die Stabilität bei Unterbrechungen bzw. Timeouts der Slaves.

  • Verbindung öffnen
  • Daten austauschen
  • Verbindung schließen

Kann eine Option in der I/O-Instanz (oder Splitter-Instanz) eingeführt werden, die nach einer einstellbaren Zeit die Verbindung zum Partner schließt, ohne nach innen eine Störung zu melden. Bei einer neuen Anforderung durch ein Objekt öffnet die Instanz wieder die Verbindung nach außen und lässt den Abfrage passieren.

Vielleicht ist dies auch durch eine „Auto-Reconnect“-Funktion oder ähnlich möglich?

Es ist klar, dass dies das Timing wesentlich verschlechtert, wenn es aktiviert ist. Deshalb sollte es auch eine abschaltbare Option sein.
Bei Kommunikation in Minutenabständen ist die Zeitverzögerung aber nicht entscheidend.

Bei Modbus-RTU spielt dies Problem in meinen Augen keine Rolle.

Danke.

Andreas Treutler

Wir werden diese Funktion nicht einbauen, da dies nicht in das aktuelle Konzept der „offenen Verbindungen“ passt. Aber das hast du ja schon richtig erkannt und dir bestimmt schon gedacht.

Aber: Du kannst aber deine Anforderung selber realisieren. Dadurch hast du zwei Vorteile:

a) Du steuerst genau, wann der Socket geöffnet/geschlossen wird
b) Du steuerst genau, wann etwas abgefragt wird und kannst auf Fehler direkt reagieren.

Lösung:


//Öffnen
IPS_SetProperty($id_vom_socket, "Open", true);
IPS_ApplyChanges($id_vom_socket);

//Abfragen
ModBus_RequestStatus($id_der_instanz1);
ModBus_RequestStatus($id_der_instanz2);
ModBus_RequestStatus($id_der_instanz3);
ModBus_RequestStatus($id_der_instanz4);

...

//Schließen
IPS_SetProperty($id_vom_socket, "Open", false);
IPS_ApplyChanges($id_vom_socket);

paresy

Hallo paresy,

danke für das Script. Habe ich nun getestet.
Dazu habe ich vier Fragen:

  • ModBus_RequestStatus() muss sicher ModBus_RequestRead() heißen. OK

  • Welchen Wert trage ich in so einem Fall bei den zu lesenden Instanzen im Feld „Intervall“ ein?
    Ich habe den besten Erfolg mit 0 und gehe davon aus, dass bei 0 nicht aktualisiert wird!?

  • Im Meldungs-Journal werden mal mehr, mal weniger Einträge des „VariableManager“ angezeigt und der Rest verschluckt.
    Bug or Feature?
    Kann ich davon ausgehen, dass trotzdem gelesen wird?

  • Sollte ich im Script Wartezeiten einbauen „sleep(x)“ oder while-loop, um Abhängigkeiten zu sichern?

Danke.

Andreas Treutler

p.s. Vielleicht ist ein auto-reconnect doch noch in einer späteren Version drin.
Die Hoffnung stirbt zuletzt. :slight_smile:

  1. Natürlich :slight_smile:
  2. 0 ist auch korrekt, da du ja manuell per Skript abfragst.
  3. Nur Änderungen sind im Log sichtbar. Wenn sich nichts ändert, steht somit auch nichts im Log.
  4. Das ist nicht notwendig.

paresy