WinCC WinCC 7.X C-Script für OnlineTrendControl

LumiluX

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine Frage an die C sckript Experten unter euch, ich verzweifle da grade etwas dran.
Es soll ein Reglerbild mit Variablen Präfix aufgerufen werden indem ein OnlineTrendControl mit dem jeweiligen Istwert, Sollwert und Stellwert vorhanden ist.
Die Variablen sind im TagLoggin auch alle drin, die Variablenpräfix zu denn Buttons und Ein-/Ausgabe feldern werden auch ohne Problemlos übergeben, ausser in meinem Script für das OnlineTrendControll.
Dieses sieht so aus:


#define Istwert "Istwert"
#define Sollwert "Sollwert"
#define Stellwert "Stellwert"

char Ordner[50] = "Allgemein\\";
char Var1[50] = Istwert;
char Var2[50] = Sollwert;
char Var3[50] = Stellwert;
char Kurve1[255];
char Kurve2[255];
char Kurve3[255];
sprintf(Kurve1, "%s%s", Ordner, Var1);
sprintf(Kurve2, "%s%s", Ordner, Var2);
sprintf(Kurve3, "%s%s", Ordner, Var3);

SetPropWord(lpszPictureName,"Control1","TrendIndex",0);
SetPropChar(lpszPictureName,"Control1","TrendTagName",Kurve1);
SetPropWord(lpszPictureName,"Control1","TrendIndex",1);
SetPropChar(lpszPictureName,"Control1","TrendTagName",Kurve2);
SetPropWord(lpszPictureName,"Control1","TrendIndex",2);
SetPropChar(lpszPictureName,"Control1","TrendTagName",Kurve3);

Wenn ich bei "Istwert", "Sollwert" und "Stellwert" denn kompletten Variablen namen hinschreibe dann funktiert es. Deshalb denke ich das es daran liegt das hier kein Prefix gesetzt wird, aber ich komme nicht drauf warum.


Danke im Vorraus
Andreas
 
Bei den Daten im Taglogging existiert kein Präfix. Du könntest es aber mit GetTagPrefix auslesen, und ihn dann in deinem Script an entsprechender Stelle mit in den kompletten Pfad einbauen. Da müsstest du mal zeigen, nach welchem Bezeichnungsschema die Variablen im Taglogging abgelegt sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achso, das hab ich garnicht gewusst. Ich bin nicht so erfahren mit C scripten in WinCC, aber ich taste mich da rein, ich probiere das gleich aus.
die Variablen sind aus dem Variablen Haushalt mit denn selben Namen in Tagloggin kopiert.
Die sind im Ordner (Archivname) Allgemein
Regler1.Istwert
Regler1.Sollwert
Regler1.Stellwert
Regler2.Istwert
Regler2.Sollwert
Regler2.Stellwert
Regler3.Istwert
Regler3.Sollwert
Regler3.Stellwert
Regler4.Istwert
Regler4.Sollwert
Regler4.Stellwert
usw...

Das Script zum aufruf des Reglerbildes ist:

#define PIC_1 "00_Bedienung_Regler.pdl"

#define Prefix "Regler1."
#define Name "Regler"

static char szPicture[30] = PIC_1;
static char* tmp = &szPicture[0];

SetPropChar(lpszPictureName,"Bildfenster4","CaptionText",Name);
SetPropChar(lpszPictureName,"Bildfenster4","TagPrefix",Prefix);
SetPropBOOL(lpszPictureName,"Bildfenster4","Visible",1);
PDLRTSetPropEx(PDLRT_AM_PICTABS,lpszPictureName,"Bildfenster4","PictureName",VT_LPSTR,&tmp,NULL,NULL,0,NULL,NULL);




UPDATE:
Ich hab das jetzt mal versucht und zwei Ansätze versucht , aber beides klappt irgendwie trotzdem nicht :confused:

char Prefix[50] = GetTagPrefix(lpszPictureName,"Bildfenster4");

char *Prefix[50] = GetTagPrefix(GetParentPicture(lpszPictureName),"Bildfenster4");

sprintf(Kurve1, "%s%s%s", Ordner, Prefix, Var1);

diese beiden Ansätze hahbe ich veruscht, aber beides klappt nicht, bin langsam verzweifelt, es muss doch irgendwie gehen.
 
Zuletzt bearbeitet:
Was heißt denn "klappt nicht": Lässt sich nicht übersetzen, oder funktioniert nicht wie gewünscht?

Wenn sich der Code fehlerfrei übersetzen lässt aber nicht funktioniert wie gewünscht, ist es hilfreich ist es zum "debugging" ein paar printf Ausgaben einzubauen und sich die Ausgaben mit apdiag oder einem Diagnose-Bildobjekt für Global Script anzusehen.

Ob das mit den Bildpfad so passt lässt sich ohne das Projekt zu kennen, und aus welchem Bildfenster das Script aufgerufen wird nicht sagen.

Auf jeden Fall gibt GetTagPrefix einen Zeiger auf ein char Array zurück.

D.h. entweder:

char *Prefix;
Prefix = GetTagPrefix(lpszPictureName, "Bildfenster4");
// z.B. Debug Ausgabe mit
print("GetTagPrefix returned: %s\r\n", Prefix);

Oder alles zusammen ohne Zwischenvariablen:
sprintf(Kurve1, "Allgemein\\%sIstwert", GetTagPrefix(lpszPictureName,"Bildfenster4"));
 
Mit Klappt nicht war gemeint, dass beim aufruf keine Verbindung zu denn Variablen da war, entweder stand "Allgemein//Istwert" oder Allgemien//[NULL]Istwert. Deshalb war mir klar das es am Präfix liegt, hab noch etwas rum gebastelt und so klappt es jetzt:

char *Prefix[50] = GetTagPrefix(GetParentPicture(lpszPictureName),"Bildfenster4");

sprintf(Kurve1, "%s%s%s", Ordner, *Prefix, Var1);

Ich hatte vorher kein * gesetzt.

Danke für deine Hilfe (y)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mag zwar funktionieren, ist aber mindestens verwirrend.

Wie geschrieben, gibt GetTagPrefix einen Zeiger auf einen String (char array) zurück.
Mit "char *Prefix[50]" hast du ein Array mit 50 Elementen in denen zu ein Zeiger auf ein char speichern kannst. Wenn du es passend schreibst, könntest du dort 50 Rückgabewerte von GetTagPrefix speichern.

Wie gesagt ist das dann nur ein Zeiger. Der eigentliche String liegt in einem anderen Speicher den die Funktion GetTagPrefix intern allokiert.
 
Ich werde nach meinem Urlaub mal deine kombinierte Version
sprintf(Kurve1, "Allgemein\\%sIstwert", GetTagPrefix(lpszPictureName,"Bildfenster4"));
ausprobieren, es ist damit natürlich viel eleganter.
 
Zurück
Oben