Wincc Bit Togeln

Timbo

Level-2
Beiträge
82
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich möchte in WinCC 7.3 mit einem Button ein Bit wechseln.

Leider komme ich damit überhaupt nicht klar.

Kann mir hier jemand helfen?

Habe hier schon mal einen Beitrag gefunden, aber der hilft bei mir nicht.


Danke schon mal
 
Lang...
Code:
#define TAG_1 "MyBit"

IF GetTagBit(TAG_1)
{
	SetTagBit(TAG_1, FALSE);
}
ELSE
{
	SetTagBit(TAG_1, TRUE);
}

Kurz...
Code:
SetTagBit(TAG_1, !GetTagBit(TAG_1));
 
OK. und da wo du hin geschrieben hast "MyBit" trage ich die variable ein oder wie?
JA. Die volle Version ist aber...
Code:
// WINCC:TAGNAME_SECTION_START
    #define TAG_1 "MeineVariable1"
    #define TAG_2 "MeineVariable2"
    #define EinAndererNameAlsTAG_irgendwas "MeineVariable3"
// WINCC:TAGNAME_SECTION_END
Die Zeichen "// WINCC:TAGNAME_SECTION_START" etc. bekommst du automatisch eingefügt wenn du ein neue C-Aktion erstellst.
Dazwischen, wie der Name "TAG-NAME-SECTION" schon sagt, musst du die WinCC-Variablen (die aus dem WinCC-Explorer) deklarieren.

Wenn du die Variablen so wie oben deklariert hast, greift zum Beispiel GetTagBit(TAG_1) auf die WinCC-Variable "MeineVariable1" zu.
Der Compiler macht beim Übersetzen nichts anderes als GetTagBit("MeineVariable1") daraus, man könnte also auch gleich selber GetTagBit("MeineVariable1") schreiben.
#define definiert mit "TAG_1" nur einen Platzhalter für "MeineVariable1". Google "C #define" für mehr Infos.

Warum die Mehrarbeit?
WinCC-Funktionen wie Querverweise (Cross Referencing) und Umverdrahten erkennen wenn WinCC-Tags in einem Skript innerhalb von "WINCC:TAGNAME_SECTION_START/END"
so verwendet werden. Wenn man es so macht, kann man bei Objekten die Funktion "Rechtsklick/Umverdrahten" verwenden und dann werden genau diese WinCC-Variablen für einen möglichen Austausch angeboten.

Ich würde dir die Handbücher "WINCC GETTING STARTED" und "WINCC SCRIPTING REFERENCE" empfehlen.

wo deklariere ich die Variable bei der kurzen Fassung?
Selbes wie vorher, ich war nur zu faul das "#define TAG_1" nochmal zu tippen. :ROFLMAO:
Und auch hier gehört es zwischen "// WINCC:TAGNAME_SECTION_START" und // WINCC:TAGNAME_SECTION_END"
 
Zuletzt bearbeitet:
Also ich habe jetzt mal ein paar Sachen ausprobiert. Bekomme einfach keine bit`s gewechselt. Auf den weg mit den bits bin ich auch nur gekommen weil es bei einem byte nicht geklappt hat. Hier meine Meldungen. das mit dem wb funktioniert leider auch nicht, obwohl hier wenigstens keine fehler beim kompelieren kommen.
 

Anhänge

  • IMG_20160218_100632.jpg
    IMG_20160218_100632.jpg
    552,7 KB · Aufrufe: 24
  • IMG_20160218_101044.jpg
    IMG_20160218_101044.jpg
    584,2 KB · Aufrufe: 21
  • IMG_20160218_101124.jpg
    IMG_20160218_101124.jpg
    586,4 KB · Aufrufe: 19
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Code sieht auch nun mal nicht so aus wie in meinem Beispiel in Beitrag #3.

Nur der "#define"-Teil kommt zwischen // WINCC:TAGNAME_SECTION_START" und // WINCC:TAGNAME_SECTION_END"

Der Code beginnt dann nach "// WINCC:pICNAME_SECTION_END"

Des erste GetTagBit gehört in die selbe Zeile wie das "if".
Aus den Set/GetTagBit gehören die Anführungszeichen bei "Tag" raus.
Anführungszeichen markieren Tag als String-Zeichenkette und nicht als Referenz auf das was du mit #define definiert hast.

Es könnte sein dass du TRUE und FALSE in Blockbuchstaben schreiben musst, ich weiß jetzt nicht was der Compiler frisst.
Du kannst auch einfach 0 und 1 schreiben.
 
Zuletzt bearbeitet:
Oh, an Screenshot 2 sehe ich das MB1150 ein Byte ist...
Die Info hätten wir am Anfang gebraucht...

Script-Nummer 1 ist für BOOL-Datentypen.

Ein Variante für Byte müsste ungefähr so aussehen
Code:
#define TAG     "MB1150"
#define BitNum   2


//Invertiere Bit in Byte
SetTagByte(TAG, GetTagByte(TAG)^(1<<BitNum));
Script 2 war also gar nicht so falsch wenn man von den Systax-Fehlern (siehe ein Beitrag vorher) absieht.

Script 3 müsste eigentlich gehen, aber einmal schreibst du "MB1150" dann wieder "mb1150".
 
Zuletzt bearbeitet:
IMG_20160218_105514.jpg

Was habe ich jetzt schon wieder falsch gemacht? Ok die VaRIABLE IST NOCH DIE FALSCHE; ABER DER cODE??

das ist nicht meine Welt mid dem C. Muss mich da mal richtig ein lesen. leider habe ich dafür momentan nicht die Zeit.

Ist wie das mit dem Holzfäller und der stumpfen Axt
 
Der Compiler möchte dir mit "( expected before..." sagen dass er die Bedingung der If-Abrage gerne in einer Klammer hätte.

Hatte ich jetzt in meinen Beispielen aus dem Hinterkopf vergessen.

Wenn du auf "( expected before..." doppelt draufklickst, springt der Cursor sogar (meist) an die Stelle wo der Compiler mit deinem Code unzufrieden ist.
 
Zuletzt bearbeitet:
Zurück
Oben