Verbesserte ModBus Anbindung (IP-Symcon 7.0)

Ich hoffe das ist die Richtige Kategorie. Ausgangsituation S7-300/Anybus Gateway PB-DP auf Modbus TCP:

Warum sind bei mir die Adressbereiche verschoben. Dachte zuerst ich habe eine fehlerhafte Konfig im Symcon erstellt. Aber als ich das zweite Register beschrieb tauchte der Wert an der ersten Registeradresse auf (blau). Im Schneider Modbus Tester funktioniert Anzeige über Register 1

dürfte daher kommen, dass in Symcon mit adresse 0 gestartet werden kann

Das ist herstellerspezifisch und es wird auch in der Doku darauf hingewiesen.

Zu beachten gilt noch, dass die virtuellen Variabeln wohl nicht aktualisiert werden, wenn man bei Intervall 0 einstellt…
Grüsse Martin

Hallo.

Ich erstelle grade eine Modbus-Vorlage für einen Deye Sun-8k-sg04lp3 die ich auch später dann gerne bereitstelle.

Dazu eine Frage in Sachen „offset“:
Ich bekomme einen -Temperatur- Wert „1385“ zurück.
Das passt soweit auch. Denn die Temp ist 38,5 Grad.

Wie kann ich das via Modbus Modul so bereitstellen, dass es dann auch 38,5 Grad werden in der Variable?

Oder muss ich dies via eigenem Skript mit zusätzlichen Variablen selbst erzeugen?

Vielen Dank und viele Grüße

Steve

Du kannst dafür die virtuellen Adressen nutzen. D.h. du liest den Rohwert ein und nimmst in der virtuellen Adresse dann den Wert und die Formel return ($VALUES["...."] - 1000) / 10;

paresy

Super. Danke. Perfekt!

Hab dazu auch eine kleine Doku von dir gefunden. :slight_smile:

Ich füge mal den Link dazu hier ein.

Virtuelle Adressen

Hallo Zusammen.

Ich habe irgendwie Probleme mit dem Modbus Modul. Ich habe alle Adressen eingetragen die ich Abfragen möchte. Das sind insgesamt 42 Stück.
Zusätzlich 3 virtuelle Adressen.
Sind alle aktiviert, bekomme ich stetig Abbrüche mit TimeOuts. Manche Werte werden aber auch anscheinend gar nicht, oder erst nach erneuten Änderungen in der Instanz-Liste abgefragt.
Aktiviere ich nur 10 Stück funktioniert es meistens. Aber auch nicht immer konstant.

Ich habe zusätzlich das (Beta) Modul von ThomasW69 installiert:
GitHub - ThomasW69/IPSymcom-Deye_Inverter

Über dieses Modul erfolgt eine reibungslose Abfrage ohne Timeouts.
Beide Varianten nutzen das gleiche Gateway. (Modbus RTU - USB Dongle)
Zu dem ist immer nur eine der beiden Modbus-Instanzen aktiv. (Intervall = 0 ms)

Ich kann den Fehler leider nicht finden und hoffe auf Unterstützung von euch.

Vielen Dank vorab.

Steve

Hi Steve,

hast du im Splitter mal versucht die Delays höher zu stellen. Vielleicht sind die 10ms zu gering für dein Gerät.

paresy

Hallo Paresy.

Beide Instanzen nutzen den gleichen Splitter.
Steht derzeit auf 20ms.

Mit 30ms hab ich es auch schon probiert. Brachte leider keinen Erfolg.

Gruß Steve

Da kann ich mich anschließen. Habe ständig Fehlermeldungen bezüglich TimerPool mit meiner Kostal Plenticore - Modbus-Anbindung. Mit dem Delay habe ich ebenfalls kein Erfolg gehabt. Habe aktuell 50ms eingestellt. Aber auch mit deutlich höheren Werten wird es nicht besser. Grundsätzlich würde mich das gar nicht stören, wenn hin und wieder mal ein Wert verloren geht. Aber dann sollten nicht ständig rote Fehlermeldungen die Statusliste fluten.
@paresy Wäre schön, wenn du da eine Verbesserung hinbekommst.

Grüße
Jürgen

Anbei mal Beispiel-Fehlermeldungen aus dem Debug der Schnittstelle und Meldungslog.

Vielleicht fällt jemandem dazu etwas ein.

@Silberstreifen : Benutzt du auch einen USB Adapter?

Ich habe mir jetzt mal einen Waveshare RS485 to Ethernet Converter bestellt und will es damit mal testen.

Frage mich allerdings, wo der Unterscheid bei der Abfrage zwischen dem Modul von ThomasW69 und der neuen „Modbus Schnittstelle“ in V7 liegt. Denn wie gesagt, damit geht es.

