WinCC Button Mausklick bestimmtes Bit im Byte ansteuern ohne toggeln

sps-fuzzy

Level-2
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wie oben:
Button Mausklick bestimmtes Bit im Byte ansteuern ohne toggeln
Hat hier jemand eine Lösung für WinCC V7.4 als C-Script oder VBA

z. B.
Klick -> Bit2 wird angesteuert solange ich klicke und fällt dann wieder ab -> 0000 0010

Danke im Voraus
Gruß
sps-fuzzy
 
Du meinst nicht klicken sondern "Setze-Bit-In-Variable-Solange-Taste-Gedrückt"?

Beim Button beim Ereignis "links drücken" die C-Aktion:
Code:
[COLOR="#008080"]// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1[/COLOR]
#define Tag "My_Byte"
[COLOR="#008080"]// WINCC:TAGNAME_SECTION_END[/COLOR]

[COLOR="#008080"]// Bit setzen[/COLOR]
SetTagByte(Tag, (BYTE)( GetTagByteWait(Tag) | 2 ));
... und beim Ereignis "links loslassen" die C-Aktion:
Code:
[COLOR="#008080"]// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1[/COLOR]
#define Tag "My_Byte"
[COLOR="#008080"]// WINCC:TAGNAME_SECTION_END[/COLOR]

[COLOR="#008080"]// Bit rücksetzen[/COLOR]
SetTagByte(Tag, (BYTE)( GetTagByteWait(Tag) & ~2 ));

Gibt es mehrere Bedienstationen? Auf die PLC-Variable darf nicht gleichzeitig von mehreren Quellen geschrieben werden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier noch mit DWORD:

Maus links drücken

