TIA Länge Array auslesen für FOR-Schleife

SPSnewbie91

Level-2
Beiträge
186
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich möchte gerne die Länge eines Arrays bestimmen und diese Zahl dann für eine FOR-Schleife verwenden, da sich die Länge des Arrays im DB ändern kann.

FOR #tmp_i := 0 TO 999 DO

IF #FRG_ID_Check AND #ID_Ist = "EL-Daten_DB".EL[#tmp_i].ID THEN
#pd_Störung_SB_ID:= TRUE;
END_IF;

END_FOR;

IF #FG.AckError THEN
#pd_Störung_SB_ID := FALSE;
END_IF;

Das Array geht von 0 bis 999. Anstatt der 999 würde ich aber gerne die Länge des Arrays als Variable darstellen. Wie gesagt. Falls sich die Länge des Arrays ändert.

Hier der DB mit dem Array
1662645026541.png

Ist wahrscheinlich ziemlich einfach, aber ich stehe irgendwie auf dem Schlauch.

Vielen Dank schon Mal für die Mühe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn ich es richtig verstanden habe würde ich dir folgende Methoden empfehlen.

1662645744807.png

Entweder im Baustein eine konstante definieren oder prinzipiell eine Anwenderkonstante (ist eher meine Wahl, da alle Änderungen einer Array-Größe durch eventuelles umkopieren in andere Arrays usw. sofort für das gesamte Programm gültig ist).

MfG
 
Moin du kannst anstatt deiner Übergabeparameter einfach Array[*] of XXX nehmen und dann mit Lower und Upperbound die Grenzen auslesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn ich es richtig verstanden habe würde ich dir folgende Methoden empfehlen.

Anhang anzeigen 63404

Entweder im Baustein eine konstante definieren oder prinzipiell eine Anwenderkonstante (ist eher meine Wahl, da alle Änderungen einer Array-Größe durch eventuelles umkopieren in andere Arrays usw. sofort für das gesamte Programm gültig ist).

MfG
Ok. Diese Variante ist natürlich einfacher. Danke :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah ok also als Lower Bound Dim 1 u Upper Bound Dim 2 wenn ich das richtig verstanden habe?!
Da es dir nur um die obere Grenze geht stimmt das so nicht.

In deinem Fall musst du einfach UPPER_BOUND mit Dim 1 verwenden, da du ja nur ein eindimensionales Array besitzt.
Würde die empfehlen hier mal kurz reinzuschnuppern:
 
Da es dir nur um die obere Grenze geht stimmt das so nicht.

In deinem Fall musst du einfach UPPER_BOUND mit Dim 1 verwenden, da du ja nur ein eindimensionales Array besitzt.
Würde die empfehlen hier mal kurz reinzuschnuppern:
Danke. Mache ich
 
Irgendwie ist auch noch unklar, auf welcher Steuerung programmiert wird.
Davon abhängig wäre dann eventuell auch ...

Code:
    IF IS_ARRAY(#DATENBANK) THEN
        #ANZAHL_DATENSAETZE := CountOfElements(#DATENBANK);
    ELSE
        RETURN;
    END_IF;

.. das Mittel der Wahl. "DATENBANK" müsste dann als "VARIANT" deklariert werden. Das funktioniert auch "nichtoptimiert".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn ich es richtig verstanden habe würde ich dir folgende Methoden empfehlen.

Anhang anzeigen 63404

Entweder im Baustein eine konstante definieren oder prinzipiell eine Anwenderkonstante (ist eher meine Wahl, da alle Änderungen einer Array-Größe durch eventuelles umkopieren in andere Arrays usw. sofort für das gesamte Programm gültig ist).

MfG
Moin,

Eines verwirrt aber immer mal wieder: #Length ist NICHT die Länge des Arrays!
#Length ist der maximale Index des Arrays. Den Index 0 muss man mit berücksichtigen. Obwohl man mit [1.. , also 1 ein Index beginnen kann, ist es besser mit 0 zu beginnen (Modulo, manche Bausteine arbeiten intern sowieso mit 0, div. andere Berechnungen, ...).
Jedenfalls würde ich die Konstante in #maxIndex oder so umbenennen.

UpperBound und LowerBound hilft eigentlich nur, wenn ein Array unbestimmter Größe übergeben wird und man im einem (gekapselten) Baustein mit den Grenzen rechnen möchte/muss. Aber es muss trotzdem von außen ein Array mit FESTER Größe übergeben werden.

Also so oder so: Speicher allokieren geht in der SPS nicht. Einzige Möglichkeit: man lässt "Reserve"... unschön.

Die Arbeit mit Konstanten als ArrayGrenzen und die Verwendbarkeit in Schleifen macht für mich diese Variante am angenehmsten. Dann umgeht man auch die Bereichslängenfehler durch wild berechnete Schleifengrenzen.

Wobei man natürlich sagen muss, dass die Arbeit mit UpperBound und LowerBound eigentlich keine andere Variante darstellt, sondern eine ganz eigene Berechtigung hat.

Wie immer: der Anwendungsfall entscheidet. Dafür muss man die optimale Lösung suchen/finden.

VG

MFreiberger
 
Zurück
Oben