TIA Arraygröße von UDT ermitteln in SCL

kp400

Level-1
Beiträge
76
Reaktionspunkte
16
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bei einem FB (SCL) als InOut eine CFG-Struktur (als UDT), in welcher ein Array of Struct vorhanden ist. Nun möchte ich die Anzahl der Arrayelemente ermitteln. Ich habe es zwar bereits geschafft, indem ich beim FB als InOut ein Variant anlege und dann per CountOfElements(CFG) die Elementanzahl auslese. Jedoch möchte ich als InOut eben nicht einen Variant Datentypen, sondern meinen UDT angeben.

Der CFG-UDT wird in einem Global-DB aufgerufen, diesen Global-DB habe ich dann auf das Variant InOut gelegt wodurch ich die Elementanzahl ermitteln konnte. Leider scheitert das wenn ich das InOut mit diesem UDT definiere und dann per CountOfElements auslesen probiere.

Bei dem folgenden Code kommt immer die Fehlermeldung beim Übersetzen, dass "_arr_variant" nicht initialisiert ist (_arr_variant ist eine TEMP Variable) => jedoch ist diese ja initialisiert, da sie am DST anliegt oder?

CFG_IO ist der InOut Parameter mit Datentyp UDT

VariantPut(SRC:=#CFG_IO,
DST:=#_arr_variant);


#_arrelements := UDINT_TO_INT(CountOfElements(#_arr_variant));



Danke für eure Hilfe!
 
Nabend,
ich habe es nun gelöst, indem ich beim FB das Array als Variant angebe, im FB als temp diesen UDT angebe, dann per TypeOf mein Variant mit dem Temp UDT vergleiche und danach über den Variant und CountOfElements die Anzahl der Arrayelemente vergleiche. Leider muss ich dann per MOVE_BLK_VARIANT mein Variant in den Temp-UDT kopieren um im Programm dann symbolisch damit arbeiten zu können.

Falls jemand eine bessere Lösung hat bitte her damit ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
man könnte sich einen Hilf's FC schreiben

InOut als Variant - hier übergibt man das Array
Im FC kann man dann mit "CountOfElements" die Arraylänge auslesen und zurück geben

Ich würde noch mindestens prüfen ob der übergebene wert vom Typ Array ist, anderenfalls "-1" zurück geben

Das setzt aber zwei Dinge voraus:
1. die Array's beginnen bei "0"
2. die Arrays sind mit eine einer Obergrenze >0 definiert

Wenn das nicht der Fall ist ich kann man es auch noch mit einem UDT und Array
[*] of UDT lösen
dann kann man im Hilf's FC mit lower und upper bound arbeiten, geht dann aber nur für den speziellen UDT, jeder UDT braucht einen eigenen Hilf's FC
 
Hallo Beisammen,

ich hab jetzt schon öfters mit Globalen Konstanten gearbeitet. Die gibst du über all an wo die Grenze vom Array gebracht wird ist zwar nicht immer optimal aber doch oft eine gute Lösung.

Gruß Tia
 
Hallo,
willst du die anzahl der elemente in deinem UDT lesen oder wie groß dein array ist ?
hast du mal mit array
[*] gearbeitet?
Du legst es beim INOUT an mit einem Datentyp ( egal welcher auch UDTs).
Die anzahl der plätze wird dann festgelegt durch das array welches angeschlossen ist.

die grenze nach oben bzw unten kannst du dann mit dem befehl upper_bound bzw lower_bound ermitteln.

grüße

Balu
 
Zurück
Oben