WORD_TO_DINT geht schief

SLe

Level-2
Beiträge
41
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich habe bei einer ILC3350PN festgestellt, dass WORD_TO_DINT bis 32767 richtig rechnet aber ab 32768 das Bit 15 als Vorzeichen einrechnet. Ich hätte erwartet, dass WORD als Vorzeichenlos betrachtet wird. Der Umweg über WORD_TO_DWORD und dann DWORD_TO_DINT funktioniert dann aber, ist aber etwas zu umständlich.
Hat jemand Erfahrung, ob dass ein Fehler ist oder ob dass so von PCWORX gewollt ist?

SLe
 
Gibt es eine Dokumentation von Phoenix, wie das WORD_TO_DINT funktionieren soll?
Mir scheint das beschriebene Verhalten so richtig zu sein, also: zunächst die 16 Bit des WORD als INT interpretieren und dann typrichtig auf 32 Bit DINT erweitern.

Der Umweg über WORD_TO_DWORD und dann DWORD_TO_DINT funktioniert dann aber, ist aber etwas zu umständlich.
Hmm, als "umständlich" würde ich das nicht bezeichnen, höchstens vielleicht für manche Programmierer etwas lästig, wenn sie genau hinschreiben müssen, welches unnormale Verhalten sie wollen. Der Compiler macht da vermutlich auch keinen "umständlicheren" Code draus im Vergleich zu WORD_TO_DINT.

Harald
 
Laut Siemens entspricht WORD_TO_DINT(x) = INT_TO_DINT(WORD_TO_INT(x))
Ist also richtig, das den Vorzeichenbit umplaziert wird.

Wenn das nicht gewünscht ist, dann den Umweg DWORD_TO_DINT(WORD_TO_DWORD(x))

edit: Vielleicht WORD_TO_UDINT ?
 
Zuletzt bearbeitet:
Hallo SLe,

in der Hilfe des FB wird eindeutig beschrieben, dass das MSB als Vorzeichen betrachtet wird . hier sollte also die Umwandlung nach uint oder udint erfolgen.

Hilfe aus dem FB word_to_dint.

Diese Funktion zur Typumwandlung wandelt einen Eingangswert vom Datentyp WORD in einen Ausgangswert vom Datentyp DINT um.


Die Konvertierung erfolgt vorzeichenbehaftet. Das höchstwertige Bit (MSB) des WORD-Eingangswertes wird als Vorzeichenbit interpretiert und in das höchstwertige Bit des DINT-Ausgangswertes geschrieben (auch hier als Vorzeichenbit interpretiert).
Wenn das MSB gesetzt ist (DINT-Wert wird negativ), findet eine Vorzeichenerweiterung statt. Alle Bits zwischen dem höchstwertigen Bit und Bit 16 werden auf 1 gesetzt.


Beispiele für die Konvertierung:


16#7FFF (32767) liefert den Wert 32767 (16#00007FFF)
16#8000 (32768) liefert den Wert -32768 (16#FFFF8000)
16#FFFF (65535) liefert den Wert -1 (16#FFFFFFFF)

Gruß Uwe
 
Zurück
Oben