Step 7 In AWL auf Struktur (UDT) im Array zugreifen

steinche

Well-known member
Beiträge
112
Punkte Reaktionen
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Forengemeide,

vom Gedanke her stelle ich mir das vermutlich zu einfach vor.


Wir haben an einem FB eine UDT Schnittstelle, die z.B. so aussieht und der hat mich auf eine Idee gebracht ...
FB.png

Dazu einen etwas verschachtelten DB angelegt:

DB.png

Der erste in der Struktur eingefügte UDT "Koppel-PuF-din" hat folgenden Aufbau:

UDT.png


Und jetzt hatte ich die Idee, dass mit folgenden AWL Abweisungen zum Ziel zu kommen:
Code:
      L     EW     0
      T     "PuF-IO-Link".TH01_T1.VT0.In

aber ... das funktioniert so leider nicht.

Wenn ich die Adresse direkt angebe, habe ich die Funktion, jedoch ohne "Symbolik"
Code:
      L     EW     0
      T     DB400.DBW    0

Allerdings wäre mir die "symbolische" Darstellung deutlich lieber, da die Zuordnung so wesentlich leichter wäre.
Kann man das überhaupt in AWL umsetzen, oder wäre so etwas in SCL leichter möglich. Da scheitert es bei mir allerdings an jeglichen Kenntnissen 🙈

Über den ein oder anderen Tipp wäre ich seeehr dankbar 🤗


Wünsche allen noch einen erfolgreichen Tag!
 

AWL auf der 300er spricht leider nicht direkt Array.
Hier muss man sich über Pointer und das AR behelfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist kein variablen Array Zugriff, sondern fix Array Zugriff.
Das kann man in AWL, KOP und FUP:
Nicht
Code:
T "PuF-IO-Link".TH01_T1.VT0.In
Sondern
Code:
T "PuF-IO-Link".TH01_T[1].VT[0].In

edit: Achso, die unterste Struktur ist nicht ein WORD oder INT sondern eine Reihe von BYTE und BOOLs. Dann geht es nicht so einfach.
edit: Die symbolische Name ".In" hat mich auf den falschen Spuhr geführt.
 
Zuletzt bearbeitet:
Mit SFC20 BLKMOV kannst du die Übertragung in AWL, KOP oder FUP machen:
Code:
      CALL  "BLKMOV"
       SRCBLK :=EW0
       RET_VAL:=MW10
       DSTBLK :="PuF-IO-Link".TH01_T[1].VT[0].In
 
Hallo @chbg und @JesperMP

vielen Dank für die schnellen Rückmeldungen 🤩

So ...
Code:
T "PuF-IO-Link".TH01_T[1].VT[0].In
wäre cool gewesen. Denn ich habe in Summe rund 1400 von den
Einträgen zu machen. Über BLOCKMOVE wäre eine Möglichkeit, aber geht das nicht ziemlich auf die Zykluszeit?

Nochmal zu der Idee wegen SCL ... wäre dass dort leichter umsetzbar? Die Erstellersprache ist für diesen Baustein egal, da er nur diese Art von Anweisungen hat. Als Hardwareunterbau ist eine 416er, die aktuell bei 42ms Zykluszeit ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo @chbg und @JesperMP

vielen Dank für die schnellen Rückmeldungen 🤩

So ...
Code:
T "PuF-IO-Link".TH01_T[1].VT[0].In
wäre cool gewesen. Denn ich habe in Summe rund 1400 von den
Einträgen zu machen. Über BLOCKMOVE wäre eine Möglichkeit, aber geht das nicht ziemlich auf die Zykluszeit?

Nochmal zu der Idee wegen SCL ... wäre dass dort leichter umsetzbar? Die Erstellersprache ist für diesen Baustein egal, da er nur diese Art von Anweisungen hat. Als Hardwareunterbau ist eine 416er, die aktuell bei 42ms Zykluszeit ist.

Früher habe ich solche Dinge über das Adressregister gelöst. In einer Variable am Anfang des DBs stand die Anzahl der Elemente.
Danach kann man einfach sagen bei 0 fängt das erste Element an bei 0+Element Länge das zweite.
Damit kann man dann über den Pointer bei Zugriff auf das AR seine Elemente adressieren.

