-> Hier kostenlos registrieren
Liebe Mitleser,
ich habe hier schon etliche Threads gelesen über das Thema OPs und Störmeldungen.
Ich möchte einen FB entwerfen, der mir das erleichtert.
Der Baustein soll 8 Fehlermeldungen bearbeiten können, wenn ich doch mal mehr habe nehme ich einen Zweiten Baustein davon.
Ich benutze WinCC Flex 2007
Er soll über folgende Ein und Ausgänge verfügen:
Hier der Code, den ich bisher geschrieben habe. Ich weiß, daß man das viel kürzer machen kann, aber ich arbeite gern mit FUP, solange es geht, und ich möchte meine Baustein auch mal einem Lehrling geben können, ohne Ihm AWL beibringen zu müssen, damit er den Inhalt versteht.
Das ganze ist offensichtlich noch nicht fertig. Doch ich bin über das Problem mit der direkten Adressierung DIX gestolpert.
Ich bekomme die FehlerQuittierVariable ja als Word. Das soll auch so bleiben, denn der User soll von der OP-Problematik ja entlastet werden. Im Baustein will ich diese Variable aber Bitweise bearbeiten, deswegen die DIX Befehle.
Muss ich, wenn ich das Ding später mehrfach aufrufen will wirklich durch die Harte Schule mit:
Oder kann man das irgendwie unkomplizierter lösen?
Gruß,
Aksels
ich habe hier schon etliche Threads gelesen über das Thema OPs und Störmeldungen.
Ich möchte einen FB entwerfen, der mir das erleichtert.
Der Baustein soll 8 Fehlermeldungen bearbeiten können, wenn ich doch mal mehr habe nehme ich einen Zweiten Baustein davon.
Ich benutze WinCC Flex 2007
Er soll über folgende Ein und Ausgänge verfügen:
- 8 x IN Bool : Fehler
- 8 x Out Bool : Meldelampe (Firmenspezifisch: schnell blinkend für Fehler Unquittiert, langsam blinkend für Fehler quittiert aber noch anstehend)
- 1 x IN Bool : Quittieren (vom Knebelschalter)
- 1 x IN Bool : Anwesend
- 1 x IN Bool : Lampentest
- 1 x IN_OUT Word : Hier wird die Variable angegeben, die nacher in WinCC Flex übernommen wird. Gerade Bits: Fehler, Ungerade Quittierung. Es soll Hibyte und Lobyte im Baustein getauscht werden)
- 1 x IN Word : Quittiervariable Lesen in WinCC Flex. Hier kommen die Quittierungen vom OP zurück. Es werden nur 8 Bits verwendet, aber ich bekommen WinCC Flex nicht dazu ein Byte zu akzeptieren.
- 1 x Out INT : Anzahl Anliegender Störungen
- 1 x IN INT : Anzahl Anliegender Störungen von einem anderen Störbaustein Startwert 0. Hiermit sind so Dinge wie Sammelstörungsauswertung oder wenn mehr als 3 Fehler dann NotfallSMS raussenden möglich.
- 1 x IN Bool : Takt Langsamblinken
- 1 x In Bool : Takt Schnellblinken
Hier der Code, den ich bisher geschrieben habe. Ich weiß, daß man das viel kürzer machen kann, aber ich arbeite gern mit FUP, solange es geht, und ich möchte meine Baustein auch mal einem Lehrling geben können, ohne Ihm AWL beibringen zu müssen, damit er den Inhalt versteht.
Code:
FUNCTION_BLOCK "FB_Fehler"
TITLE =
VERSION : 0.1
VAR_INPUT
I_F0 : BOOL ;
I_F1 : BOOL ;
I_F2 : BOOL ;
I_F3 : BOOL ;
I_F4 : BOOL ;
I_F5 : BOOL ;
I_F6 : BOOL ;
I_F7 : BOOL ;
I_Quitt : BOOL ;
I_Anwesend : BOOL ;
I_Lampentest : BOOL ;
I_BL_La : BOOL ;
I_BL_Schn : BOOL ;
END_VAR
VAR_OUTPUT
O_ML0 : BOOL ;
O_ML1 : BOOL ;
O_ML2 : BOOL ;
O_ML3 : BOOL ;
O_ML4 : BOOL ;
O_ML5 : BOOL ;
O_ML6 : BOOL ;
O_ML7 : BOOL ;
END_VAR
VAR_IN_OUT
IO_Err_Quitt_8x : WORD ;
END_VAR
VAR
S_F_UQ_0 : BOOL ;
S_F_UQ_1 : BOOL ;
S_F_UQ_2 : BOOL ;
S_F_UQ_3 : BOOL ;
S_F_UQ_4 : BOOL ;
S_F_UQ_5 : BOOL ;
S_F_UQ_6 : BOOL ;
S_F_UQ_7 : BOOL ;
S_Fl_0 : BOOL ;
S_Fl_1 : BOOL ;
S_Fl_2 : BOOL ;
S_Fl_3 : BOOL ;
S_Fl_4 : BOOL ;
S_Fl_7 : BOOL ;
S_Fl_6 : BOOL ;
S_Fl_5 : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
U #I_F0;
FP #S_Fl_0;
S #S_F_UQ_0;
NETWORK
TITLE =
U #I_F1;
FP #S_Fl_1;
S #S_F_UQ_1;
NETWORK
TITLE =
U #I_F2;
FP #S_Fl_2;
S #S_F_UQ_2;
NETWORK
TITLE =
U #I_F3;
FP #S_Fl_3;
S #S_F_UQ_3;
NETWORK
TITLE =
U #I_F4;
FP #S_Fl_4;
S #S_F_UQ_4;
NETWORK
TITLE =
U #I_F5;
FP #S_Fl_5;
S #S_F_UQ_5;
NETWORK
TITLE =
U #I_F6;
FP #S_Fl_6;
S #S_F_UQ_6;
NETWORK
TITLE =
U #I_F7;
FP #S_Fl_7;
S #S_F_UQ_7;
NETWORK
TITLE =
U #I_Quitt;
= L 0.0;
O L 0.0;
O DIX 5.1;
R #S_F_UQ_0;
O L 0.0;
O DIX 5.3;
R #S_F_UQ_1;
O L 0.0;
O DIX 5.5;
R #S_F_UQ_2;
O L 0.0;
O DIX 5.7;
R #S_F_UQ_3;
O L 0.0;
O DIX 4.1;
R #S_F_UQ_4;
O L 0.0;
O DIX 4.3;
R #S_F_UQ_5;
O L 0.0;
O DIX 4.5;
R #S_F_UQ_6;
O L 0.0;
O DIX 4.7;
R #S_F_UQ_7;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_0;
O ;
U #I_BL_La;
U #I_F0;
UN #S_F_UQ_0;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML0;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_1;
O ;
U #I_BL_La;
U #I_F1;
UN #S_F_UQ_1;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML1;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_2;
O ;
U #I_BL_La;
U #I_F2;
UN #S_F_UQ_2;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML2;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_3;
O ;
U #I_BL_La;
U #I_F3;
UN #S_F_UQ_3;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML3;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_4;
O ;
U #I_BL_La;
U #I_F4;
UN #S_F_UQ_4;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML4;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_5;
O ;
U #I_BL_La;
U #I_F5;
UN #S_F_UQ_5;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML5;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_6;
O ;
U #I_BL_La;
U #I_F6;
UN #S_F_UQ_6;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML6;
NETWORK
TITLE =
U( ;
U #I_BL_Schn;
U #S_F_UQ_7;
O ;
U #I_BL_La;
U #I_F7;
UN #S_F_UQ_7;
O #I_Lampentest;
) ;
U #I_Anwesend;
= #O_ML7;
END_FUNCTION_BLOCK
Ich bekomme die FehlerQuittierVariable ja als Word. Das soll auch so bleiben, denn der User soll von der OP-Problematik ja entlastet werden. Im Baustein will ich diese Variable aber Bitweise bearbeiten, deswegen die DIX Befehle.
Muss ich, wenn ich das Ding später mehrfach aufrufen will wirklich durch die Harte Schule mit:
Code:
LAR1 AR2;
L P##Feh;
+AR1 ;
L1: U DIX [AR1,P#0.0];
Gruß,
Aksels