Umwandlungsfunktionen in Anweisungsliste AWL
In vielen SPS-Programmen werden müssen Zahlen in ein anderes Format umgewandelt werden. Beispielsweise ist es nicht möglich, mit Zahlen die unterschiedlichen Formate haben, zu rechnen. In solchen Fällen muss man mittels Umwandlungsfunktionen eine Zahl in ein anderes Format umwandeln. Hierfür gibt es in AWL viele Befehle
Ganzzahlen und BCD-Zahlen werden mit folgenden Befehlen umgewandelt:
- BTI - wandelt eine BCD-Zahl in eine 16 Bit Ganzzahl
- ITB - wandelt eine 16 Bit Ganzzahl in eine BCD-Zahl
- BTD - wandelt eine BCD-Zahl in eine 32 Bit Ganzzahl
- ITD - wandelt eine 16 Bit Ganzzahl in eine 32 Bit Ganzzahl
- DTB - wandelt eine 32 Bit Ganzzahl in eine BCD-Zahl um
- DTR - wandelt eine 32 Bit Ganzzahl in eine Gleitpunktzahl um
Die Bildung von Komplementen von Ganzzahlen sowie der Vorzeichenwechsel bei Gleitpunktzahlen wird mit diesen Befehlen gemacht:
- INVI - erzeugen des Einer-Komplements einer 16 Bit Ganzzahl
- INVD - erzeugen des Einer-Komplements einer 32 Bit Ganzzahl
- NEGI - erzeugen des Zweier-Komplements einer 16 Bit Ganzzahl
- NEGD - erzeugen des Zweier-Komplements einer 32 Bit Ganzzahl
- NEGR - wechseln des Vorzeichens einer Gleitpunktzahl
32 Bit Gleitpunktzahlen im Format IEEE-floating point werden mit folgenden Befehlen umgewandelt. Die Unterschiede zwischen den einzelnen Befehlen liegen darin, wie man diese rundet:
- RND - eine Gleitpunktzahl (32 Bit) runden zur nächstliegenden Ganzzahl (32 Bit)
- TRUNC - erzeugen einer Ganzzahl durch weglassen der Nachkommastellen
- RND+ - erzeugen der nächsthöheren Ganzzahl aus einer Gleitpunktzahl
- RND- - erzeugen der nächstniederen Ganzzahl aus einer Gleitpunktzahl
Diese Befehle tauschen den Inhalt von Akku 1:
- TAW - tauscht die Reihenfolge der Bytes im AKKU1 bis zu 16 Bit langer Zahlen
- TAD - tauscht die Reihenfolge der Bytes im AKKU1 bis zu 32 Bit langer Zahlen
Umwandlungsbeispiele in AWL
L MW 6 //Laden von Merkerwort 6 (16 Bit Ganzzahl) in den AKKU1
ITB //Umwandlungsoperation von Ganzzahl nach BCD-Zahl
T MW 6 //In Merkerwort 6 steht nun die 16 Bit Ganzzahl als BCD-Zahl
und kann nun aus AKKU1 ausgelesen werden
BTI - umwandeln einer dreistelligen BCD-Zahl in eine 16 Bit Ganzzahl
Der Inhalt des AKKU1 wird als dreistellige BCD-Zahl (±999) gelesen, in einen ganzzahligen Wert (16 Bit) umgewandelt und wird in AKKU1-L gespeichert. Umgewandelt werden die Bits 0 bis 11. Die Bits 12 bis 14 sind ohne Bedeutung, Bit 15 gibt das Vorzeichen der BCD-Zahl an. Bei dem Wert "0" auf Bit 15 handelt es sich um eine positive BCD-Zahl und bei dem Wert "1" auf Bit 15 handelt es sich um eine negative BCD-Zahl. Liegt eine Stelle einer BCD-Zahl im Bereich der Pseudotetraden, also zwischen 10 und 15, dann tritt ein Fehler auf bei der Umwandlung. Ist ein OB121 programmiert, so wird er im Fall eines solchen Umwandlungsfehlers aufgerufen. In OB121 kann festgelegt werden wie die SPS auf Programmfehler reagieren soll. Ansonsten geht die CPU in den STOP-Zustand.
ITB - umwandeln einer 16 Bit Ganzzahl in eine dreistellige BCD-Zahl
Der Inhalt von AKKU1 wird als 16 Bit Ganzzahl gelesen, in eine dreistellige BCD-Zahl (±999) umgewandelt und wird in AKKU1-L von Bit 0 bis Bit 11 gespeichert. Bit 12 bis Bit 15 geben das Vorzeichen der gewandelten Zahl an, "0000" steht für eine positive BCD-Zahl und "1111" steht für eine negative BCD-Zahl. Im Fall eines Überlaufs (Umwandlungsversuch in BCD-Zahl 10 bis 15) führen die Bits OV und OS des Statuswortes den Wert "1".
BTD - umwandeln einer BCD-Zahl in eine 32 Bit Ganzzahl
Der Inhalt des AKKU1 wird als siebenstellige BCD-Zahl (±999 9999) gelesen, in einen ganzzahligen Wert (32 Bit) umgewandelt und wird in AKKU1-L gespeichert. Umgewandelt werden die Bits 0 bis 27. Die Bits 28 bis 30 sind ohne Bedeutung, Bit 31 gibt das Vorzeichen der BCD-Zahl an. Bei dem Wert "0" auf Bit 31 handelt es sich um eine positive BCD-Zahl und bei dem Wert "1" auf Bit 31 handelt es sich um eine negative BCD-Zahl. Liegt eine Stelle einer BCD-Zahl im Bereich der Pseudotetraden, also zwischen 10 und 15, dann tritt ein Fehler auf bei der Umwandlung. Ist ein OB121 programmiert, so wird er im Fall eines solchen Umwandlungsfehlers aufgerufen. Ansonsten geht die CPU in den STOP-Zustand.
ITD - umwandeln einer 16 Bit Ganzzahl in eine 32 Bit Ganzzahl
Der Inhalt von AKKU1 wird als 16 Bit Ganzzahl gelesen, in eine 32 Bit Ganzzahl umgewandelt und in AKKU1 gespeichert.
DTB - umwandeln einer 32 Bit Ganzzahl in eine BCD-Zahl um
Der Inhalt von AKKU1 wird als 32 Bit Ganzzahl gelesen, in eine siebenstellige BCD-Zahl (±9 999 999) umgewandelt und in AKKU1 gespeichert. Umgewandelt werden die Bits 0 bis 27. Die Bits 28 bis 31 geben das Vorzeichen der BCD-Zahl an. "0000" steht für eine positive BCD-Zahl und "1111" steht für eine negative BCD-Zahl. Im Fall eines Überlaufs (Umwandlungsversuch in BCD-Zahl 10 bis 15) führen die Bit OV und OS des Statuswortes den Wert "1".
DTR - wandelt eine 32 Bit Ganzzahl in eine Gleitpunktzahl um
Der Inhalt von AKKU1 wird als 32 Bit Ganzzahl gelesen, in eine Gleitpunktzahl umgewandelt und in AKKU1 gespeichert. Hat die 32 Bit Ganzzahl eine höhere Genauigkeit als die Gleitpunktzahl, dann rundet die Operation das Ergebnis.
INVI - erzeugen des Einer-Komplements einer 16 Bit Ganzzahl
Der Inhalt von AKKU1 wird als 16 Bit Ganzzahl gelesen. Dann werden die Stellen der 16 Bit Ganzzahl in ihrem Wert getauscht und in AKKU1 gespeichert. Dadurch wird der Wert jedes Bits umgekehrt. Die Stellen mit dem Wert "0" werden durch den Wert "1" ersetzt und die Stellen mit dem Wert "1" durch den Wert "0".
INVD - erzeugen des Einer-Komplements einer 32 Bit Ganzzahl
Der Inhalt von AKKU1 wird als 32 Bit Ganzzahl gelesen. Dann werden die Stellen der 32 Bit Ganzzahl in ihrem Wert getauscht und in AKKU1 gespeichert. Dadurch wird der Wert jedes Bits umgekehrt. Die Stellen mit dem Wert "0" werden durch den Wert "1" ersetzt und die Stellen mit dem Wert "1" durch den Wert "0".
NEGI - erzeugen des Zweier-Komplements einer 16 Bit Ganzzahl
Der Inhalt von AKKU1 wird als 16 Bit Ganzzahl gelesen. Dann werden die Stellen der 16 Bit Ganzzahl in ihrem Wert getauscht und in AKKU1 gespeichert. Dadurch wird der Wert jedes Bits umgekehrt. Die Stellen mit dem Wert "0" werden durch den Wert "1" ersetzt und die Stellen mit dem Wert "1" durch den Wert "0". Zu dem Ergebnis (Einer-Komplement) wird eine "1" an der Stellenwertigkeit von Bit 0 addiert (bilden des Zweierkomplements). Das Zweier-Komplement einer 16 Bit Ganzzahl erhält man auch indem man die Ganzzahl mit -1 multipliziert. Die Statusbits A1, A0, OS und OV werden als Ergebnis der Operation gesetzt.
NEGD - erzeugen des Zweier-Komplements einer 32 Bit Ganzzahl
Der Inhalt von AKKU1 wird als 32 Bit Ganzzahl gelesen. Dann werden die Stellen der 32 Bit Ganzzahl in ihrem Wert getauscht und in AKKU1 gespeichert. Dadurch wird der Wert jedes Bits umgekehrt. Die Stellen mit dem Wert "0" werden durch den Wert "1" ersetzt und die Stellen mit dem Wert "1" durch den Wert "0". Zu dem Ergebnis (Einer-Komplement) wird eine "1" an der Stellenwertigkeit von Bit 0 addiert (bilden des Zweierkomplements). Das Zweier-Komplement einer 32 Bit Ganzzahl erhält man auch indem man die Ganzzahl mit -1 multipliziert. Die Statusbits A1, A0, OS und OV werden als Ergebnis der Operation gesetzt.
NEGR - wechseln des Vorzeichens einer Gleitpunktzahl
Der Inhalt von AKKU1 wird als 32 Bit Gleitpunktzahl gelesen. Dann wird das Vorzeichen umgekehrt wobei die Bits von Exponent und Mantisse gleich bleiben. Es wird nur das MSB (Bit 31, Vorzeichenbit der Gleitpunktzahl) umgekehrt. Das Ergebnis wird in AKKU1 gespeichert.
RND - eine Gleitpunktzahl (32 Bit) runden zur nächstliegenden Ganzzahl (32 Bit)
Der Inhalt von AKKU1 wird als 32 Bit Gleitpunktzahl gelesen und durch runden in eine 32 Bit Ganzzahl umgewandelt (3.4 -> 3 oder 3.51 -> 4). Als Ergebnis wird die am nächsten liegende Ganzzahl in AKKU1 gespeichert. Beträgt der gebrochene Anteil ,5 wird die gerade Zahl ausgegeben (zum Beispiel 3,5 -> 4 bzw. 4,5 -> 4). Tritt ein Fehler auf (z.B. Vorliegen einer NaN oder einer 32 Bit Gleitpunktzahl, die nicht als 32 Bit Ganzzahl dargestellt werden kann), wird die Umwandlung nicht ausgeführt, sondern Überlauf angezeigt. Liegt die Zahl außerhalb des zulässigen Bereichs, haben das OS-Bit und das OV-Bit des Statuswortes den Wert "1".
TRUNC - erzeugen einer Ganzzahl durch weglassen der Nachkommastellen
Der Inhalt von AKKU1 wird als 32 Bit Gleitpunktzahl gelesen und in eine 32 Bit Ganzzahl umgewandelt. Als Ergebnis wird der ganzzahlige Anteil der 32 Bit Gleitpunktzahl in AKU1 gespeichert. Tritt ein Fehler auf (z.B. Vorliegen einer NaN oder einer 32 Bit Gleitpunktzahl, die nicht als 32 Bit Ganzzahl dargestellt werden kann), wird die Umwandlung nicht ausgeführt, sondern Überlauf angezeigt. Liegt die Zahl außerhalb des zulässigen Bereichs, haben das OS-Bit und das OV-Bit des Statuswortes den Wert "1".
RND+ - erzeugen der nächsthöheren Ganzzahl aus einer Gleitpunktzahl
Der Inhalt von AKKU1 wird als 32 Bit Gleitpunktzahl gelesen und in eine 32 Bit Ganzzahl umgewandelt. Als Ergebnis wird die nächste Ganzzahl, die größer oder gleich der in den AKKU1 geladenen Gleitpunktzahl ist, als Ergebnis in AKKU1 gespeichert. Tritt ein Fehler auf (z.B. Vorliegen einer NaN oder einer 32 Bit Gleitpunktzahl, die nicht als 32 Bit Ganzzahl dargestellt werden kann), wird die Umwandlung nicht ausgeführt, sondern Überlauf angezeigt. Liegt die Zahl außerhalb des zulässigen Bereichs, haben das OS-Bit und das OV-Bit des Statuswortes den Wert "1".
RND- - erzeugen der nächstniederen Ganzzahl aus einer Gleitpunktzahl
Der Inhalt von AKKU1 wird als 32 Bit Gleitpunktzahl gelesen und in eine 32 Bit Ganzzahl umgewandelt. Als Ergebnis wird die nächste Ganzzahl, die kleiner oder gleich der in den AKKU1 geladenen Gleitpunktzahl ist, als Ergebnis in AKKU1 gespeichert. Tritt ein Fehler auf (z.B. Vorliegen einer NaN oder einer 32 Bit Gleitpunktzahl, die nicht als 32 Bit Ganzzahl dargestellt werden kann), wird die Umwandlung nicht ausgeführt, sondern Überlauf angezeigt. Liegt die Zahl außerhalb des zulässigen Bereichs, haben das OS-Bit und das OV-Bit des Statuswortes den Wert "1".
TAW - tauscht die Reihenfolge der Bytes im AKKU1 bis zu 16 Bit langer Zahlen
Die Operation TAW kehrt die Reihenfolge der Bytes 0 und 1 in AKKU1 um. Die Aufteilung der Bytes in AKKU1 vor der Operation TAW ist folgende: Byte3, Byte2, Byte1, Byte0. Nach dem Ausführen der Operation ist die Anordnung der Bytes in AKKU1 folgende: Byte3, Byte2, Byte0, Byte1. Gespeichert wird das Ergebnis in AKKU1.
TAD - tauscht die Reihenfolge der Bytes im AKKU1 bis zu 32 Bit langer Zahlen
Die Operation TAD kehrt die Reihenfolge der Bytes 0 bis 4 in AKKU1 um. Die Aufteilung der Bytes in AKKU1 vor der Operation TAD ist folgende: Byte3, Byte2, Byte1, Byte0. Nach dem Ausführen der Operation ist die Anordnung der Bytes in AKKU1 folgende: Byte0, Byte1, Byte2, Byte3. Gespeichert wird das Ergebnis in AKKU1.