Typwandlung DINT -> INT???

Olav

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, allerseits!

Kurze Frage: Wie kann ich einen DINT-Wert in einen INT-Wert wandeln?
Habe hier eine REAL-Variale, die ich mittels ROUND in DINT wandeln kann,
aber für DINT -> INT finde ich nix...

Danke!

Gruß, Olav
 
Ich würde folgendes versuchen:

L MD 10
T MW 20

Du mußt aufpassen, daß der Wert in MD10 kleiner 16 Bit ist, also in MW20 hineinpaßt. (Evtl. Verleicher einsetzen) Für eine negative Zahl solltest du das erst testen, ich habe jetzt keine CPU zur Hand.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es geht auch direkt:
Code:
L Kammertemperatur  //MD100
RND
T PCData.TempKamm  //DB für PC, DBW 0
Allerdings werden die Realwerte schon vorher auf Über- und Unterlauf getestet und negative Werte kommen hier per Definition hier nicht vor.

Peter
 
Hallo!

Nun, das hatte ich mir auch überlegt, aber bei DINT ist das MSB, also das höchste Bit (31), ein Vorzeichenbit, während ich aber eigentlich dann nur die "unteren" 16 Byte betrachte.
Wenn ich`s so machen will, muß ich dann wohl erst meine DINT Zahl auf "Negativ" prüfen, dann obiges durchführen und dann bei negativem DINT zu meinem Wert noch 2^16 dazuaddieren, um das Vorzeichenbit zu setzen, oder wie jetzt?

Ich dachte eigentlich an einen "einfachen" FUP-Block, vorne DINT rein, hinten INT raus... Schade eigentlich :)

Schönen Freitag und angenehmes Wochenende Euch allen!

Gruß, Olav
 
Hallo

Ich muss das Thema nochmal aufgreifen, hab da auch meine Schwierigkeiten mit.

Ich arbeite auch mit dem ROUND- Befehl. Leider kann ich nachdem ich die REAL zahl umgewandelt habe und das Signal in meinem DB als INT hineinschreibe, die Variable nicht vor einem Vergleicher ( CMP ) setzen. Hab schon vieles versucht bekomme es einfach nicht hin. Im Anhang mal ein Bild.
Zur Info: DBD36 ist die realzahl die vom Touchpanel kommt ( auch als REAL im DB100 deklariert )
Habs einmal in AWL probiert wie oben schon beschrieben und einmal noch mit einem Zwischenschritt wo ich versuche das Signal nach dem ROUND befehl über einen Movebefehl direkt nochmal in einem INT schiebe. Die eingegeben Zahlen gehen von 0 - 300....Ohne Vorzeichenänderung.

Bitte um Hilfe
MFG


DINT_to_int_AWL.JPG

DINT_to_int.JPG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ist denn das Problem, dass du bei zweiten Bild nur die Adresse DB100.DBW58 zu sehen bekommst?

Du hast dort eine Adressüberschneidung.
DB100.DBD58 besteht aus den beiden Wörtern DB100.DBW58 und DB100.DBW60.

Eine Adresse kann immer nur ein einziges Symbol besitzen.
 
In AWL gibt es ITD (INT to DINT) aber kein DTI (DINT to INT). Ein "DTI" wäre auch bei negativen Zahlen nicht erforderlich. Das liegt an der Darstellung der negativen Zahlen durch das sogenannte Zweierkomplement. Es gibt natürlich auch keine DINT-to-INT-Wandlungen in FUP und KOP.

Beispiel:
L MD10 //32-Bit-Operand, DINT
T MW20 //16-Bit-Operand, INT

Solange im MD10 nur Werte zwischen -32768 bis 32767 (INT-Bereich) liegen, kommen diese Werte auch immer im MW20 korrekt an.


Man kann sich das am besten klar machen, wenn man PLCSim zu Rate zieht und sich das MD10 und MW20 sowohl im Ganzzahlformat als auch Binär anzeigen lässt. Dann kann man auch erkennen, wie die negativen Zahlen dargestellt werden.



Aber: In SCL gibt es DINT_TO_INT. Es ist eine Klasse-B-Konvertierung, die immer programmiert werden muss. Natürlich kann der Wert aus dem DINT-Operanden nur dann in einem INT-Operanden untergebracht werden, wenn er zwischen -32768 bis 32767 liegt.
Obiges Beispiel muss dann so programmiert werden:
MW20 := DINT_TO_INT(MD10);
 
Zuletzt bearbeitet:
Ohne die Adressüberschneidung funktioniert es wie gewünscht.
In AWL kann man es auch noch kürzer schreiben, ohne Move in eine Zwischenvariable.

Harald
 

Anhänge

  • RND_CMP_AWL.gif
    RND_CMP_AWL.gif
    4,2 KB · Aufrufe: 42
  • RND_CMP_KOP.gif
    RND_CMP_KOP.gif
    4,5 KB · Aufrufe: 41
Zurück
Oben