Pymodbus Reference Number "address" abfrage im Server

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
McAce_2
User
Beiträge: 11
Registriert: Donnerstag 12. März 2020, 09:30

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.
McAce_2
User
Beiträge: 11
Registriert: Donnerstag 12. März 2020, 09:30

__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.
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.

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. :-)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß wirklich nicht, wie ModBus hier hereinspielt, aber ein

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)
sollte das Problem doch auch lösen.
McAce_2
User
Beiträge: 11
Registriert: Donnerstag 12. März 2020, 09:30

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.
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Das klingt alles sehr, sehr seltsam...
McAce_2
User
Beiträge: 11
Registriert: Donnerstag 12. März 2020, 09:30

Naja was soll ich sagen, ich habe meine Randbedingungen die ich einhalten muss :-D
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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...
Antworten