WinCC WinCC 7.5 SP1 Upd4 VBS Set bit en Varibel 32 Bit > Bit31 ...???

pramkies

Level-2
Beiträge
80
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe in WinCC in Global Skript eine Funktion geschrieben, dir mir einfach in eine 32 Bit unsigned Variabel, einzelne Bits setzten kann.
Aber ich habe ein Problem mit dem bit31..., bisschen gegoogelt und habe auch einen FAQ dazu gefunden;

Welche Besonderheit ist in VBScript bei der bitweisen Verknüpfung von Variablen zu beachten und wie kann das höchstwertige Bit (Bit-31/Bit-32) in WinCC mit VBS gesetzt werden?


https://support.industry.siemens.co...-wincc-mit-vbs-gesetzt-werden-?dti=0&lc=de-WW

Aber die Abhilfe verstehe ich nicht...
In dem Beispiel ist das lesen der 31 Bit beschrieben, um irgendein Eigenschaft zu setzen in WinCC.
Kann bzw. darf ich das 31 Bit also nicht setzen ?

Habe ein paar 32 Bit unsigned Variabel, wo ich Bitweise lese/Schreibe...
SoftkeySet;Enable;Events...


Code:
Sub SetBitEnVariable (Byval TagName, Byval bit)


    Dim Tag
    Set Tag = HMIRuntime.Tags(TagName)
    
                            
    Tag.Write(Tag.Read Or (2 ^ bit))         'Set
    


End Sub


Gruß
Pramkies
 
Hallo,

das Problem ist eine Systemeigenschaft von VBS. Werte >= 2.147.483.648 können nicht als Ganzzahl-Datentyp für Ganzzahl-Operationen verwendet werden, weil es in VBS kein unsigned Long gibt. Sie werden als "Double" (Fließkommawert) verwendet. Bitweise-And/Or ist nur mit Ganzzahl-Datentypen möglich und deshalb kommt ein Runtime-Error beim Versuch, einen Wert >= 2.147.483.648 (Fließkommawert!) mit "And" oder "Or" zu verknüpfen.

Hier eine ausführlichere Erklärung und eine Lösung, wie man das Problem umgeht. Und ein Hinweis, daß beim And/Or-Verknüpfen auch das Bit 15 problematisch ist, was in dem Siemens FAQ nicht erwähnt wird.

In C besteht das Problem nicht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

danke für deine Antwort.

Aber bin wahrscheinlich in dem Thema nicht so belesen, ich verstehe es nicht bzw. ich komme mit deine Lösung es trotzdem nicht hin.
Das Warum verstehe ich, aber die Abhilfe zu mein Problem verstehe ich nicht.

Das bitweise lesen macht ja ein Problem, wenn das 31 Bit TRUE ist...,
Dein Vorschlag abfrage größer als 2.147..483.648 bringt mir nichts. Ich möchte einfach in meiner Variabel (32 unsigned) den 31. Bit setzen können per VBS !
Leider ist mein Projektstand sehr fortgeschritten um auf C umzuschwenken. Kannst du mir mit mein Code weiter helfen.
Bin bisschen in Zeitdruck.


Code:
' SetBitEnVariable ist eine SUb in GlobalSkript
Sub OnClick(Byval Item)     


SetBitEnVariable "SK_Unit5.Softkeys_IsSet" , 31
End Sub

Code:
Sub SetBitEnVariable (Byval TagName, Byval bit)
   
    Dim Tag
    Set Tag = HMIRuntime.Tags(TagName)
                        
    Tag.Write(Tag.Read Or (2 ^ bit))         'Set
    


End Sub
 
VBS SetBitInVariable inkl. Bit .31

Ich habe gerade kein WinCC 7.x zum testen verfügbar, ich habe es mit TIA WinCC Comfort V15.1 getestet.
Probiere mal so:
Code:
[COLOR="#0000FF"]Sub SetBitInVariable(ByVal TagName, ByVal BitNo)[/COLOR]
[COLOR="#008000"]' Die übergebene HMI Variable "TagName" muß unsigned 32 Bit (UDInt) sein.
' Die Bitnummer "BitNo" darf 0..31 sein.
' Achtung VBS: Werte >=2.147.483.648 (&H80000000) sind Double! 
' und können nicht bitweise And/Or/Xor-verknüpft werden.
' Deshalb das Bit .31 temporär entfernen und gesondert behandeln.[/COLOR]

Const cvalue31 = 2147483648 [COLOR="#008000"]'&H80000000[/COLOR]
Dim value, bit31

[COLOR="#008000"]'HMI Variable lesen
'value = SmartTags(TagName)             'WinCC flexible/Comfort/Advanced[/COLOR]
value = HmiRuntime.Tags(TagName).Read   [COLOR="#008000"]'WinCC/Professional[/COLOR]

[COLOR="#008000"]'Falls Bit .31 gesetzt ist, dann temporär entfernen und merken[/COLOR]
If value >= cvalue31 Then           [COLOR="#008000"]'Bit .31 ist 1 ?[/COLOR]
    value = value - cvalue31        [COLOR="#008000"]'Bit .31 löschen[/COLOR]
    bit31 = cvalue31                [COLOR="#008000"]'merken: Bit .31 ist 1[/COLOR]
Else
    bit31 = 0                       [COLOR="#008000"]'merken: Bit .31 ist 0[/COLOR]
End If

[COLOR="#008000"]'Bit <BitNo> setzen[/COLOR]
If BitNo = 31 Then
    bit31 = cvalue31                [COLOR="#008000"]'merken: Bit .31 ist 1[/COLOR]
Else
    value = value Or (2 ^ BitNo)    [COLOR="#008000"]'Set Bit[/COLOR]
End If

[COLOR="#008000"]'Bits 0..30 + Bit .31 in HMI Variable schreiben
'SmartTags(TagName) = value + bit31             'WinCC flexible/Comfort/Advanced[/COLOR]
HmiRuntime.Tags(TagName).Write (value + bit31)  [COLOR="#008000"]'WinCC/Professional[/COLOR]

[COLOR="#0000FF"]End Sub[/COLOR]

Harald
 
Zurück
Oben