Modbus und Array

mf2000

Level-2
Beiträge
149
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute.

Wie im Anhang habe ich ein Gerät per Modbus eingebunden. Ich bekomme auch alle Werte.

Aber wie kann ich statt den Channel 2 in zwei einzel Word darzustellen , dass gnaze als Array [0..1] of WORD bekommen?

Siehe Bild

Vielen Dank.
 

Anhänge

  • 2017-10-11 19_26_34-WAGO750_342.project_ - CODESYS.jpg
    2017-10-11 19_26_34-WAGO750_342.project_ - CODESYS.jpg
    36,3 KB · Aufrufe: 116
Moin, brauchst du das um einen Wert der 32Bit hat zu übertragen?

ich bräuchte das nämlich auch :D weil sonst die beiden WORD Bereiche unterschiedlich abgefragt werden und es während der Laufzeit zu Problemen führen kann.

Falls du etwas gefunden hast melde dich mal ich habe bis her noch keine Lösung.

MfG Hendrik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin.

Wenn Du Modbus hast, gibt es nur WORD Blöcke. Wenn Du ein DWORD übertragen willst machst Du das als WORD + WORD. Dannach rechnet man das ganze wieder zusammen:

WR_DC_Power := (WORD_TO_REAL(DC_Energy_Power_READ[0]) * 65535) + WORD_TO_REAL(DC_Energy_Power_READ[1]);

Es werden aus zwei WORD ein DWORD gemacht und dann in REAL gewandelt.

Kannst auch das ganze Bitweise verschieben. Ich finde diese Ansicht nur für mich besser ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
WR_DC_Power := (WORD_TO_REAL(DC_Energy_Power_READ[0]) * 65535) + WORD_TO_REAL(DC_Energy_Power_READ[1]);

Es werden aus zwei WORD ein DWORD gemacht und dann in REAL gewandelt.
Vorsicht, die Formel/der Code funktioniert so nicht. Es müssen erst die beiden WORD zu einem DWORD zusammengefasst werden und dann das Bitmuster des DWORD einer REAL-Variable zugewiesen werden. Das geht meines Wissens in Codesys oder Twincat nur über eine UNION oder einen Pointer.

Harald
 
Vorsicht, die Formel/der Code funktioniert so nicht. Es müssen erst die beiden WORD zu einem DWORD zusammengefasst werden und dann das Bitmuster des DWORD einer REAL-Variable zugewiesen werden. Das geht meines Wissens in Codesys oder Twincat nur über eine UNION oder einen Pointer.

Harald

Warum nicht?
Die Werte die ich bekomme passen.

Ich rechne doch ein ganzes WORD hoch und dann den zweiten Wert dazu. Wenn ich das mit dem Taschenrechner mache, in Binär kommt das selbe raus.

mfrey
 
Mache das nicht mit dem Taschenrechner sondern mit der realen Zielplattform (oder notfalls mit dem offiziellen Simulator der Zielplattform). :cool:
Man kann nicht von einem "zerschnippelten" REAL-Wert das L-Word und das H-Word getrennt nach REAL konvertieren.
Und dann ist auch noch das Problem, daß Codesys-Derivate bei DWORD_TO_REAL nicht den Bitstring übernehmen sondern den Dezimalwert des DWords nach REAL konvertieren.

Harald
 
mmmh also bei mir handelt es sich um einen Zähler vom Strom.

Jeder Impuls erhöht das Word um eins. Ist das Word voll wird das nächste Word um eins erhöht.

Es handelt sich nicht um Fließkommazahlen.

Fakt ist das die Werte genau passen.

Aber wie würde ich es denn richtig machen.

Das erste H-Word ist z.b. 20
Das zweite L-Word ist z.B. 3432
 
mmmh also bei mir handelt es sich um einen Zähler vom Strom.

Jeder Impuls erhöht das Word um eins. Ist das Word voll wird das nächste Word um eins erhöht.

Es handelt sich nicht um Fließkommazahlen.
Es handelt sich um einen 32 Bit DINT (oder UDINT).

OK, es steht hier nirgends daß die beiden WORD vorher ein REAL waren - das habe ich irgendwie hineininterpretiert (wohl weil das die übliche Frage ist, und wegen der Zwischenfrage von Hendrik und Deiner Antwort wo unmotiviert die REAL-Wandlung auftaucht).

WR_DC_Power := (WORD_TO_REAL(DC_Energy_Power_READ[0]) * 65535) + WORD_TO_REAL(DC_Energy_Power_READ[1]);

Es werden aus zwei WORD ein DWORD gemacht und dann in REAL gewandelt.
Deine Erklärung passt nicht zu dem was der Code wirklich macht.
Es werden zwei WORD (eigentlich UINT) getrennt zu REAL gewandelt und danach zusammengerechnet. Da ist nirgends ein "DWORD" was aus 2 WORD gebildet wird. Vermutlich geht durch diese umständliche Rechnung sogar noch Genauigkeit verloren.

Außerdem ist der Multiplikator 65535 falsch - es muß mit 65536 multipliziert werden, damit es einer Verschiebung um 16 Bit entspricht.

