WinCC Bit auslesen über VBS

Da_To

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Community,

Folgende Frage:

Über einen VB- SKript, möchte ich mehrere Bits auslesen von einem Int-Wert und je nach aktivem Bit (TRUE) dementsprächend folgende Aktionen ausführen. Im Internet habe ich dann mehrere Beiträge gefunden über das Thema Bit auslesen, jedoch nichts genaues.

Das Skript funktioniert so nicht, kann mir jemand hier behilflich sein ?





Dim Word, Auswahl

Auswahl = SmartTags("@NOTP::Auftragstyp")



If Auswahl = 1 Then

Word = SmartTags("@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1")

If ((Word And 2^6) <> 0 And (Word And 2^3) <> 0) Or ((Word And 2^6) = 0 And (Word And 2^3) = 0) Then

InvertBitInTag Word, 3
InvertBitInTag Word, 6

ElseIf ((Word And 2^6) <> 0 And (Word And 2^3) = 0) Then
SetBitInTag Word, 3

ElseIf ((Word And 2^3) <> 0 And (Word And 2^6) = 0) Then
ResetBitInTag Word, 3

End If

End If






Freundliche Grüsse
 
Was funktioniert denn nicht?

Du setzt Bits in der lokalen Variable "Word" (übrigens eine schlechte Wahl für einen Bezeichner).
Wenn deine Funktion nach dem "End If" zu Ende ist, dann siehst du von deinem Ergebnis nichts. Du müsstest den Wert schon wieder einer Variable / oder SmartTag zuweisen.

D.h. mindestens müsste am Ende noch ein:

SmartTags("@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1") = Word

eingefügt werden um das Ergebnis wieder in der Variable zu sehen zu bekommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 41985

Danke für deine Antwort und entschuldigung für die schlechte Erklärung meines Problems.

Der Kunde hat dieses Bild vor sich und will, dass wen er die Schaltfläche "mit Reiniger" drückt,
"mit Waage" auch angewählt wird. Das heisst die Waage wird IMMER aktiviert bzw. deaktiviert wen
die Schaltfläche "mit Reiniger" angewählt wird.

Die Schaltfläche "mit Reiniger" ist mit den Funktionen InvertiereBitInVariable (Bit 3, Bit 6) ausgestattet ( Bit 3 = Reiniger, Bit 6 = Waage)

Die Schaltfläche "mit Waage" ist mit der Funktion InvertiereBitInVariable (Bit 6) ausgestattet.

Betätigt der Bediener nun zuerst die Schaltfläche "mit Waage" wird das Bit 6 gesetzt.
Will er nun doch den Reiniger auch dazu nehmen, wird das Bit 3 gesetzt und Bit 6 zurückgesetzt (invertbit).

Dies ist mein Problem und das wollte ich anhand eines Skriptes abfragen und jenach AKTIVEM Bit die entsprechenden Funktionen ausführen.


P.S. Der Kunde wollte das sobald dieses Bild aufgerufen wird das Bit 6 (mit Waage) gesetzt wird.
:???:

Freundliche Grüsse
 
Hallo,
das ist eigentlich ganz einfach.
Du kopierst in deinem Script den Inhalt deiner Visu-Variablen in die Script-interne Variable 'Word'. Mit dieser arbeitest du dann und manipulierst ihren Inhalt ggf.
Jetzt solltest du dann nur am Ende deines Scriptes den Inhalt von 'Word' wieder in deine Visu-Variable (den SmartTag) zurückkopieren ... 8) - das geschieht nicht von selbst ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwie klapptdas nicht so ganz wie Thomas_v2.1 schon empfohlen hat, hab ich am Schluss noch den Wert von "Word" in die Variable geschrieben, jedoch ohne Erfolg.

Gelöst hab ich das ganze dann so:

Dim Word, Auswahl

Auswahl = SmartTags("@NOTP::Auftragstyp")

If Auswahl = 1 Then

Word = SmartTags("@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1")

If ((Word And 2^6) <> 0 And (Word And 2^3) <> 0) Or ((Word And 2^6) = 0 And (Word And 2^3) = 0) Then

InvertBitInTag "@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1", 3
InvertBitInTag "@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1", 6

ElseIf ((Word And 2^6) <> 0 And (Word And 2^3) = 0) Then
SetBitInTag "@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1", 3

ElseIf ((Word And 2^3) <> 0 And (Word And 2^6) = 0) Then
ResetBitInTag "@NOTP::Automatik_Aufträge_Silo1_AnnahmeLKW.AuftragsWord1", 3

End If

End If


Vielen Dank allen!
 
Vielleicht solltest du dir überlegen diese 3 Bits die du da mühsam aus dem Word pulst, einfach als 3 einzelne Bool Variablen an der entsprechenden Adresse anzulegen.

Du musst bei deinen Aktionen bedenken, dass bei den ganzen xxBitInTag Funktionen immer das komplette Wort an die SPS geschickt wird. Und wenn du in diesem Wort nicht nur Befehle sondern auch Statuszustände hast, diese mit überschrieben werden.

Wenn du das zum Tags sparen machen willst, dann solltest du zumindest die Wörter in Schreib- und Lesewörter auftrennen. Andernfalls führt das erfahrungsgemäß immer wieder zu Problemen, wie dass Befehle nicht korrekt ausgeführt werden, Schaltflächen mehrmals betätigt werden müssen usw.
 
... möchte ich ... dementsprechend folgende Aktionen ausführen.
Dementsprechend? Wem entsprechend?
Folgende Aktionen?
Meinst Du damit im folgenden beschriebene Aktionen?
Wo folgt denn diese Beschreibung?

