# Bit/Byte toggle



## Farinin (18 September 2008)

Hallo,
als "C Luser" brauche ich euch mal! Wie toggle ich ne' Bit in einem Byte unter WinCC 7.0?


----------



## johnij (18 September 2008)

Farinin schrieb:


> Hallo,
> als "C Luser" brauche ich euch mal! Wie toggle ich ne' Bit in einem Byte unter WinCC 7.0?


 

in C:


```
if x then 
x=false
else
x=true
end if
```
 
In WinCC hat man keine reine C-programmierung sondern eine Mischung
zwischen C und C a lá S.

In WinCC hast (denke ich ) GetTag und Settag


```
if Gettag("x") then 
Settag("x",0)
else
Settag("x",1)
end if
```
PS: Bitte check die richtige Schreibweise von Gettag und settag ab


----------



## Farinin (18 September 2008)

Hi,
ich darf aber nur ein Bit des Bytes ändern. Der Rest muss unverändert bleiben!


----------



## johnij (18 September 2008)

Farinin schrieb:


> Hi,
> ich darf aber nur ein Bit des Bytes ändern. Der Rest muss unverändert bleiben!


 
Das soll mit der Maskierung  von 2 Bytes gehen
(ich habe leider die WinCC Bibliothek nicht dabei)


----------



## Farinin (18 September 2008)

johnij schrieb:


> Das soll mit der Maskierung von 2 Bytes gehen
> (ich habe leider die WinCC Bibliothek nicht dabei)


 
Könntest du vielleicht da bei nächster Gelegenheit noch den genauen Code heraus finden?


----------



## johnij (18 September 2008)

Ups....

wieder xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx


----------



## johnij (18 September 2008)

Das kann ich leider nicht, weil ich keine WinCC-Packet bei mir habe
Bzw. nicht brauche.

Ich weiss, in der Library gibt es genug functions, die die Aufgabe lösen können.
2 ter Vorschlag (keine saubere Lösung) aus der SPS kannst du dein Byte Maskieren und das ergebnis in einem DB speichern---> im DB hast du
0000 0001-->1 (Int)
0000 0010-->2


1000 000--->-128 
insgesamt 8 Bytes
In Wincc schreibst Du ein Skript mit 8 Abfragen:


```
x=dein Byte, nach dem Maskieren in der SPS
y=originales Byte vor dem Maskieren in der SPS
 
 if (Gettag("x")==1)     then            //Abrage ob Bit0=1
Settag("y", Gettag("y")-1)
else
Settag("y", Gettag("y")+1)
end if
 
if (Gettag("x")==2)  then               //Abrage ob Bit1=1
Settag("y", Gettag("y")-2)
else
Settag("y", Gettag("y")+2)
end if
 
if (Gettag("x")==4)   then              //Abrage ob Bit2=1
Settag("y", Gettag("y")-4)
else
Settag("y", Gettag("y")+4)
end if
 
.
.
.
if (Gettag("x")==-128)   then              //Abrage ob Bit7=1
Settag("y", Gettag("y")+128)
else
Settag("y", Gettag("y")-128)
end if
```


----------



## vladi (18 September 2008)

*Bits und Bytes..*

Hallo Kollege,
das geht mittels exclusive und bzw. oder, z.B.
--------------------------------------------------------
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// variablen deklaration
unsigned setzen =      0x00000001;
unsigned ruecksetzen =      0x00000000;
unsigned  var1;
unsigned  var1;

//Rückgabe-Typ :BYTE 
var1=GetTagByte("Variable_BYTExx");  // Variablenwert holen..
var2 = var1;  // Wert intern speichern

// schauen, was macht das Bit gerade..                            
     var1 = var1 *&* 0x01;                           // passendes Bit ausmaskieren, z.B. hier Bit 0.. 
if (var1 == 1) 
           var1= var2 *&* ruecksetzen;                                   // Bit reset
else    var1= var2 *|* setzen;                                   // Bit setzen

// Variable zurückschreiben:
SetTagByte("Variable_BYTExx",var1);    //Rückgabe-Typ :BOOL 

return 0;
-----------------------------------------
Gruss: V.


----------



## Kai (18 September 2008)

Hier noch einmal ein Programmbeispiel in VBScript für das Toggeln eines Bits in einer Byte-Variablen.

