TIA Abfrage ob Arrayelement vorhanden ist

Berger

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

Ich habe ein Array "Wert" (Array[5..50] of Real) in einem FB das indirekt abgefragt wird. (SCL)
Jetzt kann es bei falscher Parametrierung dazu führen, dass das Programm das Element "Wert[0]" abfragen will. Da dieses aber nicht existiert geht die CPU in Störung.
Kann ich ein Element in einem Array abfragen ob dieses überhaupt existiert bevor ich darauf zugreife?
Das ganze soll flexibel sein, da das Array nicht bei jeder Anwendung die gleiche Länge hat, deshalb wäre eine Abfrage auf '>5' und '<50' nicht der optimale Weg.

DANKE!
 
Du machst in dem Baustein die Arraygrenzen mit Variablen.Wenn die Untergrenze kleiner wie 5 ist weisst du der variablen 5 zu.
Wenn es über die Schnitsstelle geht musst du INOut nehmen und im programm die Anwendereingabe überschreiben.Geht das nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ideal wäre, wenn ich die Länge vom Array schon variabel anlegen könnte ...

Wenn die Untergrenze kleiner wie 5 ist weisst du der variablen 5 zu.

Das geht sicherlich schon. Ich möchte aber das man so wenig wie möglich einstellen muss um Fehler zu vermeiden ...

Im VB-Script gibt es so 'ne "FileExists"-Abfrage, so was wäre halt für's Array-Element genial ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mein erfahrung von STEP7 v5.5:

Obwohl es nicht das Problem mit falschen Array limits komplett löst, dann kan man es sauberer hantieren als bloss OB121 zu triggern.
In die SCL Options wählt man das Array Limts gecheckt werden muss, und das OK bit abgefragt werden kann.

Dann fügt man am ende von den 'verdächtigen' Code etwas in diesen Stil ein:

IF NOT OK THEN
// z.B. ein HMI Alarm triggern
// eventuell den Baustein enden
END IF ;

Und der Zustand von OK wird auch in ENO übertragen.
Damit kann das aufrufende Program eventuell das ENO abfragen.

mMn. soll man immer mit OK arbeiten. Nur wenn den SCL code sehr einfach ist, oder es ist sehr gut getestet kann man ohne OK arbeiten.
Ein nachteil ist das wenn man OK in die Options aktiviert, wird den erzeugte STL code viel aufwendiger.
 
Ich habe ein Array "Wert" (Array[5..50] of Real) in einem FB das indirekt abgefragt wird. (SCL)
[...]
Das ganze soll flexibel sein, da das Array nicht bei jeder Anwendung die gleiche Länge hat, deshalb wäre eine Abfrage auf '>5' und '<50' nicht der optimale Weg.
Code:
CONST
  Min_Index := 5 ;
  Max_Index := 50 ;
END_CONST
VAR
  Wert : ARRAY[Min_Index..Max_Index] OF REAL;
END_VAR

  IF Abfrage_Index < Min_Index OR Abfrage_Index > Max_Index THEN
  ... //Fehlerbehandlung

Harald
 
Willst du die Feldgröße im HMI vorgeben?Dann kannst du doch dort die Variable begrenzen auf 5 und 50.Ich verstehe noch nicht was du vorhast.
Willst du die Feldgrößen an der Bausteinschnitstelle verändern?Was hast du eigentlich vor mit dem Array.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ganze ist etwas komplizierter da das Array in Wirklichkeit zweidimensional ist. Der Baustein ist ein Standard-Regelbaustein. Das Array muss je nach Anwendungsfall 'verschoben' werden können. Ich kann das Array aber nicht zu groß werden lassen, sonst wird das ganze zu groß für dem Remanenzspeicher der kleinen CPU. Der FB kann teilweise bis zu 32x pro Programm verwendet werden.
 
So sieht's dann aus, geht leider nur mit Constanten:
Statt der Zeilen 1..8 mit den IF... kannst Du auch übersichtlich schreiben:
Code:
#"Stat Index" := LIMIT(MN := #A_min, IN := #"In Index", MX := #A_max);

#Out := #Wert[#"Stat Index"];

#"Stat Index" darf auch in TEMP liegen.

Dies sollte ebenfalls gehen:
Code:
#Out := #Wert[LIMIT(MN := #A_min, IN := #"In Index", MX := #A_max)];

Harald
 
Das ganze ist etwas komplizierter da das Array in Wirklichkeit zweidimensional ist. Der Baustein ist ein Standard-Regelbaustein. Das Array muss je nach Anwendungsfall 'verschoben' werden können. Ich kann das Array aber nicht zu groß werden lassen, sonst wird das ganze zu groß für dem Remanenzspeicher der kleinen CPU. Der FB kann teilweise bis zu 32x pro Programm verwendet werden.

Für was braucht man da ein 2 dimensionales Array?Da kriegt doch jeder Regler einen Instanz-DB normalerweise.Du hast ja dann immer den gleichen Datensatz.Also das ganze verstehe ich jetzt nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da werden Positionen für ein Stellglied in Abhängigkeit von Istdrehzahl und Sollstrom abgespeichert, damit nicht immer neu von "0" an geregelt werden muss:
z.B. Array[25,10]=60 bedeutet: 60% Öffnung bei 2500U/Min und 10A
 
Zurück
Oben