Hallo fabey,
Hallo Zusammen,
ich nutzte folgenden Baustein. Dieser kopiert mir die Störmeldungen auch passen für WinCCflex um, so das "Meld 123" auch im HMI "Meld 123" ist.
Zudem gibt er ein Sammelbit, das eine Meldung vorhanden und ob eine neue Meldung hinzu gekommen ist aus. Vielleicht passt ja was bzw kannst Du davon nutzen.
Aufruf:
CALL "fcAllg_ChangeStoerBits"
ia_Quellzeiger :=P#DB18.DBX0.0 WORD 32
idi_ZielOffset :=DINT#64
idi_AltwertOffset :=DINT#192
ib_ResetImp :="xVImpStörReset"
iT_Nr_Reset :="tSE ResetHMI"
iob_Hupe :="m SStörHupe"
iob_SStoer :="m SStörmeldung"
iob_Hilfsbit1 :="m HM21.4"
iob_Hilfsbit2 :="m HM21.5"
"DB18":
Stoerung Array[1..512] of Bool 0.0 Quellbereich für KopierFC (für die Störmeldungen) Adresse 0 !nicht ändern !!
Stoer_SPSQuitt Array[0..63] of Word 64.0 Zielbereich für KopierFC / Quelle für Visualisierung (für die Störmeldungen)
AltwertStoerung Array[0..31] of Word 192.0 dient zum Vergleich ob eine neue Störung hinzugekommen ist
der Baustein..
FUNCTION "fcAllg_ChangeStoerBits" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.2
//6.12.2011 erweitert kontrolle auf gegangene Störung...
//
//Beispiel wie ein DB aussehen sollte
//
//Stoerung Array [1..512] of bool [32 WORD]
//Stoer_SPS_Quitt Array[0..63] [64 WORD] (Ziel und Quittiebereich fürs HMI)
//AltwertStoerung Array[0..31] [32 WORD] (zur Erkennung auf neue Störungen)
//
//Aufruf
// CALL "fc ChangeStoerBits"
// ia_Quellzeiger :=P#DB18.DBX 0.0 WORD 32 //Stoerung Array [1..512]
// idi_ZielOffset :=L#64 //Stoer_SPS_Quitt Array[0..63]
// idi_AltwertOffset:=L#192 //AltwertStoerung Array[0..31]
// ib_Reset :=M1000.0
// iT_Nr_Reset :=T10
// iob_Hupe :=M1000.1
// iob_SStoer :=M1000.2
// iob_Hilfsbit :=M1000.3
//
VAR_INPUT
ia_Quellzeiger : Any; // P#DBxx.DBXy.y WORD 16
idi_ZielOffset : DInt; // der auf den Quellzeiger hinzuaddiert wird
idi_AltwertOffset : DInt; // der auf den Quellzeiger hinzuaddiert wird
ib_ResetImp : Bool;
iT_Nr_Reset : Timer;
END_VAR
VAR_IN_OUT
iob_Hupe : Bool;
iob_SStoer : Bool;
iob_Hilfsbit1 : Bool;
iob_Hilfsbit2 : Bool;
END_VAR
VAR_TEMP
tby_datentyp : Byte;
tw_wdh : Word;
tw_db_no : Word;
tdw_zeiger : DWord;
ti_SchleifenIindex : Int;
tdw_ZielZeiger : DWord;
tdw_OffsetQuittbereich : DWord;
tdw_StartZeiger : DWord;
END_VAR
BEGIN
NETWORK
TITLE =
// CALL "000fc ChangeStoerBits"
// ia_Quellezeiger:="000db_KopplungVisu".Stoerungen.Gruppe100
// ip_Offset :=P#100.0
//
// Quellzeiger zerlegen
L P##ia_Quellzeiger;
LAR1;
L B[ AR1, P#1.0];
T #tby_datentyp;// word
L W[ AR1, P#2.0];
T #tw_wdh;
L W[ AR1, P#4.0];
T #tw_db_no;
L D[ AR1, P#6.0];
T #tdw_zeiger;
// Zurücksetzen
U #ib_ResetImp;
R #iob_Hupe;
R #iob_SStoer;
// Datenbaustein öffnen
AUF DB[ #tw_db_no];
// Offset für Zielzeiger HMI-Quittierbereich
L #tw_wdh;
L 2;
*D;
T #tdw_OffsetQuittbereich;
NETWORK
TITLE = Meldungen am Display quittieren
U #ib_ResetImp;
S #iob_Hilfsbit1;
S #iob_Hilfsbit2;
UN #ib_ResetImp;
U #iob_Hilfsbit1;
L S5T#1S;
SE #iT_Nr_Reset;
U #iT_Nr_Reset;
R #iob_Hilfsbit1;
U #ib_ResetImp;
SPBN w003;
// #### Zeiger zusammen setzen #################
L #tdw_zeiger;
L #tdw_OffsetQuittbereich;
SLD 3;// Pointer bilden
+D;
L #idi_ZielOffset;
SLD 3;
+D;
T #tdw_ZielZeiger;
// #### SCHLEIFE ###############################
L #tw_wdh;
s003: T #ti_SchleifenIindex;
// #### Meldungen Quittierbit setzen ###########
L 16#FFFF;
T DBW[ #tdw_ZielZeiger];
// Zeiger um ein Word erhöhen
L #tdw_ZielZeiger;
L P#2.0;
+D;
T #tdw_ZielZeiger;
L #ti_SchleifenIindex;
LOOP s003;
// #### ENDE SCHLEIFE ##########################
w003: NOP 0;
UN #iob_Hilfsbit1;
U #iob_Hilfsbit2;
SPBN w004;
// #### Zeiger zusammen setzen #################
L #tdw_zeiger;
L #tdw_OffsetQuittbereich;
SLD 3;// Pointer bilden
+D;
L #idi_ZielOffset;
SLD 3;
+D;
T #tdw_ZielZeiger;
// #### SCHLEIFE ##############################
L #tw_wdh;
s004: T #ti_SchleifenIindex;
// #### Quittierbit zurück nehmen #############
L 16#0000;
T DBW[ #tdw_ZielZeiger];
// Zeiger um ein Word erhöhen
L #tdw_ZielZeiger;
L P#2.0;
+D;
T #tdw_ZielZeiger;
L #ti_SchleifenIindex;
LOOP s004;
// #### ENDE SCHLEIFE #########################
U #iob_Hilfsbit2;
R #iob_Hilfsbit2;
w004: NOP 0;
NETWORK
TITLE = Bytes drehen und kopieren, Störung vorhanden?
//SPS -> HMI
//Byte n+0 -> Byte n+1
//Byte n+1 -> Byte n+0
////####################################################################
//// Zeiger zusammensetzen
//// für den HMI-Bereichzeige
//
// L #tdw_zeiger
// LAR1
//
// L #idi_ZielOffset
// SLD 3
// L #tdw_zeiger
// +D
// T #tdw_ZielZeiger
// LAR2
//
//// #### SCHLEIFE zum kopieren / auswerten ####
//
// L #tw_wdh
//s001: T #ti_SchleifenIindex
//
//
//// Kopieren und Bytes im Word tauschen
// L DBW [AR1,P#0.0] // Quellword laden
// TAW // bytes im worden tauschen
// T DBW [AR2,P#0.0] // ins HMI-Zielword ablegen
// L 0
// ==I
// SPB w001 // Sprung wenn keine Störung vorhanden
//
//// wenn ja dann Störmelder setzen
// SET
// S #iob_SStoer
//w001: NOP 0
//
// +AR1 P#2.0
// +AR2 P#2.0
//
// L #ti_SchleifenIindex
// LOOP s001
//// #### ENDE SCHLEIFE ########################
//
//####################################################################
// Zeiger zusammensetzen
// für den HMI-Bereichzeige
L #tdw_zeiger;
T #tdw_StartZeiger;
L #idi_ZielOffset;
SLD 3;
L #tdw_zeiger;
+D;
T #tdw_ZielZeiger;
// #### SCHLEIFE zum kopieren / auswerten ####
L #tw_wdh;
s001: T #ti_SchleifenIindex;
// Kopieren und Bytes im Word tauschen
L DBW[ #tdw_StartZeiger];// Quellword laden
TAW;// bytes im worden tauschen
T DBW[ #tdw_ZielZeiger];// ins HMI-Zielword ablegen
L 0;
==I;
SPB w001;// Sprung wenn keine Störung vorhanden
// wenn ja dann Störmelder setzen
SET;
S #iob_SStoer;
w001: NOP 0;
L #tdw_StartZeiger;
L P#2.0;
+D;
T #tdw_StartZeiger;
L #tdw_ZielZeiger;
L P#2.0;
+D;
T #tdw_ZielZeiger;
L #ti_SchleifenIindex;
LOOP s001;
// #### ENDE SCHLEIFE ########################
NETWORK
TITLE = Vergleich auf Altwert -> neu Störung vorhanden?
//6.12.2011 erweitert kontrolle auf gegangene Störung...
//
//#####################################################################
// Auf neue Meldungen vergleichen
// Zeiger zusammensetzen
// für den Altwert zum vergleichen
L #tdw_zeiger;
T #tdw_StartZeiger;
L #idi_AltwertOffset;
SLD 3;
L #tdw_zeiger;
+D;
T #tdw_ZielZeiger;
// #### SCHLEIFE zum kopieren / auswerten ####
L #tw_wdh;
s002: T #ti_SchleifenIindex;
// Auf Neue Störung Checken
L DBW[ #tdw_ZielZeiger];// Altwert laden
L DBW[ #tdw_StartZeiger];// Aktualwert laden
XOW;// Exklusiv-Oder
L DBW[ #tdw_StartZeiger];// mit Aktualwert vergleichen
UW;
L 0;
==I;
SPB w002;// Sprung wenn kein Unterschied
// wenn ja dann Hupe setzen
SET;
S #iob_Hupe;
w002: NOP 0;
//#################################################
//### 6.12.2011 ## auf gegangen kontrollieren #####
// Auf gegangen kontollieren
L DBW[ #tdw_ZielZeiger];// Altwert laden
L DBW[ #tdw_StartZeiger];// Aktualwert laden
XOW;// Exklusiv-Oder
L DBW[ #tdw_ZielZeiger];// mit Altwert vergleichen
UW;
L 0;
==I;
SPB w012;// Sprung wenn kein Unterschied
// wenn ja dann LM resetten wird ja wieder bei der nächsten Abfrage gesetzt,
// falls noch eine Störung vorhanden ist
UN #iob_Hupe;
R #iob_SStoer;
w012: NOP 0;
//### 6.12.2011 ## ENDE ###########################
//#################################################
// #### Altwert sichern #######################
L DBW[ #tdw_StartZeiger];// Aktualwert laden
T DBW[ #tdw_ZielZeiger];// und als Altwert sichern
L #tdw_StartZeiger;
L P#2.0;
+D;
T #tdw_StartZeiger;
L #tdw_ZielZeiger;
L P#2.0;
+D;
T #tdw_ZielZeiger;
L #ti_SchleifenIindex;
LOOP s002;
// #### ENDE SCHLEIFE #########################
END_FUNCTION