TIA Alternative zu Array[*] of varriant

Mrtain

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

Ich verzweifle gerade etwas an Siemens...
Hintergrund ist, ich möchte an einen Baustein ein array unbestimmter größe und eines unbestimmten Types übergeben.
Leider ist ein array [*] of Variant nicht möglich, da von Siemens nicht unterstützt.
Lustigerweise verlangt upper_bound / lower_bound ein array [*] of variant ...

Hat jemand noch ein Idee oder Hinweise für mich, wie ich das lösen könnte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Mrtain,


Hintergrund ist, ich möchte an einen Baustein ein array unbestimmter größe und eines unbestimmten Types übergeben.
Ich glaube, dass das nicht geht.

Leider ist ein array [*] of Variant nicht möglich, da von Siemens nicht unterstützt.
Stimmt.

Lustigerweise verlangt upper_bound / lower_bound ein array [*] of variant ...
Sicher?
Bei mir kommt der Hinweis "Nur ARRAYS mit variablen Grenzen sind zulässig". Das bezieht sich auf das [*].
In der Hilfe steht für die Parameter des UPPER_BOUND:
ARR ==> Datentyp ARRAY[*]
DIM ==> UDINT
Funktionswert ==> DINT

Ich bin mir ziemlich sicher, dass der Datentyp des Array kein Variant sein darf.


Also, soweit ich weiß, kannst Du bei Variant kein "Upper_Bound" oder "Lower_Bound" verwenden.

Aber mit CountOfElements könntest Du die Anzahl an Array-Elementen eines Variant abfragen (wenn es ein Array ist!).
Mit IsArray kannst Du fragen, ob Variant ein Array ist.
Mit TypeOfElements kannst Du fragen, welchen (elementaren) Datentyp ein Array-Element hat. Diese Abfrage geht aber nur in einer IF- oder CASE-Anweisung.

Code:
IF
    TYPEOfElements(#Variant) = BYTE
THEN
    Do_Something;
END_IF;

VG
MFreiberger
 
Leider ist ein array [*] of Variant nicht möglich, da von Siemens nicht unterstützt.
Warum willst du überhaupt ein Array of Variant übergeben?
Variant an sich frisst doch bereits problemlos auch Arrays...
Im nachgelagerten Code kannst du dan prüfen ob der Aktualparameter am Variant ein Array + was für ein Datentyp es ist & entsprechend weiter verwursten.
 
Hi, danke für die Antworten.

Ich bin mir gerade ein Sortieralgoryhtmus am schreiben. Ziel war es, nur einen fb zu haben - zumindest für die BasisTypen.
Den basistyp hätte ich mit typeOf abgefragt und vorher geschaut, ob es ein Array ist.

Das Problem sind die arraygrenzen, die ich so nicht mit upper_bound / lower_bound berechnen kann. Und CountOfElements bekomme ich leider nur die Anzahl... Alternativ könnte ich zwar den startindex übergeben und mit der Anzahl berechnen, finde ich aber etwas unschön.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem sind die arraygrenzen, die ich so nicht mit upper_bound / lower_bound berechnen kann. Und CountOfElements bekomme ich leider nur die Anzahl... Alternativ könnte ich zwar den startindex übergeben und mit der Anzahl berechnen, finde ich aber etwas unschön.

Moin Mrtain,

bei einem Variant sind die Arraygrenzen IMMER nullbasiert. Und mit dem MOVE_BLK_VARIANT kannst Du das Array oder Elemente davon umkopieren (z.B. in ein deklariertes Array).
 
Hallo,

Ich verzweifle gerade etwas an Siemens...
Hintergrund ist, ich möchte an einen Baustein ein array unbestimmter größe und eines unbestimmten Types übergeben.
Leider ist ein array [*] of Variant nicht möglich, da von Siemens nicht unterstützt.
Lustigerweise verlangt upper_bound / lower_bound ein array [*] of variant ...
Upper_Bound lower_bound erwarten kein Array of variant. der Eingang ist ein Array of variant. das heisst du kannst da jede Art von Array anhängen, ausser of variant, weil es das nicht gibt.

dass heisst, es ist egal ob du Array of Byte oder Array of udt anhängst. das ist mit Array of variant gemeint.
 
Lustigerweise verlangt upper_bound / lower_bound ein array [*] of variant ...
Das ist tatsächlich ungeschickt formuliert, weil in der Realität arbeitet die Funktion nicht mit Variant, sondern der Compiler baut dann den Code typisiert mit jenem Datentyp, der angegeben worden ist.

Wenn man aus der S7 classic Welt kommt ist man es gewohnt dass am Zielsystem exakt das läuft was da steht, aber in TIA sind viele Konstrukte nur dazu da um dem Compiler zu sagen was genau er bauen soll.
 
Zurück
Oben