Code:
[COLOR=#FF0000][FONT=Helvetica][COLOR=#0000ff]#include[/COLOR]"apdefap.h"[/FONT][/COLOR]
[FONT=Helvetica][COLOR=#0000ff]void[/COLOR] OnLButtonDown([COLOR=#0000ff]char[/COLOR]* lpszPictureName, [COLOR=#0000ff]char[/COLOR]* lpszObjectName, [COLOR=#0000ff]char[/COLOR]* lpszPropertyName, UINT nFlags, [COLOR=#0000ff]int[/COLOR] x, [COLOR=#0000ff]int[/COLOR] y)[/FONT]
[FONT=Helvetica]{[/FONT]
[COLOR=#008080][FONT=Helvetica]// WINCC:TAGNAME_SECTION_START[/FONT][/COLOR]
[COLOR=#008080][FONT=Helvetica]// syntax: #define TagNameInAction "DMTagName"[/FONT][/COLOR]
[COLOR=#008080][FONT=Helvetica]// next TagID : 1[/FONT][/COLOR]
[COLOR=#FF0000][FONT=Helvetica][COLOR=#0000ff]#define[/COLOR][COLOR=#000000] TAG_0 [/COLOR]"Taste_1-16_S11"[/FONT][/COLOR]
[COLOR=#008080][FONT=Helvetica]// WINCC:TAGNAME_SECTION_END[/FONT][/COLOR][FONT=Helvetica]
[/FONT]
[FONT=Helvetica]DWORD dwHelp1,dwHelp2;[/FONT]

[FONT=Helvetica]dwHelp1=GetTagDWordWait(TAG_0);[/FONT]
[FONT=Helvetica]dwHelp2=dwHelp1|32;[/FONT]
[FONT=Helvetica]SetTagDWordWait(TAG_0,dwHelp2);[/FONT]

[FONT=Helvetica]}

Maus links loslassen:

[/FONT]
Code:
[COLOR=#FF0000][FONT=Helvetica][COLOR=#0000ff]#include[/COLOR]"apdefap.h"[/FONT][/COLOR]
[FONT=Helvetica][COLOR=#0000ff]void[/COLOR] OnLButtonUp([COLOR=#0000ff]char[/COLOR]* lpszPictureName, [COLOR=#0000ff]char[/COLOR]* lpszObjectName, [COLOR=#0000ff]char[/COLOR]* lpszPropertyName, UINT nFlags, [COLOR=#0000ff]int[/COLOR] x, [COLOR=#0000ff]int[/COLOR] y)[/FONT]
[FONT=Helvetica]{[/FONT]
[COLOR=#008080][FONT=Helvetica]// WINCC:TAGNAME_SECTION_START[/FONT][/COLOR]
[COLOR=#008080][FONT=Helvetica]// syntax: #define TagNameInAction "DMTagName"[/FONT][/COLOR]
[COLOR=#008080][FONT=Helvetica]// next TagID : 1[/FONT][/COLOR]
[COLOR=#FF0000][FONT=Helvetica][COLOR=#0000ff]#define[/COLOR][COLOR=#000000] TAG_0 [/COLOR]"Taste_1-16_S11"[/FONT][/COLOR]
[COLOR=#008080][FONT=Helvetica]// WINCC:TAGNAME_SECTION_END[/FONT][/COLOR]

[FONT=Helvetica]DWORD dwHelp1,dwHelp2;[/FONT]

[FONT=Helvetica]dwHelp1=GetTagDWordWait(TAG_0);[/FONT]
[FONT=Helvetica]dwHelp2=dwHelp1&(0xFFFFFFFF^32);[/FONT]
[FONT=Helvetica]SetTagDWordWait(TAG_0, dwHelp2);[/FONT][FONT=Helvetica]
[/FONT]
[FONT=Helvetica]}[/FONT]

Mit DWORD hat es leider einen kleinen Nachteil, man hat größere Hexwerte und ACHTUNG: Die Bytes sind vertauscht, also Bit 0 hat nicht die 1!
Leider finde ich meine Tabelle nicht mehr, die ich mit damals angelegt habe.
 
Hallo,
erstmal Danke an Harald und Ralle,
beide Lösungen funktionieren gut.
Zwischenzeitlich habe ich noch eine Lösung in VBS
Maus links drücken:
DWORD dwHelp1,dwHelp2;

dwHelp1=GetTagDWordWait(TAG_0);
dwHelp2=dwHelp1&(0xFFFFFFFF^32);
SetTagDWordWait(TAG_0, dwHelp2);


Maus links loslassen:

DWORD dwHelp1,dwHelp2;

dwHelp1=GetTagDWordWait(TAG_0);
dwHelp2=dwHelp1&(0xFFFFFFFF^32);
SetTagDWordWait(TAG_0, dwHelp2);

Gibt es hier eine bevorzugte Variante?


Harald: Es gibt mehrere Bedienstationen, wie verhält es sich, wenn zufällig eine gleichzeitige Betätigung erfolgt (schreiben auf SPS)?
Gibt es hier noch andere Möglichkeiten...

Danke
Gruß
sps-fuzzy



 
Zuletzt bearbeitet:
Also ich hab die Scripte in einem WinCC-Server und 11 Web-Navigator-Anwendungen mit dem gleichen Server. Probleme mit den Buttons hatte ich noch nie. Aber gleichzeitiges Drücken müßte da schon ordentlich von 2 Nutzern "synchronisiert" sein :ROFLMAO:

PS: Ich erinnere mich noch an einen Bug, das oberste Bit im DWORD konnte man nicht verwenden. Das hing irgendwie mit dem Vorzeichen einer DINT zusammen, obwohl die Variable ja als DWORD deklariert ist.
Irgendwo im Forum hatten wir das auch schon einmal thematisiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mit dem obersten Bit im DWord gilt für VBS, das lässt sich dort nicht (so einfach) verwenden. Wenn du VBS einsetzen willst mit DWORD-Variablen (z.B. in Faceplates ist ja nur VBS möglich), dann ist es einfacher dieses Bit als Reserve zu lassen und immer auf False zu setzen.

Kommt drauf an wie viele verschiedene Befehle du in ein DWORD packst. Wenn da völlig verschiedene Antrieb enthalten sind, tritt das vermutlich öfter aus als wenn dort nur ein einziger Antrieb gesteuert wird. Wichtig ist auch, dass auf dieses Befehls-DWORD von der SPS aus nicht geschrieben werden darf. Ich mache es immer so, dass ich ein explizites Befehls-DWORD habe und ein Rückmeldungs-DWORD. Die Befehls-Bits werden in WinCC nur gesetzt, in der SPS verarbeitet und zurückgesetzt. Aber den Tag-Sparern ist das auch schon zu teuer.
 
Zurück
Oben