Modbus RTU & Variablenaktualisierung

Hallo Zusammen,

ich betreibe Modbus RTU über einen USB/RS485 Adapter. Da ich Probleme habe mit Timeouts von Scripten, die Manuell die Instanzen für einen Lesevorgang Triggern, suche ich gerade den Fehler. Dabei lese ich zum Testen sekündlich eine einzige Instanz/Variable aus (Die anderen Instanzen der Geräte habe ich testweise deaktiviert - durch ein sehr langes Auslese-Intervall).
Dabei fällt mir auf dass, wenn ein Wert reinkommt der identisch ist zum Inhalt der Variable im IPS, dann wird die Variable nicht aktualisiert, bzw. nur sporadisch aktualisiert, ca. pro 2 Minuten ungefähr 1x. Dies sehe ich an der Aktualisierungs-Uhrzeit im Objektbaum. Die Werte kann ich im Debug-Modus in der Schnittstelle und im Cutter sekündlich sehen. Diese passen auch, habe ich mit dem Hex-Rechner nachgerechnet.
Die Frage hier ist: Bug oder Feature?
Frage am Rande: Kann man das Automatische Auslesen bei einer ModBus-RTU Instanz richtig deaktivieren? Das Ausleseintervall hochzustellen auf 9999999ms gefällt mir nicht…

Gruß
Bikasso

Moin!

Ob es in diesem Fall Absicht ist, dass die Variable nur aktualisiert wird wenn der Wert sich ändert, kann ich dir nicht sagen. Aber es ist besser so!

Wenn ich Skripte/Module mache, sehe ich zu, dass Variablen nur geändert/geschrieben werden, wenn der Wert sich ändert. Spart „Schreibvorgänge“ und Log-Einträge.

Von daher würde ich sagen > Feature :slight_smile:

Grüße,
Chris

0 ist aus.

Und wir schreiben bei keiner Änderung nur 1x pro Minute den gleichen Wert als „KeepAlive“ in die Variable.

paresy

Hallo,
danke für die Antworten, hat mir sehr weitergeholfen.
Ich habe nun nach einiger Zeit auch den „Fehler“ gefunden. Ich hatte sporadische Timeouts bei Scripten die Mod-Bus-RTU Geräte auslesen (2 Geräte auf einem Bus). NallChan hatte mich vor einiger Zeit drauf hingewiesen dass IPS mit 2 Geräte an einem Strang Probleme hat. Ich konnte ihm anfangs nicht zustimmen, da es bei mir scheinbar einwandfrei funktionierte. Bei genauerem Hinsehen hab ich dann doch bemerkt dass etwas „im Busch“ ist, und Handlungsbedarf besteht. Ich frage auf das damalige Anraten von NallChan mit einem Script alle Instanzen aller Geräte nacheinander ab, um gleichzeitige Abfragen auf dem Bus zu vermeiden. Leider ergab dies auch Timeouts. Ich hatte anfangs die Hardware unter Verdacht, die ich auch ausgetauscht habe, aber es liegt an IPS selbst:
Ich habe nun rausgefunden dass wenn ich im Script zuerst eine Instanz von Adresse 1 und danach eine Instanz von Adresse 2 abfrage gibt’s einen Timeout. Wenn ich mit allerdings mit usleep 100ms zwischen den Abfragen warte funktioniert alles einwandfrei.
Jetzt weiß ich wie ich es anpacken muss dass ich gescheite Werte bekomme, das sieht jetzt für mich aber nach einem Bug aus…

Hier noch mein Code (ohne die Zeile „usleep(100000);“ funktioniert er nicht):

ModBus_RequestRead(44083 /*[Energie\Wechselrichter\Rohdaten\WR1 Leistung Skalierungsfaktor]*/);
$PotenzVorher = GetValue(55417 /*[Energie\Wechselrichter\Rohdaten\WR1 Leistung Skalierungsfaktor\Value]*/   );
ModBus_RequestRead(30469 /*[Energie\Wechselrichter\Rohdaten\WR1 Leistung]*/);
$Wert_Original = GetValue(54417 /*[Energie\Wechselrichter\Rohdaten\WR1 Leistung\Value]*/  );
ModBus_RequestRead(44083 /*[Energie\Wechselrichter\Rohdaten\WR1 Leistung Skalierungsfaktor]*/);
$PotenzNachher = GetValue(55417 /*[Energie\Wechselrichter\Rohdaten\WR1 Leistung Skalierungsfaktor\Value]*/   );

$Wert_Neu_WR1 = 0;
if ($Wert_Original == 0 ){
   SetValue (45860 /*[Energie\Wechselrichter\WR1 Leistung]*/  , 0);
}else{
if ($PotenzVorher == $PotenzNachher) {
                               $Wert_Neu_WR1 = round( $Wert_Original * pow(10,$PotenzNachher)*0.001,2);
  SetValue (45860 /*[Energie\Wechselrichter\WR1 Leistung]*/   , $Wert_Neu_WR1);
                }
}

usleep(100000);

ModBus_RequestRead(53281 /*[Energie\Wechselrichter\Rohdaten\WR2 Leistung Skalierungsfaktor]*/);
$PotenzVorher = GetValue(10019 /*[Energie\Wechselrichter\Rohdaten\WR2 Leistung Skalierungsfaktor\Value]*/   );
ModBus_RequestRead(46019 /*[Energie\Wechselrichter\Rohdaten\WR2 Leistung]*/);
$Wert_Original = GetValue(42431 /*[Energie\Wechselrichter\Rohdaten\WR2 Leistung\Value]*/  );
ModBus_RequestRead(53281 /*[Energie\Wechselrichter\Rohdaten\WR2 Leistung Skalierungsfaktor]*/);
$PotenzNachher = GetValue(10019 /*[Energie\Wechselrichter\Rohdaten\WR2 Leistung Skalierungsfaktor\Value]*/   );

$Wert_Neu_WR2 = 0;
if ($Wert_Original == 0 ){
   SetValue (52774 /*[Energie\Wechselrichter\WR2 Leistung]*/  , 0);
}else{
if ($PotenzVorher == $PotenzNachher) {
                               $Wert_Neu_WR2 = round( $Wert_Original * pow(10,$PotenzNachher)*0.001,2);
  SetValue (52774 /*[Energie\Wechselrichter\WR2 Leistung]*/   , $Wert_Neu_WR2);
                }
}
SetValue (12866 /*[Energie\Wechselrichter\PV Leistung gesamt]*/ ,$Wert_Neu_WR1 + $Wert_Neu_WR2);

Gruß
Bikasso

Inzwischen hat IPS 4 da intern Abhilfe mit mehreren Geräten auf einem Bus.
Somit solltest du das Script nicht mehr benötigen.
Stand auch in irgendeinem Changelog :wink:
Michael

Nutzt du bereits IP-Symcon 4.0? Dort sollte das Problem für RTU Geräte eigentlich gelöst sein?

paresy

Hallo Paresy,

natürlich nutze ich IPS 4.0 :wink:
Die genaue Version hab ich nicht zur Hand, aber am 12.03.2016 hab ich ein Update gemacht.

Gruß
Bikasso

Hast du das aktuellste Update der 4.0 mal probiert? Ist der Fehler immer noch aktuell?

paresy