Zahlenformate bei Speicherprogrammierbaren Steuerungen
In einer SPS werden viele Zahlen verarbeitet. Dabei gibt es unterschiedliche Zahlenformate, für die es unterschiedliche Datentypen gibt. Grundsätzlich wird zwischen Ganzzahlen und Gleitpunktzahlen unterschieden. Eine häufige Fehlerquelle ist, dass man versucht, Zahlen mit unterschiedlichen Datentypen zu addieren. Hierbei kommt es dabei häufig zu Problemen bzw. es ist erst gar nicht möglich. Zahlen mit unterschiedlichen Datentypen kann man nicht addieren. In solchen Fällen muss man zuerst die Zahl in einen identischen Datentypen umwandeln.
Ganzzahlen
Mit Ganzzahlen sind ganze Zahlen, ohne Nachkommastelle gemeint. Der darstellbare Zahlenraum hängt von der Anzahl der zur Verfügung stehenden Bits ab. Mit nur einem Bit kann man z.B. nur die Ziffern 0 und 1 darstellen. Bei Speicherprogrammierbaren Steuerungen werden Ganzzahlen mit unterschiedlichen Datentypen verwendet. Diese sind:
- Integer-Zahlen, Kurzform INT: Ganzzahlen vom Typ Integer haben eine Bitlänge von 16 (Bit 0 bis Bit 15). Die belegte Bitlänge wird auch als ein Wort oder 2 Bytes bezeichnet. Als Vorzeichenbit MSB, das für die Unterscheidung zwischen negativen und positiven Zahlen benötigt wird, wird dabei Bit 15 benutzt.
- Doppelinteger-Zahlen, Kurzform DINT: Ganzzahlen vom Typ Doppelinteger haben eine Bitlänge von 32 (Bit 0 bis Bit 31). Die Bitlänge wird auch als Doppelwort oder 4 Bytes genannt. Als Vorzeichenbit wird bei DINT-Zahlen Bit 31 benutzt.
Siehe auch Bit und Byte sowie Dualzahlen.
INTEGER: Bei Ganzzahlen vom Typ INT wird Bit 15 als Vorzeichenbit, auch MSB oder Most Significant Bit genannt, benutzt. Dementsprechend bleiben 15 Bits (Bit 0 bis Bit 14) für die Darstellung der Zahlenwerte übrig. Da sowohl positive als auch negative Zahlen dargestellt werden können, erstreckt sich der darstellbare Bereich von -3276810 (-215) bis +3276710 (215).
DOPPELINTEGER: Bei Ganzzahlen vom Typ DINT wird Bit 31 als Vorzeichenbit benutzt. Für die Darstellung der Zahlenwerte bleiben somit 31 Bits (Bit 0 bis Bit 30) übrig. Damit kann man einen Zahlenbereich von -214748364810 (-231) bis +214748364710 (231) darstellen.
Vorzeichenbit MSB:
Das Vorzeichenbit wird dabei wie folgt belegt:
- Negative Zahlen: Vorzeichenbit auf 1
- Positive Zahlen: Vorzeichenbit auf 0
Das bedeutet, ist das Bit mit dem höchsten Stellenwert (Bit 15 bei INT, Bit 31 bei DINT) eine 0, dann ist die dargestellte Zahl positiv, z.B. würde die Zahl 0000 0000 0000 10002 vom Typ INT eine positive 8 darstellen.
Bei der Darstellung negativer Zahlen wird das Zweierkomplement gebildet. Das bedeutet, alle Ziffern werden negiert (Einerkomplement) und mit der Dualzahl 1 addiert. Die negative Zahl -8 hätte demnach folgendes Bitmuster: 1111 1111 1111 10002.
Näheres siehe unter Komplementbildung.
Gleitpunktzahlen
Mit Gleitpunktzahlen sind Zahlen gemeint, die eine Nachkommastellen haben, also z.B. die Dezimalzahl 8,7510. Bei Speicherprogrammierbaren Steuerungen werden Gleitpunktzahlen mit folgendem Datentypen verwendet:
- REAL: Gleitpunktzahlen vom Datentyp REAL haben eine Bitlänge von 32 (Bit 0 bis Bit 31). Auch hierbei wird das Bit mit dem höchsten Stellenwert als Vorzeichenbit (Bit 31) benutzt. Mit dem Datentyp REAL können einerseits sehr große Zahlen darstellen. Andererseits kann man damit auch sehr kleine Zahlen sehr gut darstellen, da man auch Nachkommastellen abbilden kann.
Für die Darstellung von Gleitpunktzahlen vom Datentyp REAL werden die zur Verfügung stehenden 32 Bits in 3 Bereiche aufgeteilt. Diese werden bei der Auswertung einzeln berücksichtigt.
- Bit 31 wird als Vorzeichenbit MSB benutzt.
- Bit 30 (27) bis Bit 23 (20), (8 Bits) wird als Exponent benutzt. Der Exponent gibt die Potenz der Basis an, die man mit der Zahl multiplizieren muss. Bei Dualzahlen ist die Basis die 2. Bei Speicherprogrammierbaren Steuerungen wird der Exponent als 8 Bit Dualzahl ohne Vorzeichen dargestellt und ergibt sich aus der Subtraktion der Zahl 12710. Damit wird die Kommaposition abgebildet.
- Bit 22 ( 2-1 ) bis Bit 0 ( 2-23) wird als Mantisse benutzt. Hier werden die Zahlenwerte rechts vom Komma abgelegt. Somit entscheidet die Mantisse darüber, wie genau die Gleitpunktzahlen dargestellt werden können. Der Mantisse wird eine 1 vorangestellt, die nicht darstellbar ist und auch nicht gespeichert wird. Mit dem Zahlenwert der Mantisse ergibt das einen Zahlenwert zwischen 110 und 210.
Beim Exponenten gilt folgendes: 1 <= Exponent <= 254 und durch die Verwendung des BIAS +127 entfällt ein extra Vorzeichen.
Unterschiede bei 32 Bits und 64 Bits
In der heutigen Zeit werden 32-Bit Rechner und 64-Bit Rechner eingesetzt. Daher musste festgelegt werden, wie viele Stellen für den Exponenten und wie viele Stellen für die Mantisse bei den jeweiligen Systemen reserviert werden sollen, um Gleitpunktzahlen darzustellen. Hier hat die IEEE zwei Normen festgelegt und dabei den Datentyp REAL in SHORT REAL und LONG REAL unterteilt.
- 32 Bits: SHORT REAL, Bit 31 als Vorzeichenbit, Bit 30 - 23 für den Exponenten (8 Bits), Bit 22 - Bit 0 für die Mantisse (23 Bits). Der darstellbare Zahlenbereich ist dabei 1,5 x 10-45 bis 3,4 x 1038.
- 64 Bits: LONG REAL, Bit 63 als Vorzeichenbit, Bit 62 - 52 für den Exponenten (11 Bits), Bit 0 - Bit 51 für die Mantisse (52 Bits). Der darstellbare Zahlenbereich ist dabei 5,0 x 10-324 bis 1,7 x 10308.
Bei Speicherprogrammierbaren Steuerungen wird für die Darstellung von Gleitpunktzahlen der Datentyp SHORT REAL mit einer Bitlänge von 32 benutzt und der Datentyp wird lediglich REAL genannt.
Umrechnung dezimaler Gleitpunktzahlen in duale Gleitpunktzahlen
Duale Gleitpunktzahlen lassen sich in dezimale Gleitpunktzahlen umrechnen und umgekehrt. Allerdings ist eine exakte Umrechnung von dezimalen Gleitpunktzahlen in duale Gleitpunktzahlen nicht immer möglich. Das liegt daran, dass die Basis von Dualzahlen 2 ist. Daher haben die Nachkommastellen die Wertigkeit der negativen Potenz zur Basis von 2 (2-1 - 2-n). Somit kann man nur die Nachkommastellen exakt abbilden, die sich aus der Summe der negativen Potenzen zur Basis von 2 ergeben. Bei allen anderen Nachkommastellen kann man nur Näherungswerte ermitteln.
- Beispiel 0,510: Lässt sich exakt in Dual darstellen, da die Zahl die negative Potenz 2-1 ist.
- Beispiel 0,7510: Lässt sich ebenfalls exakt in Dual darstellen, da die Zahl aus der Summe der negativen Potenzen 2-1 und 2-2 gebildet wird.
- Beispiel 0,110: Lässt sich nicht exakt darstellen, da man mit der Summe der negativen Potenzen 2-1 - 2-n die Zahl nicht darstellen kann.
Für die Zahl 0,110 kann man nur folgende Näherungswerte ermitteln:
- 0,0999999940395355210, entspricht der dualen Gleitpunktzahl 0 0111 1011 100110011001100110011002
- 0,1000000014901161210, entspricht der dualen Gleitpunktzahl 0 0111 1011 100110011001100110011012.
Bei Speicherprogrammierbaren Steuerungen ist für die Eingabe von Gleitpunktzahlen vom Datentyp REAL häufig eine Beschränkung vorhanden. Die Eingabe weiterer Nachkommastellen ist dabei nicht möglich. In Step7 liegt die Beschränkung z.B. bei 6 Nachkommastellen.
Beispiel für die Umrechnung einer dualer Gleitpuntzahl in Dezimal
Umrechnung einer dualen Gleitpunktzahl in eine dezimale Gleitpunktzahl. Folgende Bitmuster-darstellung ist gegeben:
- Vorzeichenbit MSB: 0. Die Zahl ist positiv.
- Exponent: 0111 1000. Bedeutet = 12010.
- Mantisse: Bit 22 ist "1", entspricht 2-1 also 0,5. Die übrigen Ziffern sind 0 und werden daher nicht betrachtet.
Formel für die Umrechnung:
1 + Mantisse · ( 2(Exp-127) ) = 1,5 · ( 2(120-127) ) = 1,5 · (2-7) = 1,5 · 0,0078125 = 0,01171875.
Zum Schluss noch das Vorzeichen setzen: + 0,01171875
Umrechnung einer dezimalen Gleitpunktzahl in Dual
Man kann auch dezimale Gleitpunktzahlen (z.B. 3,210) in eine duale Gleitpunktzahlen umrechnen. Zu beachten ist hier, dass nicht alle Nachkommastellen exakt in Dual dargestellt werden können. Man kann nur die Nachkommastellen exakt darstellen, die sich aus der Summe der negativen Potenzen 2-1 - 2-23 bilden lassen (bei 32 Bit).
Im 1. Schritt berechnet man die Mantisse der Gleitpunktzahle. Hierfür verwendet man die Formel Mantisse = GPZ10 · ( 2n ), sodass sich im Ergebnis diese Form ergibt:
- 1 <= Mantisse < 2
Das bedeutet, der Exponent n bei ( 2n) muss so gewählt werden, dass das Ergebnis für die Mantisse einen Wert zwischen 1 und 2 hat.
Wenn für den Exponenten n die Zahl kleiner als -12610 oder größer als +12710 errechnet wird, dann kann die Zahl als SHORT REAL nicht dargestellt werden. Das Ergebnis wäre dann nämlich entweder 0 oder unendlich und wird als NaN bezeichnet, was übersetzt Not a Number bedeutet.
Um negative Werte zu vermeiden, wird der Exponent mit dem BIAS-Wert verrechnet, der bei SHORT-Real 127 ist. Daher kann man nur die Exponenten im Bereich -126 bis +127 speichern, die als Charakteristik zwischen 1 - 255 gespeichert werden. Somit bleiben die Werte 0 und 255 übrig. Diese beiden Werte sind als Charakteristik für die Zahlenwerte Null und Unendlich und somit als NaN reserviert.
Im 2. Schritt werden die Nachkommastellen der Mantisse in Dual dargestellt. Hier hat man entweder das Glück, dass die Nachkommastellen durch die Summe der negativen Potenzen 2-1 - 2-23 dargestellt werden können oder man kann nur einen Näherungswert ermitteln. Ist eine negative Potenz in der Mantisse enthalten, wird eine 1 an die entsprechende Stelle gesetzt. Ist eine negative Potenz nicht enthalten, setzt man eine 0.
Im 3. Schritt ermittelt man den Exponenten der Gleitpunktzahl als Dualzahl. Dabei verwendet man folgende Formel:
- Exponent = (y) + ( EBias)
EBias ist hier die Zahl 127 die bereits weiter oben im Beispiel benutzt wurde. EBias legt die Größe des Zahlenbereichs fest, bei 32 Bit GPZ2 eben durch 12710 und bei 64 Bit GPZ2 ist es die 102310.
Beispiel für die Umrechnung der Gleitpunktzahl 3,210
Ermitteln der Mantisse unter Verwendung der Formel GPZ10 · ( 2n ) und Auswahl des Exponenten, so dass man die Mantisse in der Form 1 <= Mantisse < 2 erhält:
- Mantisse von 3,210 = 3,210 x 2-1 = 1,6
Hier wurde der Exponent 2-1 gewählt, weil dadurch das Ergebnis zwischen 1 und 2 liegt.
Nun wird die Dezimalzahl 0,6 in Dual umgerechnet. Die Dezimalzahl 0,6 kann nicht exakt in Dual dargestellt werden, da man die Zahl nicht aus der Summe der Potenzen 2-1 - 2-23 bilden kann. Also wird ein Näherungswert ermittelt. Wird eine Potenz verwendet, schreibt man eine 1 in die Mantisse, bei nicht verwendeten Potenzen wird eine 0 eingesetzt.
Für Umrechnung der Nachkommastelle 0,6 sähe das folgendermaßen aus:
1x2-1 + 0x2-2 + 0x2-3 + 1x2-4 + 1x2-5 +0x2-6 + 0x2-7 + 1x2-8 + 1x2-9 + 0x2-10 + 0x2-11 + 1x2-12 + 1x2-13 + 0x2-14 + 0x2-15 + 1x2-16 + 1x2-17 + 0x2-18 + 0x2-19 + 1x2-20 + 1x2-21 + 0x2-22 + 1x2-23
- Das ergibt die Dualzahl 100 1100 1100 1100 1100 11012
- Der Näherungswert entspricht dabei 0,60000002384185791075625
- Die Mantisse wäre: 1 + 0,60000002384185791075625 = 1,60000002384185791075625
Daraus ergibt sich folgendes Aussehen für die Stellen in der Mantisse:
X XXXX XXXX 100 1100 1100 1100 1100 11012
Nun der Exponent für:
Exponent = (y) + ( EBias) für Dezimalzahlen >= 1
Exponent = ( - y) + ( EBias) für Dezimalzahlen < 1
Exponent = 110 + 12710 = 12810
Bei Gleitpunktzahlen >= 1 wird für die Variable (y) der positive Wert des Exonenten eingesetzt, der bei der Ermittlung der Mantisse GPZ10 · (2-n) als (n) verwendet wurde. Bei Gleitpunktzahlen < 1 setzt man den negativen Wert des ermittelten Exponenten ein.
In diesem Fall wird 12810 nach dual umgewandelt. Man erhält 1000 00002.
Zum Schluss setzt man noch das Vorzeichenbit und man erhält folgendes Ergebnis:
- 0 1000 0000 100 1100 1100 1100 1100 1101
Die Zahl ist positiv, der Exponent und die Mantisse wurden ermittelt. Rechnet man die duale Gleitpunktzahl in Dezimal um, erhält man 3,210.