TIA Probleme mit Array[*] und FOR Schleife

steifhahn

Level-2
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Allerseits,

ich bin dabei meinen Melde-FC mit Hilfe von Array
[*] etwas dynamisch zu gestalten, was die Array Grenzen angeht.
CPU1214C, TIA Portal V15

Hier der übergebene DB:
Code:
STRUCT       AlarmIn : Array[0..99] of Bool;
   END_STRUCT;

Hier der FC:
Code:
FUNCTION "202 AlarmHandling" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      AlarmIn : Array
[*] of Bool;
      AlarmRelease : Array
[*] of Bool;
      AlarmQuit : Array
[*] of Bool;
      resetDelayed : Bool;
   END_VAR


   VAR_OUTPUT 
      blinkAlarm : Bool;
      collAlarm : Bool;
      newAlarm : Bool;
   END_VAR


   VAR_IN_OUT 
      AlarmOut : Array
[*] of Bool;
      AlarmOutOld : Array
[*] of Bool;
   END_VAR


   VAR_TEMP 
      i : Int;
      tempUpperBound : DInt;
      tempLowerBound : DInt;
      tempUpperBound1 : DInt;
      tempLowerBound1 : DInt;
   END_VAR




BEGIN
    // Meldungs Init
    #blinkAlarm := FALSE;
    #collAlarm := FALSE;
    
    #tempUpperBound := UPPER_BOUND(ARR := #AlarmIn, DIM := 1);
    #tempLowerBound := LOWER_BOUND(ARR := #AlarmIn, DIM := 1);


    
    FOR #i := #tempLowerBound  TO #tempUpperBound  DO
      // Alarme, Störungen
        // wenn einkommende Meldung mit Freigabe, dann Meldung ausgeben
      IF #AlarmIn[#i] THEN
          #collAlarm := FALSE;
        END_IF;
        
    END_FOR;
END_FUNCTION

Ich habe den FC von unnötigem Code befreit.
CPU bringt folgende Fehlermeldung:
Temporärer CPU-Fehler: Bereichslängenfehler in FC 202 betrifft OB 123-Ausführung
Lesezugriff Typsicherer V-Bereich
fehlerhafte Adresse, Operand ersetzt
Bearbeitung wird fortgesetzt (keine OB-Bearbeitung)


PLC_1 / PLC_1



interne Adressierungsdetails: Caddr=16#00000050, Bereich: Typsicherer V-Bereich, Adr: 4294409296

Der durch die Zugriffsadresse adressierte Wert liegt außerhalb oder nicht vollständig innerhalb des zulässigen Operandenbereiches (CPU-spezifische Größe oder Größe des Datenbausteins).
Behebung:
Wählen Sie die Zugriffsadresse so, dass der adressierte Wert vollständig im jeweils zulässigen Operandenbereich liegt. Überprüfen Sie auch die Adressierungsart und den adressierten Operandentyp.
Öffnen Sie den Baustein, um den Fehler im Kontext des Baustein-Programmcodes anzuzeigen.

Hab ich was vergessen???
 
Gerade an einer 1500er Steuerung getestet, funktioniert ohne Probleme. Als ich dann eine ich dann eine CPU1214C ausprobiert habe kam der gleiche Fehler.
Scheint an der CPU zu liegen.
 
Hinweis

Verfügbarkeit der Anweisung

Die Anweisung steht Ihnen ab der Firmware Version >= 4.2 bei einer CPU der Baureihe S7-1200 und ab der Firmware Version >= 2.0 bei einer CPU der Baureihe S7-1500 zur Verfügung.

Hast du FW-Version >= 4.2?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss er haben, da sich sonst das Programm gar nicht übersetzen bzw. die Funktion nicht benutzen lässt.

Außer:
Nur die projektierte CPU hat die FW 4.2

Das meine ich. Projektierte kann >= 4.2 haben. Wenn die reale CPU kleiner 4.2 ist, wird das glaube ich nur als Unterschied angezeigt. Ob das laden verhindert wird, kann ich im moment nicht sagen. Denke, TIA lässt das laden zu.
 
Liefern LOWER_BOUND und UPPER_BOUND die richtigen Werte (0 und 99)? Können die Anweisungen auch Fehler melden, z.B. daß das Array gar kein Array ist? Gibt es irgendwo eine Referenz/Erklärung der Anweisungen wenn man kein TIA V15 installiert hat? Muß vielleicht die Anzahl Elemente des Bool-Arrays durch 8 teilbar sein?

