TIA Mehrdimensionales Array - Eine Dimension übergeben

Stefan592

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

ich habe ein Mehrdimensionales Array (Array [1..12, 1..100]). Dieses Array enthält mehrere Reihen (12) mit mehreren Messinformationen (100).
In einem FC möchte ich diese Messinfomationen auswerten.

Ist es möglich nur eine Dimension des Arrays dem FC als Input zu übergeben?
Meine bisherigen Versuche verlaufen im Sand.

S7-1511
TIA V13 SP2


Stefan
 
Moin!
Du könntest dein mehrdimensionales Array als UDT anlegen und deinem FC dann als IN/OUT dieselbe UDT verpassen.
IN/OUT würde ich empfehlen, weil deine Schnittstellenvariable dann durchs Call by Reference deutlich kleiner ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich bin der Meinung das ich das schon mal gemacht habe.
Als INPUT oder IN/OUT habe ich ein Array angelegt das den weiteren Dimensionen des Arrays entspricht und dann array[12] an den Eingang übergeben.

Grüße

Marcel
 
ich habe ein Mehrdimensionales Array (Array [1..12, 1..100]). Dieses Array enthält mehrere Reihen (12) mit mehreren Messinformationen (100).
In einem FC möchte ich diese Messinfomationen auswerten.

Ist es möglich nur eine Dimension des Arrays dem FC als Input zu übergeben?

Es müßte auf jeden Fall gehen, wenn es anders angelegt ist :
Code:
an Stelle von :
Array [1..12, 1..100] of Integer
so machen :
(Array [1..12] of Array [1..100] of integer
Gruß
Larry
 
Hallo,

anderes anlegen kann ich es nicht.
array.PNG
Kannst du es so anlegen? TIA V13 SP2

Was funktionieren würde wäre ein Array of Struct.
array_2.PNG

Ich mache es nun so wie von Howard vorgeschlagen und übergebe das komplette Array an IN/OUT



Stefan
 
Könnte man das auch so lösen?
Die Pumpendrehzahlen als UDT und dann ein Array of UDT anlegen? Die Drehzahlen sind dort als REAL deklariert.
Und folgendermaßen auswerten:
Pumpensteuerung_Beispiel.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hatte ich auch gedacht an array of UDT aber ich lese die Arrays immer mit field read aus, und das kann ich mit den UDT#s nich machen. Da kommt dann falsches Datenformat wenn ich die UDT an field read Ausgan packe.
 
Array
[*] wäre auch noch ein Möglichkeit, allerdings weis ich gerade nicht ob das auch für TeilArray geht :)

Slice-Zugriff auf dynamische Arrays funktioniert leider nicht. Nur auf feste Arrays.

C-ähnlich:
VAR_IN_OUT
    iq_arrMulti[MIN_DIM1..MAX_DIM1, MIN_DIM2..MAX_DIM2] OF INT
VAR_END

fbSub(iq_arrDIM2 := iq_arrMulit[iDim1]);

Da es echte Dynamische Arrays bei TIA nicht gibt, müsste das ausreichend sein mit Konstanten zu arbeiten. Da sowieso irgendwo die Größe definiert sein muss. Anders verhält sich das natürlich wenn man zur Laufzeit ein Array-DB generiert.

---------

Mit Variant funktioniert funktioniert es leider auch nicht, soweit ich weiß.
 
Array
[*] wäre auch noch ein Möglichkeit, allerdings weis ich gerade nicht ob das auch für TeilArray geht :)

Geht
In meinem Beispiel
fbA mit InOut
Lines Array[*, *] of "udtMV2_Reservation" False False False False
Übergabe "DBxyz".Lines

fbB mit InOut
Line Array[*] of "udtMV2_Reservation" False False False False Linie 1..n, r; r:...
Übergabe z.B. "DBxyz".Config.Line[1]

Beim lesen der Boundarys dann nur drauf achten, dass die richtige Dimension geprüft wird. (Zählt ab 1, nicht 0)
#temp_diLB := LOWER_BOUND(ARR := #Queue, DIM := 1);
#temp_diUB := UPPER_BOUND(ARR := #Queue, DIM := 1);

Alternativ kann man je nach Einsatz die Grenzen gleich über globale Konstanten festlegen und die Prüfung sparen:
z.B. Array[1.."iMV2_ANZ_LINES", 0.."iMV2_LINE_MAX"] of "udtMV2_Reservation"

Bei zweckgebundenen aber von Projekt zu Projekt unterschiedlich großen Arrays ist die Kombination von Array[*] mit Konstanten imho ziemlich angenehm und lesbar.


Gruß Semo
 
Zurück
Oben