# WinCC flexible: Anzahl anstehender Fehlermeldungen mit VB-Skript ermitteln



## herdi

Hallo,

ich hätte mal wieder eine kurze Frage:
Ist es möglich die Anzahl gerade anstehender Fehler-Bitmeldungen in einem VB-Skript abzufragen?

Danke sehr.

Gruß

Herdi


----------



## johnij

herdi schrieb:


> Hallo,
> 
> ich hätte mal wieder eine kurze Frage:
> Ist es möglich die Anzahl gerade anstehender Fehler-Bitmeldungen in einem VB-Skript abzufragen?
> 
> Danke sehr.
> 
> Gruß
> 
> Herdi


 

Hallo

In dem Skript die Träger addieren

johnij


----------



## herdi

Hallo johnij,

wie meinst du das mit den "Trägern". Ich arbeite erst seit ca 1 Woche mit WinCC flexible und wurschtel mich da gerade erst durch..

Danke

Herdi


----------



## johnij

herdi schrieb:


> Hallo johnij,
> 
> wie meinst du das mit den "Trägern". Ich arbeite erst seit ca 1 Woche mit WinCC flexible und wurschtel mich da gerade erst durch..
> 
> Danke
> 
> Herdi


 
Hallo,

Nehmen wir an, du hast deine Meldungen in DB10.dbw0 und DB10.Dbw2
projektiert:



		Code:
	

DB10.DBx0.0--> Not-Aus gedrückt
DB10.DBX0.1--> Einer hat auf die SPS gepinkelt :ROFLMAO:
DB10.DBX0.2--> Die Sps streikt
..
.
..)

 
In WCF hast du schon in der Variablen_Rubrike:
Meldung0: Db10.DBw0 
Meldung1: Db10.DBw2

Im Skript 

Summe=Meldung0+Meldung1

johnij


----------



## Rainer Hönle

Verstehe ich nicht. Wenn nur ein oberstes Bit gesetzt ist, habe ich nach der Addition 32768 Fehlermeldungen (oder -32768 wenn als Signed Int) interpretiert.


----------



## Waelder

Vielleicht hilft dir folgender Beitrag Weiter : 
http://www.sps-forum.de/showthread.php?t=14611&highlight=anzahl+bits

Du musst ja nur die Anzahl der "True" Bits in deinem DB zählen lassen.
Dann kannst du das ergebnis an deine Visu übergeben

Gruss Wälder


----------



## herdi

Hallo miteinander,

eigentlich habe ich eine etwas anders gelagerte Lösung im Auge...

Ich bräuchte in einem Skript die Info wieviele Fehler (aus den Bitmeldungen) gerade anstehen. Eigentlich reicht mir auch schon die Aussage ob überhaupt Fehler anstehen.

Ich denke dass sich diese Info irgendwie aus der Runtime-Umgebung gewinnen lassen müsste. Kann man auslesen wieviele Zeilen einer Meldeanzeige belegt sind bzw. kommt man an den Wert der den Meldeindikator sichtbar werden lässt?

Gruß

Herdi


----------



## volker

wenn du nur wissen willst, ob überhaupt eine störung anliegt kannst du deinen störmeldebereich einfach auf 0 vergleichen.

wenn du was besonderes willst, schau mal hier.
http://www.sps-forum.de/showthread.php?t=15348
unter wince

hab das geschrieben, um störungen einer fremdanlage ins netzwerk zu kopieren ohne das die aber das störmeldearchiv verhunzen.


----------



## Waelder

*Meldungen*

Sorry aber mein wissensstand Nein. Wäre toll wenns wer besser weiss.
Mach doch für deine Auswertung der Fehlerbits einen Vergleich auf null.
wenn deine Bits im 
Bereich db2.dbx0.0 bis db2.dbx3.7 liegen
langt es schon wenn du db2.dbd0 auf 0 vergleichst fertig fehler liegt an.

Kanst natürlich auch ne kompfortablere lösung machen mit XOD zwischen Fehler und Quittierbits. Dann hast Du die info ob noch unquittierte fehler anliegen.

Gruss Wälder

Sorry Volker war zu langsam......


----------



## JesperMP

Einfach in S7 pogramm jedes alarm-wort (Merker oder DB) mit "ungleich Null" testen.
Hast du z.b. nur 160 alarmen (16 wörter), denn brauchst du kein durchlauf-schleife oder ähnliches



		Code:
	

      O(    
      L     0
      L     "AlarmWort0"
      <>I   
      )     
      O(    
      L     0
      L     "AlarmWort1"
      <>I   
      )
usw.     
      O(    
      L     0
      L     "AlarmWort10"
      <>I   
      )     
      =     "AlarmVorhanden"


Als reine übung habe ich auch ein versuch in VBS von dein ursprüngliche frage:

