- Beiträge
- 15.416
- Reaktionspunkte
- 4.044
-> Hier kostenlos registrieren
Ich mache es über Slice-Zugriff:
Alarm DB:
Anhang anzeigen 31873
OB100:
Code://Anzahl Störmeldungen CALL "T0_Anzahl_Positionen_ermitteln" ArraySize :="O2_DB_Stoermeldungen".ErrNrMax myArray :="O2_DB_Stoermeldungen".Error_Msg L "O2_DB_Stoermeldungen".ErrNrMax L 2 /I L 16 *I T "O2_DB_Stoermeldungen".ErrNrMax
ALARM Afruf:
Code:L 2 //Alarm Nummer HMI T #ErrID CALL "O8_ALARM_QUITT" Error_Delete :=#Fehler_ignorieren EVENT :=#Bandriss EVENT_NEGIERN :=FALSE RESET :=#Reset_Stoerungen ErrMax :="O2_DB_Stoermeldungen".ErrNrMax ErrNr :=#ErrID HmiErrSet :="O2_DB_Stoermeldungen".HMIErrSet[#ErrID] HmiQuit :="O2_DB_Stoermeldungen".HMIQuitt[#ErrID]
ALARM FC:
Code:FUNCTION "O8_ALARM_QUITT" : Void { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT Error_Delete : Bool; EVENT : Bool; EVENT_NEGIERN : Bool; RESET : Bool; ErrMax : Int; ErrNr : Int; END_VAR VAR_IN_OUT HmiErrSet : Bool; HmiQuit : Bool; END_VAR VAR_TEMP SPSQuit : Bool; HmiErrWord : Int; HmiErrBit : Int; SPSQuitWord : Int; SPSErrBit : Int; END_VAR BEGIN //Bit Nummer eliminieren, Array (Word) Nummer gewinnen //+1 ist weil der Index von 1..10 im Array angelegt ist. //Im Panel ist dem Bit "0" die ID 1 zugeornet, daher die Korrektur Errnr -1. //Das Anlegen von 1 - 160 entspricht der Fehler ID 1 - 160 im Panel. #HmiErrWord := SHR(IN := (#ErrNr - 1), N := 4) + 1; //Error ID durch 16 (Bits in Word) teilen, Rest = Bitnummer #HmiErrBit := (#ErrNr - 1) MOD 16; //Zweite Hälfte von Error Array ist SPS Quittirbereich #SPSQuitWord := SHR(IN := (#ErrNr + #ErrMax - 1), N := 4) + 1; #SPSErrBit := #HmiErrBit; IF NOT #Error_Delete THEN //Error vom SPS zurücksetzen // IF #RESET THEN #SPSQuit := true; ELSE #SPSQuit := false; END_IF; //Quittierbit vom HMI zurücksetzen //Quittierbit wird zurückgesetzt wenn Quittierbit= 1 und Error = 0 oder im Erste_Zyklus IF #HmiQuit AND NOT #HmiErrSet THEN CASE #HmiErrBit OF 0: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X0 := false; 1: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X1 := false; 2: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X2 := false; 3: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X3 := false; 4: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X4 := false; 5: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X5 := false; 6: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X6 := false; 7: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X7 := false; 8: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X8 := false; 9: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X9 := false; 10: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X10 := false; 11: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X11 := false; 12: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X12 := false; 13: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X13 := false; 14: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X14 := false; 15: "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X15 := false; END_CASE; END_IF; //Error setzen //Error wird vom OP oder SPS oder Erste Zyklus zurückgesetzt IF #EVENT XOR #EVENT_NEGIERN THEN #HmiErrSet := true; ELSIF #SPSQuit OR #HmiQuit THEN #HmiErrSet := false; END_IF; //Bits in Word CASE #HmiErrBit OF 0: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X0 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X0 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X0; 1: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X1 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X1 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X1; 2: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X2 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X2 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X2; 3: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X3 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X3 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X3; 4: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X4 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X4 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X4; 5: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X5 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X5 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X5; 6: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X6 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X6 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X6; 7: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X7 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X7 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X7; 8: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X8 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X8 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X8; 9: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X9 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X9 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X9; 10: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X10 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X10 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X10; 11: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X11 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X11 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X11; 12: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X12 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X12 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X12; 13: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X13 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X13 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X13; 14: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X14 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X14 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X14; 15: "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X15 := #HmiErrSet; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X15 := #SPSQuit; #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X15; END_CASE; END_IF; IF #Error_Delete THEN #HmiErrSet := false; #SPSQuit := false; #HmiQuit := false; "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord] := 0; "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord] := 0; "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord] := 0; END_IF; END_FUNCTION
Klar, wir wissen ja wie das geht, aber durch die Slice-Zugriffe hast du keinen Textbezug zur Störmeldung.
Bei mit steht da "Störmeldungen".STM_128
Wenn ich das sehe, weiß ich genau, das ist Störmeldung 128, im HMI dort zu finden, in der SPS ebenfalls.
Wie siehst du das sofort? Das sollte doch der Vorteil von symbolischer Programmierung sein oder?