Mathematische Funktionen für Festpunktzahlen in KOP
In einem SPS-Programm kann man auch mathematische Operationen durchführen. Hierbei wird zwischen Festpunktzahlen (Ganzzahlen) und Gleitpunktzahlen (mit Komma) unterschieden. Ganzzahlen liegen entweder als 16-Bit INT-Zahlen vor oder als 32-Bit DINT-Zahlen. Die Bausteine für mathematische Operationen für Ganzzahlen befinden sich in Step7 unterhalb des Knotens Festpunkt-Funktionen. Folgende Rechenoperationen können mit den Bausteinen durchgeführt werden:
- ADD_I Ganze Zahlen addieren (16 Bit Ganzzahlen)
- SUB_I Ganze Zahlen subtrahieren (16 Bit Ganzzahlen)
- MUL_I Ganze Zahlen multiplizieren (16 Bit Ganzzahlen)
- DIV_I Ganze Zahlen dividieren (16 Bit Ganzzahlen)
- ADD_DI Ganze Zahlen addieren (32 Bit Ganzzahlen)
- SUB_DI Ganze Zahlen subtrahieren (32 Bit Ganzzahlen)
- MUL_DI Ganze Zahlen multiplizieren (32 Bit Ganzzahlen)
- DIV_DI Ganze Zahlen dividieren (32 Bit Ganzzahlen)
- MOD_DI Divisionsrest gewinnen (32 Bit Ganzzahlen)
Es können nur mit jeweils 2 Zahlen gerechnet werden, die außerdem das gleiche Zahlenformat haben müssen. Möchte man mit Zahlen rechnen, die unterschiedliche Zahlenformate haben, muss man eine Zahl mit den Umwandlungsfunktionen erst in ein anderes Zahlenformat unwandeln.
Mit den mathematischen Rechenoperationen werden auch die Bits OV, OS, A0 und A1 im Statuswort beeinflusst. Mit diesen Bits ist es möglich, die Rechenoperationen auszuwerten. Dadurch, dass sich durch die Länge von 16 oder 32 Bits eine Beschränkung des Zahlenraums ergibt, gibt es gültige und ungültige Zahlenbereiche. Mit den Bits im Statuswort werden solche Bereichsüberschneidungen ausgewertet. Die Bits haben dabei folgende Signalzustände:
Ungültige Bereiche | 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 Bit OS.
Operation | A1 | A0 | OV | OS |
---|---|---|---|---|
ADD_DI: Ergebnis = -4 294 967 296 | 0 | 0 | 1 | 1 |
DIV_DI oder MOD_DI: Division durch 0 | 1 | 1 | 1 | 1 |
Übersicht über die mathematischen Funktionen für Ganzzahlen
ADD_I: Addition von 16 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format INT (16 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format INT (16 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen addieren (16 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen addieren (16 Bit) durchgeführt. Am Ausgang OUT kann das Ergebnis abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 16 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
SUB_I: Subtraktion von 16 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format INT (16 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format INT (16 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen subtrahieren (16 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen subtrahieren (16 Bit) durchgeführt. IN2 wird von IN1 subtrahiert (IN1 - IN2 = OUT). Am Ausgang OUT kann das Ergebnis abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 16 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
MUL_I: Multiplikation von 16 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format INT (16 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format INT (16 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen multiplizieren (16 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen multiplizieren (16 Bit) durchgeführt. IN1 wird mit IN2 multipliziert (IN1 x IN2 = OUT). Am Ausgang OUT kann das Ergebnis abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 16 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
DIV_I: Division von 16 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format INT (16 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format INT (16 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen dividieren (16 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen dividieren (16 Bit) durchgeführt. IN1 wird durch IN2 dividiert (IN1 ÷ IN2 = OUT). Am Ausgang OUT kann das Ergebnis als ganzzahliger Quotient (ganzzahliger Anteil der Division) abgefragt werden. Der Divisionsrest kann nicht abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 16 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
ADD_DI: Addition von 32 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format DINT (32 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format DINT (32 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen addieren (32 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen addieren (16 Bit) durchgeführt. Am Ausgang OUT kann das Ergebnis abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 32 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
SUB_DI: Subtraktion von 32 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format DINT (32 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format DINT (32 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen subtrahieren (32 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen subtrahieren (32 Bit) durchgeführt. IN2 wird von IN1 subtrahiert (IN1 - IN2 = OUT). Am Ausgang OUT kann das Ergebnis abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 32 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
MUL_DI: Multiplikation von 32 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format DINT (32 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format DINT (32 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen multiplizieren (32 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen multiplizieren (32 Bit) durchgeführt. IN1 wird mit IN2 multipliziert (IN1 x IN2 = OUT). Am Ausgang OUT kann das Ergebnis abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 32 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
DIV_DI: Division von 32 Bit Ganzzahlen
Am Eingang IN1 wird die erste Zahl vom Format DINT (32 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format DINT (32 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen dividieren (32 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Ganze Zahlen dividieren (32 Bit) durchgeführt. IN1 wird durch IN2 dividiert (IN1 ÷ IN2 = OUT). Am Ausgang OUT kann das Ergebnis als ganzzahliger Quotient (ganzzahliger Anteil der Division) abgefragt werden. Der Divisionsrest kann nicht abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 32 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".
MOD_DI: gewinnen des Divisionsrestes
Am Eingang IN1 wird die erste Zahl vom Format DINT (32 Bit Ganzzahl) und am Eingang IN2 die zweite Zahl vom Format DINT (32 Bit Ganzzahl) eingelesen. Die Rechenoperation Ganze Zahlen dividieren (32 Bit) wird nicht ausgeführt, wenn der Eingang EN den Wert"0" führt oder sich das Ergebnis außerhalb des zulässigen Bereiches befindet. In diesem Fall führt auch der Ausgang ENO den Wert "0".
Erhält der Freigabeeingang EN den Signalzustand "1", dann wird die Rechenoperation Divisionsrest gewinnen (32 Bit) durchgeführt. IN1 wird durch IN2 dividiert (IN1 ÷ IN2 = OUT). Am Ausgang OUT kann der Divisionsrest abgefragt werden. Berechnet die Operation ein Ergebnis außerhalb des gültigen Bereiches von 32 Bit, dann führen das OV-Bit und das OS-Bit den Wert "1" und der Freigabeausgang ENO den Wert"0".