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
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;
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.
Ü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)
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.
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.
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
Fast Perfekt.
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?
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:
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
$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