Nehmen wir z.B. Modbus: Eine Adresse im Modbus, ein Register, entspricht einem WORD.
Wenn nun aber ein Gerät ein REAL zur Verfügung stellen will, legt das Gerät diesen REAL in zwei WORD-Registern ab. Diese muß ich also zusammen abrufen. Und dann habe ich auf meiner Steuerung ein Bitmuster, das sich aus zwei WORD zusammensetzt. Weil auch bei mir wird der abgerufene Datenbereich i.d.R. erstmal wieder als zwei WORD dargestellt.
Nun muß ich aus den beiden WORD ein DWORD bauen. Und dieses DWORD kann ich dann als REAL interpretieren. Ich als Programmierer muß also wissen, was ich in der Variablen erwarte und wie ich das Bitmuster gelesen haben möchte.
Hier werden zwei WORD in ein DWORD konvertiert:
Code:
SHL(WORD_TO_DWORD(HIGH_WORD),16) OR WORD_TO_DWORD(LOW_WORD)
Was wird gemacht?
WORD_TO_DWORD legt das WORD intern in eine DWORD-Variable, und zwar rechtsbündig,
links sind nur Nullen.
Damit ich das eine WORD nun im linken Bereich stehen habe, wird es mit SHL (Shift Left)
dorthin verschoben.
Da es sich um "Bitcontainer" handelt, kann man mit einem logischen OR ein DWORD
aus den beiden einzelnen DWORDS bilden, weil das eine rechts, das andere links seine
Nullen hat, besteht das resultierende DWORD aus den Bits der beiden WORD.
Nun haben wir ein DWORD, das wir zu einem REAL machen wollen:
Code:
MyDWORD : DWORD; <-- hier liegt nun mein Bitmuster aus obiger Operation
MyPointer : POINTER TO REAL; <-- Zeiger auf eine REAL-Zahl
MyReal : REAL; <-- Meine REAL-Zahl
MyPointer := ADR(MyDWORD); <-- MyPointer enthält nun die Speicheradresse meines Bitmusters
MyReal := MyPointer^; <-- mit "^" nehme ich das gespeicherte Bitmuster dieser Speicheradresse
Somit habe ich jetzt das Bitmuster von MyDWORD in die Variable MyReal transferiert.
Dort wird es jetzt als REAL interpretiert.