# (Banale) WinCC C-Aktions Frage



## Rengel (9 März 2005)

Hallo Leute!

Ich habe da eine kleine Frage zu einer C-Aktion in WinCC habe aber leider null Ahnung von der Sprache. (Sollte ich dringend mal dran arbeiten  )

Auf jeden FAll möchte ich ein Symbol nur anzeigen, wenn zwei bits gesetzt sind. Also eine simple AND Funktion.

Habe aber leider keine Ahnung wie ich das in WinCC realisieren kann 

Danke für etwas Code  8)  :lol: 

MfG

Rengel


----------



## Lipperlandstern (9 März 2005)

Ich hab leider schon lange nicht mehr mit WinCC gearbeitet aber so wie ich mich erinnerkann kannst Du die Variablen im Aktionfeld verknüpfen... also bei Sichtbarkeit Var1 AND Var2 eintippen...... sollte gehen ;-)

Viel Erfolg

Axel


----------



## Rengel (9 März 2005)

Habe ich versucht, klappt leider nicht! So einfach scheints nicht zu sein 

DAnn kommt es zu Fehlermeldungen wie

"Undefined Identifier" für die Variablen und zu <ident> expected before <eof>

Und leider habe ich ja überhaupt keine Ahnung was er mir damit sagen will   Ein Schelm wer dabei schlechtes denkt *fg*


----------



## BernhardHartl (9 März 2005)

Hallo!

Die C Funktion müsste so aussehen:

if (var1 == var2 && var3 == var 4) ....

Müsste klappen

Bernhard


----------



## Rengel (9 März 2005)

Also, ich habe mich jetzt mal mit dem Visu Rechner eingeloggt 

Also, das ganze sieht im Moment so aus:


```
#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{

DE_30_1_ZF_0801__Start_Beladen_GS3 && DE_30_2_ZF_0801__Ende_Beladen_GS3


// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END

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

}
```

Wieso denn eine if/then Aktion? Obiges ist sicherlich völlig Falsch denke ich


----------



## Rengel (9 März 2005)

Bzw. nach einer kleinen Eingebung, die aber auch nicht funktioniert...

Das then wird nicht blau hinterlegt also wohl gar nicht als Befehl erkannt...


```
#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{

if (DE_30_1_ZF_0801__Start_Beladen_GS3 && DE_30_2_ZF_0801__Ende_Beladen_GS3)

then GetVisible("Visible",lpszObjectName);	//Return-Type: BOOL 

}
```


----------



## BernhardHartl (9 März 2005)

In C brauchst du kein then. 

Ich glaube, dass du eine Set Visible Anweisung brauchst, habe leider derzeit keinen WinCC Rechner, wenn du noch Hilfe brauchst, kann ich dir am Nachmittag nachsehen.

Statt "Visible" gehört außerdem eine boolscher Wert, also 0 oder 1 und statt lpszObjectName der Name deines Objektes. Füge den Befehl aus der Bibliothek ein, dann hast du ein Auswahlmenu zur Verfügung. 

Wenn DE_30_1_ZF_0801__Start_Beladen_GS3 Variablen aus deiner Steuerung sind, was ich vermute, musst du sie ausserdem mit dem Befehl GetTagBit laden, da es ja keine Variablen in deinem C Script sind. 

[/code]
#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{

if (GetTagBit(DE_30_1_ZF_0801__Start_Beladen_GS3) && GetTagBit(DE_30_2_ZF_0801__Ende_Beladen_GS3))
{
SetVisible(1, Objektname); 
}


----------



## Rengel (9 März 2005)

Also bei den Variablen handelt es sich um welche aus der Steurung, da hast du recht.

Allerdings klappt es so wie von dir geschrieben leider auch nicht.

Die Fkt. hate ich schon aus den Vorlagen nur irgendwie hat er die Gruppe nicht übernommen. So schauts jetzt bei mir aus:


```
#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
if (GetTagBit(DE_30_1_ZF_0801__Start_Beladen_GS3) && GetTagBit(DE_30_2_ZF_0801__Ende_Beladen_GS3)) 

GetVisible(1, Gruppe10); 

}
```

Es wäre super Nett von dir wenn du die Zeit und Lust finden würdest das heute mittag mal an einem WinCC Rechner zu probieren )

Danke und Grüße

Rengel


----------



## BernhardHartl (9 März 2005)

Sorry, Befehl für SetVisible war falsch. 

Zusätzlich gehört die Variablennamen unter ""

So müssts jetzt eigentlich gehen


```
#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
if (GetTagBit("DE_30_1_ZF_0801__Start_Beladen_GS3") && GetTagBit("DE_30_2_ZF_0801__Ende_Beladen_GS3"))
SetVisible("Bild.pdl","Objekt",1);
}
```


----------



## Rengel (9 März 2005)

Super, DAnke dein Code ist Fehlerfrei )

Jetzt bekomme ich nur noch ein Meldung zu Zeile 2

BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

und zwar: error (0086): function 'main' does not Return a value


----------



## BernhardHartl (9 März 2005)

Ahh, du hast die Funktion bei der Eigenschaft visible hinterlegt, d.h. du musst die Eigenschaft direkt zurückgeben. Das vereinfacht natürlich das ganze noch: 



