WinCC Flexible 2008 SP2 | Mehrere Variablen (DBs) zusammenfassen für Sichtbarkeit

Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du es konkreter haben willst dann schreib doch mal bitte, welches Bit in welcher Variablen du setzen und/oder abfragen möchtest.

In meinem Beipiel ist myBit0 und folgende z.B. eine Script-interne Variable.
In myBit0 würde dann ein TRUE drinstehen wenn myInt and 256 (also das tatsächlich 8.Bit des INT ist gesetzt) einen Werte <> 0 ergibt.
 
Eine Idée, ohne Skripte:

Anstatt EINE Blinker versuchen mit mehrere Variabeln zu aktivieren, mehrere Blinker Visible/Hidden animieren über je sein eigene Variabel.
Wenn die Blinker genau auf denselbe Position auf den Schirm sind, sieht es aus als ein Blinker.
Soll der Blinker graue aussehen wenn kein Variabel aktiv ist, dann hinter die andere Blinker eine graue Feld ohne animation plazieren.

Sollte klappen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Idee war bereits so verwirklicht, ich finde es so aber galanter :)

Es funktioniert ja auch, aber ich brauche nun das gleiche auch für Bitmeldungen.


WIE GENAU, hab ich eigentlich geschrieben ... siehe letzter Beitrag auf Seite 2:

SmartTags("Interne\TLZ_COM_Error") = SmartTags("Interne\BIT_MELDUNGEN.COM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.COMM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.KOM_FEHLER_SE_TLZ")


Hierbei ist SmartTags("Interne\TLZ_COM_Error") nun nicht mehr eine BOOL-, sondern eine INT-Variable, die ich in EINEM beliebigen Bit beschreiben möchte um selbiges Bit als BITMELDUNG auswählen zu können. Idealerweise Bit 0

Der nächste Schritt KÖNNTE sein, EINE INT-Variable "komplett" zu beschreiben (also alle möglichen BITs der INT-Variable). Wichtig ist mir aber erstmal, zu verstehen wie ich über die SmartTag-Geschichte überhaupt ein BIT einer INT-Variable ansprechen kann.
 
Wie man ein Bit in einer INT-Variablen abfragt habe ich oben dargestellt.

Wenn du in einer INT-Variablen gezielt ein Bit setzen möchtest ginge das mit OR - also :
Code:
myInt = myInt or 256  ' setzt das Bit 0
myInt = myInt or 512  ' setzt das Bit 1

myInt = myInt or 1  ' setzt das Bit 8
myInt = myInt or 2  ' setzt das Bit 9
Irgendwie habe ich aber den Verdacht, dass wir nicht die gleiche Sprache sprechen 8)
 
Ja ´richtig versteh ich das noch immer nich... was soll das OR denn da überhaupt?

Nochmal,

Ich möchte EIN Bit von SmartTags("Interne\TLZ_COM_Error") setzen, um diese Variable mit diesem einen gesetzten Bit als BITMELDUNG auswählen zu können.

Die Logik hab ich ja auch schon geschrieben, aber wie ich eben dieses eine Bit setze weiß ich noch immer nicht...


SmartTags("Interne\TLZ_COM_Error") = SmartTags("Interne\BIT_MELDUNGEN.COM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.COMM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.KOM_FEHLER_SE_TLZ")


Dabei gibts die eine INT-Variable und 3 BOOL-Variablen
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Welches Bit möchtest du setzen ? Es gibt keine Funktion, die irgendein Bit setzt. Man kann immer nur ein bestimmtes Bit setzen.

Am Beispiel deiner Variablen :
Code:
 [B]SmartTags("Interne\TLZ_COM_Error")[/B]  =  [B]SmartTags("Interne\TLZ_COM_Error")[/B]  or 256  'setzt das Bit 8 in der genannten Variablen
 
Hab doch schon geschrieben dass es grundsätzlich egal is. Das 1. Bit wär wohl am logischsten.

