In VBS maske auf DWord-Variable - Hilfeeee

schuld

Level-1
Beiträge
39
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Tritt der Fehler bei der Variante auch auf?
Code:
(objVar.value and 2^8) <> 0

btw:
Ist vielleicht auch besser lesbar, da erst maskiert und dann geprüft wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey zusammen,

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

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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Code:
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
 
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :cool: und ich kann prima in Skripten maskieren :D

(WinCC flexible 2007)

mfg
HelixX23
 
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):
Code:
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
 
Zurück
Oben