Ja bei meinem Deye gibt es das Register einmal als Low und einmal als high. Der high wert ist 1 eventuell ist das der Counter, wie oft der Low wert auf 0 gesetzt wurde. Finde dazu nirgends was, obwohl das Deye Modbus Thema eigentlich ultra viel behandelt wird im Netz. Ich muss da mal was zusammen wursteln.
Das ist kein Counter für nen Overflow.
Bzw. halt eigentlich schon.
So arbeiten unsere Zahlensysteme halt grundsätzlich. Das ist aber kein Counter im losgelösten Kontext.
Im Dezimalbereich ist die 10er Stelle der Counter für die 1er Stelle und die 100er Stelle der Counter für die 10er Stelle, wenn man so will.
01
02
03
04
05
06
07
08
09
10 Overflow von 1er
usw. usf.
Gehen wir mal auf 35.
Man kann also 3x Overflow 1er Stelle rechnen und dann die 1er Stelle dazu.
heißt:
3x10+5 =35.
Oder man fragt direkt die 35 ab, dann muss man nicht rechnen.
Das lässt sich auf alle Zahlensysteme und alle Breiten übertragen.
Was glaube ich hier das Problem ist, dass man sich von diesen Registern ins Bockshorn jagen lässt.
Das ist hardwarenahe/-technische Adressierung von Werten. Das kennt man so aus der klassischen IT nicht.
Eine 32Bit Zahl ist halt ne 32Bit Zahl.
Dazu muss man aber 32Bit verarbeiten können. Das kann Modbus, als Protokoll, aber nicht.
Daher wird ne 32Bit Zahl als 2x 16Bit abgebildet.
Jetzt muss man sich des Umstandes aber bewusst sein, dass das zwar als 2x 16bit abgebildet wird, aber eigentlich 1x 32Bit ist. Und das ist ganz wichtig.
Das kann man auch auf 8Bit machen oder auf Nibble, das Problem bleibt bestehen.
Also, es ist wichtig, dass man sich des Umstandes bewusst wird. Ist man das nicht, kann folgendes passieren.
0.65535
1. High Register abfragen: "0"
2. Low Register abfragen: "65535"
Rechnen: 0*65536+65535=65535
So weit, so unspektakulär.
Jetzt passiert folgendes.
Das Eintragen in die Register vom internen Prozess und das Auslesen ist nicht gegeneinander verschränkt.
Zähler intern läuft: (ich nehme mal die Dezimalzahlen, Bitdarstellung ist dann analog)
a) 65533
b) 65534
c) 65535
d) 65536
Eingetragen in die Register wird:
a) 0.66533
b) 0.66534
c) 0.66535
d) 1.0
Jetzt kommt die Abfrage mit jeweils getrenntem Auslesen dazu:
a) 0.66533
b) 0.66534
c) 0.66535
-> Auslesen Low Register: 66535
d) 1.0
-> Auslesen High Register: 1
Rechnen: 1*65536+65535=131071
Wir haben also ein Problem.
Machen wir das mal andersrum.
a) 0.66533
b) 0.66534
c) 0.66535
-> Auslesen High Register: 0
d) 1.0
-> Auslesen Low Register: 0
Rechnen: 1*0+0=0
Wir haben also wieder ein Problem.
Was ist das Problem?
Durch das asynchrone Lesen, kann es also dazu kommen, dass sich zwischen dem einzelnen Lesen der beiden Register dieser Übertrag vollzieht. Und das sieht man so nicht.
An der Stelle e) wird das natürlich wieder gerade gezogen.
e) 1.1
-> Auslesen High Register: 1
-> Auslesen Low Register: 1
Rechnen: 1*65536+1=65537
Nur sieht das dann in der Applikation so aus:
c) 66535
d) 0 oder 131071
e) 65537
Das muss man dann also irgendwie wieder rausfinden und den Wert als ungültig rausziehen.
Oder man macht es gleich so, wie es richtig ist:
c) 0.66535
-> Auslesen beide Register: 0.66535 -> 66535
d) 1.0
-> Auslesen beide Register: 1.0 -> 66536
Damit wird die Konsistenz bei der Abfrage sichergestellt und nur so.
Das Thema Datenkonsistenz in dem Umfeld ist eines der Probleme, womit ITler, die sich damit nicht auskennen, immer wieder Probleme haben. (auch die Leute, die das kennen, kanntes am Anfang logischer Weise auch nicht, das wird einem ja nicht mit der Muttermilch mitgegeben)
Das muss man wirklich mal erlebt haben.
Das ist bei so nem Doppelwort-Thema noch überschaubar. Wenn aber ganze Datenstrukturen asynchron abgeholt werden müssen, dann wirds übel.
Jetzt kann man natürlich die Abfragerate so hoch wählen, dass man diesen Fehler vermeintlich umschifft.
Allerdings verschlimmert man das damit eigentlich nur. Auch langsamer machts nicht besser.
Das ist freilich eine Spezialsituation, aber sie passiert nun mal, mal öfter, mal weniger oft.
Applikationen können dadurch aber "verwirrt" werden.
Und das stellt sich dann so dar, dass man dann irgendwelche sinnlosen Spikes im Graphen hat.
Anzeigen sind geduldig. Aber wehe, man will mit den Werten etwas anderes anfangen, als nur Darstellen, dann kann man sich schonmal die Applikation zerschießen.
Daher nochmal der Hinweis, sich des FC3 des Modbus zu bedienen.