Ich verstehe aber nach wie vor nicht, wie ich über die 3 BOOL-Variablen das 1. Bit (oder irgendein anders, ich muss nur wissen welches) der INT-Variable setze. Ich verstehe nicht, warum ich mit der INT-Variable das Bit der selben INT-Variable setzen sollte bzw. wie das logisch funktionieren soll. In deinen Beispielen schreibst du immer "INT-Variable = INT-Variable OR xyz" ... ich will aber "INT-Variable BIT 1 = BOOL-Variable 1 OR BOOL-Variable 2 OR BOOL-Variable 3"


Als Textaufgabe:
3 verschiedene BOOL-Variablen sollen als EINE Bitmeldung erscheinen.
Möchte man eine Bitmeldung deklarieren, kann man diese aber nicht aus BOOL-Variablen "ziehen" sondern man braucht z.B. eine INT-Variable (es könnte auch Word usw sein)

IRGENDEIN Bit dieser INT-Variable muss also über ODER-Verknüpfung von den 3 BOOL-Variablen gesetzt werden. Natürlich muss ich wissen, WELCHES BIT gesetzt wird - es gibt aber von mir aus keine Vorgabe.

Nachher wähle ich dann beim Einfügen einer neuen Bitmeldung die INT-Variable samt dem eben gesetzten BIT aus und habe meine Bitmeldung.



Problem:
Ich weiß dank euch, wie ich eine BOOL-Variable über ODER-Verknüpfung mehrerer BOOL-Variablen setzen kann ... aber nicht, wie ich durch verschiedene BOOL-Variablen ein bestimmtes BIT (egal welches...) einer INT-Variable setze. Das Ganze soll auch über SmartTags laufen...



Ergebnis:
Ein Script mit SmartTags, welches z.B. so aussieht ... bloß solls halt funktionieren :D

SmartTags("Interne\TLZ_COM_Error".BIT1) = SmartTags("Interne\BIT_MELDUNGEN.COM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.COMM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.KOM_FEHLER_SE_TLZ")
 
Zuletzt bearbeitet:
Ob das jetzt das Bit sein muss / kann weiß ich auch nicht - wenn du aber dieses setzen willst so ginge das so :
Code:
if (SmartTags("Interne\BIT_MELDUNGEN.COM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.COMM_TLZ_ERROR") OR SmartTags("Interne\Bit_Meldungen.KOM_FEHLER_SE_TLZ") ) then 
   SmartTags("Interne\TLZ_COM_Error") = SmartTags("Interne\TLZ_COM_Error") or 512
end if

Vielleicht tust du dir (und mir) den Gefallen und testest das einfach mal - von mir aus auch mir der Visu.
Du kannst dir ja die Ausgabe-Variable SmartTags("Interne\TLZ_COM_Error") auch auf dem Bildschirm anzeigen lassen - oder in der SPS im Status beobachten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort. Ich hoffe, man versteht was ich machen möchte ^^


Dein Script werde ich dann mal ausprobieren - bin aber leider erst in ein paar Tagen wieder am Projekt (dh. an der SPS). Bis dahin erhoffe ich mir evt. noch weitere Beispiele - zum Verständnis aber vor Allem zur Sicherheit, damit ich dann auch wirklich was Funktionierendes hab.

