Quittiertaste TP177B in SPS auswerten

Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
call FC15
FC15
Code:
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
 
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:
Code:
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.
Code:
//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:
Code:
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
= #Temp_Neustoer
und für die Meldungen 17-32, 33-48, 49-64 schreibst du
Code:
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
 
Zuletzt bearbeitet:
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 *
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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).
Code:
// 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.
Code:
// 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(n) Meldung(en) zur Ignoreliste hinzufügen.
Code:
// 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(n) Meldung(en) zur Ignoreliste hinzufügen.
Code:
// 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.

Die Bedienbilder der Reserve-Abgänge sind erreichbar über das Bildverzeichnis (Sitemap) und über das Bild
Nebenprozesse.

Die Beschriftung der Reserve-Abgänge kann spannungsausfallsicher geändert werden (max. 14 Zeichen).
Die zugehörigen Störungsmeldungen „Sicherungsausfall“ können einzeln aktiviert bzw. deaktiviert werden.
Erforderliche Bedienberechtigung für Beschriftung und Alarm-Aktivierung: Einrichten Technik

Gruß
Harald
 

Anhänge

  • 042_Settings_Msg.gif
    042_Settings_Msg.gif
    23,7 KB · Aufrufe: 81
  • 056_Reserve_A2.gif
    056_Reserve_A2.gif
    46,8 KB · Aufrufe: 87
  • 057_Reserve_A3.gif
    057_Reserve_A3.gif
    24,3 KB · Aufrufe: 71
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
 
Zurück
Oben