Step 7 Störbits erkennen

Zuviel Werbung?
-> Hier kostenlos registrieren
Ferner eine Meldeanzeige, die immer automatisch aufpoppen soll, wenn ein Störungsbit aktiv ist, bzw. ein neues hinzukommt. Störungsbit ist hier vielleicht der falsche Ausdruck, da es eigentlich Betriebsmeldungen (Hinweise für den Benutzer) sind, und keine Alarme!

Also, ein Bit aus dem DB10 wird aktiv --> Meldeanzeige mit Text geht auf. Der Benutzer kann das zur Kenntnis nehmen und über eine Taste die Meldeanzeige (auch bei noch aktivem Störungsbit) wieder ausschalten. Kommt eine neue Meldung hinzu, so poppt die Anzeige erneut auf und wenn sie nicht durch den Benutzer geschlossen wird, so wird sie automatisch geschlossen, wenn keine Meldung (Störungsbit) mehr anliegt.
So eine klare Beschreibung ist doch einfach umzusetzen.
Das A4.7 soll der Trigger für das Aufpoppen der Meldeanzeige sein.
Code:
      CLR                   // (vorsichtshalber VKE begrenzen)

// Bei "Kommen" einer neuen Meldung --> Signalisierung EIN
      L     MD216
      INVD
      L     DB10.DBD16
      T     MD216
      UD
      U     <>0             // mindestens 1 Bit im DBD neu dazugekommen
      S     A4.7

      L     MD220
      INVD
      L     DB10.DBD20
      T     MD220
      UD
      U     <>0             // mindestens 1 Bit im DBD neu dazugekommen
      S     A4.7

      L     MD224
      INVD
      L     DB10.DBD24
      T     MD224
      UD
      U     <>0             // mindestens 1 Bit im DBD neu dazugekommen
      S     A4.7

      L     MD228
      INVD
      L     DB10.DBD28
      T     MD228
      UD
      U     <>0             // mindestens 1 Bit im DBD neu dazugekommen
      S     A4.7

// Signalisierung AUS bei "keine Meldung mehr aktiv" oder bei vorher Quittieren
      L     DB10.DBD16
      L     DB10.DBD20
      OD
      L     DB10.DBD24
      OD
      L     DB10.DBD28
      OD
      O     ==0             // alle Bits in allen DBD sind 0
      O     "OP_ACK"        // oder Taste zum Ausblenden der Meldeanzeige
      R     A4.7

Wenn das hier so funktioniert wie gewünscht, dann entscheide, ob es sich lohnt, das in eine Schleife umzuformen. Hier kannst Du ja gut sehen was wiederholt werden muß und was in jedem Schleifendurchlauf unterschiedlich sein muß.

Falls Du mit "Aufpoppen einer Meldeanzeige" eigentlich ein Meldefenster in WinCC flexible meinst, dann hilft dieser Code wahrscheinlich nicht viel, weil Du dann das Verhalten des Meldefensters passend projektieren und steuern mußt, was selber schon eine "Kommen/Gehen/Quittiert"-Logik hat, welche außerdem noch davon abhängig ist, ob Meldungen einer Meldeklasse überhaupt quittiert werden müssen und können.


Bevor Du anfängst irgendwas zu programmieren, beschreibe vollumfänglich was dabei herauskommen soll. Dann überlege, ob das überhaupt so realisierbar ist und wenn ja wie. Erst wenn die Aufgabenstellung widerspruchsfrei ist, dann kannst Du anfangen, die in Software umzusetzen.

Harald
 
Wenn das hier so funktioniert wie gewünscht, dann entscheide, ob es sich lohnt, das in eine Schleife umzuformen. Hier kannst Du ja gut sehen was wiederholt werden muß und was in jedem Schleifendurchlauf unterschiedlich sein muß.

Falls Du mit "Aufpoppen einer Meldeanzeige" eigentlich ein Meldefenster in WinCC flexible meinst, dann hilft dieser Code wahrscheinlich nicht viel, weil Du dann das Verhalten des Meldefensters passend projektieren und steuern mußt, was selber schon eine "Kommen/Gehen/Quittiert"-Logik hat, welche außerdem noch davon abhängig ist, ob Meldungen einer Meldeklasse überhaupt quittiert werden müssen und können.

Harald

Lieben Dank Harald! (Danke-Button drücke ich dann später ... ;) )

Also für zwei DBD's hatte ich es schon so gelöst und es hat auch funktioniert.

Nein, ich meine kein Meldefenster sondern schon die Meldeanzeige! Und diese lässt sich ja so einstellen, dass sie bei aktivem Ausgang auf dem Display erscheint. Insofern ist das schon so ok.

Jetzt noch zur Schleife:

Vom Code her ist die Schleife wohl hier nicht gerechtfertigt; aber für mein Ego schon! ;) Hatte gehofft so eine Schleife selbstständig hinzubekommen; hat aber leider nicht geklappt. Naja.

MD216 - 228 werden doch eigentlich in meiner Schleife durch den #pointer_2 ersetzt, so dass dieser nur einmal programmiert werden muss.

