Mathematische Funktionen für Ganzzahlen in AWL
In SPS-Programmen wird häufig mit Zahlen gerechnet. Hierfür gibt es mathematische Funktionen, die auch in AWL eingegeben werden können. Grundsätzlich wird zwischen Berechnungen mit Ganzzahlen und Gleitpunktzahlen unterschieden. Zum Berechnen von zwei Zahlen werden beide Akkus (1 und 2) benutzt. Die mathematischen Funktionen verknüpfen die Inhalte der beiden Akkus. Das Ergebnis wird wiederum in Akku 1 abgelegt. Der Inhalt von Akku 2 bleibt bei CPU's mit zwei Akkus. Sollte die CPU vier Akkus haben, wird der Inhalt von Akku 4 in Akku 3 und der Inhalt von Akku 3 in Akku 2 verschoben bzw. kopiert. Akku 4 würde dann bleiben wie es ist.
Mit folgenden Befehlen kann man in AWL Ganzzahlen, egal ob 16 Bit oder 32 Bit, berechnen:
- +I Ganze Zahlen addieren (16 Bit Ganzzahlen)
- -I Ganze Zahlen subtrahieren (16 Bit Ganzzahlen)
- *I Ganze Zahlen multiplizieren (16 Bit Ganzzahlen)
- /I Ganze Zahlen dividieren (16 Bit Ganzzahlen)
- + addieren von Ganzzahlkonstanten (16 Bit, 32 Bit)
- +D Ganze Zahlen addieren (32 Bit Ganzzahlen)
- -D Ganze Zahlen subtrahieren (32 Bit Ganzzahlen)
- *D Ganze Zahlen multiplizieren (32 Bit Ganzzahlen)
- /D Ganze Zahlen dividieren (32 Bit Ganzzahlen)
- MOD Divisionsrest gewinnen (32 Bit Ganzzahlen)
Man kann nur jeweils zwei Zahlen des gleichen Typs berechnen. Liegen die Zahlen in unterschiedlichen Formaten vor, z.B. INT und DINT, muss man sich für ein Format entscheiden und eine Zahl entsprechend umwandeln. Hierfür gibt es die Umwandlungsfunktionen.
Eine mathematische Berechnung beeinflusst die Bits OV, OS, !0 und A1 des Statusworts. Dadurch, dass INT- oder DINT-Zahlen mit 16 Bits und 32 Bits eine bestimmte Länge haben, ergeben sich dadurch zwangsläufig Beschränkungen hinsichtlich des gültigen Zahlenraums. Solche Bereichsüberschreitungen mit ungültigen Zahlen können mit den Bits im Statuswort ausgewertet werden. Diese haben dabei folgende Signalstände:
Ungültiger Bereich | A1 | A0 | OV | OS |
---|---|---|---|---|
Unterschreitung bei Addition 16 Bit: Ergebnis = -65536 32 Bit: Ergebnis = -4 294 967 296 |
0 | 0 | 1 | 1 |
Unterschreitung bei Multiplikation 16 Bit: Ergebnis < -32 768 (negative Zahl) 32 Bit: Ergebnis < -2 147 483 648 (negative Zahl) |
0 | 1 | 1 | 1 |
Überlauf bei Addition, Subtraktion 16 Bit: Ergebnis > 32 767 (positive Zahl) 32 Bit: Ergebnis > 2 147 483 647 (positive Zahl) |
0 | 1 | 1 | 1 |
Überlauf bei Multiplikation, Division 16 Bit: Ergebnis > 32 767 (positive Zahl) 32 Bit: Ergebnis > 2 147 483 647 (positive Zahl) |
1 | 0 | 1 | 1 |
Unterschreitung bei Addition, Subtraktion 16 Bit: Ergebnis < -32 768 (negative Zahl) 32 Bit: Ergebnis < -2 147 483 648 (negative Zahl) |
1 | 0 | 1 | 1 |
Division durch 0 | 1 | 1 | 1 | 1 |
Gültiger Bereich | A1 | A0 | OV | OS |
0 (Null) | 0 | 0 | 0 | * |
16 Bit: -32 768 <= Ergebnis < 0 (negative Zahl) 32 Bit: -2 147 483 648 <= Ergebnis < 0 (negative Zahl) |
0 | 1 | 0 | * |
16 Bit: 32 767 >= Ergebnis > 0 (positive Zahl) 32 Bit: 2 147 483 647 >= Ergebnis > 0 (positive Zahl) |
1 | 0 | 0 | * |
* Ohne Einfluss auf das OS-Bit.
Operation | A1 | A0 | OV | OS |
---|---|---|---|---|
+D: Ergebnis = -4 294 967 296 | 0 | 0 | 1 | 1 |
/D oder MOD: Division durch 0 | 1 | 1 | 1 | 1 |