# In VBS maske auf DWord-Variable  - Hilfeeee



## schuld (26 Februar 2013)

Hallo zusammen,

ich habe ein problem beim maskieren einer DWord-Variable in VBS in einem WInCC Projekt!  

In der SPS gibt es ein DWord (Adresse 0.0 bis 3.7) aus dem das 8 Bit abgefragt (also 1.0) werden soll. Ist dieses Bit gesetzt soll eine Meldung ausgegeben werden.

Mein Code sieht folgendermaßen aus:

```
dim objVar
set objVar = HMIRuntime.Tags("Tag1")
objVar.read

if objVar.value & 2^8 then
MsgBox "Es sitzt"
end if
```

Leider funktioniert das ganze aber nicht wie ich es mir vorstelle. Ich bekomme andauernd die Msgbox angezeit unabhängig ob das bit sitzt oder nicht!!

Kann mir da jemand sagen was ich falsch mache?!


Grüße schuld


----------



## MRose (26 Februar 2013)

Hallo,

*&* verknüpft Zeichenketten, versuch mal *AND*.


----------



## Thomas_v2.1 (26 Februar 2013)

Mit AND sollte es gehen.

Bei VBS gibt es aber in dem Zusammenhang noch einen Fallstrick.
Wenn du eine logische Verknüpfung machen willst und im Wert ist das höherwertigste Bit gesetzt, so bricht VBS das Skript mit Fehler ab.
Darum muss man das vorher abfangen:

If value > 2^31 Then
  value = value - 2^31 ' höherwertigstes Bit zurücksetzen
End If

Wenn du das Bit auswerten willst musst du das dort auch noch einbauen.

Wegen diesen Merkwürdigkeiten versuche ich VBS in WinCC wo immer es geht zu vermeiden, aber in Faceplates kommt man bei WinCC leider nicht drumherum.


----------



## MRose (26 Februar 2013)

Tritt der Fehler bei der Variante auch auf?

```
(objVar.value and 2^8) <> 0
```

btw:
Ist vielleicht auch besser lesbar, da erst maskiert und dann geprüft wird.


----------



## Thomas_v2.1 (26 Februar 2013)

Weiß gar nicht wo ich meine Lösung her hatte, auf die Schnelle habe ich aber hier einen Thread gefunden wo das angesprochen wird:
http://microsoft.public.de.vb.narki...e-oberstes-bit-31-einer-long-variablen-setzen

Ich glaube du kannst nicht "And 2^31" prüfen, hab mir damals einen Wolf gesucht als mein Skript darum nicht funktionierte.


----------



## schuld (27 Februar 2013)

Hey zusammen,

@Thomas: ich glaube genau das mit dem 2^31 scheint der Fall zu sein!!!!!!! 

Die Bits 2^31 bis 2^25 sind bei mir in WinCC True (also in der Steuerung Bit 0.0 bis 0.6 = True ) Ich interessiere mich zwar für die anderen Bits aber ich bekomme den Fehler Overflow, wenn ich es mit dem MS Script debugger im Befehlsfenster ausführen lasse.

Werde es also gleich mal versuchen


----------



## Larry Laffer (27 Februar 2013)

Hallo,
wenn es um das Bit 2^31 geht dann könntest du es auch noch mal mit "and &h8000" versuchen. Ich habe das jetzt allerdings nicht getestet ...

Das mit deinem Overflow gibt mir aber zu denken. Vielleicht solltest du doch mal dein ganzes Script hier posten ...

Gruß
Larry


----------



## JesperMP (27 Februar 2013)

Wird das VBS Skript zyklisch aufgerufen ?
Und es wird ein MsgBox angezeigt !
Beide sind no-no.

Ist dies eine Übung, oder ist es ernsthaft gemeint ?

Und: Wichtig. WinCC oder WinCC Flexible.
v6, v7, 2004, 2005, 2007, 2008 oder v11 ?


----------



## schuld (28 Februar 2013)

