# Quittiertaste TP177B in SPS auswerten



## bastler (6 September 2010)

Hallo
Ich habe ein Projekt in WinCC flexible 2008 erstellt. Dieses läuft auf einen TP177B. In diesen Projekt benutze ich auch die Meldeanzeige. Diese besitzt ja schon eine "integrierte" Quittiertaste. Ist es möglich, diese Taste im SPS-Programm auszuwerten? Welches Bit wird beim Drücken dieser Taste gesetzt?
Danke für eure Hilfe.

MfG
bastler


----------



## Dr.M (7 September 2010)

Mit der Quittiertaste kannst du zu jeder Meldung ein spezifisches Signal zum quittieren ausgeben. Dazu wählst du die Meldung unter "Bitmeldungen" an und kannst dann im Eigenschaftenfenster unter Ereignisse >> Quittieren >> Setze Bit >> XXXXX  dein Bit festlegen,

Quittierst du nun z.B. Meldung 1, dann wird das Bit, welches du der Meldung zugeordnet hast, gesetzt. 

Willst du nur ein Bit für alle, dann weist du halt allen das gleiche zu.


----------



## bastler (8 September 2010)

Danke für deine Hilfe. Wenn ich im Eigenschaftenfenster unter Ereignisse >> Quittieren >> Setze Bit >> auswähle, wird dieses Bit "fest gesetzt". Ich bräuchte aber eine Funktion, wo dieses Bit nur solange gesetzt ist, solang ich auf die Quittiertaste drücke. Wie kann man den das realisieren? Sorry für die blöden Fragen, aber ich bin kein Programmierer.

MfG
bastler


----------



## Manfred Stangl (8 September 2010)

so in der Art:
Wenn dein Störmeldemerker verschwindet ( negative Flanke) dieses Quittbit das "festgesetzt" ist, rücksetzen.


----------



## bastler (10 September 2010)

Hallo
Irgendwie komm ich nicht so richtig weiter. Mit der Quitt-Taste quittiere ich die Meldung und gleichzeitig möchte ich eine Hupe abschalten, die bei jeder eingehenden Meldung los geht. Steht eine Meldung noch an, soll halt nur der Merker, der die Hupe eingeschalten hat, zurückgesetzt werden. Dafür bräuchte ich halt dieses kurze Signal, wenn auf die Quittiertaste gedrückt wird. Mit den Quittierbits wie es Manfred beschrieben hat komm ich irgendwie nicht klar. Gibt es denn keine Möglichkeit diese Taste auszuwerten?

MfG
bastler


----------



## jabba (10 September 2010)

Mit der Taste wird nur bestätigt das die Meldung gelesen wurde
ACK=ACKnowledgement

Wenn diese taste betätigt wird, wird immer nur ein Bit der aktuellen Meldung gesetzt. Für die Hupe müßtet due theoretisch alle Bits einzeln abfragen.
Dies erfodert aber einiges an Arbeit.

Nun kann man ein paar mehr oder weniger schöne Sachen anwenden.

Man kann die Quittiervariablen auf 0 setzen, und jedesmal wenn ein Bit kommt, die hupe quittieren und die Quittierbits wieder löschen.
Dies funktioniert aber nicht, weil man eine Meldung nur einmal bestätigen kann, sollte die Störung also nicht weggegangen sein, kann man die Huper nicht mehr quittieren.

Hier hab ich das Verfahren der Meldungen mal beschrieben.

Eine einfache Sache wäre z.B. auf dem Störmeldebild eine extra Taste zu hinterlegen mit "Reset" oder "Hupe aus".

Je nachdem wieviele Meldungen es werden, kann man auch die Bits abfragen. Dazu müßte man mal die Anzahl der Meldungen wissen.

Ich habe immer eine extra Taste zum Löschen der bereits quittierten Meldungen, sollten diese noch anstehen. Hält man diese taste z.B. fest, werden alle noch nicht quittierte Meldungen gelöscht.


----------



## God_Failed (10 September 2010)

Hi, AFAIK kann man in der Vorlage der Taste eine Funktion zuweisen, Bit setzen etc, wenn es das ist was Du wissen willst ! 

Gruß Kai


----------



## bastler (10 September 2010)

Also es sind max. 64 Störungen. 
Was ich nicht verstanden habe, du schreibst du hast eine Taste für bereits quittierte Meldungen. Ich nutze die Meldeanzeige von WinCC flexible und da ist doch die Quittiertaste bereits integriert. Ich fürchte ich hab die ganze Problematik mit der Meldeanzeige noch nicht ganz verstanden. Ich dachte bei älteren Tasten-OP's konnte man die einzelnen Tasten (per Bereichszeiger ???)abfragen. So wollte ich es halt auch mit dem TP177B machen. Das Problem ist halt, dass ich kein Programmierer bin, und das ein oder andere nicht ganz so verstehe wie die Profis hier.

MfG
bastler


----------



## jabba (10 September 2010)

God_Failed schrieb:


> Hi, AFAIK kann man in der Vorlage der Taste eine Funktion zuweisen, Bit setzen etc, wenn es das ist was Du wissen willst !
> 
> Gruß Kai




Wie und wo soll das gehen, oder ist das was neuen in SP2 ?


----------



## bastler (10 September 2010)

@God_Failed
Die Taste ist in der Meldeanzeige integriert, die geht nicht extra zu konfigurieren, auch nicht in der aktuellen Version, ich wüßte zumindest nicht wie.

Gruß bastler


----------



## jabba (10 September 2010)

bastler schrieb:


