WinCC Button über zwei Wörter blinken lassen

InstandhalterIE

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Gemeinschaft,
ich habe folgendes Problem.
Ich habe zwei Variablen als Wort angelegt (z.B. 420_PultI1 / 420_PultI2).
Von den Variablen brauche ich jetzt mehrer verschiedene Bits, um einen Button blinken zu lassen.
Einmal das Bit x.0 jeweils und x.8 jeweils.
Kann ich das über ein C-Scipt machen oder anders machen?

Gruß Instandhalter
 
Zuletzt bearbeitet:
WinCC so wie in WinCC-v7-SCADA?
Willst du die Bits in den Wörtern nur setzen und das Blinken wir über das Blick-Property des Buttons gemacht (gut) oder soll WinCC die Bit in einem Takt setzen/rücksetzen (schlecht) damit es zum blinken kommt....

SetzeBit in WORD
Code:
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define TAG_1    "MyWordVar"
// WINCC:TAGNAME_SECTION_END


#define BitNum    5


SetTagWord( TAG_1, GetTagWord( TAG_1 ) | (1 << BitNum));

Bit in Wort rücksetzen
Code:
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define TAG_1    "MyWordVar"
// WINCC:TAGNAME_SECTION_END


#define BitNum    5

SetTagWord( TAG_1, GetTagWord( TAG_1 ) & ~(1 << BitNum));

Am besten verpackst du dir das in eine Projektfunktion ala SetTagBITinWORD(Tag_Name, BitNum).

Wobei, wenn du 2 Bits auf einmal schreiben willst, wäre es so besser.
Wenn du die obige SetTag/GetTag-Kombination zweimal nacheinander auf die selbe Variable schreibst, könnte das zweite GetTag den Wert vor der Änderung durch das erste SetTag liefern (Aktualisierungszyklus). Man könnt zwar die GetTagWait-Funktion nehmen aber..
Code:
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define TAG_1    "MyWordVar"
// WINCC:TAGNAME_SECTION_END


WORD VAL;


VAL = GetTagWord( TAG_1 );
VAL |= (1<<5);        //Setze Bit 5
VAL |= (1<<6);        //Setze Bit 6
VAL &= ~(1<<3);        //Rücksetze Bit 3


SetTagWord( TAG_1, VAL);
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal danke für die Antwort.
Aber ich möchte keine Bits setzen. Die Bits werden vom Programm aus gesetzt.
Ablauf ist wie folgt:
Hat die Anlage eine Störung so wird Bit x.0 gesetzt und der Button soll blinken
Wird die Anlage in Hand geschaltet wird Bit x.8 gesetzt und der Button soll auch blinken.

Ich hab es jetzt mit DynamicLog Analog probiert, konnte es aber noch nicht testen.
Bild2.png
 
Ich würde die Bits möglichst in der SPS OR-Verknüpfen und auf ein eigenes Bit legen.

Es geht aber auch im Dynamik-Dialog, z.B.
Datentyp: (x) Bool
Ausdruck/Formel: 'Var1'&1||'Var1'&256||'Var2'&1||'Var2'&0x100

Wenn es denn unbedingt ein C-Skript sein soll, dann danach den projektierten Dynamik-Dialog in eine C-Aktion umwandeln (Rechtsklick auf den roten Blitz > C-Aktion), dann sieht man wie ein C-Aktions-Skript idealerweise aussehen sollte:
Code:
#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 3
#define TAG_1 "Var1"
#define TAG_2 "Var2"
// WINCC:TAGNAME_SECTION_END

// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END

if ((long)GetTagDouble (TAG_1)&1 || (long)GetTagDouble (TAG_1)&256 || (long)GetTagDouble (TAG_2)&1 || (long)GetTagDouble (TAG_2)&0x100)
  return 1;
else
  return 0;
}

Harald
 
Also ich habe es heute ausprobiert und es geht nur teilweise.
Wenn in beiden Wörtern nur die Bits x.0 und/oder x.8 gesetzt sind blinkt es rot, aber es sind noch andere Variablen in diesen Wörtern enthalten und sobald eine von den aktiv ist blinkt es nicht mehr.
Der Befehl soll sich halt nur auf exakt das 0-Bit und 8-Bit konzentrieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich habe es heute ausprobiert und es geht nur teilweise.
[...]
Der Befehl soll sich halt nur auf exakt das 0-Bit und 8-Bit konzentrieren.
Du meinst jetzt Deinen Versuch aus Beitrag #3? Der kann nicht funktionieren. Wenn Du den Ausdruck "Analog" auswertest, dann müssen die nicht zu beachtenden Bits aus der Auswertung ausmaskiert werden. Außerdem muß auch bei 256 Blinken = "Ja".
Folgendes sollte funktionieren:
Dynamik-Dialog - Ausdruck/Formel (Blinken bei Ergebnis <> 0):
Code:
('PG430_I1_Pult'|'PG430_I2_Pult')&0x101
Ich weiß grad nicht, ob in dem Ausdruck auch Klammern erlaubt sind. Alternativen:
Code:
'PG430_I1_Pult'&0x101|'PG430_I2_Pult'&0x101
oder
'PG430_I1_Pult'&0x101||'PG430_I2_Pult'&0x101

Hast Du auch mal meinen Vorschlag aus Beitrag #4 ausprobiert?
Dynamik-Dialog - Ausdruck/Formel (kann "Bool" oder "Analog" ausgewertet werden):
Code:
'PG430_I1_Pult'&1||'PG430_I1_Pult'&256||'PG430_I2_Pult'&1||'PG430_I2_Pult'&0x100
(ob man mit 256 oder mit 0x100 maskiert ist egal (Geschmacksfrage) weil 256 (dez) = 0x100 (hex))

Harald
 
Klammern sind im Dynamik-Dialog kein Problem. Würde auch zum ersten Beispiel von PN/DP im Vorbeitrag tendieren.
 
Zurück
Oben