Das jeweilige Script wird mit dem Drücken der linken Maustaste auf einen Button ausgeführt.


```
Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)  
 
'Bit 0 toggeln
 
Dim Variable
 
Set Variable = HMIRuntime.Tags("Variable_Byte")
 
If Variable.Read And 2^0 Then
   Variable.Write(Variable.Read And (Not 2^0))
Else
   Variable.Write(Variable.Read Or 2^0)
End If
 
End Sub
```
 

```
Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)  
 
'Bit 1 toggeln
 
Dim Variable
 
Set Variable = HMIRuntime.Tags("Variable_Byte")
 
If Variable.Read And 2^1 Then
   Variable.Write(Variable.Read And (Not 2^1))
Else
   Variable.Write(Variable.Read Or 2^1)
End If
 
End Sub
```
 

```
Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)  
 
'Bit 2 toggeln
 
Dim Variable
 
Set Variable = HMIRuntime.Tags("Variable_Byte")
 
If Variable.Read And 2^2 Then
   Variable.Write(Variable.Read And (Not 2^2))
Else
   Variable.Write(Variable.Read Or 2^2)
End If
 
End Sub
```
 
Gruß Kai


----------



## johnij (19 September 2008)

vladi schrieb:


> Hallo Kollege,
> das geht mittels exclusive und bzw. oder, z.B.
> --------------------------------------------------------
> void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
> ...


 
Morgääääään Forumer,
@vladi: der Code ist nicht ganz richtig.....

Korrektur:



```
variablen deklaration
unsigned setzen = [COLOR=red]0x11111111;
[/COLOR]unsigned ruecksetzen = [COLOR=red]0x11111110;
[/COLOR]unsigned var1;
unsigned var2;
//Rückgabe-Typ :BYTE 
var1=GetTagByte("Variable_BYTExx"); // Variablenwert holen..
var2 = var1; // Wert zwischenspeichern
// schauen, was macht das Bit gerade.. 
var1 = var1 & 0x01; // passendes Bit ausmaskieren, z.B. hier Bit 0.. 
if (var1 == 1) 
var1= var2 & ruecksetzen; // Bit reset
else var1= [COLOR=red]var2 & setzen;[/COLOR] // Bit setzen
// Variable zurückschreiben:
SetTagByte("Variable_BYTExx",var1); //Rückgabe-Typ :BOOL
```


----------



## Farinin (19 September 2008)

@ALL
Ich habe mich für die VBS Variante entschieden, denn das verstehe ich zumindest annähernd.

Aber leider nicht alles, daher ...

@Kai

... die Anweisung 2^0  kann doch eigentlich nicht die Zehnerpotenz meinen, sondern muss doch einer Binärschlüssel sein oder  ? Ist 2^0 vergleichbar mit der S7-Anweisung 2#1?


----------



## johnij (19 September 2008)

Farinin schrieb:


> Ist 2^0 vergleichbar mit der S7-Anweisung 2#1?


 
2^0 = Das bit0
2^1 = Das bit1
2^3 = Das bit3 
.
.


Die letzte (C) Lösung  soll auch funzen


----------



## vladi (19 September 2008)

*C Code*

Hi,
@Farinin: ja, du hast Recht, war zu müde gestern..

Ganz richtig wäre so:
variablen deklaration
unsigned setzen = 0x01;
unsigned ruecksetzen = 0xFE;
unsigned var1;
unsigned var2;
//Rückgabe-Typ :BYTE 
var1=GetTagByte("Variable_BYTExx"); // Variablenwert holen..
var2 = var1; // Wert zwischenspeichern
// schauen, was macht das Bit gerade.. 
var1 = var1 & 0x01; // passendes Bit ausmaskieren, z.B. hier Bit 0.. 
if (var1 == 1) 
var1= var2 & ruecksetzen; // Bit reset
else var1 = var2 | setzen; // Bit setzen
// Variable zurückschreiben:
SetTagByte("Variable_BYTExx",var1); //Rückgabe-Typ :BOOL
Gruss:
V.


----------



## johnij (19 September 2008)

vladi schrieb:


> Hi,
> @Farinin: ja, du hast Recht, war zu müde gestern..
> 
> V.


 
Ich merke, Du bist nooch müde ROFLMAO (@j..)


----------