Tags: AlarmArray, NoActiveAlarms.


		Code:
	

Dim i, j, tempAlarmTag, tempNoAA, SizeOfAlarmArray
SizeOfAlarmArray = 10 'Manuell einstellen
tempNoAA = 0
For i = 0 to SizeOfAlarmArray
  tempAlarmTag = smarttags("AlarmArray")(i)
  For j = 1 to 16
    tempAlarmTag = tempAlarmTag * 2
    If tempAlarmTag > 65535 Then
      tempNoAA = tempNoAA + 1
      tempAlarmTag = tempAlarmTag - 65536
    End If
  Next
Next
NoOfActiveAlarms = tempNoAA

Bin nicht ganz sicher ob ein tag mit bit 16 aktiv, als "65536" oder als "-32768" interpretiert.


----------



## johnij

Rainer Hönle schrieb:


> Verstehe ich nicht. Wenn nur ein oberstes Bit gesetzt ist, habe ich nach der Addition 32768 Fehlermeldungen (oder -32768 wenn als Signed Int) interpretiert.


 
Das hat damit nix zu tun
Das war nicht die fertige Lösung.
Ich brauche  nicht alles von a bis z zu schreiben.
Klaro nach der Summe kommt eine Maskierung....

um die Einzelnen gesetzten Bits zu zählen


johnij


----------



## Rainer Hönle

johnij schrieb:


> Das hat damit nix zu tun
> Das war nicht die fertige Lösung.
> Ich brauche  nicht alles von a bis z zu schreiben.
> Klaro nach der Summe kommt eine Maskierung....
> 
> um die Einzelnen gesetzten Bits zu zählen
> 
> 
> johnij


Sorry, aber das ist auch nicht die Lösung. Beispiel: In Wort1 Bit 0 = 1 und in Wort2 Bit 0 = 1. Nach Addition steht in der Summe 2. Dort ist ein Bit gesetzt. Es stehen aber zwei Fehler an. Diese Lösung ist somit falsch. Richtig wäre, die Bits der Worte zu zählen und die Summe der gesetzten Bits zu addieren.


----------



## herdi

Danke für die Antworten. ich hatte gehofft dass es eleganter geht in dem man Werte der Runtime hierfür nehmen kann. Jetzt zähle ich halt doch die Bits. 

Gruß

Herdi


----------



## johnij

Es geht einfach mit (wenigem Aufwand):



		Code:
	

Dim Anzahl_Word ' Anzahl der Worte, in den die Meldungen kommen
Dim i, Meldung_vorhanden
i=0
Meldung_vorhanden=0
While (i<= Anzahl_Word) And (Meldung_vorhanden=0)
 
if SmartTags(Meldung)(i)<>0 then
Meldung_vorhanden=1
end IF
i=i+1
Wend

 
johnij


----------



## johnij

Rainer Hönle schrieb:


> Sorry, aber das ist auch nicht die Lösung. Beispiel: In Wort1 Bit 0 = 1 und in Wort2 Bit 0 = 1. Nach Addition steht in der Summe 2. Dort ist ein Bit gesetzt. Es stehen aber zwei Fehler an. Diese Lösung ist somit falsch. Richtig wäre, die Bits der Worte zu zählen und die Summe der gesetzten Bits zu addieren.


 

Sorry ich hatte mich verschrieben

Eigentlich die Summe der Bits

Danke für die Feststellung

johnij


----------



## volker

mal ne andere frage
warum willst du das im script machen und nicht direkt in der steuerung?


----------



## Waelder

@johnij
sehe ich das richtig, dass du jede Meldevariable mit wertänderung (meine annahme) verknüpfst und dann dein script auslösst ? Na ja ob das dein System nicht ausbremst wenn Du beispielsweise in mehreren Worten gleichzeitig gehende und kommende fehler hast ? Ändert sich wert = Starte script geht fehler wieder weg script wird erneut gestartet . 
es ist ja nur 1 Script zur selben zeit möglich. Motzt WCF nicht wenn du 2x dass selbe anstösst ?

@Volker
genau da liegt der Hund begraben was will er


----------



## johnij

Waelder schrieb:


> @johnij
> sehe ich das richtig, dass du jede Meldevariable mit wertänderung (meine annahme) verknüpfst und dann dein script auslösst ? Na ja ob das dein System nicht ausbremst wenn Du beispielsweise in mehreren Worten gleichzeitig gehende und kommende fehler hast ? Ändert sich wert = Starte script geht fehler wieder weg script wird erneut gestartet .
> es ist ja nur 1 Script zur selben zeit möglich. Motzt WCF nicht wenn du 2x dass selbe anstösst ?
> 
> @V


 
Hallo Waelder,
eigentlich muss das Skript bei jeder Wertänderung aufgerufen werden
(das beeinflusst negativ die Prozessorleistung) Aber,
man könnte das Skript in bestimmten Zeitabständen Aufrufen
(Nachteilhaft falls man prozesskritische Ereignisse hat).

