WinCC 7.0 Aufruf mehrerer Bildfenster & Präfix im Hauptbild

win2000

Level-1
Beiträge
83
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe momentan folgendes Problem:

Im Hauptbild sind mehrere Bildfenster hinterlegt die über `jeweils ein Objekt geöffnet werden können.

Hauptbild --> Button --> Bildfenster (im Hauptbild)

Die Bildfenster sind alle gleich. Im Bildfensterobjekt öffne ich immer das gleiche .pdl und übergebe nur unterschiedliche Variablen-Präfixe.

Über ein C-Skript soll ein Statischer Text dem Bildfenster übergeben werden.


Wenn in der Runtime Button 1 gedrückt wird, geht auch Bildfenster 1 mit richtigem Statischen Text auf. Selbiges gilt für Bildfenster 2, aber auch nur dann wenn Bildfenster 1 vorher geschlossen wurde.
Wenn Bildfenster 1 geöffnet ist, und es soll zusätzlich Bildfenster 2 geöffnet werden, dann ändert sich der statische Text im Bildfenster 1 und im Bildfenster 2 ist ein Platzhalter zu sehen.

Wo muss man ansetzen um das Problem zu lösen?
 
Hast du denn schon angefangen und es gibt ein Problem, oder hast du noch überhaupt keine Idee wie es funktioniert?

Was ist das Hauptproblem: das mit den statischen Text, oder der Variablen-Präfix?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hauptproblem momentan:
Statischer Text (bei den anderen Werten sehe ich noch nicht ob sich was ändert). Er wird überschrieben. Obwohl in beiden Bildfensterobjekten ein fester Text vorgegeben wird.

Idee:
Name des Bildfensters in eine Variable im Skript schreiben.
Dann per SetText(Name des Bildfensters, "Objekt Statischer Text", "TEXT") den Text festlegen.
 
Wenn in der Runtime Button 1 gedrückt wird, geht auch Bildfenster 1 mit richtigem Statischen Text auf. Selbiges gilt für Bildfenster 2, aber auch nur dann wenn Bildfenster 1 vorher geschlossen wurde.
Zeig mal was für Code sich hinter dem Button (oder Buttons falls du mehrere hast) jetzt bei die verbirgt.
Da tun wir uns vielleicht leichter herauszulesen was du erreichen möchtest.

Denn auch nach mehrmaligem Lesen weiß ich nicht was du vorhast und was du schon programmiert hast.
 
Das wird in den Buttons aufgerufen per Mausklick.

Code:
char* Bildname=NULL;
char szPicName1[_MAX_PATH+1];




Bildname = GetPictureName(lpszPictureName, lpszObjectName);


if(Bildname != NULL) //Beispiel aus WinCC Skript Tut
{
strncpy(szPicName1,Bildname,_MAX_PATH); //Copy the string
}


SetText(lpszObjectName,"Text_Objekt","Statischer Text");
 
Wenn ein Bildfenster aufgerufen wird, funktioniert es auch so. Aber sobald ein 2tes aufgerufen wird, ändert sich das 1. Bildfenster.
 
Wenn du mehrere Bildfenster gleichzeitig geöfnet haben willst die verschiedene Funktionen / Variablen Präfixe haben sollen, musst du mehrere Bildfensterobjekte in dein Bild einfügen.
Oder habe ich das falsch verstanden?

Nutzt du das Basic Process Control? Dort sind schon entsprechende Bildfensterobjekte vorgesehen die du für deine eigenen Anwendungen benutzen kannst (TOP01, TOP02, ...)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
char* Bildname=NULL;
char szPicName1[_MAX_PATH+1];

Bildname = GetPictureName(lpszPictureName, lpszObjectName);
if(Bildname != NULL) //Beispiel aus WinCC Skript Tut
{
    strncpy(szPicName1,Bildname,_MAX_PATH); //Copy the string
}
[COLOR=#ff0000]------- Bis hier hast du einen Bildnamen ausgelesen[/COLOR]

[COLOR=#ff0000]------- Hier Übergibst du aber den Button-Namen als Bildnamen (Paramter lpszPicturName) für SetText[/COLOR]
[COLOR=#ff0000]------- Wofür sind denn die Variablen "Bildname und[/COLOR][COLOR=#ff0000] "szPicName1" gut?[/COLOR]
SetText(lpszObjectName,"Text_Objekt","Statischer Text");
??? Die Verwirrung steigt....
 
Zuletzt bearbeitet:
Wenn du mehrere Bildfenster gleichzeitig geöfnet haben willst die verschiedene Funktionen / Variablen Präfixe haben sollen, musst du mehrere Bildfensterobjekte in dein Bild einfügen.
Oder habe ich das falsch verstanden?

Es sind mehrere Objekte im Hauptbild vorhanden.

Basic Process Control?
Nein, nutze ich nicht. Kenne ich auch nicht :D

??? Die Verwirrung steigt....
Ich hab mich noch nicht allzu lange mit Skripten beschäftigt. Möglich das Fehler drin sind und ich das falsche Objekt lese.


Aber: Wie könnte man das lösen? :)
 
Ahhh... Ich glaub jetzt hat meine Glaskugel Signal bekommen....

Du hast ein Grundbild. (Bsp. Grundbild.pdl)...
Im Grundbild hast du mehrere Bildfenster (Bps. Bildfenser_1 bis Bildfenster_9)
Jedes Bildfenster hat eine Button über dass es aufgerufen werden soll...
Die Bildfenster verwenden alle das selbe Bild (Bsp. BildFuerBildfenster.png)

Ab hier bin ich mir unsicher mit was du mit den Präfixen bzw. der SetTextFunktionen willst.
Das Setzen der Präfix für die einzelnen Bilder ginge so:
Code:
//Buttonscript

 SetTagPrefix(lpszPictureName, "Bildfenster_1", "Mein Präfix")

 //In dem Fall ist lpszPictureName der Name des Fensters wo der Button drin liegt "Grundbild.pdl"
 //Den Wert bekommst du beim Scritpaufruf mitübergeben

Zum zweiten Problem mit dem SetText.
Wenn ich dich richtig verstanden habe möchtest du eine Text-Eigenschaft
eines Textfeldes im Bildfenster verändern.
Also:
Grundbild.pld -> Bildfenster_1 -> BildFuerBildfenster.pdl -> Textfeld_1 -> Text-Eigenschaft.

Dann würde ich auch dein Problem verstehen das du bei 2 aufgerufenen Fenstern die Text-Eigenschaft immer im ersten Bildfenster änderst.
Du hast dann vermutlich sowas wie geschrieben:
Code:
SetText("BildFuerBildfenster.pdl","Textfeld_1", "MeinText");
Das würde dein Problem erklären, denn wenn mehrere Bildfenster mit dem selben Bildnamen gleichzeitig offen sind, man den AccessPath aber nicht genauer spezifiziert sonder nur über den Bildnamen (welcher nicht mehr eindeutig ist) arbeitet, dann wird die Aktion nach meiner Erinnerung nach im erster aufgerufenen Bildfenster ausgeführt.

Hab ich das richtig verstanden oder muss ich meine Glaskugel wegschmeißen?

Das erklärt aber immer noch nicht die Zeile die du uns gezeigt hast:
Code:
SetText(lpszObjectName,"Text_Objekt","Statischer Text");
Das Klick-Script bekommt in lpszObjectName den Namen des Objektes (der Button), von dem aus es aufgerufen wurde, mit gegeben.
Da müsste also der Button-Name z.B. "Button_1" drin stehen.

Die SetText-Zeile von dir würde also eine geöffnetes Bild mit dem Namen "Button_1" suchen, darin nach einem Objekt "Text_Objekt" und dort dann versuchen die Text-Eigenschaft zu ändern. Wenn der Button nicht gleich heißt wie das Bild in deinen Bildfenstern kann ich mir nicht vorstellen dass da was raus kommt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum zweiten Problem mit dem SetText.
Wenn ich dich richtig verstanden habe möchtest du eine Text-Eigenschaft
eines Textfeldes im Bildfenster verändern.
Also:
Grundbild.pld -> Bildfenster_1 -> BildFuerBildfenster.pdl -> Textfeld_1 -> Text-Eigenschaft.

Ja, das hab ich doch schon geschrieben. So soll es sein :D

Dann würde ich auch dein Problem verstehen das du bei 2 aufgerufenen Fenstern die Text-Eigenschaft immer im ersten Bildfenster änderst.
Du hast dann vermutlich sowas wie geschrieben:
Code:

SetText("BildFuerBildfenster.pdl","Textfeld_1", "MeinText");

Genau.

Hab ich das richtig verstanden oder muss ich meine Glaskugel wegschmeißen?
Richtig verstanden.

Das erklärt aber immer noch nicht die Zeile die du uns gezeigt hast:
Code:

SetText(lpszObjectName,"Text_Objekt","Statischer Text");
Ist evtl. nicht richtig. Hab ich nie behauptet. ;)
 
Wow... eine Streicheleinheit für die Glaskugel... :ROFLMAO:

Jetzt bin ich mir nur nicht sicher wie die korrekte Lösung aussieht... schon wieder lang her das ich vor nem WinCC gesessen bin...

Kurze Info zum Parameter lpszPicturName
WinCC V7.2 WinCC: Scripting (VBS schrieb:
2.15.1 lpszPictureName
Overview
"lpszPictureName" is the name of the picture.
If you configure an action on a property or a "Mouse-click" event in WinCC, the name of the
picture is provided as "lpszPictureName" in the action. The picture name has the following
structure:
<BASE PICTURE NAME>.<PICTURE WINDOW NAME>:<PICTURE NAME>. ... .<Picture
window name>:<Picture name>.
The "BASE PICTURE NAME" and the "PICTURE NAME" are provided without the file
extension ".PDL".
This enables you to identify the object's picture path. You can also address specific picture
windows, if a process picture is opened more than once for example.

Wenn ich's richtig im Kopf hab müsste man an deinen Pfad lpszPictureName denn du vom Button bekommst nur "<Punkt>Bildfenstername<Doppelpunkt>Bildname" dranhängen.
Könnte also so aussehen
Code:
char lpszPicName_BildF[255];
strcpy(lpszPicName_BildF,lpszPictureName);
strcat(lpszPicName_BildF,".Bildfenster_1:BildFuerBildfenster");

SetText(lpszPicName_BildF, "TextFeld_1", "MeinText")
Hab jetzt aber keine Testumgebung hier. Bin mir auch nicht sicher ob hinten noch ein ".pdl" dran muss.

Am einfachsten ist du vergleichst die Werte von lpszPictureName dort wo dein Aufrufbutton sitzt
zu dem Wert innerhalb deines Bildfensters.
Zum Beispiel einfach im Fester des Aufruf-Buttons ein TextFeld names "TestTextFeld" einfügen und dazu noch einen Button.
Im ButtonScipt dann:
Code:
SetText(lpszPictureName, "TestTextFeld", lpszPictureName);
Die Zeile schreibt dir den Wert von lpszPictureName in das Test-Textfeld rein.
Das selbe macht du innerhalb des Bildes "BildFuerBildfenster.pdl".
Dann kannst du die Werte mal ansehen und vergleichen.

Ach ja, noch was. Du kannst erst auf die Objekt innerhalb der Bildfenster zugreifen nachdem das Bild ins Bildfenster geladen und das Bild auch sichtbar geschalten wurde.
 
Zuletzt bearbeitet:
So sollte es funktionieren wenn du die festen Texte noch an deine Gegebenheiten anpasst:

Code:
// WINCC:PICNAME_SECTION_START
#define POPUPPICTURE "TestPopup.pdl"
// WINCC:PICNAME_SECTION_END

#define BILDFENSTEROBJECT "Bildfenster01"

char szPicturePath[512];

szPicturePath[0] = '\0';

/* Kompletten Pfad zum Bild im Bildfenster */
sprintf(szPicturePath, "%s.%s:%s", lpszPictureName, BILDFENSTEROBJECT, POPUPPICTURE);

/* Bildname setzen */
SetPropChar(lpszPictureName, BILDFENSTEROBJECT, "PictureName", POPUPPICTURE);

/* Sichtbar schalten */
SetPropBOOL(lpszPictureName, BILDFENSTEROBJECT, "Visible", TRUE);

/* Und statischen Text in einen Objekt setzen */
SetPropChar(szPicturePath, "StatischerText1", "Text", "Nur ein Test");
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So sollte es funktionieren wenn du die festen Texte noch an deine Gegebenheiten anpasst:

Code:
// WINCC:PICNAME_SECTION_START
#define POPUPPICTURE "TestPopup.pdl"
// WINCC:PICNAME_SECTION_END

#define BILDFENSTEROBJECT "Bildfenster01"

char szPicturePath[512];

szPicturePath[0] = '\0';

/* Kompletten Pfad zum Bild im Bildfenster */
sprintf(szPicturePath, "%s.%s:%s", lpszPictureName, BILDFENSTEROBJECT, POPUPPICTURE);

/* Bildname setzen */
SetPropChar(lpszPictureName, BILDFENSTEROBJECT, "PictureName", POPUPPICTURE);

/* Sichtbar schalten */
SetPropBOOL(lpszPictureName, BILDFENSTEROBJECT, "Visible", TRUE);

/* Und statischen Text in einen Objekt setzen */
SetPropChar(szPicturePath, "StatischerText1", "Text", "Nur ein Test");


Wunderbar, genau so funktioniert es!
THX!

Code:
[COLOR=#333333][FONT=Courier]/* Sichtbar schalten */
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]SetPropBOOL(lpszPictureName, BILDFENSTEROBJECT, "Visible", TRUE);[/FONT][/COLOR]

Diese Zeile musste ich allerdings entfernen, sonst kann das Bildfenster nicht mehr geschlossen werden.
 
Code:
[COLOR=#333333][FONT=Courier]/* Sichtbar schalten */
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]SetPropBOOL(lpszPictureName, BILDFENSTEROBJECT, "Visible", TRUE);[/FONT][/COLOR]

Diese Zeile musste ich allerdings entfernen, sonst kann das Bildfenster nicht mehr geschlossen werden.

Wirklich? Welche Einstellungen hast du denn für das Bildfenster gemacht? Ich stelle das immer in Voreinstellung auf Unsichtbar, immer im Vordergrund, mit einen Rahmen und schließbar. Dann funktioniert das mit den Visible schalten, bzw. muss so gemacht werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[COLOR=#333333][FONT=Courier]/* Sichtbar schalten */
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]SetPropBOOL(lpszPictureName, BILDFENSTEROBJECT, "Visible", TRUE);[/FONT][/COLOR]

Diese Zeile musste ich allerdings entfernen, sonst kann das Bildfenster nicht mehr geschlossen werden.
SetPropBOOL(lpszPictureName, BILDFENSTEROBJECT, "Visible", TRUE)
ist das selbe wie
SetVisible(lpszPictureName, BILDFENSTEROBJECT, TRUE)

kann mir nicht vorstellen dass dies Schuld ist. Sofern du dein Skritpt nicht zyklisch ausführst.

Mit welchem Befehl öffnest du den jetzt das Bildfenster, nachdem du obige Zeile entfernt hast.
 
Zurück
Oben