Mein Problem ist, dass ich nicht weiß, wo ich den Block mit dem Rücksetzen des Ausgangs einfügen soll. Automatisch darf ja nur rückgesetzt werden, wenn alle Störungsbits = Null sind. Somit müsste ich als Abfragebedingung ja auch noch ins Spiel bringen, dass der Schleifenzähler = 0 ist; also alle Durchläufe beendet sind, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Automatisch darf ja nur rückgesetzt werden, wenn alle Störungsbits = Null sind.
Ich vermute mal, dass hier gar nichts automatisch zurück gesetzt werden soll, damit der Anwender mitbekommt, dass eine Störung vorhanden war. Auch wenn diese (und auch keine andere Störung) schon gar nicht mehr vorliegt, wenn er auf den Bildschirm schaut, oder?
Somit erfolgt das Rücksetzen ausschließlich bei Druck auf den Quittierbutton.
 
Es sind Betriebsmeldungen, welche ein- und ausgeblendet werden, die der Bediener aber auch "wegklicken" können soll. siehe oben in #21 das Zitat vom #16

Harald
 
Mein Problem ist, dass ich nicht weiß, wo ich den Block mit dem Rücksetzen des Ausgangs einfügen soll. Automatisch darf ja nur rückgesetzt werden, wenn alle Störungsbits = Null sind.
Mache 2 Schleifen nacheinander. Die erste Schleife sucht neue 1-Bits und die zweite Schleife sucht irgendein 1-Bit. Die zweite Schleife kann abgebrochen werden, sobald irgendein 1-Bit festgestellt wurde.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mache 2 Schleifen nacheinander. Die erste Schleife sucht neue 1-Bits und die zweite Schleife sucht irgendein 1-Bit. Die zweite Schleife kann abgebrochen werden, sobald irgendein 1-Bit festgestellt wurde.

Harald

wozu zwei Schleifen? wenn ich weiß, wieviele Bits den Zustand TRUE haben kann man doch daraus ableiten, dass irgendein Bit den Zustand TRUE besitzt und weiter kann ich aus der Information, das 0 Bits den Zustand TRUE haben ableiten, dass die Anzeige geschlossen werden kann.

es geht also nur noch darum Bits zu zählen.
 
wozu zwei Schleifen? wenn ich weiß, wieviele Bits den Zustand TRUE haben kann man doch daraus ableiten, dass irgendein Bit den Zustand TRUE besitzt und weiter kann ich aus der Information, das 0 Bits den Zustand TRUE haben ableiten, dass die Anzeige geschlossen werden kann.

es geht also nur noch darum Bits zu zählen.

Hi vierlagig,

aber bei Pointern kann ich doch eigentlich nur einen Vergleich auf Null machen, oder?