Das Skript funktioniert so nicht
Dein Skript kann damit also nicht gemeint sein, denn dort steht leider nur, wie es nicht funktioniert - wie Du selbst sagst.

kann mir jemand hier behilflich sein ?
Im Prinzip gerne, aber wie erfahren wir, welches Problem geknackt werdem soll?

Ein Klick auf den Anhang führt ins Nirvana. Was soll denn passieren bzw. zum Vorschein kommen?

Der Kunde hat dieses Bild vor sich und will, dass wenn er die Schaltfläche "mit Reiniger" drückt,
"mit Waage" auch angewählt wird. Das heisst die Waage wird IMMER aktiviert bzw. deaktiviert wenn
die Schaltfläche "mit Reiniger" angewählt wird.
"... wird IMMER aktiviert bzw. deaktiviert wenn ..." - gibt Dir das nicht zu denken?
"wird immer aktiviert" ist eine klare Aussage. "wird immer deaktiviert" ist auch eine klare Aussage.
Aber "wird immer aktiviert bzw. deaktiviert" ist ein Widerspruch in sich.

Die Schaltfläche "mit Reiniger" ist mit den Funktionen InvertiereBitInVariable ... ausgestattet.
Die Schaltfläche "mit Waage" ist mit der Funktion InvertiereBitInVariable ... ausgestattet.
Aha, mit Betätigen der SchaltFläche "mit Reinger" lässt sich also die ausgeschaltete Funktion einschalten und die eingeschaltete Funktion ausschalten.
Auf NeuDeutsch "toggeln" genannt. Sinngemäss gilt dies auch für die SchaltFläche "mit Waage".

Sooo, was soll also passieren?
1. Wird "mit Reiniger" per SchaltFlächenBetätigung EINgeschaltet, so soll "mit Waage" ebenfalls EINgeschaltet werden bzw. bleiben.
2. Wird "mit Reiniger" per SchaltFlächenBetätigung AUSgeschaltet, so soll "mit Waage" ebenfalls AUSgeschaltet werden bzw. bleiben.
3. Wird "mit Waage" per SchaltFlächenBetätigung EINgeschaltet, so soll "mit Reiniger" unverändert EINgeschaltet bzw. AUSgeschaltet bleiben.
4. Wird "mit Waage" per SchaltFlächenBetätigung AUSgeschaltet, so soll "mit Reiniger" unverändert EINgeschaltet bzw. AUSgeschaltet bleiben.
Habe ich das soweit richtig verstanden?

Wenn ja, einfachste Lösung (sogar für den Bediener durchschaubar):
4 Schaltflächen "spendieren". Je 1 für ...
1. "Reiniger und Waage EIN"
2. "Reiniger und Waage AUS"
3. "Waage EIN"
4. "Waage AUS"

KompromisLösung: 3 Schaltflächen "spendieren". Je 1 für ...
1. "Reiniger und Waage EIN"
2. "Reiniger und Waage AUS"
3. "Waage EIN/AUS"

Eine Verriegelung im Sinne "...darf nicht, wenn nicht auch ..." stellt das obige ja nicht dar.
Man kann ja trotz allem - wenn auch auf Umwegen - Reiniger und Waage einzeln betreiben.
Inwieweit das ganze überhaupt sinnvoll ist, kann ich nicht beurteilen.
Ich weiss nur, dass vieles, was hier und da - gut gemeint - als "BedienKomfort" eingebaut wird, den Bediener eher verwirrt, als ihm zu helfen.

Du musst, um Deine Vorstellung umzusetzen, nicht nur den aktuellen Status des "mit Reiniger"-Bits unverändert an ausschliesslich(!) den Reiniger durchreichen,
sondern zusätzlich das "mit Reiniger"-Bit beobachten, um festzustellen, ob bzw. wann es kommt oder geht ("FlankenErkennung").
Nur in dem Moment, wenn es von 0 auf 1 wechselt ("positive Flanke"), setzt Du das "mit Waage"-Bit auf 1.
Nur in dem Moment, wenn es von 1 auf 0 wechselt ("negative Flanke"), rücksetzt (löschst) Du das "mit Waage"-Bit.
Damit die FlankenErkennung möglich wird, muss der vorherige Zustand des "mit Reiniger"-Bits verfügbar sein.
Versuch's mal mit ...

Code:
Const cBit3_AUS = -9  ' = FFF7 bit 3 löschen
Const cBit3_EIN = 8   ' = 0008 bit 3 setzen

If ((xWord And 2 ^ 6) = 2 ^ 6) And Not ((xWordOld And 2 ^ 6) = 2 ^ 6) Then ' pos. Flanke
    xWord = xWord Or cBit3_EIN
ElseIf Not ((xWord And 2 ^ 6) = 2 ^ 6) And ((xWordOld And 2 ^ 6) = 2 ^ 6) Then ' neg. Flanke
    xWord = xWord And cBit3_AUS
    End If
xWordOld = xWord
Achtung:
- xWordOld darf nicht anderweitig verändert werden, also an "globaler Stelle" deklarieren.
- einer Anregung aus #2 folgenden, habe ich hier die Variable "Word" in "xWord" umbenannt … da Dich "Word" nicht irritiert: mach's so, wie willst Du ;o)
- die beiden Konstanten gelten, sofern xWord und xWordOld als INTEGER deklariert sind.


Der Kunde wollte, dass sobald dieses Bild aufgerufen wird, das Bit "mit Waage" gesetzt wird.
Kein Kommentar, ausser: das solltest Du besser hinkriegen als ich.

Gruss, Heinileini
 
Zuletzt bearbeitet:
Zurück
Oben