> Also es sind max. 64 Störungen.
> Was ich nicht verstanden habe, du schreibst du hast eine Taste für bereits quittierte Meldungen. Ich nutze die Meldeanzeige von WinCC flexible und da ist doch die Quittiertaste bereits integriert. Ich fürchte ich hab die ganze Problematik mit der Meldeanzeige noch nicht ganz verstanden. Ich dachte bei älteren Tasten-OP's konnte man die einzelnen Tasten (per Bereichszeiger ???)abfragen. So wollte ich es halt auch mit dem TP177B machen. Das Problem ist halt, dass ich kein Programmierer bin, und das ein oder andere nicht ganz so verstehe wie die Profis hier.
> 
> MfG
> bastler



Bei den alten OP's bzw bei OP's kann man über die Systemtastatur die "ACK"-Taste abfragen und zum quittieren verwenden. Dieses gibt es aber bei reinen TP's nicht. Daher eventuell der Umweg über eine extra Taste.

Man muß dieses mal aus der Sicht sehen, wie es mal von Siemens entwickelt wurde.

Wenn eine Störung kommt, wird diese am Panel bestätigt, die Meldung bekommt den Status "K" für gekommen. Jetzt kann man diese eine Meldung auf der der Focus steht quittieren, und dann die nächste. Würde man über eine taste alle Meldungen quittieren und vieleicht löschen , könnte man eventuelle ein unbeabsichtige Handlung durchführen oder man würde eine Meldung die eventuell weiter unten steht nie sehen. Normalerweis muß man jede Störmeldung einzeln quittieren, dann kann man diese auch mit den einzelnen Bits abfragen. Jetzt könnte dies unter Umständen bei bestimmten Meldungen zu viel sein, dann kann man diese in eine Quittiergruppe zusammenfassen, und bei ACK werden allen Meldungen dieser Gruppe auf einmal quittiert.

Hast Du dir mal den Tread den ich verlinkt habe durchgelesen ?
Dort steht eigentlich alles wichtige erklärt, und es ist ein Diagramm vorhanden wie der Ablauf des Meldewesens funktioniert.


----------



## PN/DP (10 September 2010)

God_Failed schrieb:


> Hi, AFAIK kann man in der Vorlage der Taste eine Funktion zuweisen, Bit setzen etc, wenn es das ist was Du wissen willst !


Bei Panelen, die eine echte Tastatur besitzen (z.B. MP277 Key), kann man verschiedenen Systemtasten eine Funktion zuweisen.
z.B. der ESC-Taste, den Blätter-Tasten und auch der gelben ACK-Taste.
Ich meine, die LEDs kann man auch manipulieren.

Edit: das geht schon mindestens seit WCCflex 2007

Harald


----------



## iPDI (11 September 2010)

Am besten blendest du die integrierte ACK Taste aus und erstellst einen neuen Button. Mit diesem kannst du dann auch anstellen, was du willst...


----------



## bastler (11 September 2010)

