# Skript in Bildbaustein: Bit in Variable setzten



## HarryH (21 Januar 2009)

Hallo zusammen,

ich verwende WinCCflex2007 mit einem MP377. Ich habe ein Bildbaustein erstellt in dem 4 Buttons (Steuerfunktionen) , sowie anzeigende Elemente (Statusfunktionen) enthalten sind. Dieser Bildbaustein hat als Schnittstelle jeweils eine 1Byte-Variable "Status" und "Steuer". Meine Buttons und anzeigenden Elemente funktionieren soweit einwandfrei. 

Jetzt benötige ich jedoch noch folgende Funktion. Und die soll mit dem Skript in dem Bildbaustein realisiert werden:

Ich möchte abhängig von dem 4.Bit im Byte "Status" das 2.Bit im Byte "Steuer" setzten. 
Bedeutet: Wenn "Status".Bit4 = TRUE soll auch "Steuer".Bit2 = TRUE gesetzt werden. Alle anderen Bits im "Steuer" und "Status" können beliebige Werte annehmen und dürfen nicht verändert werden.

Weiß jemand wie das geht?

Gruß HarryH


----------



## xhasx (21 Januar 2009)

ShiftAndMask

und

SetBitInTag


----------



## Kai (21 Januar 2009)

HarryH schrieb:


> Ich möchte abhängig von dem 4.Bit im Byte "Status" das 2.Bit im Byte "Steuer" setzten.
> Bedeutet: Wenn "Status".Bit4 = TRUE soll auch "Steuer".Bit2 = TRUE gesetzt werden. Alle anderen Bits im "Steuer" und "Status" können beliebige Werte annehmen und dürfen nicht verändert werden.


 
Hier ist einmal ein kurzes Programmbeispiel in VB-Script:


```
'Statusbyte = Bit 0 - Bit 7 = 2^0 - 2^7 
'Steuerbyte = Bit 0 - Bit 7 = 2^0 - 2^7
 
If SmartTags("Statusbyte") And 2^4 Then
    SmartTags("Steuerbyte") = SmartTags("Steuerbyte") Or 2^2
Else
    SmartTags("Steuerbyte") = SmartTags("Steuerbyte") And (Not 2^2)
End If
```
 
Gruß Kai


----------



## Kai (22 Januar 2009)

Und hier noch einmal ein Programmbeispiel in VB-Script mit der Systemfunktion SchiebenUndMaskieren (ShiftAndMask):


```
' SchiebenUndMaskieren
'    Quellvariable <Variable>
'    Zielvariable <Variable>
'    Zu schiebende Bits <Konstante>
'    Zu maskierende Bits (Dezimalnotierung) <Konstante>
'
' Quellvariable
' Der Wert dieser Variable wird geschoben und maskiert.
'
' Zielvariable
' Das Ergebnis wird in diese Variable geschrieben.
'
' Zu schiebende Bits
' Wenn 'Zu schiebende Bits' positiv ist, dann werden die Bits
' nach rechts geschoben, andernfalls werden sie nach links
' geschoben. Die gesamte Bitdarstellung wird geschoben,
' einschließlich ein mögliches Vorzeichenbit.
'
' Zu maskierende Bits
' Die 'Zu maskierenden Bits', mit denen das Ergebnis der
' Schiebeoperation maskiert wird. Jedes Bit wird bitweise
' durch UND verknüpft. 
 
Dim Quellvariable
Dim Zielvariable
 
Quellvariable = SmartTags("Statusbyte")
 
ShiftAndMask Quellvariable, Zielvariable , 4, 1
 
If Zielvariable Then
    SetBitInTag SmartTags("Steuerbyte"), 2
Else
    ResetBitInTag SmartTags("Steuerbyte"), 2
End If
```
 
Oder:


```
' SchiebenUndMaskieren
'    Quellvariable <Variable>
'    Zielvariable <Variable>
'    Zu schiebende Bits <Konstante>
'    Zu maskierende Bits (Dezimalnotierung) <Konstante>
'
' Quellvariable
' Der Wert dieser Variable wird geschoben und maskiert.
'
' Zielvariable
' Das Ergebnis wird in diese Variable geschrieben.
'
' Zu schiebende Bits
' Wenn 'Zu schiebende Bits' positiv ist, dann werden die Bits
' nach rechts geschoben, andernfalls werden sie nach links
' geschoben. Die gesamte Bitdarstellung wird geschoben,
' einschließlich ein mögliches Vorzeichenbit.
'
' Zu maskierende Bits
' Die 'Zu maskierenden Bits', mit denen das Ergebnis der
' Schiebeoperation maskiert wird. Jedes Bit wird bitweise
' durch UND verknüpft. 
 
Dim Quellvariable
Dim Zielvariable
 
Quellvariable = SmartTags("Statusbyte")
 
ShiftAndMask Quellvariable, Zielvariable , 0, 16
 
If Zielvariable Then
    SetBitInTag SmartTags("Steuerbyte"), 2
Else
    ResetBitInTag SmartTags("Steuerbyte"), 2
End If
```
 
Gruß Kai


----------



## HarryH (23 Januar 2009)

Danke Kai für deine Info! Ich habe es inzwischen wie in deinem ersten Beitrag realisiert. Funktioniert sehr gut. 
Allerdings der Befehl "SetBitInTag" (kannte ich nicht) gefällt mir besser als [FONT=VERDANA,ARIAL,HELVETICA]die logische Disjunktion[/FONT] mit "or" die du in deinem ersten Beitrag verwendet hast. Ist für Leute die noch nichts/wenig mit VB gemacht haben intuitiver zu verstehen. :-D

Gruß HarryH


----------



## xhasx (23 Januar 2009)

Na prima,

ich habe absichtlich keinen "Code" hier platziert. Die Befehle sind in der Wcf Hilfe recht gut dokumentiert...


----------



## derwestermann (17 August 2009)

xhasx schrieb:


> Na prima,
> 
> ich habe absichtlich keinen "Code" hier platziert. Die Befehle sind in der Wcf Hilfe recht gut dokumentiert...


 

Ist das so? Ich mußte erst hierher kommen, um zu sehen, wie der Aufruf von ShiftAndMask wirklich aussieht. In der WcF-Hilfe steht:

SchiebenUndMaskieren (Quellvariable, Zielvariable, Zu schiebende Bits, Zu maskierende Bits)

Das ist doch mal gut dokumentiert........:sb7:


----------

