Ich denke hier herrscht Verwirrung weil Modbus als eher spezielles Protokoll im Spiel ist. Da scheinen die Clients als Register-Raum dargestellt zu sein, aus dem man eben ab einer bestimmten Adresse eine Menge an Werten liest oder schreibt. Und ich vermute mal stark unser TE moechte an der Stelle einhaken, und die Daten erzeugn, statt das einfach auf eine Liste oder so abzubilden. Darum habe ich auch nach der Server-Version gefragt. Damit man sehen kann, wie ein solches Request konkret reinkommt, und dann verarbeitet wird.
Ich denke der Ansatz ist das Erstellen eines eigenen Block Storages: https://github.com/riptideio/pymodbus/b ... ore.py#L62
Den wuerde ich ableiten und einhaengen, mit prints/debugger statements versehen, um die callbacks zu verstehen.
Pymodbus Reference Number "address" abfrage im Server
Die Klasse hat nichts mit dem Problem zu tun, ich weiß nicht warum das thematisiert worden ist, wahrscheinlich weil das eine schlecht gekürzte Version ist, die nicht dem Python Standard entspricht.
Mein Problem war das eine Variable x = server_context.getValues(3, 16, 2) gesetzt wurde und die Variable x wurde auch durch x = server_context.getValues(3, 1060, 2) gesetzt.
Nur das unter bestimmten Bedingen x = server_context.getValues(3, 16, 2) mit einem Validen Wert gesetzt wird und danach mit einem nicht validen Wert durch x = server_context.getValues(3, 1060, 2) gesetzt wird.
Weil x =server_context.getValues(3, 16, 2) zuerst gesetzt wird und im Anschluß x=server_context.getValues(3, 106,0 2) gesetzt wird ist in x ein nicht valider Wert gespeichert worden.
Das Problem wollte ich durch eine Abfrage der Adresse 1060 umgehen, was aber nicht zu funktionieren scheint. Jetzt habe ich das Problem so gelöst, dass wenn x=server_context.getValues(3, 16, 2) gesetzt wird, setze ich server_context.setValues(3, 1060, x) .
So wird x immer noch überschrieben, aber jetzt mit einem validen Wert.
Mein Problem war das eine Variable x = server_context.getValues(3, 16, 2) gesetzt wurde und die Variable x wurde auch durch x = server_context.getValues(3, 1060, 2) gesetzt.
Nur das unter bestimmten Bedingen x = server_context.getValues(3, 16, 2) mit einem Validen Wert gesetzt wird und danach mit einem nicht validen Wert durch x = server_context.getValues(3, 1060, 2) gesetzt wird.
Weil x =server_context.getValues(3, 16, 2) zuerst gesetzt wird und im Anschluß x=server_context.getValues(3, 106,0 2) gesetzt wird ist in x ein nicht valider Wert gespeichert worden.
Das Problem wollte ich durch eine Abfrage der Adresse 1060 umgehen, was aber nicht zu funktionieren scheint. Jetzt habe ich das Problem so gelöst, dass wenn x=server_context.getValues(3, 16, 2) gesetzt wird, setze ich server_context.setValues(3, 1060, x) .
So wird x immer noch überschrieben, aber jetzt mit einem validen Wert.
Genau, das ist das Problem gewesen und deswegen nur die Liste in einer Klasse. Das mit dem Ableiten hatte ich mir für den absoluten Worst Case aufgehoben.__deets__ hat geschrieben: ↑Donnerstag 12. März 2020, 14:17 Ich denke hier herrscht Verwirrung weil Modbus als eher spezielles Protokoll im Spiel ist. Da scheinen die Clients als Register-Raum dargestellt zu sein, aus dem man eben ab einer bestimmten Adresse eine Menge an Werten liest oder schreibt. Und ich vermute mal stark unser TE moechte an der Stelle einhaken, und die Daten erzeugn, statt das einfach auf eine Liste oder so abzubilden. Darum habe ich auch nach der Server-Version gefragt. Damit man sehen kann, wie ein solches Request konkret reinkommt, und dann verarbeitet wird.
Ich denke der Ansatz ist das Erstellen eines eigenen Block Storages: https://github.com/riptideio/pymodbus/b ... ore.py#L62
Den wuerde ich ableiten und einhaengen, mit prints/debugger statements versehen, um die callbacks zu verstehen.
Ich habe es jetzt anders gelöst, und das passt so.
x = server_context.getValues(3, 16, 2)
server_context.setValues(3, 1060, x)
Vielen Dank für die Hilfe.
Ich weiß wirklich nicht, wie ModBus hier hereinspielt, aber ein
sollte das Problem doch auch lösen.
Code: Alles auswählen
x = server_context.getValues(3, 16, 2)
irgendein_anderer_name_so_dass_x_nicht_ueberschrieben_wird = server_context.getValues(3, 1060, 2)
Ja das stimmt aber nicht bei meinem Problem, weil x unter zwei Bedingungen geschrieben wird wenn ich dann ein x_1 udn x_2 verwende weiß die nachgeschaltete Software nicht welchen Wert diese zu nehmen hat. Das Problem ist komplexer als ich nehme einfach eine zweite Variable.
Deine Randbedingungen sind nicht das Problem. Deine Formulierung ist es. Du bist tief in den Details von etwas, nimmst an jeder hier weiss wovon du redest, und entscheidest recht freimuetig, was du so weglaesst und was nicht. Damit kann man halt nur so viel anfangen. Aber wenn dein Problem geloest ist...