> #include "apdefap.h"
> BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
> {
> if (GetTagBit("DE_30_1_ZF_0801__Start_Beladen_GS3") &&   GetTagBit("DE_30_2_ZF_0801__Ende_Beladen_GS3")) return (1);
> ...


----------



## Rengel (9 März 2005)

Ah, doch so "einfach" .. Man muss nur wissen wie! Aber ich habs verstanden  

Herzlichen Dank

Rengel


----------



## Rengel (9 März 2005)

Was mir just noch einfällt, WinCC warnt mich jetzt ja bzgl. einer hohen Systembelastung des Systems durch zyklische Bearbeitung. Ist das gravierend oder bei einem aktuellen PC vernachässigbar?


----------



## BernhardHartl (9 März 2005)

Bei einer Siemens Software ist natürlich alles gravierend *g*

Nein, im ernst. Ich habe schon größere Projekte gemacht, in dem ich zB ein Programm, das mir x Variablen in ein *csv file schreibt, jede Sekunde einmal aufgerufen habe. Dabei habe ich erst bei ca. 120 Variablen Probleme mit der Systemlaufzeit bekommen, also kann man diese Warnung eher vernachlässigen. 

Bernhard


----------



## Rengel (9 März 2005)

Irgendwie tut sich hier just das nächste Problem auf ;o) Köönen die von Siemens das nicht mal bessre ausdokumentieren...

Also, jetzt möchte ich in einem statischen Textfeld den Text ändern wenn eine Variable einen bestimmten Wert hat. Quelle für den Text ist eine weitere Variable oder ein statischer Text.


```
#include "apdefap.h"
 char* _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{

if (GetTagBit("Scanneranwahl") == "1") return (test)


}
```

Scanneranwahl ist ein Vorzeichenloser 8 bit Wert, Bool geht da nicht da ich ca. 10 verschiedene Mögliche Inhalte für das Textfeld habe.


----------



## Anonymous (10 März 2005)

Servus, wenn du nur verschiedene statische Texte abhängig von deiner Variablen anzeigen möchtest würde ich es nicht über eine C-Aktion sondern über den Dynamik-Dialog realisieren. Dort kannst du für jeden Wert deiner Variablen einen Text eingeben.
Gruß Ralf


----------



## Rengel (10 März 2005)

@ Mars

Das geht bei statischen Texten, so habe ich es auch bei einigen schon gemacht.

Nur habe ich unter anderem auch ständig wechselnde Daten (Scannerdatensätze) die ich aus der SPS auslesen muss, da diese halt immer wieder wechseln.

Das ganze sieht so aus, das ich in einer Übersicht das Transportsystem mit verschiedenen Scannern darstelle. Klickt der Bediener jetzt auf einen der Scanner, so wird in einem Textfeld der aktuelle Scannerdatensatz angezeit. Und dieser wechselt ja immer wieder.


----------



## BernhardHartl (10 März 2005)

Zum Script

return("text"), da ja text ein Character ist, dann müssts gehen, wobei du glaube ich beim 1 kein Appostroph brauchst, also -->

```
#include "apdefap.h"
 char* _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{

if (GetTagBit("Scanneranwahl") == 1) return ("test");


}
```


Bernhard


----------



## Rengel (10 März 2005)

Ja so geht's ohne Fehlermeldung  Da war ich ja schon verdammt nahe dran  Danke und auf ein neues... bestimmt bald

Grüße

Rengel


----------



## Rengel (10 März 2005)

Ja da bin ich schon wieder, früher als erwartet doch später als befürchtet 

Das mit deinem Code oben klappt ja wunderbar mit einem festen Test wobei man das ja ggf. Resourcensoparender mit einem Dynamik Dialog machen kann.

Was mir jetzt wieder kleine Probleme bereitet ist es, in das Textfeld den Inhalt eines Datenwortes (Doppelwort) zu bekommen. Ich habes mit folgenden Befehlen versucht ;o)

if (GetTagBit("Scanneranwahl") == 1) return SetTagDWord("Daten_SC_0103_1_GS1");

if (GetTagBit("Scanneranwahl") == 1) return GetTagDWord("Daten_SC_0103_1_GS1");

Bzw. das ganze noch komplizierter 

Abfrage einer Textfolge in einer Textvariablen und dann den Inhalt des Textfeldes aus dem DWord 

if (GetTagChar("Scanneranwahl") == "SC 0103.1 bei STF 0102") return SetTagDWord("Daten_SC_0103_1_GS1");

Hoffe ich nerve micht


----------



## Anonymous (17 März 2005)

wenn du hinter ein return eine function hängst, dann wird der rückgabewert der funktion returned.
das set tag gibt dir einen erfolgsstatus zurück und erwartet darüber hinaus noch einen parameter.
ich glaube ja du wolltest sicherlich get verwenden, oder?

get --> wert holen
set --> wert setzen


----------



## Rengel (24 März 2005)

Danke, ich werde das mal ausprobieren! War in den letzten 2 Wochen mit anderen Dingen belegt und denkle das ich Anfang nächsten Monats hieran weiter basteln kann


----------