Hi zusammen,

also nachdem ich es implementiert habe läufts! ... Weiß jetzt halt nicht ob es so gut ist, nach euren Beiträgen^^

Eingesetzt wird WinCC 6.2.2.7
Es ist eine Aktion --> zyklischer Aufruf alle 5sec, wird aber nicht in einer MsgBox angezeigt.

Mein script sieht wie folgt aus:


```
Function SetzeBitWennTrue(Tag1, Tag2, RetTag, mask)
Dim objTag1
Dim objTag2
Dim objRet
 Set objTag1 = HMIRuntime.Tags(Tag1)
 Set objTag2 = HMIRuntime.Tags(Tag2)
 
 objTag1.Read
 objTag2.Read
 
 If objtag2.Value > 2^31 Then
  objTag2.Value = objTag2.Value - 2^31
 End If

 If (objTag1.Value = 1) And ((objtag2.Value And mask) <> 0) Then 
  Set objRet = HMIRuntime.Tags(RetTag)
  objRet.Value = True
  objRet.Write
 Else
  Set objRet = HMIRuntime.Tags(RetTag)
  objRet.Value = False
  objRet.Write
 End If 
End Function
```

Der Übergabeparameter mask ist also mein Bit das ich maskieren will, z.B. das 18 Bit --> 2^17 wird übergeben.

Wäre cool wenn ihr dazu was sagen könntet wo da noch schwierigkeiten auftreten können!!

Danke schuld


----------



## Thomas_v2.1 (28 Februar 2013)

Dadurch dass du meinen Codeschnipsel zum Rücksetzen des MSB einfach so übernommen hast, kannst du das Bit nicht mehr abfragen.
In der SPS ist das dann im Word das Offset-Bit 0.7 welches nicht abgefragt werden kann.

Wenn du das aber brauchst, musst du deine Funktion noch etwas modifizieren.


----------



## schuld (5 März 2013)

Hi Thomas,

danke für den Hinweis. Stimmt aber meine Annahme, dass wenn ich nicht objTag1.write schreibe, dass 2^31 lediglich in der "internen Variable" subtrahiert wird, die eigentliche Variable (also die ProzVar die an Tag1 hängt) nicht geändert wird??

Grüße schuld


----------



## HelixX23 (13 September 2013)

Hi,
zur vollständigkeit halber:

Wenn man ein DWORD (Bsp.: MD 0) einließt und dort bit 31 gesetzt ist (M0.7) damm kommt dieser Overflow Fehler.
Wenn man den Typ von DWORD in DINT ändert dann kommt der Fehler nicht  und ich kann prima in Skripten maskieren 

(WinCC flexible 2007)

mfg
HelixX23


----------



## schuld (17 Juni 2015)

Hallo Zusammen,

ich muss diesen Thread nochmals aufmachen!! :sad: :'(

Das Lesen mit VBS aus einer DWORD Variable klappt wie von euch beschrieben.
Allerdings muss ich nun auch einzelne Bits in einem DWORD setzen. WinCC7.2 ist im Einsatz und die DWORD Variable ist als 32Bit Vorzeichenlos deklariert.

Solange Bit 31 nicht gesetzt ist kann ich mit folgendem Code maksieren (Bsp. an Bit 30): 

```
Var1 = HMIRuntime.Tags("DWORD_Var")
Var1.Read
Var1.Write = (Var1.value Or &H40000000)
Set Var1 = Nothing
```

Meine Probleme:
Ich muss Bit 31 setzten können und im Falle dass Bit31 gesetzt ist muss ich weiterhin alle anderen Bits noch setzten können!
Mit dem oben geposteten Skript funktioniert die Maskierung von Bit31 nicht und wenn Bit31 gesetzt ist kann ich den oben geposteten Skript ebenfalls nicht mehr ausführen...

Kann mir hierzu jemand was sagen, bzw. hat von euch schon mal jemand dieses Problem gehabt?

Vielen Dank und grüße
schuld


----------

