Hallo zusammen
Ich habe mich ein wenig in weiner Funktion verrannt. Ich habe zwar einen funktionierenden Lösungsansatz, aber der ist irgendwie nicht zufriedenstellend. Ich hab so ein kribbeln im Hinterkopf nach dem Motto "Das muss doch besser gehen..." :icon_mrgreen:
Folgende Ausgangslage: wir haben einen unoptimierten Datenbaustein welcher Datenblöcke mit einer Breite von 1'000 Bytes enthält. Die Datenblöcke haben einen Header aus 10 Bytes, gefolgt von einem Datenbereich in strukturierter Form von 990 Bytes (hier mal "myData" genannt).
Siemens.Automation.Portal_2020-02-25_14-04-18.jpg
Ich will nun mit einer Funktion während der Laufzeit einen Datenbereich in Abhängigkeit von der ID auslesen und bestimmte Daten innerhalb des UDTs "myData" herausnehmen und in eine andere Struktur packen, welche ich dann ausgebe.
Das ganze soll in SCL programmiert werden, da AWL ja inzwischen als "Legacy" definiert wurde und bereits jetzt in vielen neueren Funktionen im TIA Portal gar nicht mehr unterstützt wird.
Mein Ansatz bis jetzt ist folgender:
Ich gehe mit WHILE-Schlaufe durch den Baustein durch. In der Schlaufe habe ich eine Variable "byteZeiger" definiert. Mit "PEEK_WORD" mit einem ByteOffset von
"byteZeiger" + 0 lese ich den Wert "ID_Daten" aus. Stimmt die ID an der aktuellen Stelle mit der gesuchten ID überein, so gehe ich in eine FOR-Schlaufe (
FOR i := 0 TO 989 DO) mit welcher ich über "PEEK_BYTE" mit einem ByteOffset von
("byteZeiger" + 10) + i die 990 Bytes des UDTs auslese und in ein
Array[0..989] of Byte schreibe. Über dieses Array habe ich über AT den UDT "myData" gelegt, wodurch ich nun auf die strukturierten Daten zugreifen kann.
So weit der Plan. Das ganze funktioniert nun auch relativ okay. Nur habe ich das Gefühl, dass ich das ganze falsch angehe und es einen einfacheren Weg gibt. Oder täuscht mich hier mein Gefühl und das Kribbeln im Hinterkopf sind nur Flöhe die ich mir selber in den Kopf gesetzt habe? :p
PS. Falls sich jemand wundert warum ich nicht "BLKMOV" verwende: BLKMOV wurde von Siemens ebenfalls als "Legacy" markiert, also bin ich hier nicht sicher wie lange diese Funktion noch zur Verfügung steht.
Und Ja, mir ist bewusst, dass das ganze mit einem Array deutlich einfacher wäre, nur ist die Vorgabe dass in diesem ersten Schritt in Richtung SCL nicht gleich alle Strukturen über den Haufen geworfen werden sollen die über die Jahre etablierrt wurden (da noch sehr viele Funktionen im Hintergrund sind die auch auf diese Daten zugreifen wollen und ich nicht all diese Funktionen auf einen Schlag von AWL mit indirekter Adressierung auf SCL mit Arrays umschreiben kann).