@Silberstreifen Der @KaiS hat sehr viel Werbung gemacht, dass wir eine Checkbox einbauen, die Fehlermeldungen unterdrückt. Ich denke dass dies zur 7.1 kommen wird.

@nsrracer Hast du mal die Blockabfrage probiert?

paresy

3 „Gefällt mir“

nein, bei mir läuft das über TCP.

@paresy danke!!!

Grüße,
Kai

Danke an dich!
Das ist ein Punkt, der mich schon seit längerem nervt.
@paresy Bin gespannt auf die Umsetzung, denn wesentliche Fehlermeldungen sollen ja nicht unterdrückt werden, sondern nur so Dinge wie: Ich habe einen Wert verloren.
Grüße
Jürgen

Hallo Paresy.

Fast Perfekt. :slight_smile:
Die Blockabfrage funktioniert wunderbar. Alle Werte kommen nach ein paar Sekunden an.
Im Log gibt es nur noch ab und an den Fehler der Zeitüberschreitung.

Aber wie mache ich das mit den 5 Werten die ich auch beschreiben möchte?
Zu dem funktionieren die Virtuellen Adressen leider nicht.
Muss ich diese Werte dann in eine extra Instanz packen? Oder können die raus aus der Blockabfrage und in der Instanz dann das Zeitlimit wieder auf einen Wert für eine Abfrage setzen?

Viele Grüße…

Ich brauche mal eure Hilfe bei den Virtuellen Adressen und dem Script zum schreiben.

Folgende Situation:

In einem Modbus Register werden zwei Temperaturwerte (Zone 1 und Zone 2) als Hexwert ausgelesen. Diese beiden Werte schreibe ich in zwei Virtuelle Adressen:

Lesecode für Virtuelle Adresse (Zone 1)

$wert = $VALUES["A_2_3_2"];
$hex = dechex($wert);
$zone1 = substr($hex,2);
$zone1 = hexdec($zone1);
return $zone1;

Lesecode für Virtuelle Adresse (Zone 2)

$wert = $VALUES["A_2_3_2"];
$hex = dechex($wert);
$zone2 = substr($hex, -4, 2); 
$zone2 = hexdec($zone2);
return $zone2;

Jetzt muss der ganze Kram beim ändern einer der Virtuellen Adressen natürlich auch geschrieben werden. Ich habe folgendes versucht:

$zone1 = $VALUES["Soll_Vorlauftemperatur_Zone_1"]; //Ident der Virtuellen Adresse Zone 1
$zone2 = $VALUES["Soll_Vorlauftemperatur_Zone_2"]; //Ident der Virtuellen Adresse Zone 2
$zone1 = dechex($zone1);
$zone2 = dechex($zone2);
$hex = $zone2. $zone1;
$dec = hexdec($hex);

return[
    "A_2_3_2" => $dec
    ];

Ich erhalte aber nur folgende Fehlermeldung wenn ich über Befehl Testen den Wert z.B. von Zone 1 ändere:

Warning: Soll-Vorlauftemperatur Zone 1: Fehler beim Ausführen vom Schreibskript. Ergebnis: 
Warning: Undefined variable $VALUES in /- on line 4

Warning: Trying to access array offset on value of type null in /- on line 4

Warning: Undefined variable $VALUES in /- on line 5

Warning: Trying to access array offset on value of type null in /- on line 5
{"A_2_3_2":0}, Fehler: [json.exception.parse_error.101] parse error at line 2, column 1: syntax error while parsing value - invalid literal; last read: '<U+000A>W' in /- on line 1

Wo liegt mein Denkfehler?

Viele Grüße
Stephan

$VALUES ist nur beim Lesen gesetzt.

Beim Schreiben holst du dir den Wert mit GetValues. So meine Vermutung.

$VALUE (ohne s) enthält den Wert der Aktion der Virtuellen Variable.
Das wäre bei dir entweder der Wert aus Virtuelle Adresse 1 oder 2.
Den anderen Wert kannst du nur mit GetValue +GetObjektByIdent.

Du willst ja im Endeffekt bei Änderung einer Variablen dessen neuen Wert (Value) mit dem anderen aktuellen Werte kombinieren und dann wieder an eine echte Adresse senden.

Jein, siehe Beitrag 1 das Beispiel zum Schreiben.
VALUES enthält die Werte aller echten Variablen beim lesen.
VALUE (ohne s) den neuen Wert beim Schreiben.
Muss auch so sein, weil GetValue liefert den alten Wert und nicht den gewünschten Wert der Schaltaktion.
Michael