Umrechnung 32-Bit-Werte in Low- und High-Wort (1 x DINT in 2 x INT)

Frage:
Bestimmte Systemvariablen (z. B. CAN2_dnOutD1_p) teilen sich mit anderen Systemvariablen (CAN2_nOutW1_a, CAN2_nOutW2_a) ein und denselben Speicherbereich (in der Servo PLC z. B. das Doppelwort %QD32.0 enthält die Worte %QW32.0 und %QW32.1). Welche Umrechnungsformeln gelten, wenn eine 32-Bit-Variable in zwei 16-Bit-Variablen bzw. umgekehrt umgerechnet werden sollen?

Antwort:
Folgende Formeln gelten:

Umrechnung von einer 32-Bit-Variable (dnOriginalValue_p) in zwei 16-Bit-Variablen (Low-Word (wLowWord) und High-Word (wHighWord)):
wHighWord:=DINT_TO_WORD(SHR(DINT_TO_DWORD(dnOriginalValue_p),16))
wLowWord:=DINT_TO_WORD(dnOriginalValue_p);

Umrechnung von zwei 16-Bit-Variablen (Low-Word (wLowWord) und High-Word (wHighWord)) in eine 32-Bit-Variable (dnOriginalValue_p):
dnOriginalValue_p:=DWORD_TO_DINT(SHL(WORD_TO_DWORD(wHighWord),16) OR wLowWord)

Anwendungen:
Bei der Übertragung von Positionswerten (32-Bit-Werte) steht auf den Systembausteinen CAN1, CAN2, CAN3 sowie AIF1, AIF2 und AIF3 jeweils nur ein 32-Bit-Wert als Systemvariable zur Verfügung. In Fällen, in denen zwei Positionswerte pro Systembaustein übertragen werden sollen, können über die o.a. Umrechnungsformeln auch die beiden anderen Datenwörter (16-Bit-Werte) zur Übertragung von 32-Bit-Werten genutzt werden, wenn der Wert in Low- und High-Word gesplittet wird und nach der Übertragung wieder in einen 32-Bit-Wert gewandelt wird.

Hinweis:
Da die Aufsplittung in zwei 16-Bit-Werte bzw. die Rückrechnung des 32-Bit-Wertes in mehreren IEC-Operationen erfolgt, muss vom Anwender die Datenkonistenz sichergestellt werden (z. B. durch Semaphoren, Verriegelungen, ...).

URL zur Verlinkung dieses AKB-Artikels: https://www.lenze.com/de-de/go/akb/200506420/0/
Kontaktformular