Bit/Byte toggle

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


in C:

Code:
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 :rolleyes:) GetTag und Settag

Code:
if Gettag("x") then 
Settag("x",0)
else
Settag("x",1)
end if
PS: Bitte check die richtige Schreibweise von Gettag und settag ab
 
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:

Code:
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
 
Zuletzt bearbeitet:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
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

Code:
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

Code:
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
 

Anhänge

  • VBScript.jpg
    VBScript.jpg
    162,1 KB · Aufrufe: 55
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.

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

Korrektur:


Code:
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
 
@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 :confused: ? Ist 2^0 vergleichbar mit der S7-Anweisung 2#1?
 
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.
 
Zurück
Oben