WinCC Bit in Variable über Checkbox setzen

steinche

Level-2
Beiträge
112
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Forengemeinde,

über eine Check-Box mit einem Eintrag möchte ich nicht das erste Bit in einer 16-Bit Variable setzen sondern das 3.te. Ich stellte mir das wohl etwas zu einfach vor, indem ich bei den Eigenschaften -> Ausgabe/Eingabe -> Selektierte Felder die Statik auf 0x8 setze und die Variable zuweise. Problem, die Statik bleibt bei 0x0.
Über den Dynamik-Dialog komme ich mit Versuchen über die verschiedenen Datentypen auch nicht weiter und bei C- bzw. VBS-Aktionen hört es bei mir leider auf 🙈

Hat da wer einen Tip für mich?

Viele Grüße und einen guten Start in die neue Woche!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In dem Fall wäre es eigentlich am einfachsten, nicht die fertige Checkbox zu verwenden, sondern eine Eigenkonstruktion. Gerade bei nur einem einzigen Feld. Aber mit entsprechenden Skripten geht das auch.

An die Eigenschaft "Selektierte Felder" hängst du ein C-Skript an. Als Trigger stellst du dafür einen Variablentrigger mit deiner Variable ein.
Als Funktion trägst du dort:
C:
// WINCC:TAGNAME_SECTION_START
#define TAG1 "deineVariable16BitUnsigned"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
return ((GetTagWord(TAG1) & (1 << 2)) > 0);
ein. Darüber wird wenn Bit 3 (gezählt von Bit 0 an) gesetzt ist eine 1 zurückgegeben was den Haken setzt, und sonst eine 0.

Dann fügst du unter Ereignis bei der gleichen Eigenschaft "Selektierte Felder" bei Änderung ebenfalls ein C-Script ein:
C:
short tagval;
// WINCC:TAGNAME_SECTION_START
#define TAG1 "deineVariable16BitUnsigned"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END

tagval = GetTagWordWait(TAG1);

if (value) {
  /* Prüfen ob Bit wirklich noch nicht gesetzt ist und gesetzt werden muss */
  if (!(tagval & (1 << 2))) {
    tagval |= (1 << 2);
    SetTagWord(TAG1, tagval);
  }
} else {
  /* Prüfen ob Bit wirklich auch gesetzt ist und rückgesetzt werden muss. */
  if (tagval & (1 << 2)) {
    tagval &= ~(1 << 2);
    SetTagWord(TAG1, tagval);
  }
}
Die Sonderprüfung ob das Schreiben wirklich notwendig ist, sollte sein, da ansonsten bei Bildaufruf bei schon gesetztem Bit ein Ereignis ausgelöst wird, wo die Variable nochmals beschrieben wird. Gerade bei Bits Ausmaskieren (setzen und rücksetzen einzelner Bits) in Variablen muss man im SPS-Programm aufpassen, dass diese Variable nur gelesen werden. Darum auch GetTagWordWait, damit auf jeden Fall vorher nochmal der letzte Stand von der SPS angefordert wird. Ansonsten kannst du auch das normale GetTagWord verwenden.
 
Zurück
Oben