TIA V17: wie groß ist ein BOOL

Beiträge
6.768
Reaktionspunkte
1.631
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
weder RTFM noch Tante Google haben mich 100% weitergebracht.
Im Codesys-Universum belegt ein BOOL immer ein Byte, wobei es vorkommen kann, dass hinter dem Bool/Byte noch ein oder mehr Füllbytes eingefügt werden.
Aber wie sieht das bei TIA V17 aus? Soweit ich das richtig verstanden habe belegt ein Bool in einem optimierten Baustein ein Byte, aber wie sieht das bei nicht optimierten Bausteinen aus? Verhält sich das bei UDTs dann wie bei Structs im Codesys-Universum, dass das eigentliche Bool ein Byte belegt, aber Füllbytes angefügt werden?
 
Soweit ich richtig erinnere belegt bei nicht optimierten Bausteinen ein Bit zwar genau ein Bit, füllt aber auf. Kommt danach ein Byte, dann sind 7 Bits faktisch "nutzlos" aufgefüllt. Ein Byte, Word, Doppelword beginnt immer an Byte bzw. Word-Grenze.
Wenn man also in einer Struktur ein Bit und ein Byte anlegt, belegt das 2 Byte. Legt man 2 Bit und ein Byte an, belegt das auch 2 Byte usw.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nicht optimiert: 1 BOOL = 1 Bit

Tipp: lege einen nicht-optimierten DB an, deklariere darin ein paar BOOL, übersetze den Baustein und schaue Dir dann die Adressen/Offsets der Variablen an.

Hinter dem letzten BOOL: ein BYTE oder CHAR beginnt auf der nächsten "glatten/vollen" Byte-Adresse. Alle anderen Datentypen > 1 Byte beginnen auf der nächsten "glatten/vollen" geraden Byte-Adresse.

Harald
 
Das hängt ja nicht nur an TIA sondern auch noch am Steuerungstyp und der Firmware.
Bei der 1500er nimmt in optimierten DBs ein Bool ein Byte ein, bei der S7-1200 ist hingegen nach meinem letzten Stand ein Bool ein Bit.
Dann gibts noch einen Unterschied bei UDT in einem DB oder an einer EA-Adresse, und evtl. ist das auch noch von der aktuellen Mondphase abhängig.
 
Vielen Dank für die bisherigen und zukünftigen Antworten, das hat mich wirklich weitergebracht.
Eine Frage hätte ich noch, falls das überhaupt einer beantworten kann.
Im Codesys-Universum wird von der Nutzung des Datentyps BIT abgeraten, da ein Arbeiten damit deutlich länger dauert als wenn man ein Bool nutzen würde. Bei einem BIT belegt ein Bool tatsächlich nur ein Bit und kein Byte.
Ist die Verarbeitung bei Siemens auch langsamer, wenn Bools in einzelnen Bits abgelegt werden?
 
Ist die Verarbeitung bei Siemens auch langsamer, wenn Bools in einzelnen Bits abgelegt werden?
Ich erinnere mich (relativ vage) an S5-Zeiten, als uns Siemens eine CPU (130WB?) angedient hat, bei denen sich die AusführungsZeiten der Befehle halbiert haben sollten. Da haben wir uns in freudiger Erwartung draufgestürzt, da wir gerne kürzere ZyklusZeiten gehabt hätten.
Und was war? Im Endeffekt kamen wir mit der neuen Variante auf deutlich längere ZyklusZeiten.
SiemensErklärung: die BitBefehle waren doppelt so schnell geworden und alle anderen Befehle "zum gerechten Ausgleich" natürlich viiiel laaagsamer.
Irgendwie wurden die BitBefehle und die anderen in der CPU auf getrennten Wegen bzw. in getrennten "Abteilungen" abgearbeitet ... was auch immer das bedeuten mag.
(Einige Zeit später hat uns Siemens dann aber doch noch bewiesen, dass sie tatsächlich viel schneller konnten, wenn sie sich denn wirklich die Mühe gemacht haben.)
Anscheinend ist das Problem der Zugriffe auf einzelne Bits nicht ganz neu, war damals aber Grund genug, die Hardware der CPU speziell darauf zu trimmen. Ich vermute mal, dass heutzutage der Lösungsweg darin besteht bzw. darauf beschränkt wird, für jedes BOOL grosszügig ein BYTE (bestimmt gar nicht mehr zeitgemäss, vielleicht mittlerweile ein WORD oder DWORD oder ...?) zu vergeben. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich vermute mal, dass heutzutage der Lösungsweg darin besteht bzw. darauf beschränkt wird, für jedes BOOL grosszügig ein BYTE (bestimmt gar nicht mehr zeitgemäss, vielleicht mittlerweile ein WORD oder DWORD oder ...?) zu vergeben. ;)
Also im Codesys-Universum ist es immer noch "nur" ein Byte, allerdings kann Dir das Aligment da noch in die Suppe spucken und das Ganze durch Füllbytes noch aufblasen.
 
Noch 'n Bisschen offTopic am Rande des Themas:
Vor meiner Beschäftigung mit S5 hatte ich mit einem 16-Bit-Rechner zu tun. Da gab es gar keine BitBefehle, aber ein ähnliches Problem auf "höherer Ebene": es gab zwar ByteBefehle, aber der Speicher liess sich nicht byteweise adressieren. Also musste die CPU ein Wort lesen, das gewünschte Byte isolieren und das gesamte Wort wieder in den Speicher zurückschreiben, denn einfach nur lesen, ohne zurückzuschreiben war bei KernSpeichern nicht möglich bzw. hätte das Wort gelöscht.
 
Zurück
Oben