2 Word in Real zusammenfügen Ecockpit

axelr81

Member
Beiträge
5
Punkte Reaktionen
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
 

oliver.tonn

Well-known member
Beiträge
4.389
Punkte Reaktionen
722
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.
 

Frohnius

Well-known member
Beiträge
393
Punkte Reaktionen
129
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 ..

 

holgermaik

Well-known member
Beiträge
1.224
Punkte Reaktionen
278
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.
 

Frohnius

Well-known member
Beiträge
393
Punkte Reaktionen
129
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 ...
 
OP
A

axelr81

Member
Beiträge
5
Punkte Reaktionen
0
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?
 

oliver.tonn

Well-known member
Beiträge
4.389
Punkte Reaktionen
722
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.
 

holgermaik

Well-known member
Beiträge
1.224
Punkte Reaktionen
278
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.
 

oliver.tonn

Well-known member
Beiträge
4.389
Punkte Reaktionen
722
Ja klaro. Hab es mit Union Funktion umgesetzt ging ganz easy nachdem ich die Funktionsweise begriffen hatte :)
Also kamen die beiden WORDS glücklicherweise nur vertauscht vom Gerät an, wäre die Byteorder noch unterschiedlich gewesen wäre die Sache, wie @Frohnius schon schrieb, deutlich aufwändiger.
 
Zuletzt bearbeitet:

jensemann

Well-known member
Beiträge
212
Punkte Reaktionen
70
deutlich aufwändiger würde ich jetzt nicht sagen. Auch die Bytes kann man in der Union in die gewünschte Reihenfolge bringen.
 

Frohnius

Well-known member
Beiträge
393
Punkte Reaktionen
129
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 ....
 
Oben