Harald
 
Liefern LOWER_BOUND und UPPER_BOUND die richtigen Werte (0 und 99)?
Ja, liefern die richtigen Werte.

Können die Anweisungen auch Fehler melden, z.B. daß das Array gar kein Array ist?
Nein sie können nur die Grenzen feststellen, haben kein Fehlercode oder ähnliches. Dafür bräuchte man eine "IsArray"-Abfrage davor.

Gibt es irgendwo eine Referenz/Erklärung der Anweisungen wenn man kein TIA V15 installiert hat?
Die Befehle gibt es seit TIA 14.

Muß vielleicht die Anzahl Elemente des Bool-Arrays durch 8 teilbar sein?
Nein müssen sie nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Bound Funktionen liefern jeweils 0 und 99

Man kann die FOR Schleife auch weglassen (rein zum Testen)
Wenn man dann mit

Code:
[COLOR=#333333][FONT=Courier]IF #AlarmIn[0] THEN[/FONT][/COLOR][COLOR=#333333][FONT=Courier]          
#collAlarm := FALSE;[/FONT][/COLOR][COLOR=#333333][FONT=Courier]        
END_IF;
[/FONT][/COLOR]

zugreift geht es noch. Wenn man anstatt der 0 eine 1 eingibt, erscheint der Fehler.
Irgendwas ist da Faul in der 1200er
 
Das Problem sind nicht die Upper/Lower Befehle, sondern das der Zugriff auf ein variables Array in der FOR schleife bzw. die IF Abfrage denn Fehler erzeugt.

Achso, war auf dem falschen Pfad.

Hab das mal getestet. Als kleinen Workaround kann man folgendes machen:

Code:
FOR #i := #tempLowerBound  TO #tempUpperBound  DO
      // Alarme, Störungen
        // wenn einkommende Meldung mit Freigabe, dann Meldung ausgeben
      IF [COLOR=#0000ff][B]MeinDB.AlarmIn[#i][/B][/COLOR] THEN
          #collAlarm := FALSE;
        END_IF;

Irgendwie scheint das Lesen des variablen array bzw. deren elemente ein Problem zu machen.

EDIT:

Aus der Hilfe finde ich nur dieses hier:
Elemente vom Datentyp ARRAY werden mit dem Wert "0" vorbelegt, auch wenn sie innerhalb eines PLC-Datentyps verwendet werden.

Ob es da einen Zusammenhang gibt, dass die 1200er zwar damit klar kommt, bei array
[*] of bool den Anfang und das Ende des angelegten Arrays zu finden, aber aufgrund der Vorbelegung bei Zugriff auf das Array > array
[*] of bool = array[0..0] of bool irgendwas durcheinander bringt?!
 
Zuletzt bearbeitet:
Gibt es irgendwo eine Referenz/Erklärung der Anweisungen wenn man kein TIA V15 installiert hat?
Die Befehle gibt es seit TIA 14.
Das beantwortet zwar nicht meine Frage, macht aber nichts, ich habe mittlerweile die Erklärung der Anweisungen in den Systemhandbüchern V14 und V15 über die Volltextsuche gefunden.

Können die Anweisungen auch Fehler melden, z.B. daß das Array gar kein Array ist?
Nein sie können nur die Grenzen feststellen, haben kein Fehlercode oder ähnliches. Dafür bräuchte man eine "IsArray"-Abfrage davor.
Laut Erklärung in den Systemhandbüchern melden die Anweisungen Fehler wie üblich über ENO.
Wie man in SCL den Fehlerstatus über ENO auswertet findet man in der TIA-Hilfe über "EN-/ENO-Mechanismus, SCL-Beispiel"
Code:
... //Testanweisung

IF NOT ENO THEN
  //Fehlerbehandlung
END_IF;

Harald
 
Laut Erklärung in den Systemhandbüchern melden die Anweisungen Fehler wie üblich über ENO.
Wie man in SCL den Fehlerstatus über ENO auswertet findet man in der TIA-Hilfe über "EN-/ENO-Mechanismus, SCL-Beispiel"

Gut, das ist ja klar dachte du meinst wie üblich das man ein RetVal bekommt.
 
Zurück
Oben