DWord in 2x WORD umwandeln

Zuviel Werbung?
-> Hier kostenlos registrieren
Ok danke. Ich habe es nun mit DINT versucht und das hat geklappt.
Das "^" im Code würde mich aber noch interessieren was es heisst. Weisst du das?
@DeltaMikeAir hat mit seinem Handbuch Auszug eigentlich schon die Lösung geliefert, trotzdem gebe ich noch meinen Senf dazu.
Wenn Du mit Pointern arbeitest enthalten diese ja "nur" die Adresse auf die eigentlichen Daten. Wenn Du jetzt aber auf die an der Adresse liegenden Daten zugreifen möchtest musst dazu den sogenannten Dereferenzierer nutzen. Bei Nutzung des Dereferenzierers ist es übrigens sehr wichtig bei der Deklaration des Pointers den richtigen Variablentyp anzugeben auf den er Zeigt, weil sonst der Dereferenzierer die "falschen" Daten liefert.
Ich muss aber gestehen, dass ich es noch nie gesehen habe, dass man den Dereferenzierer auch vor dem := nutzen kann. Ich kannte es bisher immer nur so, dass man Ihn so nutzt:
Code:
uiVar01 := puiPointer01^;
Tja, wieder was gelernt.
Es gibt übrigens auch den umgekehrten Fall, eine Funktion oder ein FB braucht die Adresse zu einer Variablen, dann nutzt man die Funktion ADR.
 
Hallo TimSchuh
da du schreibst, das du neu in ST bist möchte ich Harald seinen Code mal interpretieren.
pReal := ADR(dwVar); //Pointer auf das DWord setzen
pReal^:= Input_Real; //REAL-Wert in das DWord speichern
Lo_Word := DWORD_TO_WORD(dwVar);
Hi_Word := DWORD_TO_WORD(SHR(dwVar, 16));
pReal := ADR(wArr); Hier wird die Speicheradresse der Variable "wArr" ermittelt, Der Speicherblock ist 32bit groß
pReal^:= Input_Real; pReal^ ist ein Zeiger auf die ermittelte Speicheradresse. Die Variable "Input_Real" wird an die ermittelte Speicheradresse geschrieben
Lo_Word := DWORD_TO_WORD(dwVar);
Hi_Word := DWORD_TO_WORD(SHR(dwVar, 16)); entnahme der 2 Word aus der Variable dwVar

Diese Möglichkeit hat Nachteile.
Bei OnLine Change kann es fehlerhafte Zugriffe auf den Speicher geben, da Speicherbereiche verschoben werden.
Pointer sollten m.M.n. nur bei unbedingt nötigen Zugriffen verwendet werden.

In deinem Fall wäre eine Lösung mit einer Union wesentlich besser geeignet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei OnLine Change kann es fehlerhafte Zugriffe auf den Speicher geben, da Speicherbereiche verschoben werden.
Aber nur dann wenn du mehrere Zyklen brauchst um etwas auszuwerten oder aber die Adresse nur einmalig ermittelt wird und dann in Folge "blind" mit dieser ermittelten Adresse gearbeitet wird. Solange immer erst die Adresse ermittelt wird und dann anschließend im gleichen Zyklus mit dieser Adresse gearbeitet wird, passiert bei Online-Changes nichts.
 
Nur zur Vollstaendigkeit, da Union immer genannt wurde.
Screenshot 2022-10-11 081053.png
Hier eine Union definiert und eine Struct mit dem erwarteten Ergebnis.
Schaut dann so aus
Screenshot 2022-10-11 081053.png
Das Schöne daran, es ist beliebig erweiterbar, man könnte eine Structur mit Bits, Strings oder ähnlichem machen,
und die Zahlen werden automatisch immer umgewandelt.

Für genauere Interpretationen des Real Werts von 200000 zu DINT und DWORD sollen die Profis was sagen.



EDIT: Unpräzise bzw. falsch ausgedrückt, ich meinte die Darstellung von unterschiedlichen Datentypen wird eben im spezifischen Datentyp dargestellt.
Wie erwähnt, ist die Magie dahinter die zugrundeliegende Darstellung der Zahl im Speicher,
worauf jeder Datentyp zugreift und eben entsprechend interpretiert.
 
Zuletzt bearbeitet:
UNION gibt es ab Codesys/TwinCat 3 (...). Etwa so:
Code:
TYPE VAR32 : UNION
  dwVar : DWORD;
  rVar : REAL;
END_UNION
END_TYPE

VAR
  X : VAR32;
  MyDwWert : DWORD;
  MyRealWert : REAL;
END_VAR

//DWORD auf REAL-Variable kopieren
X.dwVar := MyDwWert;
MyRealWert := X.rVar;

//und REAL auf DWORD-Variable kopieren
X.rVar := MyRealWert;
MyDwWert := X.dwVar;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Schöne daran, es ist beliebig erweiterbar, man könnte eine Structur mit Bits, Strings oder ähnlichem machen,
und die Zahlen werden automatisch immer umgewandelt.
Das Schöne daran ist, daß Zahlen NICHT umgewandelt werden. Es wird immer nur das in der Speicherstelle liegende Bitmuster OHNE Umwandlung als Zahl des betreffenden Datentyps interpretiert.
 
Zurück
Oben