Aber wie würde ich es denn richtig machen.
Einen 32 Bit UDINT, der als 2 WORD übertragen wird, in einen REAL zu wandeln, könnte man etwa so machen (ich weiß allerdings nicht, ob ein Codesys-Compiler das so schluckt):
Code:
RealVar := UDINT_TO_REAL( WORD_TO_UDINT(Word_H) * 65536 + WORD_TO_UDINT(Word_L) );

PS:
Einen 32 Bit DINT wieder zusammensetzen mit Erhalt des Vorzeichens und in REAL wandeln muß man vermutlich so
Code:
RealVar := DINT_TO_REAL( DWORD_TO_DINT(SHL(WORD_TO_DWORD(Word_H), 16) OR WORD_TO_DWORD(Word_L)) );
Hier würde ich aber vermutlich eine Lösung mit einer UNION vorziehen.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

und erstmal Danke für die Hilfe.

Es handelt sich um einen 32 Bit DINT (oder UDINT).

OK, es steht hier nirgends daß die beiden WORD vorher ein REAL waren - das habe ich irgendwie hineininterpretiert (wohl weil das die übliche Frage ist, und wegen der Zwischenfrage von Hendrik und Deiner Antwort wo unmotiviert die REAL-Wandlung auftaucht).

Hatte ich auch wohl nicht eindeutig geschrieben.

Außerdem ist der Multiplikator 65535 falsch - es muß mit 65536 multipliziert werden, damit es einer Verschiebung um 16 Bit entspricht.

Tippfehler :rolleyes:

Einen 32 Bit UDINT, der als 2 WORD übertragen wird, in einen REAL zu wandeln, könnte man etwa so machen (ich weiß allerdings nicht, ob ein Codesys-Compiler das so schluckt):

Ergebnis ist genau gleich :confused: Siehe Anhang.

Aber wenn ich es jetzt richtig verstehe ist mein Weg falsch und nur Glück das es funktioniert :confused:
 

Anhänge

  • 2017-10-31 08_13_54-WR.project_ - CODESYS.jpg
    2017-10-31 08_13_54-WR.project_ - CODESYS.jpg
    12,1 KB · Aufrufe: 26
Schön wenn es jetzt geht :)

Aber zu meine #12 Post habe ich keine Rückmeldung, kann da jemand nochmal sagen ob das bei dann falsch ist.



G
M
T





[TD="class: SL, width: 10%, align: right"][/TD]
[TD="class: SL, width: 20%, align: left"]Sprache erkennenAfrikaansAlbanischArabischArmenischAserbaidschanischBaskischBengalischBosnischBulgarischBurmesischCebuanoChichewaChinesisch (ver)Chinesisch (trad)DänischDeutschEnglischEsperantoEstnischFinnischFranzösischGalizischGeorgischGriechischGujaratiHaitianischHausaHebräischHindiHmongIgboIndonesischIrischIsländischItalienischJapanischJavanesischJiddischKannadaKasachischKatalanischKhmerKoreanischKroatischLaoLateinishLettischLitauischMalabarischMalagasyMalaysischMaltesischMaoriMarathischMazedonischMongolischNepalesischNiederländischNorwegischPersischPolnischPortugiesischPunjabiRumänischRussischSchwedischSerbischSesothoSinghalesischSlowakischSlowenischSomaliSpanischSuaheliSundanesischTadschikischTagalogTamilTeluguThailändischTschechischTürkischUkrainischUngarischUrduUzbekischVietnamesischWalisischWeißrussischYorubaZulu[/TD]
[TD="class: SL, width: 3, align: center"]
[/TD]
[TD="class: SL, width: 20%, align: left"]AfrikaansAlbanischArabischArmenischAserbaidschanischBaskischBengalischBosnischBulgarischBurmesischCebuanoChichewaChinesisch (ver)Chinesisch (trad)DänischDeutschEnglischEsperantoEstnischFinnischFranzösischGalizischGeorgischGriechischGujaratiHaitianischHausaHebräischHindiHmongIgboIndonesischIrischIsländischItalienischJapanischJavanesischJiddischKannadaKasachischKatalanischKhmerKoreanischKroatischLaoLateinishLettischLitauischMalabarischMalagasyMalaysischMaltesischMaoriMarathischMazedonischMongolischNepalesischNiederländischNorwegischPersischPolnischPortugiesischPunjabiRumänischRussischSchwedischSerbischSesothoSinghalesischSlowakischSlowenischSomaliSpanischSuaheliSundanesischTadschikischTagalogTamilTeluguThailändischTschechischTürkischUkrainischUngarischUrduUzbekischVietnamesischWalisischWeißrussischYorubaZulu[/TD]
[TD="class: SL, width: 8%, align: center"]
[/TD]
[TD="class: SL, width: 8%, align: center"]
[/TD]
[TD="class: SL, width: 8%, align: center"]

[/TD]
[TD="class: SL, width: 8%, align: center"]
[/TD]
[TD="class: SL, width: 15%, align: right"]
[/TD]





Die Sound-Funktion ist auf 200 Zeichen begrenzt


[TD="width: 5%, align: center"][/TD]
[TD="width: 5%, align: left"]
[/TD]
[TD="width: 70%, align: center"] Optionen : Geschichte : Feedback : Donate [/TD]
[TD="width: 15%, align: right"]Schließen[/TD]
 
Zurück
Oben