TIA SInt to Real in AWL

Ludewig

Level-2
Beiträge
872
Reaktionspunkte
159
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen
Frage eines Quereinsteigers:

Ich muss mehrere vorzeichenbehaftete SInt innerhalb eines AWL-Bausteins in Real umwandeln. Ich habe es der Einfachheit halber mit einer SCL-Funktion gelöst, weil ich das einigermaßen beherrsche.
Aber interessehalber: Wie ginge das in AWL?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo TP-Inc
Dieses Konstrukt kannte ich, dabei geht jedoch das Vorzeichen verloren.
Konkret werden in meinem Fall aus Lizenzkostengründen in einem DINT vier SINT verpackt, die Werte zwischen -25 und +25 annehmen können.

Lese ich das Byte aus dem DB als SINT aus und wandle es mit ITD + DTR zu einem REAL, so wird aus SINT#-3 ->REAL#253.0
In SCL per FC wird mit SINT_to_REAL aus SINT#-3 auch REAL#-3.0?

Irgendwie stirbt AWL ja, aber ich war halt neugierig.
 
Ich muss mehrere vorzeichenbehaftete SInt innerhalb eines AWL-Bausteins in Real umwandeln.
Code:
L #Int
ITD // Integer to Double
DTR //Double to Real
T #Real
So kurz aus der hohlen Hand geschossen wird das eher nichts. ;) Zur Auffrischung ein paar TIA/S7-Fakten:

Datentypen in TIA:
* SINT = short Int (8 Bit) -128...+127
* Double = es gibt in TIA keinen Datentyp der Double heißt, in anderen Programmiersprachen ist Double ein Gleitpunkt-Datentyp --> Double passt also gar nicht hierher

Umwandlungsoperationen in AWL:
* ITD = INT to DINT (16 Bit Ganzzahl zu 32 Bit Ganzzahl)
* DTR = DINT to REAL (32 Bit Ganzzahl zu Gleitpunktzahl)

Eine Umwandlung eines SINT zu REAL mit AWL-Operationen kann man so machen:
1. den 8 Bit SINT vorzeichenrichtig auf 32 Bit DINT erweitern
2. den DINT in REAL konvertieren

z.B. so:
Code:
L #mySINT
TAW         //Bit 0..7 zu Bit 8..15 schieben
ITD         //vorzeichenrichtig auf 32 Bit DINT erweitern
SSD 8       //falsche Bit 0..7 wieder entfernen
DTR         //DINT to REAL
T #myREAL

Harald
 
Ah, das hatte ich glatt überlesen!!1

SInt

Wer lesen kann...;)
 

Anhänge

  • Screenshot 2017-07-23 um 15.21.30.png
    Screenshot 2017-07-23 um 15.21.30.png
    15,3 KB · Aufrufe: 51
Zuletzt bearbeitet:
Moin Harald!

Was hältst Du von ...
Code:
L #mySINT
SLD 24   //Bit 0..7 zu Bit 24..31 schieben
SSD 24   //und wieder zurück mit VZ
DTR      //DINT to REAL
T #myREAL
... da sieht man doch besser, was eigentlich gemacht wird!?

Oder - alternativ, aber nicht ganz so gut lesbar ...
Code:
L #mySINT
TAD      //Bit 0..7 mit Bit 24..31 tauschen
SSD 24   //und wieder zurück mit VZ
DTR      //DINT to REAL
T #myREAL
...?
Häwenaissdäi!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kann man auch so machen - Hauptsache Prinzip erkannt. :) Den ITD kann man in der Tat einsparen, wenn man den SINT gleich zu Bit 24..31 schiebt. Der größte Trick an dem Algorithmus ist allerdings das SSD :cool:
Welche Variante man nimmt ist wohl Geschmackssache. Wobei: 24 Bit schieben klingt zunächst so als ob es länger dauern würde als 8 Bit schieben oder Bytes tauschen (tut es vermutlich aber nicht)

Mein Stück Programmcode ist allerdings besser lesbar als Dein Code, weil ich den Code in [CODE]-Tags gesetzt habe (der #-Button im Beitragseditor)

Harald
 
Danke Harald ...
... für den #-Button-im-Beitragseditor-Tipp!!!
Habe ihn direkt angewendet - s.o.

Die Befehle sind anscheinend gleich schnell, aber von CPU-Typ zu CPU-Typ recht unterschiedlich.
 
Zurück
Oben