STRUCT AlarmIn : Array[0..99] of Bool;
END_STRUCT;
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
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.
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.
Muss er haben, da sich sonst das Programm gar nicht übersetzen bzw. die Funktion nicht benutzen lässt.Hast du FW-Version >= 4.2?
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
Ja, liefern die richtigen Werte.Liefern LOWER_BOUND und UPPER_BOUND die richtigen Werte (0 und 99)?
Nein sie können nur die Grenzen feststellen, haben kein Fehlercode oder ähnliches. Dafür bräuchte man eine "IsArray"-Abfrage davor.Können die Anweisungen auch Fehler melden, z.B. daß das Array gar kein Array ist?
Die Befehle gibt es seit TIA 14.Gibt es irgendwo eine Referenz/Erklärung der Anweisungen wenn man kein TIA V15 installiert hat?
Nein müssen sie nicht.Muß vielleicht die Anzahl Elemente des Bool-Arrays durch 8 teilbar sein?
[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]
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.
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;
Elemente vom Datentyp ARRAY werden mit dem Wert "0" vorbelegt, auch wenn sie innerhalb eines PLC-Datentyps verwendet werden.
Genau das meinte ich. Man hätte dann anders programmiert. Aber das ist eine Glaubensfrage. Warum verwendest du diesen Bug (sorry.. Wenn der FC nicht optimiert ist, kann man keine Array
[*] Variable definieren.
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.Die Befehle gibt es seit TIA 14.Gibt es irgendwo eine Referenz/Erklärung der Anweisungen wenn man kein TIA V15 installiert hat?
Laut Erklärung in den Systemhandbüchern melden die Anweisungen Fehler wie üblich über ENO.Nein sie können nur die Grenzen feststellen, haben kein Fehlercode oder ähnliches. Dafür bräuchte man eine "IsArray"-Abfrage davor.Können die Anweisungen auch Fehler melden, z.B. daß das Array gar kein Array ist?
... //Testanweisung
IF NOT ENO THEN
//Fehlerbehandlung
END_IF;
Weil ich in manchen Systemen <100 Meldungen habe und manchmal >1000Genau das meinte ich. Man hätte dann anders programmiert. Aber das ist eine Glaubensfrage. Warum verwendest du diesen Bug (sorry)?
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"
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?