Code:
      L     DBD [#pointer_1]
      L     L#0
      ==D
 
wozu zwei Schleifen? wenn ich weiß, wieviele Bits den Zustand TRUE haben kann man doch daraus ableiten, dass irgendein Bit den Zustand TRUE besitzt und weiter kann ich aus der Information, das 0 Bits den Zustand TRUE haben ableiten, dass die Anzeige geschlossen werden kann.

es geht also nur noch darum Bits zu zählen.
Hmm, irgendwie kann ich Dir heute früh nicht folgen...
Aus welcher Information kannst Du dann ableiten, daß die Anzeige eingeblendet werden soll? Welche Art Bits willst Du "zählen"?

Ich brauche 2 verschiedene Informationen, welche ich ermitteln muß:
- ist 0 oder mindestens 1 TRUE-Bit neu dazugekommen? --> bei <>0 die Anzeige einblenden
- ist 0 oder mindestens 1 TRUE-Bit vorhanden? --> bei ==0 die Anzeige ausblenden

Ob man diese 2 Informationen in ein oder zwei Schleifen ermittelt ist doch Nebensache. Die zwei-Schleifen-Variante läßt sich imho einfacher aus dem linearen Programm von #21 erstellen, und ich finde die auch übersichtlicher. Deshalb habe ich spirit empfohlen, zwei Schleifen zu benutzen.

Harald
 
Aus welcher Information kannst Du dann ableiten, daß die Anzeige eingeblendet werden soll? Welche Art Bits willst Du "zählen"?

richtig ist, ich muss in einem Schleifendurchlauf zwei unterschiedliche Bedingungen prüfen.
meiner Meinung nach Falsch ist, sich darauf zu versteifen das in der größtmöglichen Dateneinheit (DWORD) zu tun.

Überprüfe ich Bit-weise habe ich den Vorteil, dass ich wie untenstehend sehr ordentlich beide Bedingungen auswerten kann und dies nach Bedarf auch noch für Negative-Flanken oder einen Meldungsnummernpuffer erweitern kann.

Code:
*
DATA_BLOCK DB 20
TITLE =
VERSION : 0.1
  STRUCT  
   ACT : ARRAY  [0 .. 7 ] OF DWORD ; 
   FLAG : ARRAY  [0 .. 7 ] OF DWORD ; 
   ACT_ON : INT ; 
  END_STRUCT ; 
BEGIN
   
END_DATA_BLOCK

FUNCTION FC 20 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
  inDBNum : INT ; 
END_VAR
VAR_OUTPUT
  newMsg : BOOL ; 
  Message : BOOL ; 
END_VAR
VAR_TEMP
  tempAR1 : DWORD ; 
  tempAR2 : DWORD ; 
  DBNum : INT ; 
  Lcount : INT ; 
END_VAR

BEGIN
NETWORK
TITLE =

      TAR1  #tempAR1; 
      TAR2  #tempAR2; 
      L     #inDBNum; 
      T     #DBNum; 
      AUF   DB [#DBNum]; 
NETWORK
TITLE =

      LAR1  P#0.0; 
      LAR2  P#64.0; 

      L     0; 
      T     DBW [AR2,P#0.0];

      L     256; 
next: T     #Lcount; 
      U     DBX [AR1,P#0.0]; 
      FP    DBX [AR1,P#32.0]; 
      S     #newMsg; 
      U     DBX [AR1,P#0.0]; 
      SPBN  not; 
      L     DBW [AR2,P#0.0]; 
      +     1; 
      T     DBW [AR2,P#0.0]; 
not:  +AR1  P#0.1; 
      L     #Lcount; 
      LOOP  next; 
      L     DBW [AR2,P#0.0]; 
      L     0; 
      <>I   ; 
      =     #Message; 
NETWORK
TITLE =

      LAR1  #tempAR1; 
      LAR2  #tempAR2; 
      SET   ; 
      SAVE  ; 
END_FUNCTION

FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
  IN_BOOL : BOOL ; 
  IN_INT : INT ; 
END_VAR

BEGIN
NETWORK
TITLE =
      CALL FC    20 (
           inDBNum                  := 20,
           newMsg                   := M     10.0,
           Message                  := M     10.1);

NETWORK
TITLE =
      U     M     10.0; 
      S     A      4.7; 
      UN    M     10.1; 
      R     A      4.7; 
END_FUNCTION

[EDIT] obenstehender Quellcode ist nicht getestet [/EDIT]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
WOW vierlagig,

da befinden wir uns jetzt aber schon in der Profiliga ...


Vielleicht könntest du mir ja dieses Mal weiterhelfen:

1)
Ich sehe nicht (was aber nichts heißen muss), an welcher Stelle die Meldeanzeige auch bei anstehenden Meldungen mittels Taster "OP_ACK" deaktiviert werden kann. An welcher Stelle könnte frau das noch einfügen?

2)
Was genau schreibe ich denn bitte beim Aufruf der FC2 im OB1 hinter "IN_BOOL" und "IN_INT"?


Vielen Dank schon einmal rein vorsorglich ... ;)
 
Vielleicht liegt es daran:

[EDIT] obenstehender Quellcode ist nicht getestet [/EDIT]

Harald

Nun gut, hatte mich jetzt nur etwas gewundert weil der Code ansonsten schon funktioniert!

Bis halt auf das Ausblenden der Meldeanzeige durch den Taster ...


Am Rande noch eine Frage zu dem Thema:

@Harald:

In deinen Codes hattest du geschrieben

CLR // (vorsichtshalber VKE begrenzen)


Gibt es da eine Regel, oder wann machst du so etwas immer in deinen Netzwerken?
 
... das macht man immer, wenn vorher viel mit bedingten Sprüngen gearbeitet wurde und man deshalb vielleicht nicht so ganz genau das aktuelle VKE kennt ... in dem Fall also eine Art Vorsichts-Maßnahme ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah, ich nochmal ...

Eine Frage zum Code von VL sei mir bitte noch gestattet bevor in dann (endlich) in Rückzug gehe.

An welcher Stelle, bzw. wodurch, wird denn dieses

S #newMsg

wieder rückgesetzt? :confused:
 
An welcher Stelle, bzw. wodurch, wird denn dieses

S #newMsg

wieder rückgesetzt? :confused:

durch die Tatsache, dass es sich um eine TEMP-Variable handelt - eine ordentliche Initialisierung darf man hier gern noch spendieren :D

und das andere "Problem":

Code:
      U     M     10.0
      S     A      4.7
      U     A      4.7
      UN    M     10.1
      O     
      U     A      4.7
      U     M     "op_ack"
      R     A      4.7
 
durch die Tatsache, dass es sich um eine TEMP-Variable handelt - eine ordentliche Initialisierung darf man hier gern noch spendieren :D

und das andere "Problem":

Code:
      U     M     10.0
      S     A      4.7
      U     A      4.7
      UN    M     10.1
      O     
      U     A      4.7
      U     M     "op_ack"
      R     A      4.7

Danke VL! :s12:

Bezüglich des anderen Problems; glaube das dürfte so noch nicht klappen, weil ja durch M10.0 der Ausgang (bei noch anstehenden Meldungen) gleich wieder gesetzt wird ... Daher wird die Meldeanzeige nur solange ausgeblendet, wie die Taste gedrückt wird.

... aber no problem! ;)
 
Zurück
Oben