2 Word in Real zusammenfügen Ecockpit

axelr81

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

Bitte seht es mir nach ich bin Codesys Neuling und hab da ein kleineres Problem.
Ich möchte Daten von einem Schreiber via Modbus mit RS485 auslesen.
Jetzt mein Problem die Werte werden als Float bzw Doublefloat vom Schreiber ausgegeben in der Steuerung werden sie als Array of Word eingelesen.
Ich muss irgendwie die 2 Word in Real schreiben und dabei auch noch Word[0] und Word[1] tauschen da der Realwert sonst nicht passt.
Ich hab schon viel rumgegooglt konnte für mich aber irgendwie nicht das passende finden oder ich habs vielleicht nicht richtig verstanden.
Könnt ihr mir weiterhelfen wie ich das hinbekomme.

Gruß Axel
 
Da gäbe es mehrere Möglichkeiten. Die Erste wäre, Du erstellst eine UNION mit einem ARRAY OF WORD und einer Real-Variable. Die einzelnen Elemente des ARRAY OF WORD füllst Du jetzt mit den empfangenen Daten, wobei Du dabei gleich die Words tauschst. Die Real-Variable enthält dann (hoffentlich) den gewünschten Wert.
Oder Du erstellst eine Real-Variable und kopierst mit MEMCPY jeweils ein Word an die richtige Stelle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich glaube du bist da ganz falsch .. mit zusammenbasteln ...
soweit ich mich erinnere waren low und high vertauscht und das 1. bit war das vorzeichen ...
benötigt ein paar rechenschritte .. hab ich irgendwann mal in python gemacht ..

 
Der Vorschlag von Oliver mit der Union ist sicherlich der besere als im Speicher rumzukopieren und du bleibst symbolisch. MEMCPY ünterstützt e!cockpit glaube ich nicht.
 
ahhh hab meine codesnipsel gefunden ...

ergebnis= master.execute(1, cst.READ_HOLDING_REGISTERS, regnr, regzahl )
a=ergebnis [0] & 0xFF ; b=(ergebnis [0] >> 8) & 0xFF ; c=ergebnis [1] & 0xFF ; d=(ergebnis [1] >> 8) & 0xFF
res = (d << 24) | (c << 16) | (b << 8) |a
rep = struct.pack('>I', res)
myfloat = struct.unpack('>f', rep)[0]
print ((time.asctime()), (myfloat), ('V zwischen L1 und L2'))

also in ergebnis [0] und ergebnis [1] ist je eine 16 bit - "zahl" ..
müssen in je 2 byte zerlegt werden ... also a, b, c, d ...
und dann in der reihenfolge d,c,b,a wieder zusammengepakt werden ...
und schon gibts einen real-wert

aber ... kann man nicht einfach einen modbus slave definieren ... und hat den zahlenwert einfach ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da gäbe es mehrere Möglichkeiten. Die Erste wäre, Du erstellst eine UNION mit einem ARRAY OF WORD und einer Real-Variable. Die einzelnen Elemente des ARRAY OF WORD füllst Du jetzt mit den empfangenen Daten, wobei Du dabei gleich die Words tauschst. Die Real-Variable enthält dann (hoffentlich) den gewünschten Wert.
Oder Du erstellst eine Real-Variable und kopierst mit MEMCPY jeweils ein Word an die richtige Stelle.
Danke für die Info.

Das mit der Union klingt ja soweit gut hab soweit jetzt auch verstanden wie eine Union funktioniert bloß wie gebe ich es ein das die 2 Word vertauscht werden?
 
Danke für die Info.

Das mit der Union klingt ja soweit gut hab soweit jetzt auch verstanden wie eine Union funktioniert bloß wie gebe ich es ein das die 2 Word vertauscht werden?
Die Frage ist, ob das überhaupt geht. @Frohnius Beitrag hat mich etwas zum Nachdenken gebracht. Wenn nicht nur die beiden Words getauscht werden müssen, sondern auch die Byte-Order anders ist müsstest Du seine Lösung nehmen.
Bezüglich Deiner Frage, ich habe in der Union ja ein ARRAY OF WORD angelegt, Du musst jetzt in Element 2 Dein erstes empfangenes Word packen und umgekehrt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
auch bei einer Änderung der Bytereihenfolge würde ich nicht wild rumshiften. Die Union lässt sich ja ohne weiteres auf ein Array of Byte erweitern.
Der TE schreibt allerdings Modbus und hier gibt es nur Coil oder Word.
 
deutlich aufwändiger würde ich jetzt nicht sagen. Auch die Bytes kann man in der Union in die gewünschte Reihenfolge bringen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
je nach gerät kann es eben sein, dass lo/high -byte getauscht werden oder nicht ...
ich habe fast nur geräte mit dem low/high-byte tausch .. schneider energiezähler, gantner messgeräte ...
ist wohl beides definiert im modbus protokoll ....
 
Zurück
Oben