Hallo,
ich habe einen Knoten im Kopf und komme nicht weiter.....
In meinem Code, Thema pymodbus, wird bei reads ein Returnwert zurückgegeben, der den Status als auch die Werte beinhaltet.
Für Tests und Simulation wollte ich mir nun diesen Returnwert "selber" erzeugen, weil ich an dieser Stelle keinen Zugriff auf Modbus etc habe.
Aber wie erzeuge ich die "strutur", in C gedacht ?
Mein Versuch:
int anzsens = 5 ## demo
rr.registers = [0 * i for i in range(anzsens)]
funktioniert nicht, weil rr noch nicht existiert. Das macht Sinn.
Aber structs gibt es doch in python nicht...?
Ich muss erst rr anlegen....aber wie, damit ich dann das Array anhängen kann?
Kann es sein, das die Konstruktion abhängig von python3 Versionen ist ?
Vielen Dank für einen Hinweis.
Und ja, selber die Lösung suchen schult mehr, aber....z.Z. geht es um den Inhalt.
Danke
JR
Datentyp und initialisieren
- __blackjack__
- User
- Beiträge: 14416
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@jr1: Ich verstehe die Frage nicht so wirklich. Natürlich muss man Objekte die man verwenden will vor der Verwendung erstellen. Was soll `rr` denn sein? Wie sähe das denn in C als ``struct`` aus? Python's Verbunddatentyp ist die Klasse. So eine würde man wahrscheinlich schreiben. Die sollte natürlich mehr als nur ein Attribut haben, denn das ist in der Regel nicht sinnvoll.
Falls diese Zuweisung zur Initialisierung gehört, dann steht die nicht ausserhalb der Klasse im Code, sondern in der `__init__()`-Methode.
Randbemerkung: Namen sollten keine komischen Abkürzungen enthalten, oder gar nur daraus bestehen. `anzsens` kann man ja noch erraten, dass das wahrscheinlich `sensorenanzahl` heissen soll, aber bei `rr` hört's dann auf. Vielleicht würde man die Frage auch schon besser verstehen, wenn man an dem Namen erkennen könnte, was dieses Objekt für eine Bedeutung im Programm haben soll.
Echter Code wäre auch nett, denn ``int anzsens = 5 ## demo`` ist ein Syntaxfehler. Den Typ würde man hier aber auch gar nicht angeben, denn das der Wert 5 vom Typ `int` ist, wissen sowohl Menschen als auch der Rechner.
``[0 * i for i in range(anzsens)]`` ist ziemlich umständlich ausgedrückt vom Ergebnis her ja einfach nur ``[0] * anzsens``.
Falls diese Zuweisung zur Initialisierung gehört, dann steht die nicht ausserhalb der Klasse im Code, sondern in der `__init__()`-Methode.
Randbemerkung: Namen sollten keine komischen Abkürzungen enthalten, oder gar nur daraus bestehen. `anzsens` kann man ja noch erraten, dass das wahrscheinlich `sensorenanzahl` heissen soll, aber bei `rr` hört's dann auf. Vielleicht würde man die Frage auch schon besser verstehen, wenn man an dem Namen erkennen könnte, was dieses Objekt für eine Bedeutung im Programm haben soll.
Echter Code wäre auch nett, denn ``int anzsens = 5 ## demo`` ist ein Syntaxfehler. Den Typ würde man hier aber auch gar nicht angeben, denn das der Wert 5 vom Typ `int` ist, wissen sowohl Menschen als auch der Rechner.
``[0 * i for i in range(anzsens)]`` ist ziemlich umständlich ausgedrückt vom Ergebnis her ja einfach nur ``[0] * anzsens``.
“The city's central computer told you? R2D2, you know better than to trust a strange computer!” — C3PO
- DeaD_EyE
- User
- Beiträge: 1353
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Wieso beschäftigen sich jetzt auf einmal wieder so viele mit ModBus?
Wenn ich Morgen wieder auf der Arbeit bin, kann ich mal Beispielcode für die Logo 8.3 von Siemens posten.
Wenn ich Morgen wieder auf der Arbeit bin, kann ich mal Beispielcode für die Logo 8.3 von Siemens posten.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Dann übersetze ich mal die Frage. In einem Programm werden per pymodbus Register per read_coils gelesen: https://pymodbus.readthedocs.io/en/late ... e-handling
Der Rückgabewert ist ein pymodbus.pdu.ModbusPDU-Objekt.
Das kann dann natürlich auch selbst erzeugt werden:
Der Rückgabewert ist ein pymodbus.pdu.ModbusPDU-Objekt.
Das kann dann natürlich auch selbst erzeugt werden:
Code: Alles auswählen
rr = pymodbus.pdu.ModbusPDU(registers=[0] * anzsens)- DeaD_EyE
- User
- Beiträge: 1353
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Hinweis:
(DI) Discrete Inputs und (CO) Coils sind bits.
Register findet man bei HR (Holding Register) und (IR) Input Register.
Eine Auflistung der Klassen gibt es hier: https://pymodbus.readthedocs.io/en/late ... odbus.html
Wenn man z.B. die Hilfe irgendeiner Response-Klasse auswählt (z.B. ReadHoldingRegistersResponse), sieht man auch die Basis-Klasse: Bases: ModbusPDU
Falls du einen Modbus-Server programmieren willst, stell dich darauf ein, dass viele Beispiele falsch sind, da die API verändert worden ist.
(DI) Discrete Inputs und (CO) Coils sind bits.
Register findet man bei HR (Holding Register) und (IR) Input Register.
Eine Auflistung der Klassen gibt es hier: https://pymodbus.readthedocs.io/en/late ... odbus.html
Wenn man z.B. die Hilfe irgendeiner Response-Klasse auswählt (z.B. ReadHoldingRegistersResponse), sieht man auch die Basis-Klasse: Bases: ModbusPDU
Falls du einen Modbus-Server programmieren willst, stell dich darauf ein, dass viele Beispiele falsch sind, da die API verändert worden ist.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
- __blackjack__
- User
- Beiträge: 14416
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@jr1: Es geht ja um den Typen des Rückgabewerts von `read_coils()` auf einem Client-Objekt. Also kann man sich den konkreten Client anschauen, zum Beispiel `pymodbus.client.ModbusTcpClient` falls man den verwendet. Der hat direkt keine `read_coils()`-Methode, also geht man zur Basisklasse `pymodbus.client.base.ModbusBaseSyncClient`. Auch dort gibt es keine `read_coils()`, aber als Basisklasse ist `ModbusClientMixin[ModbusPDU]` angegeben. `ModbusClientMixin` hat als Basisklasse `Generic[T]` und eine `read_coils()`-Methode die als Rückgabewert diesen generischen Typ `T` hat, der bei `ModbusBaseSyncClient` als `ModbusPDU` angegeben wurde.
Das Typsystem von C kennt halt weder Klassen und Vererbung noch generische Datentypen. Rein mit den Augen eines C-Programmierers kommt man da also an Grenzen.
Wobei Typannotationen in Python optional sind, man muss also auch damit klar kommen wenn diese Informationen gar nicht in der Dokumentation vorhanden wären. Man kann auch immer einfach mal in den Quelltext schauen und/oder den Code in einer interaktiven Python-Shell ausprobieren und am lebenden Objekt schauen von welchem Typ es ist.
Und man kann, insbesondere wenn es Typannotationen gibt, auch `typing.reveal_type()` verwenden.
Das Typsystem von C kennt halt weder Klassen und Vererbung noch generische Datentypen. Rein mit den Augen eines C-Programmierers kommt man da also an Grenzen.
Wobei Typannotationen in Python optional sind, man muss also auch damit klar kommen wenn diese Informationen gar nicht in der Dokumentation vorhanden wären. Man kann auch immer einfach mal in den Quelltext schauen und/oder den Code in einer interaktiven Python-Shell ausprobieren und am lebenden Objekt schauen von welchem Typ es ist.
Und man kann, insbesondere wenn es Typannotationen gibt, auch `typing.reveal_type()` verwenden.
“The city's central computer told you? R2D2, you know better than to trust a strange computer!” — C3PO
Danke,
Grenzen: ich merke es grade. Die ersten Versuche in Python sind leicht, aber wenn das herauskommen soll, was gewünscht ist.......wird es anspruchsvoll
Un nein, keinen neuen Server: geht um Ersatz-Simulation des Modbus Interfaces, wenn eben die Hardware nicht zur Hand.....
Vielen Dank
Grenzen: ich merke es grade. Die ersten Versuche in Python sind leicht, aber wenn das herauskommen soll, was gewünscht ist.......wird es anspruchsvoll
Un nein, keinen neuen Server: geht um Ersatz-Simulation des Modbus Interfaces, wenn eben die Hardware nicht zur Hand.....
Vielen Dank
- __blackjack__
- User
- Beiträge: 14416
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Wäre das dann nicht ein Server‽
“The city's central computer told you? R2D2, you know better than to trust a strange computer!” — C3PO