Ich weiß ja auch nicht, aber es kann ja nicht so schwer sein aus BOOL-Variablen eine Bitmeldung zu generieren ?! :-(
 
Du wirst keine grundlegend anderen Antworten bekommen.
In einer Variablen (ob Byte, Word, DWord - INT,DINT) repräsentieren die Bits einen bestimmen Zahlenwert. Das Bit 0 z.B. den Wert 2^0 = 1, das Bit 1 den Wert 2^1 = 2, das Bit 2 den Wert 2^2 = 4 usw.. Willst du also grundsätzlich ein Bit einer solchen Variablen setzen so geht das über das ODER-Verknüpfen mit dem entsprechenden Zahlenwert. Hierzu sollte einem natürlich die Grundlage dieser Mathematik vertraut sein - das kann man aber nachlesen. Bei Siemens kommt nun noch erschwerend hinzu, das die Byte-Reihenfolge in Word,DWors bzw. INT,DINT vertauscht sind. Das führt dann z.B. dazu, dass wenn ich das Bit 1 setzen möchte ich den Wert 2^9 verodern muss. Entsprechend aber auch umgekehrt - also für Bit 9 den Wert 2^1.

Ich denke, jetzt habe ich dich vollkommen verunsichert - aber so ist es nun mal.
 
Dass das bei WinCC so kompliziert ist hätte ich nicht gedacht...

Jedenfalls hat das hier nicht funktioniert. Ich habe das Beispiel sowohl mikt 256 als auch mit 512 getestet und JEWEILS zur Sicherheit auf Bit 0 und Bit 1 abgefragt. Zum Test dann sowohl als Integer, Binär und Bit mit jeweils Wert 0 und 1.

Bin ich also quasi der Erste, der einen BOOL-Wert als BITMELDUNG ausgeben will? Ich kann mir echt nicht vorstellen, dass es da keine Lösung für gibt... (außer alle Linien - in meinem Fall - 3 mal übereinander zu legen). Man stelle sich vor, man hat mehr als 3....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ob du dabei der erste bist weiß ich nicht.
Allerdings, wenn ich auch am Anfang dieses Thread noch dachte, dass ich wüßte um was es ging/geht - jetzt nun nicht mehr.
Somit ist es (aus meiner Sicht) sehr schwierig zu helfen, wenn man nicht weiß, was dabei herauskommen soll.
Ich wiederhole also an dieser Stelle die schon geäußerte Frage : "Was willst du nun genau bezwecken ?"

Gruß
Larry
 
also zu beginn gings um das zusammenfassen von bool-variablen zu einer (ebenfalls) bool-variable um diese als animation zu verwenden.

das klappte



nun brauche ich aber nicht nur animationen sondern auch bitmeldungen. leider kann man aber keine bool-variablen als bitmeldung auswählen. Daher war mein ansatz, eine nicht-bool-variable aus den entspr bool-variablen zu "generieren"

dh zb das bit 0 einer int-variable setzen, wenn eine der 3 bool-variablen true ist.
 
OK ... und so eine Variable wäre dann z.B. "SmartTags("Interne\TLZ_COM_Error") " ???

Die ist in den Bit-Meldungen projektiert ? Ich nehme mal an : Ja.
Als was ist die Variable angelegt ? Intern oder einer Steuerung zugeordnet. Die Frage deshalb, da ich annehme, dass bei Bit-Meldungen interne Variablen nicht auf Wertänderung überprüft und ausgewertet werden.
Wie wird die Variable aktualisiert ? Es müßte hier dann m.E. schon "zyklisch fortlaufend" passieren.
Ist das Alles so realisiert und auch sicher gestellt, dass das Script, in dem du die Variable zuweist, auch wirklich aufgerufen wird und weiterhin auch sichergestellt ist, dass nicht noch jemand anders (z.B. einer der SPS'en) die gleiche Variable auch modifizieren kann (und das auch tut), dann sollte das auch funktionieren - egal ob du nun das richtige Bit herein-geodert hast oder nicht.

Es wäre schön, wenn du zu den von mir gestellten Fragen antworten würdest ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
aaaalso

Ich habe 3 verschiedene 300er CPUs hier. Jede CPU (jeweils natürlich aus einem bestimmten DB) hat jeweils 3 Meldungen, die aber auf jeder CPU das gleiche bedeuten. Sinn ist, dass auch bei Ausfall einer oder 2 dieser CPUs die Meldung noch über die 2. oder 3. CPU an die Visu kommt. Die CPUs kommunizieren untereinander.

Der Einfachheit halber gehen wir erstmal von EINER internen Meldung aus, welche aus 3 verschiedenen Meldungen über ODER verknüpft wird. Nachher kann ich die 2 anderen selbst ERstellen.

In der Visu sollen Animationen und Bitmeldungen verwirklicht werden.


Animationen kann man über BOOL-Variablen verwirklichen. Dank eurer Hilfe habe ich bisher z.B. eine INTERNE VARIABLE (BOOL) mit 3 Variablen der CPUs (BOOL) über ODER verknüpft.

Bitmeldungen kann man aber nicht über BOOL-Variablen verwirklichen. Das Problem ist nun, aus den vorliegenden BOOL-Variablen (ob nun die zusammengefasste INTERNE oder eine aus den CPUs) eine INTERNE Bitmeldungs-Variable (NICHT-BOOL) zu machen, um diese einer Bitmeldung (Triggeradresse) zuzuweisen.

PS: Die aktualisierung hab ich jeweils zyklisch fortlaufend auf 1s
 
Zuletzt bearbeitet:
Das Problem ist nun, aus den vorliegenden BOOL-Variablen (ob nun die zusammengefasste INTERNE oder eine aus den CPUs) eine INTERNE Bitmeldungs-Variable (NICHT-BOOL) zu machen, um diese einer Bitmeldung (Triggeradresse) zuzuweisen.

Du könntest in WinCC flexible die Systemfunktionen SetBitInTag und ResetBitInTag verwenden:

Code:
Dim blnMeldung1
Dim blnMeldung2
Dim blnMeldung3

blnMeldung1 = SmartTags("Interne\BIT_MELDUNGEN.COM_TLZ_ERROR") 
blnMeldung2 = SmartTags("Interne\Bit_Meldungen.COMM_TLZ_ERROR") 
blnMeldung3 = SmartTags("Interne\Bit_Meldungen.KOM_FEHLER_SE_TLZ")

If blnMeldung1 Or blnMeldung2 Or blnMeldung3 Then
    ' Bit 0 in Variable setzen
    SetBitInTag SmartTags("Interne\TLZ_COM_Error"), 0
Else
    ' Bit 0 in Variabel rücksetzen
    ResetBitInTag SmartTags("Interne\TLZ_COM_Error"), 0
End If

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Kai:
auf die von dir genannten Funktionen bin ich noch gar nicht gekommen ... Die sind im Grunde aber auch nur eine andere Variante des Vorschlags von Lupo.
Ich habe irgendwie noch immer das Gefühl, nicht verstanden zu haben, wovon der TE spricht / wo er hinwill (ich beziehe mich dabei auf seinen Beitrag #35) obwohl ich schon mal gedacht habe, es verstanden zu haben ...

@TE:
siehe meine Statement an Kai ...
 
Sorry war im Urlaub ^^

Also ich wollte genau das, was mir der Kollege hier geschrieben hat. Ich konnts noch nicht testen, aber das ist zu 99% das was ich suche...



In einfachen Sätzen nochmal rein zum Verständnis:

1.) MEHRERE BOOL-Variablen sollen EIN Objekt Animieren. Ein mehrfaches Zeichnen soll wegfallen. Die OR-Verknüpfung hat hier funktioniert (zwischenzeitlich nicht mehr, aber WinCC Flexible hat halt sein Eigenleben).

2.) BOOL-Variablen sollen BITMELDUNGEN generieren bzw. diesen zugeordnet werden. Problem: BITMELDUNGEN verlangen z.B. INT/WORD/...-Variablen, BOOL-Variablen werden nicht unterstützt. Ein entsprechendes Zusammenfassen soll SPS-Seitig WEGFALLEN bzw. NICHT realisiert werden sondern auf Seiten von WINCC FLEX erfolgen (z.B. mit dieser SetBit-Geschichte)
 
Zuletzt bearbeitet:
... ich denke, dann ist dir ja erstmal geholfen.
Du solltest aber trotz Allem nicht vergessen (aus den Augen verlieren) dass die Visu nicht vordergründig für so etwas gedacht (gemacht) ist.
Damit diese Zusammenfassung funktioniert muss jede Variable IMMER aktualisiert werden (zyklisch fortlaufend). Sind dies dann sehr viele Variablen kann es dann irgendwann einmal problematisch werden.
Jede dieser Variablen muss das Script, in dem sie verwendet wird, bei Wert-Änderung aufrufen. Das ist an sich nichts Schlimmes, belastet aber die Visu und deren Performance bei vielen Variablen ganz schön.

Wie weit willst du denn dabei gehen ?

Gruß
Larry
 
Zurück
Oben