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

AWL-Joe

Level-2
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!!!

Brauche Hilfe eine 32-Bit-Variable in zwei 16-Bit-Variablen umzurechnen für eine Positionsvorgabe über Profibus.

lt Hersteller hat das auf folgende weise zu geschehen:

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);

So jetzt die Frage an die "C" Profis: Wie schaut das für S7 aus?

MfG

Joe
 
Hallo Joe,

was für eine Umwandlung soll das denn eigentlich sein?

Die Zeilen, die Du gepostet hast, sind ja wohl aus einer SCL-Quelle.
Wenn der Hersteller meint, dass das so geht kann man das ganze in AWL übersetzen - und fertig.

MFG
quax
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also die einfachst wenn auch unsauberste Variante:
Originalvalue steht beispielsweis im DBD0 irgend eines DB's, dann einfach:
L DBW0 fürs LowWord
L DBW2 fürs HighWord

Wobei ich mir bei Low und Highword jetzt grad nicht sooo sicher bin, je nachdem ob das Codeschnipsel bereits für Siemens war oder allgemein ist ...
Also für Little oder Big Endian ...

Mfg
Manuel
 
Zuletzt bearbeitet:
Hallo!!!

Brauche Hilfe eine 32-Bit-Variable in zwei 16-Bit-Variablen umzurechnen für eine Positionsvorgabe über Profibus.

lt Hersteller hat das auf folgende weise zu geschehen:

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);

So jetzt die Frage an die "C" Profis: Wie schaut das für S7 aus?

MfG

Joe

Ich würd erstmal testen, ob du überhaupt was wandeln musst.
Ansonsten so ähnlich:

Code:
L #Sollwert
AUF DB10
T DBD10
L DBW10
T DBW14
L DBD12
T #AUSGABE

Gruß
Dieter
 
Wenn die Bytrereihenfolge beim Empfängersystem gleich ist würde ich es so probieren:
Code:
L  #32BitVar
T  #16BitLowWord
SRD  16
T  #16BitHighWord
Ansonsten eben andersherum:
Code:
L  #32BitVar
T  #16BitHighWord
SRD  16
T  #16BitLowWord
 
Du willst doch eine 32-Bit Realzahl runden. Also kommt auch eine 32-Bit Ganzzahl raus -> Dint.

wobei bei den positiven Zahlen kein Unterschied zu Int bis 32767 besteht.

Gruß wolder

Mein Problem ist: Ich rechne in Real, runde, dann will ich das Ergebnis auf ein analoges AW geben will. Kann ich die Dint denn irgendwie zu int machen? Wenn ich die Dint einfach aufs AW transferiere, beeinflusse ich ja das nächste AW auch noch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.....
Wenn ich die Dint einfach aufs AW transferiere, beeinflusse ich ja das nächste AW auch noch.

Nein, das stimmt so nicht.
Code:
L  MD 62    //Lade den Inhalt des Merkerdoppelwortes 62 in Akku 1
T  AW 0    // transferiert das Lowword (Akku 1 L) in das AW 0
Also genaugenommen wird mit obigen code nur das MW64 in das AW0 geschrieben. AW 2 bekommt davon nichts mit.;)
 
Zurück
Oben