Leider hat man dann keine Symbole mehr. Und suchen im Programmcode wird erschwert.
Bei Bausteinen die aber wenn sie mal fertig sind nicht mehr angelangt werden sollen/müssen kann man sowas aber durchaus mal machen ;)
 
Hallo @chbg und @JesperMP

vielen Dank für die schnellen Rückmeldungen 🤩

So ...
Code:
T "PuF-IO-Link".TH01_T[1].VT[0].In
wäre cool gewesen. Denn ich habe in Summe rund 1400 von den
Einträgen zu machen. Über BLOCKMOVE wäre eine Möglichkeit, aber geht das nicht ziemlich auf die Zykluszeit?

Nochmal zu der Idee wegen SCL ... wäre dass dort leichter umsetzbar? Die Erstellersprache ist für diesen Baustein egal, da er nur diese Art von Anweisungen hat. Als Hardwareunterbau ist eine 416er, die aktuell bei 42ms Zykluszeit ist.
Sowas ist in SCL tatsächlich einfacher und sicherer zu lösen.
Ich mache das auf den 400ern immer noch so dass die Grundsprache AWL ist (weil ich Classic SCL eine Qual finde), aber sobald es ans Pointern von Arrays geht, nutze ich lieber SCL, da es hier viel einfacher und sicherer ist, Änderungen in Datenstrukturen auch wirklich überall zu aktualisieren.
Dann läuft halt zwischendurch ein SCL Baustein.
 
Mit SFC20 BLKMOV kannst du die Übertragung in AWL, KOP oder FUP machen:
Code:
      CALL  "BLKMOV"
       SRCBLK :=EW0
       RET_VAL:=MW10
       DSTBLK :="PuF-IO-Link".TH01_T[1].VT[0].In
So mach ich das auch immer. Ob SFC20 jetzt lahm ist, keine Ahnung, hatte bisher keine schlechten Erfahrungen.

Ansonsten wenns vollsymbolisch sein soll, die Eingangsbyte und Eingangsbool einzeln anlegen und einzeln in die jeweiligen Strukturvariablen kopieren.

Kann man in der 300er nen UDT auf nen EW legen? Glaube nicht, probier ich nachher mal aus...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ...
Code:
T "PuF-IO-Link".TH01_T[1].VT[0].In
wäre cool gewesen. Denn ich habe in Summe rund 1400 von den
Einträgen zu machen.
Hast du 1400 IO-Link Geräte !?

Über BLOCKMOVE wäre eine Möglichkeit, aber geht das nicht ziemlich auf die Zykluszeit?
Da BLKMOV ein Systemfunktion ist, ist es ziemlich optimiert. Es geht vermutlich nicht schneller.
Wenn man Speicherbereiche in SCL rumkopiert, dann konvertiert die SCL Kompiler die Transfer auf die passende AWL Befehle, in diesen Fall vermutlich SFC20 BLKMOV.

Nochmal zu der Idee wegen SCL ... wäre dass dort leichter umsetzbar?
Definitiv.
Und mit SCL öffnet sich die Möglichkeit von variablen Array Indizierung.
Bin aber nicht sicher dass es in diesen Fall sinnvoll oder möglich ist. Die rohe Eingangsbytes kann man nur indizieren wenn sie immer dieselbe Reihenfolge haben.
 
Hallo an Alle,

sorry für die späte Rückmeldung, normal finde ich sowas auch immer doof, wenn man helfen möchte und es keine Rückmeldung gibt.

Zum einen, ja, ich habe gut 700 I/O Karten, die jeweils ein Ein- und ein Ausgangsbyte haben und ich habe mich jetzt doch für den SFC20 entschieden, auch wenn es im Programm total kirre aussieht, wenn da hunderte SFC20s untereinander stehen 🙈 Aus wenn sie in Netzwerken zusammengefasst sind.
Die Zykluszeit hat sich durch die Anpassung nicht geändert. Hätte ich so nicht erwartet!

Vielen Dank nochmal für die Vorschläge 🤗 und ein schönes Wochenende.
 
Zurück
Oben