Hallo
Ich denke ich bin ein ganzes Stück näher ans Ziel gekommen. Im NW 1-4 mache ich die Flankenauswertung der Störmeldeeingänge. Bei jeder negativen Flanke, also beim Eintreffen einer Störung wird die Hupe (DB100.dbx1.0) im NW9 angesteuert.
Bei jeder Störmeldung wird ein dazugehöriges Quittierbit beim Quittieren der Meldung gesetzt. Jetzt wollte ich die positive Flanke der Quittierbits nutzen, (ebenfalls über die Flankenauswertung NW 5,6,7,8 um die Hupe wieder zurückzusetzen. Die Quittierbits werden nach Drücken auf die Quittiertaste ordentlich gesetzt, und setzen sich zurück, wenn die Störung weg ist. Folgendes Problem hab ich aber noch.
Sobald eine Störung einläuft wird die Hupe angesteuert und direkt wieder ausgeschalten, also vor dem eigentlichen quittieren. Was mach ich denn da noch falsch? Ich denke der Fehler liegt im NW 9, wo ich die Abfragen der Flankenauswertung mache. Vielleicht findet ja von euch einer den Fehler, wäre sehr dankbar.


```
NW1
//Flankenauswertung EW0 
//Flankenauswertung Eingänge 0-15 für Ansteuerung Hupe/Lampe
CALL  FC   102
       IN :=EW0
       OUT:=MW42
       HM :=MW40

NW2
//Flankenauswertung EW2
//Flankenauswertung Eingänge 16-31 für Ansteuerung Hupe/Lampe 
 CALL  FC   102
       IN :=EW2
       OUT:=MW46
       HM :=MW44

NW3
//Flankenauswertung EW4 
//Flankenauswertung Eingänge 32-47 für Ansteuerung Hupe/Lampe
 CALL  FC   102
       IN :=EW4
       OUT:=MW50
       HM :=MW48

NW4
//Flankenauswertung EW6 
//Flankenauswertung Eingänge 48-63 für Ansteuerung Hupe/Lampe
 CALL  FC   102
       IN :=EW6
       OUT:=MW54
       HM :=MW52

NW5
//Rücksetzen Hupe/Lampe über Quittierbits Word 8
//Rücksetzen der Hupe/Lampe mit Quittierbits der Störungen 0-15
 CALL  FC   101
       IN :=DB100.DBW8
       Out:=MW58
       HM :=MW56

NW6
//Rücksetzen Hupe/Lampe über Quittierbits Word 10
//Rücksetzen der Hupe/Lampe mit Quittierbits der Störungen 16-31
 CALL  FC   101
       IN :=DB100.DBW10
       Out:=MW62
       HM :=MW60

NW7
//Rücksetzen Hupe/Lampe über Quittierbits Word 12
//Rücksetzen der Hupe/Lampe mit Quittierbits der Störungen 32-47
 CALL  FC   101
       IN :=DB100.DBW12
       Out:=MW66
       HM :=MW64

NW8
//Rücksetzen Hupe/Lampe über Quittierbits Word 14
//Rücksetzen der Hupe/Lampe mit Quittierbits der Störungen 48-63
 CALL  FC   101
       IN :=DB100.DBW14
       Out:=MW70
       HM :=MW68

NW9
//Ansteuerung und Rücksetzen der Hupe/Lampe
      U(    
      O(    
      L     MW    42
      L     W#16#0
      <>I   
      )     
      O(    
      L     MW    46
      L     W#16#0
      <>I   
      )     
      O(    
      L     MW    50
      L     W#16#0
      <>I   
      )     
      O(    
      L     MW    54
      L     W#16#0
      <>I   
      )     
      )     
      FP    M     10.3
      S     M     10.2
      U(    
      O(    
      L     MW    58
      L     W#16#0
      <>I   
      )     
      O(    
      L     MW    62
      L     W#16#0
      <>I   
      )     
      O(    
      L     MW     66
      L     W#16#0
      <>I   
      )     
      O(    
      L     MW    70
      L     W#16#0
      <>I   
      )     
      )     
      FP    M     10.4
      R     M     10.2
      U     M     10.2
      =     L     16.0
      U     L     16.0
      BLD   102
      =     DB30.DBX    1.0
      U     L     16.0
      U     M      1.5
      =     DB30.DBX    1.1
```
NW 9 hab ich noch mal in FUP als Bils angehängt. Der FC 101 und FC 102 sind von http://www.sps-forum.de/showthread.php?t=30058. Danke dafür an PN/DP.

MfG
bastler


----------



## PN/DP (11 September 2010)

bastler schrieb:


> Sobald eine Störung einläuft wird die Hupe angesteuert und direkt wieder ausgeschalten, also vor dem eigentlichen quittieren. Was mach ich denn da noch falsch?


Hallo bastler,

an Deinem Programmcode kann ich keinen Fehler erkennen (außer daß die Flankenbildung vor dem Setzen und Rücksetzen des M10.2 überflüssig ist).
Wenn der M10.2 schon vor dem Quittieren wieder rückgesetzt wird, dann muß eines der Quittierbits vom DB100 unbeabsichtigt auf 1 gegangen sein 
oder wenigstens einer dieser Merker wird woanders nochmal beschrieben: M10.2, M10.3, M10.4, MW58, MW62, MW66, MW70

Bevor Du Dich an der Fehlersuche hier festbeißt, mein Vorschlag, Dein Hupen-Konzept nochmal zu überdenken.
Ich würde die Hupe nicht durch das Quittieren einer Störmeldung abschalten sondern durch eine extra-Taste.

Die Ansteuerung einer Störungshupe ist nicht ganz so trivial wie es auf den ersten Blick aussieht. Einerseits sollte die Störungshupe nicht ewig hupen, 
sondern zeitbegrenzt. Andererseits sollte die Hupe schnell ausschaltbar sein, bevor eine Störmeldung quittiert wird, damit der Bediener die Störmeldung(en) 
erst in Ruhe lesen kann, bevor er sie quittiert. Und das hohe C ist, wenn die Hupe nicht immer wieder neu losbrüllt, wenn eine Störung in schneller Folge 
kommt und geht.

Wenn ich eine Störungshupe an einer Anlage habe, dann löse ich die Hupensteuerung gewöhnlich so:

Ich habe einen Merker "Sammelstörung", der aus einer einfachen Oder-Wordverknüpfung aller anstehenden Störungen gebildet wird.
Ich habe einen Merker "Neustörung", der gesetzt wird, wenn eine neue bisher unquittierte Störung kommt.
Die Hupe wird vom Merker "Neustörung" und eine anschließende Zeitbegrenzung angesteuert. Die Zeit ist einstellbar von 0s bis ...

Ich habe eine rote Leuchtdrucktaste
* die Lampe leuchtet dauernd, solange irgendeine Störung ansteht (Sammelstörung und nicht Neustörung)
* die Lampe blinkt bei Neustörung
* drücken dieser Taste rücksetzt Neustörung und schaltet damit die Hupe ab
* langes drücken dieser Taste >2s schaltet die Hupe und die Lampe ein, solange gedrückt (Hupentest, Bediener-Ruf)
Das lange Drücken dieser Taste nutze ich meist auch gleich als Lampentest für alle Meldeleuchten (>0,5s Lampentest, >2s Hupe ein).

Die Funktion der Leuchtdrucktaste kann auch rein am Touchpanel realisiert werden. Die Taste sollte dann aber egal aus welchem Bild schnell 
gefunden werden, möglichst maximal ein Bildwechsel. Fast immer habe ich in der rechten oberen Ecke des Touchpanels eine Uhrzeitanzeige und 
eine stilisierte Anlagen-Zustandsampel rot/gelb/grün und darüber eine unsichtbare Schaltfläche, die ein Bild aufruft, wo auch diese Taste 
mit drauf ist.

Das Konzept kann man verfeinern, indem man der Hupe je nach "Meldeklasse" unterschiedliche Impulsfolgen bis zu "nicht hupen" aufmoduliert.

PS:
Die Flankenerkennungs-FC101 und FC102 kann man sehr leicht für die Verarbeitung von gleich 32 Bit (DWORD) modifizieren.
Wenn die Störungsbits zur HMI und die Quittierbits als Array of Word deklariert sind, dann ist eine Word-weise Verarbeitung wegen der Symbolik
aber besser.

Harald


----------



## bastler (11 September 2010)

Danke Harald für deine ausführliche Erklärung. Ich dachte ich hätte es fast geschafft, und jetzt soll ich alles nochmal überdenken:shock:. Du hast mit deinen Ausführungen völlig recht, und wenn ich es richtig verstanden habe, trennst du die eigentliche Störmeldeanzeige und die Signalisierung (Hupe) programmtechnisch gesehen, komplett von einander. Das ist sicherlich die bessere Wahl, als wie ich es jetzt machen wollte. 

Nun mein Problem ist


> Das Problem ist halt, dass ich kein Programmierer bin, und das ein oder andere nicht ganz so verstehe wie die Profis hier.


Ich werde es mal versuchen es so zu programmieren wie du es beschrieben hast.
Hättest du eventuell ein paar Codeschnipsel, das würde mir die Sache sicherlich erleichtern. Nicht falsch verstehn, ich will kein fertiges Programm, nur eine Starthilfe, denn ich will ja die ganze Sache auch lernen.

Schönes Wochenende
bastler


----------



## PN/DP (12 September 2010)

bastler schrieb:


> Hättest du eventuell ein paar Codeschnipsel, das würde mir die Sache sicherlich erleichtern. Nicht falsch verstehn, ich will kein fertiges Programm, nur eine Starthilfe, denn ich will ja die ganze Sache auch lernen.


Hallo bastler,

ich habe mal aus meinen Projekten ein Beispiel zusammenkopiert und auf 64 Meldungen gekürzt. Wenn Du Glück hast, dann habe 
ich nichts vergessen und das Programm ist fast fertig. Du mußt aber noch Deine Meldungen zufügen.
Zu lernen gibt es trotzdem noch genug. Vor allem, wenn Du die AWL-Netzwerke verstehen willst. Dazu sind aber überreichlich 
Kommentare von mir vorhanden. Am besten kann man lernen, wenn man dem Programmablauf zuschaut, z.B. mit PLCSIM.

Das Programmbeispiel tut im wesentlichen das, was ich im Beitrag #15 beschrieben habe inklusive Lampentest und Hupetest.
Aber auch noch etwas mehr.
Zum Beispiel gibt es einen Meldefilter, mit dem man Meldungen deaktivieren kann. Nützlich, wenn man Meldungen temporär 
unterdrücken will oder z.B. Reserve-Abzweige hat, wo die Sicherung ausgeschaltet ist und man diesen absichtlichen 
Sicherungsfall nicht als Störung gemeldet haben will.

Das Programm ist außerdem so geschrieben, daß man auch mehrere Panele anschließen kann und trotzdem nicht auf jedem Panel 
die Meldungen quittieren muß. Wird auf irgendeinem Panel eine Meldung quittiert, dann wird das den anderen Panels mitgeteilt 
und die Meldungen verschwinden auf allen Panels. (WinCCflex-Stichwort: "Quittiervariable Lesen" und "Quittiervariable Schreiben")
Man kann Meldungen auch im SPS-Programm quittieren (die entsprechende "Quittiervariable Lesen" auf 1 setzen).

Die Störungshupe kommt nur bei neuen Störungen und wird mit einem extra Quittiertaster abgestellt. Der Quittiertaster ist 
auch als Schaltfläche auf dem Panel vorgesehen, die das Bit DB32.DBX0.0 setzt. Das Bit wird im Programm zurückgesetzt.
Die maximale Hupzeit kann von 0 (nicht hupen), 1s bis 998s hupen und 999=unbegrenzt hupen eingestellt werden.
Wenn das Quittieren einer Meldung am Panel implizit die Hupe abstellen soll (ohne den extra-Taster), dann müßte man noch 
eine pos. Flankenerkennung auf alle Bits der "Quittiervariablen Lesen" einbauen (Array OPQuit DB30.DBX16.0 bis DBX23.7) 
und in den Merker M1.0 "M_Quittiert" verknüpfen.

Die Störungslampe blinkt sobald eine neue Störung kommt, solange, bis mit dem Hupe-Quittiertaster quittiert wird. Auch wenn 
alle Störungen wieder gegangen sind. So sieht man von weitem, daß es eine Störung gab, auch wenn das schon lange her ist.
Sind nach dem Hupe-Quittieren noch Störungen vorhanden, dann leuchtet die Störungslampe mit Dauerlicht.

Die Störungsmerker sind die Merker M100.0 bis M107.7. An diese Merker müssen die eigenen Störungen angebunden werden.
Dazu habe ich zwei Beispiele dabei:
- einfaches Zuweisen von garantiert langen Störungen (z.B. Motorschutzschalter, Sicherungsfall)
- gespeicherte Störmeldung für möglicherweise nur ganz kurze Störungen
Solange eine gespeicherte Störmeldung nicht am Panel quittiert ist, löst Gehen und wiederKommen der Störung die Hupe 
nicht erneut aus. Welche Störung wie angebunden wird, muß man für jede Störung sinnvoll entscheiden.

Das Programm nutzt zum Blinken die Taktmerker der CPU. Es geht davon aus, daß in der HW-Konfig der CPU die Taktmerker 
auf MB3 eingestellt sind.

Wie die Meldungen in WinCC flexible anzulegen sind und wie das Meldefenster und 2 Meldeanzeigen einzustellen sind ist in 
den Programmkommentaren beschrieben.

Ich würde noch eine Funktion "Alle Meldungen löschen" einbauen, z.B. über eine Schaltfläche am Panel, besser auf eine 
Hardware-Taste oder Tastenkombination legen. Für den Fall, daß durch Tippfehler im Programm  oder Defekt des Panels 
bzw. Kommunikationsstörungen ein Störmerker ewig gesetzt bleibt. Dazu alle Störungsmerker M100.0 bis M107.7 rücksetzen 
(auf 0 schreiben).

Harald


----------



## PN/DP (12 September 2010)

*Nachtrag*

Falls Du die Flankenerkennung für "Störung neu gekommen" suchst, die steckt hier:

```
//Filter aktive Meldungen + Flanke Meldung "kommt"      
      L     "ErrMsg_1-16"               //alle Meldungen jetzt = 1
      L     "DB_Meldungen".Ignore[1]    //ignore=1
      INVI                              //-> ignore=0
      UW                                //-> filtern
[COLOR="Blue"]      T     #ErrMsg_akt_1               //aktive Meldungen jetzt = 1
      L     "DB_Meldungen".ErrMsg[1]    //Meldungen vorher
      INVI                              //vorher = 0
      UW                                //-> neu = 1[/COLOR]
      U     <>0
      =     #Temp_Neustoer

//AKKU1 Bits=1: Meldung "kommt" (neu)
//-> die zugehörigen "OPQuit[x].y" löschen
//-> die anderen "OPQuit[x].y" beibehalten/übernehmen
      INVI                              //-> NICHT neu = 1
      L     "DB_Meldungen".OPQuit[1]    //Quit irgendein OP
      UW                                //nicht neue beibehalten
      T     "DB_Meldungen".OPQuit[1]    //neue löschen
      T     "DB_Meldungen".ErrMsg[5]    //OPQuit zu AQuit -> alle OP

[COLOR="blue"]      L     #ErrMsg_akt_1               //aktive Meldungen jetzt
      T     "DB_Meldungen".ErrMsg[1]    //-> Meldungen vorher + OP[/COLOR]
```

Harald


----------



## bastler (13 September 2010)

Hallo Harald

Vielen Dank für deine Mühe. Ich bin leider heute noch nicht dazu gekommen, mich in dein Programm einzuarbeiten, morgen werd ich mir aber die Zeit nehmen, und da werde ich dann sehen ob ich alles so verstehe. So wie du es beschrieben hast klingt das richtig professionell, das wäre ich nie darauf gekommen. Vielen Dank nochmal.

Viele Grüße
bastler


----------



## winnman (13 September 2010)

Hallo Leute,

Also ich hab das im TP177B folgendermassen gelöst:

die Bitmeldungen so konfiguriert, dass sie am TP nur solange anstehen, bis sie von der SPS wider auf 0 gehen, in der "Kopfzeile" einen normalen Button eingebaut, mit dem ich ein Quittierbit in der SPS setzen und den Rest in de SPS gelöst, dann hat man auch die Möglichkeit im bearbeitungszyklus die Hupe zu Quittieren. Das Quittierbit wird am Zyklusende bzw nach bearbeiten der Störbehandlung wider zurückgesetzt. 
Das ist zwar ein bisschen aufwendiger als die fertige Meldungsfunktionen des TP zu nutzen, funktioniert aber wunderbar.

sg 
winnman


----------



## bastler (14 September 2010)

Hallo Harald
Heute hatte ich Zeit mir dein Programm mal anzuschauen. Im großen und ganzen hab ich verstanden wie du die Meldungen verarbeitest, allerdings funktioniert die Flankenauswertung für die Neuwertmeldung bei mir nicht.
Um nur die Flankenauswertung zu testen hab ich folgendes gemacht:

Neues Programm angelegt:
OB1

```
call FC15
```
FC15

```
NW1
//Filter aktive Meldungen + Flanke Meldung "kommt"            
L     EW0              //alle Meldungen jetzt = 1       
L     "DB_Meldungen".Ignore[1]    //ignore=1       
INVI                              //-> ignore=0       
UW                                //-> filtern [COLOR=Blue]      
T     #ErrMsg_akt_1               //aktive Meldungen jetzt = 1       
L     "DB_Meldungen".ErrMsg[1]    //Meldungen vorher       
INVI                              //vorher = 0       
UW                                //-> neu = 1[/COLOR]       
U     <>0       
=     #Temp_Neustoer  //AKKU1 Bits=1: Meldung "kommt" (neu) //-> die zugehörigen "OPQuit[x].y" löschen //-> die anderen "OPQuit[x].y" beibehalten/übernehmen       
INVI                              //-> NICHT neu = 1       
L     "DB_Meldungen".OPQuit[1]    //Quit irgendein OP       UW                                //nicht neue beibehalten       
T     "DB_Meldungen".OPQuit[1]    //neue löschen       
T     "DB_Meldungen".ErrMsg[5]    //OPQuit zu AQuit -> alle OP  [COLOR=blue]      
L     #ErrMsg_akt_1               //aktive Meldungen jetzt       
T     "DB_Meldungen".ErrMsg[1]    //-> Meldungen vorher + OP[/COLOR]

NW2
L #Temp_Neustoer
S M5.0
```
Den DB "DB_Meldungen" hab ich unverändert übernommen. Alle Bits im EW0 auf 1 gesetzt. In PLCSIM geladen und dann E0.0 auf 0 gesetzt. Jetzt hätte doch eigentlich M5.0 auf 1 gehen müssen, macht er aber erst, wenn E0.0 wieder 1 wird. Das würde ja bedeuten, dass die Neuwertmeldung erst beim "Gehen" und nicht beim "Kommen" der Störung aktiviert wird. Hab ich da wieder einen Denkfehler?

Gruß
bastler


----------



## PN/DP (14 September 2010)

Hallo Bastler,

das Netzwerk erwartet die aktiven Störungen als 1. Deine Eingänge sind 0-aktiv, d.h. 0=Störung.
Du müßtest also das EW0 negieren. Da es kein "LN EW0" (Lade Not EW0) gibt, muß man die Bits 
nach dem Laden negieren. Das macht INVI. Also so:

```
NW1
//Filter aktive Meldungen + Flanke Meldung "kommt"
L     EW0                         [COLOR="Red"]//Störungen sind 0
INVI[/COLOR]                              //alle Meldungen jetzt = 1
L     "DB_Meldungen".Ignore[1]    //ignore=1
INVI                              //-> ignore=0
UW                                //-> filtern [COLOR=Blue]
T     #ErrMsg_akt_1               //aktive Meldungen jetzt = 1
L     "DB_Meldungen".ErrMsg[1]    //Meldungen vorher
INVI                              //vorher = 0
UW                                //-> neu = 1[/COLOR]
U     <>0
=     #Temp_Neustoer
//AKKU1 Bits=1: Meldung "kommt" (neu)
//-> die zugehörigen "OPQuit[x].y" löschen
//-> die anderen "OPQuit[x].y" beibehalten/übernehmen
INVI                              //-> NICHT neu = 1
L     "DB_Meldungen".OPQuit[1]    //Quit irgendein OP
UW                                //nicht neue beibehalten
T     "DB_Meldungen".OPQuit[1]    //neue löschen
T     "DB_Meldungen".ErrMsg[5]    //OPQuit zu AQuit -> alle OP[COLOR=blue]
L     #ErrMsg_akt_1               //aktive Meldungen jetzt
T     "DB_Meldungen".ErrMsg[1]    //-> Meldungen vorher + OP[/COLOR]

NW2
[COLOR="Red"]U[/COLOR]     #Temp_Neustoer
S     M5.0
```
Ich würde aber hier im Netzwerk1 nicht direkt das EW0 verarbeiten, sondern die 64 Eingänge einzeln 
den Störmerkern M100.0 ... M107.7 zuweisen. (siehe die 2 Beispielnetzwerke im Projekt)
Damit lasse ich mir alle Möglichkeiten offen, später einzelne Störungen einfach auf speichernde Störmerker 
umzuändern oder Verzögerungen einzubauen, falls einzelne Signale prellen. 
So ein bischen Rangieren ist nie verkehrt.
Das sieht auch in der Referenzliste besser aus, besonders, falls das Programm mal größer wird.

```
//NW1
UN    E0.0
=     M100.0

//NW2
UN    E0.1
=     M100.1

...

//NW64
UN    E7.7
=     M107.7
```
Wenn Dir die 64 simplen Netzwerke zu viel Arbeit sind, kannst Du auch kurz das schreiben:

```
L     EW0
INVI
T     MW100
...
L     EW6
INVI
T     MW106
```
Das geht auch noch kürzer, indem Du gleich 32-Bit-weise transferierst: 
ED0 -> INVD -> MD100, ED4 -> INVD -> MD104.

Harald


----------



## bastler (15 September 2010)

Hallo Harald
Ich hab dein Programm zum laufen gebracht, vom feinsten. 3 Fragen hätte ich aber noch:

1. Im NW 7 wo die Flankenerkennung programmiert ist schreibst du für die Meldungen 1-16 
	
	



```
= #Temp_Neustoer
```
 und für die Meldungen 17-32, 33-48, 49-64 schreibst du 
	
	



```
S #Temp_Neustoer
```
 Warum setzt du #Temp_Neustoer bei den Meldungen 1-16 mit einem "="?

2. Ich kann in WinCCflex bei keiner Bitmeldung/Störmeldung unter Eigenschaften/Quittierung eine Quittiervariable Schreiben eintragen (DB_Meldungen.OPQuit[1]) Es kommt die Meldung "Dieser Wert ist ungültig". Unter Kommunikation/Variablen ist aber DB_Meldungen.OPQuit[1] angelegt.

3. Folgendes Szenario: Es kommt eine Störung, die Hupe ist für die programmierte Zeit ein und die Lampe blinkt, es wird nirgends wo was quittiert. Jetzt läuft eine zweite Störung ein, die Lampe blinkt und nun sollte doch eigentlich die Hupe wieder losgehen, macht sie aber nicht, weil es ja so programmiert ist. Bei mir ist der Fall aber so, dass das Panel nicht ständig unter Aufsicht ist und die Störmeldeanlage auch nicht für eine Maschine ist, wo man dann irgendwann mitkriegt, dass was nicht funtioniert und dann aufs Panel schaut, welche Meldung eingelaufen ist. Das Panel sitzt bei uns im Werk in der Wache und dort laufen sämliche Störungen ein, die nicht maschinenbezogen sind, z.B. Abwasserkanal übervoll. Wenn das Wachpersonal durch die Hupe und die Meldelampe singnalisiert bekommt , das eine Störung eingelaufen ist, informiert sie den zuständigen Mitarbeiter. Laufen mehrer Störungen ein, so soll jede wieder per Hupe signalisiert werden. Ist das realisierbar?

Gruß
bastler


----------



## PN/DP (15 September 2010)

1. Weil #Temp_Neustoer eine temporäre Variable ist, der ich bei der ersten Zuweisung unbedingt etwas zuweisen muß, z.B. auch eine 0.
Alternativ hätte ich auch 4 Variablen Temp_Neustoer_x benutzen können, alle mit = zuweisen und zum Schluß ver-Odern.

2. Öffne mal in WinCC flexible den Ordner "Bitmeldungen" und klicke mit der rechten Maustaste auf die Spaltenköpfe.
Da kannst Du die fehlenden Spalten für die Quittiervariablen einblenden.

Im Bausteinkommentar gleich zu Beginn des FC15 habe ich die erforderliche Zuordnung aufgeführt:
Triggervariable: DB_Meldungen.ErrMsg / Bit 0 bis 63
Quit.Var.Schreiben: DB_Meldungen.ErrMsg / Bit 64 bis 127
Quit.Var.Lesen: DB_Meldungen.OPQuit / Bit 0 bis 63

Falls Du das nicht meinst:
Welche Meldeklasse haben Deine Bitmeldungen? Erfordert diese Meldeklasse das Quittieren?

3. Ein bischen Arbeit soll ja auch noch für Dich bleiben. 

Ist das Wachpersonal denn nicht ständig anwesend?
Lege doch die Störungsleuchte samt Quittiertaster und die Hupe (!) ins Wachbüro.
Dann muß (und wird!) das Wachpersonal eben das Kommen einer neuen Störung mit diesem Taster quittieren.
Der Taster schaltet ja nur die Hupe ab und macht aus dem Blinken ein Dauerleuchten. Die Meldungen bleiben auf dem Panel angezeigt.
Dann wird bei der nächsten Störung auch wieder die Hupe aktiviert.

Sollte tatsächlich die Hupendauer ablaufen ohne Quittierung und bei der nächsten noch nicht signalisierten Störung soll die Hupe dann 
erneut aktiv werden, dann muß Du "nur" erkennen, ob zu den vorhandenen unquittierten Störungen welche dazukommen. Sprich: ob die Anzahl 
0-Bits im Array OPQuit *größer* wird. In dem Moment erzeugst Du einen 1-Zyklus langen Impuls, mit dem Du im Hupe-Netzwerk entweder die 
Verbindung M1.2 zum Eingang T30 unterbrichst (T30 startet dann neu) oder den Merker M1.2 rücksetzt (was in FUP/KOP in dem Netzwerk aber 
nicht geht).

Das gerade beschriebene ist nicht schwer zu programmieren, doch vielleicht gefällt Dir diese einfachere Lösung besser:
Mit einem zweiten Timer (z.B. T31) nach Ablauf der Hupendauer T30 eine Pausezeit abmessen und danach die Hupendauer erneut starten.
Dann wird die Hupe in Intervallen aktiv, solange eine gekommene Störung nicht mit der Hupentaste quittiert wurde. Egal ob inzwischen
eine weitere Störung dazugekommen ist oder nicht. Kommt eine weitere Störung während der Pausezeit, dann wird die Hupe allerdings erst 
am Ende der Pausezeit wieder aktiv. Oder man kombiniert beide Lösungen.

Realisierbar ist eigentlich alles was man sich vorstellen kann. Dazu müßtest Du mal detailliert die Möglichkeiten und Wünsche mit dem 
Betreiber diskutieren. Besonders das Thema einer möglichen Lärmbelästigung von Nachbarn ansprechen.

Tip:
Für das Zählen von 1-Bits in einem DWORD liefert Step7 eine fertige Funktion: FC99 "BITSUM".

Gruß
Harald
* 999 *


----------



## bastler (18 September 2010)

Hallo Harald

Hab jetzt alles soweit am laufen, auch dass die Hupe bei jeder Störmeldung wieder losgeht. Was mich noch interessieren würde, wie du die Bits für die Deaktivierung der Meldungen setzt. Machst du das auch übers OP, wenn ja wie sieht das Bild dazu aus?

MfG
bastler


----------



## PN/DP (18 September 2010)

Hallo Bastler,

das softwaremäßige deaktivieren von Meldungen ist eine feine Sache, gerade wenn das 0-aktive Meldungen sind.
So muß kein Elektriker Drahtbrücken setzen oder entfernen und kein Programmierer tätig werden.

Bei nur 64 Meldungen würde ich je nach Panel 2 bis 8 Bilder machen, wo jede Meldung aufgeführt wird und 
jede einen eigenen Schalter zum aktivieren/deaktivieren dieser Meldung hat (geht direkt auf das zugehörige 
Bit im Ignore-Array). Dafür eignet sich ein Schalter mit Checkbox-Grafik. Hier kann man auch direkt sehen 
bzw. kontrollieren, welche Meldungen deaktiviert sind und welche nicht.

Da ich oft mehrere hundert Meldungen habe, ist mir der Aufwand für die Erstellung und Pflege dieser Bilder 
zu hoch. Deshalb habe ich einen Button zum aktivieren aller Meldungen (keine mehr unterdrücken) und einen 
Button zum deaktivieren aller gerade aktiven Störungen (diese Meldungen unterdrücken).
Nur für ein paar ausgewählte Störungen gibt es Buttons, um die Störmeldungen einzeln zu de-/aktivieren.
Siehe angehängte Screnshots (MP370).

```
// Network: Störmeldungen unterdrücken: Ignore-Liste setzen/löschen gesamt

// Taste "aktuelle Störungen ignorieren"
// -> aktuelle Störmeldungen in Ignore-Liste übernehmen
      U     "OP->SPS".S_SM_Ignore      // Panel-Button
      SPBN  ILD

      L     "ErrMsg_1-16"
      T     "DB_Meldungen".Ignore[1]
      L     "ErrMsg_17-32"
      T     "DB_Meldungen".Ignore[2]
      L     "ErrMsg_33-48"
      T     "DB_Meldungen".Ignore[3]
      L     "ErrMsg_49-64"
      T     "DB_Meldungen".Ignore[4]

// Taste "alle Störmeldungen aktivieren"
// -> Ignore-Liste löschen
ILD:  U     "OP->SPS".S_SM_Aktive      // Panel-Button
      SPBN  ILE

      L     0
      T     "DB_Meldungen".Ignore[1]
      T     "DB_Meldungen".Ignore[2]
      T     "DB_Meldungen".Ignore[3]
      T     "DB_Meldungen".Ignore[4]

ILE:  NOP   0
```

Man könnte das Verfahren verfeinern, um z.B. alle aktuell nicht quitterten Störmeldungen zu deaktivieren.
Dann müßte man zunächst alle Störmeldungen aktivieren, dann ggf. alle Störungen einmal auslösen, die man 
deaktivieren will und danach im Meldefenster nur die Meldungen quittieren, die weiterhin gemeldet werden 
sollen. Danach die übrig gebliebenen unquittierten Meldungen in die Ignore-Liste übernehmen.

```
// Taste "aktuell unquittierte Störungen ignorieren"
// -> aktuelle Störmeldungen in Ignore-Liste übernehmen
      U     "OP->SPS".S_SM_nqIgnore    // Panel-Button
      SPBN  IL1E

      L     "DB_Meldungen".OPQuit[1]   // Bit=0: unquittiert
      INVI                             // Bit=1: unquittiert
      L     "ErrMsg_1-16"              // Bit=1: Störung aktiv
      UW                               // UND
      T     "DB_Meldungen".Ignore[1]   // -> in Ignore-Liste

      ...

IL1E: NOP   0
```

Oder nach und nach die aktuell unquittierte Meldung(en) zur Ignoreliste hinzufügen.

```
// Taste "aktuell unquittierte Störungen ignorieren"
// -> aktuell unquittierte Störmeldungen zu Ignore-Liste hinzufügen
      U     "OP->SPS".S_SM_nqAddIgnore // Panel-Button
      SPBN  IL2E

      L     "DB_Meldungen".OPQuit[1]   // Bit=0: unquittiert
      INVI                             // Bit=1: unquittiert
      L     "ErrMsg_1-16"              // Bit=1: Störung aktiv
      UW                               // UND
      L     "DB_Meldungen".Ignore[1]   // bereits ignorierte
      OW                               // aktuelle hinzufügen
      T     "DB_Meldungen".Ignore[1]   // -> in Ignore-Liste

      ...

IL2E:  NOP   0
```

Oder nach und nach die aktuell aktive Meldung(en) zur Ignoreliste hinzufügen.

```
// Taste "aktuelle Störungen ignorieren"
// -> aktuelle Störmeldungen zu Ignore-Liste hinzufügen
      U     "OP->SPS".S_SM_AddIgnore   // Panel-Button
      SPBN  IL3E

      L     "ErrMsg_1-16"              // Bit=1: Störung aktiv
      L     "DB_Meldungen".Ignore[1]   // bereits ignorierte
      OW                               // aktuelle hinzufügen
      T     "DB_Meldungen".Ignore[1]   // -> in Ignore-Liste

      ...

IL3E:  NOP   0
```

Um bestimmte deaktivierte Störmeldungen einzeln wieder zu aktivieren, ist das Verfahren mit den einzelnen 
Schaltern für jede Meldung das Einfachste. Machbar wäre auch eine indirekte Aktivierung/Deaktivierung über 
die Meldungsnummer und eine ausgedruckte Liste aller Meldungen oder ein symbolisches Auswahlfeld. 

Welches Verfahren für Deine Anwendung am besten geeignet ist mußt Du entscheiden. Es darf den Einrichter 
aber nicht überfordern. 

Kurze Erläuterung zu den Screenshots aus der Betriebsanleitung:


> Im Schaltschrank A2 (Allgemein) sind 10 Reserve-Leistungs-Abgänge vorhanden, im Schaltschrank A3 (Trockner 1)
> sind 2 Reserve-Leistungs-Abgänge vorhanden, einer davon mit Drehzahlwächter.
> Die Schütze der Reserve-Abgänge können über die Touchpanels ein- und ausgeschaltet werden.
> 
> ...



Gruß
Harald


----------



## bastler (19 September 2010)

Hallo Harald
Deine Visu sieht ja richtig gut aus. Wie du schon geschrieben hast, ist es bei der Anzahl der Meldungen das Beste, wenn man sie einzeln deaktivieren kann. Auf mein TP177B bekomme ich pro Seite 4 Meldungen mit jeweils einen Ein-Aus-Schalter der bei aktiver Meldung einen grünen Hintergrund hat und bei deaktivierter Meldung rot blinkt. Außerdem hab ich die Bilder mit einen Paßwort geschützt, sodass nur Personen mit entsprechender Berechtigung die Meldungen deaktivieren können.
Hast du deine Eingänge eigentlich entprellt? Ich wollte das mit dem SFB5 "TOF" machen, hab auch eineiges hier im Forum gefunden,  aber irgendwie funzt das ganze nicht so richtig. Wenn ich den SFB5 als Multiinstanz anlege, dann kann ich ihn doch für jeden Eingang aufrufen und er müßte dann entsprechend des Zeitwertes verzögert jeden Eingang schalten. Hab ich das so richtig verstanden?

Gruß bastler


----------