Schlussfolgerung:wie erwähnt wurde, wäre die SPS eine vernünftige Lösung

johnij


----------



## herdi

Hallo miteinander,

bei mir gings eigentlich nur darum dass ich das das Bearbeiten-Ereignis der Meldung dazu hernehme in eine andere Visu-Page zu springen, dort dann die Quittiererei unabhängig von der Meldeanzeige erledige und dabei wieder zurück zur vorherigen Seite springe. Dort soll dann aber falls kein weiterer Fehler anliegt die Meldeanzeige unsichtbar sein.

Ich prüfe nun im beim Zurückspringen mit Hilfe des Skriptes ob das der letzte anstehende Fehler war und schalte wenn ja die Meldeanzeige unsichtbar.

Ich hatte gedacht dies geht einfacher in dem man die WinCC-eigene Meldungsverwaltung nach anstehenden Fehlern "fragen" kann.

Es ist ja nicht zwangläufig so dass die Trigger-Bits für die vielen einzelnen Fehlermeldungen alle in wenigen Bytes stehen. Die können ja wild verstreut sein. Und dann hätte es gereicht die alle einmal bei den Bitmeldungen einzutragen und nicht nochmal im Skript an alle denken zu müssen...

Soweit dazu...

Gruß

Herdi


----------



## volker

dann gehst du die sache von der völlig falschen seite an.

projektiere in der vorlage ein melde*fenster* für die störungen.
dieses wird eingeblendet wenn eine störung 'kommt'.
wenn alle störungen quittiert sind, verschwindet das fenster wieder unabhängig davon ob die störung noch anliegt.


----------



## HeizDuese

Das waren noch Zeiten, als die Siemens-Panels gleich noch den potentialfreien Kontakt für die (sogenannte) Neuwertmeldung hatten - einfach Hupe dran und fertig


----------



## Ralle

@johnij

ich verstehe nicht, warum Leuten, die gerade erst anfangen Lösungen vorgeschlagen werden, welche 

1. nur angedeutet sind, das aber nicht mit erwähnt wird
2. zwar funtionieren, aber von keinem vernünftigen Programmierer wirklich genutzt werden würden

Wozu gerade Anfänger denn völlig verwirren und vielleicht sogar aufs Glatteis führen?
Es geht doch nicht darum zu beweisen, daß etwas machbar ist, auch wenn es Vollmüll ist. Volker hat da wirklich recht, wenn er versucht zu erklären, daß man ruhig auch der Steuerung noch ein wenig Arbeit überlassen soll. Ich bilde die Sammelstörmeldung schon immer in der Steuerung, indem ich über ein Loop die Fehler-DD auf 0 vergleiche, simpler geht es nicht und es ist völlig wurscht, welches Panel, ob mit oder ohne Scripting etc.


----------



## johnij

Ralle schrieb:


> @johnij
> 
> ich verstehe nicht, warum Leuten, die gerade erst anfangen Lösungen vorgeschlagen werden, welche
> 
> 1. nur angedeutet sind, das aber nicht mit erwähnt wird
> 2. zwar funtionieren, aber von keinem vernünftigen Programmierer wirklich genutzt werden würden
> 
> Wozu gerade Anfänger denn völlig verwirren und vielleicht sogar aufs Glatteis führen?
> Es geht doch nicht darum zu beweisen, daß etwas machbar ist, auch wenn es Vollmüll ist. Volker hat da wirklich recht, wenn er versucht zu erklären, daß man ruhig auch der Steuerung noch ein wenig Arbeit überlassen soll. Ich bilde die Sammelstörmeldung schon immer in der Steuerung, indem ich über ein Loop die Fehler-DD auf 0 vergleiche, simpler geht es nicht und es ist völlig wurscht, welches Panel, ob mit oder ohne Scripting etc.


 

Moin,
lese bitte meinen Beitrag #18

Viele Grüße

johnij


----------



## Larry Laffer

[/Off-Topic]
Ich denke, dass Ralle das gelesen hat. Ich muss gestehen, dass ich in letzter Zeit schon mal des öfteren mit dem Gedanken gespielt habe etwas ähnliches zu schreiben ...
[Off-Topic]


----------



## Ralle

Larry Laffer schrieb:


> [/Off-Topic]
> Ich denke, dass Ralle das gelesen hat. Ich muss gestehen, dass ich in letzter Zeit schon mal des öfteren mit dem Gedanken gespielt habe etwas ähnliches zu schreiben ...
> [Off-Topic]



*ACK*, das ist ja nicht direkt Off-Topic !


----------

