Slice vs AT

Stogi

Level-2
Beiträge
94
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich versuche gerade den FB eines Beispielprogramms (geschrieben in SCL mit TIA V14 für eine S7-1500) für eine S7-317F (Step7 V5.6 + SP2) umzuschreiben. Geht dabei um die ProfiNet Anbindung eines Kamerasensors zur Objekterkennung. Leider bisher sehr wenig Simatic Manager Erfahrung und arbeite mich von einem Workaround zum nächsten...

Der Sensor ist wie folgt angelegt:

1658587947795.png

Im Originalprogramm werden die Adressen der einzelnen Slots mittels RD_ADDR erfasst und anschließend mit PEEK/POKE bearbeitet. Teilweise wird hier per slice auf die einzelnen Bits zugegriffen.
Nachdem es PEEK/POKE für S7-300 nicht gibt (hoffe ich hab mich hier nicht schon vertan...), habe ich UDTs entsprechend der einzelnen Slots erstellt, als Input/Output für meinen FB definiert und möchte so direkt auf die Adressen zugreifen.

Dabei bin ich auf folgende Fragen gestoßen:

Erste Frage:
Wenn ich die Bits einer Variable vom Typ "Word" durch slicen und durch AT auslese/beschreibe, warum ist die Adressierung nicht die gleiche?
Beispiel:
Variablendeklaration:
Name Datentyp
myWord Word
myWordBits AT "Myword" Array[0..15] of Bool

Ich habe es mir gerade einmal simuliert und es dabei so beobachtet:

1658589827349.png

1658589768479.png1658589704828.png


myWord.%X0 == myWordBits[8]
myWord.%X4 == myWordBits[12]
myWord.%X8 == myWordBits[0]
myWord.%X12 == myWordBits[4]

Wie kann ich mir das intern vorstellen?
Beim Slicen werden die Bits direkt adressiert. .%X0 ist somit die erste Ziffer der Binärzahl (ganz rechts)
aber bei Verwendung des AT-Befehls wird das Word erst in seine Byte zerlegt und die dann einzeln in ihre Bits?
Dabei zählen die Byte von links nach rechts hoch aber die Bits der Bytes anschließend von rechts nach links entsprechend einer Binärzahl?
--> myWord.%Xi == myWordBits[i+8] (0tes Bit vom 0ten Byte)

Zweite Frage:

Im Beispielprogramm wird ein HW-Bereich (Word) mittels PEEK_WORD in eine temporäre Variable geschrieben und deren Bits dann per slice einzeln betrachtet.
Ich habe nun UDTs für die HW-Bereiche erstellt. Zum Beispiel "Sensor_Command_Word". So kann ich den Adressenbereich als Variable als Input für meinen FB in der Symboltabelle anlegen.
Den Input hätte ich dann auf eine statische Variable des FBs geschrieben (inkl. Bitaufteilung mittels AT-Befehl) und zu Zyklusbeginn erst mal zurückgesetzt, um die temporäre Variable aus dem Originalprogramm nachzuahmen.

... wie geht das schöner oder kann man damit leben?

LG Stogi
 
Zuletzt bearbeitet:
Das kommt von der Byte-Reihenfolge (endianness), wie bei S7 ein Mehrbyte-Zahlenwert im Speicher abgelegt wird. S7 verwendet big-endian: Bei einem Word liegen die höheren Bits im ersten Byte, das niedrigste Bit liegt im zweiten Byte. Ein Bool-Array füllt den Speicher Byte für Byte aufsteigend (die niedrigen Elemente zuerst), deshalb liegt myWord.%X0 an der Speicher-Bitadresse von myWordBits[8]

Harald
 
Zurück
Oben