WinCC WinCC / PCS 7 Bildfenster

Stratos

Level-2
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,
wir setzen PCS 7 ein, folgendes Problem:
Es soll ein Bild welches in der TH eine Ebene tiefer ist als das aktuelle in einem Fenster wie ein Faceplate (Bild @1001 / @TOP10), aufgerufen werden. Es soll kein zusätzliches Bildfenster erzeugt werden sondern das vom Faceplate verwendet werden. Dieser Button soll in jedes Bild kopiert werden können ohne das das Script verändert wird.
Wie ist das zu lösen C-Script?
Ich hab schon verschiedene Varianten versucht, komme jedoch nicht weiter

Im Voraus vielen Dank
 
Bei einem Prozessbild das in der PCS7 TH liegt, ist das Elternbild immer @1001. Dabei ist es egal auf welcher Ebene in der TH das Bild liegt.
D.h. wenn du aus einem Prozessbild etwas in die TOP... Bildfenster laden willst, holst du dir über GetParentPicture den Namen (und Pfad) des Elternbildes.
Dann gehst du in einer Schleife die TOP Bildobjekte durch bis du eines gefunden hast welches noch nicht geöffnet wurde. Die Anzahl würde ich dabei so einstellen, dass sie deinen Einstellungen des PCS7 Projekts entsprichst. Hast du ein Bildfenster bei dem die Eigenschaft "Visible" noch auf false ist gefunden, setzt du deinen Bildnamen über die "PictureName" Eigenschaft und schaltest es durch setzen von "Visible" auf true sichtbar.

Wenn du so etwas aus einem bereits geöffneten Bildfenster in TOP... machen willst und bei in diesem bereits geöffneten Bildfenster das Bild tauschen willst, holst du dir ebenfalls über GetParentPicture das Elternfenster, und zusätzlich mit GetParentPictureWindow das Bildfenster in dem das Bild gerade ist. Das ist dann ein Name wie @TOP01.
Dann kannst du mit etwas wie SetPropChar(parentPicture, parentPictureWindow, "PictureName", "bla.pdl") das Bild austauschen.
Das funktioniert unabhängig von der PCS7 / BPC Struktur bei jedem anderen Bild im Bildfenster.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas_v.2.1,
vielen Dank für die Idee, leider komme ich immer noch nicht weiter.
Das was du schreibst klingt gut.:
"wenn du aus einem Prozessbild etwas in die TOP... Bildfenster laden willst, holst du dir über GetParentPicture den Namen (und Pfad) des Elternbildes."
Ich weis jedoch noch nicht wie ich den Namen des Bildes "RO_FS1_01PARA" im Bildfenster "@TOPXX" sichtbar geschaltet bekomme.
Verschiedene Varianten habe ich probiert, bin jedoch kläglich gescheitert.
Dann habe ich versucht mit "Printf" mir auszugeben was die Funktion Get.... einliest, hat auch nicht funktioniert.
Dann habe ich nochmal über die "SSM" Funktionen zu gehen, brachte auch nichts.
Kannst du oder jemand Anderes mir weiter helfen?.
Vielen Dank im Voraus.
 
Zeig doch mal dein Programmcode dazu.
Wenn du einen Button hast und ein Klick-Ereignis hinzufügst, dann kannst du dir die Bildnamen z.B. so ausgeben lassen:
Code:
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
char *pic;

pic = GetParentPicture(lpszPictureName);
printf("GetParentPicture = %s\r\n", pic);
}

Wo liegt denn dein Button zum Aufruf des Bildfensters, direkt im Hauptfenster oder schon in einem Unterfenster?

Das Ursprungsbild bei BPC ist immer @1001.pdl. Ein Prozessbild wird normalerweise in das Bildfenster @DESK in diesem Bild geladen, die @TOP.. Bildfenster liegen ebenfalls in Bild @1001.pdl
Mit GetParentPicture müsstest du eigentlich immer etwas mit @1001 erhalten. Im Prinzip sind die Bildnamen bei PCS7/BPC ja fix, aber dort steckt auch noch der Bildschirm mit drin, falls du ein Mehr-Monitor-System hast. Darum ist das mit den Funktionen immer der sauberste Weg.
 
Hallo Zusammen,

ich habe es so gelöst, dass ich im ersten Pop-Up über einen Button welcher ein C-Skript aufruft, auf das Hauptbild zugreife und von da aus das zweite Popup sichtbar machen und das erste unsichtbar.
Dafür habe ich die SetVisible-Funktion mit der GatParentPicture-Funkiton wie folgt verschachtelt:
Code:
SetVisible(GetParentPicture(lpszPictureName, "PopUp2", 1);
SetVisible(GetParentPictrue(lpszPictrueName, "PopUp1", 0)

Eine Funktion um einfach das Bild zutauschen, wie Thomas es beschreibt, wäre natürlich einfacher. Was hat es genau mit der Funktion "SetPropChar(parentPicture, parentPictureWindow, "PictureName", "bla.pdl")" auf sich? Gibt es da eine Beschreibung wie die genaue Funktion ist bzw. wie die Übergabeparameter belegt werden?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was hat es genau mit der Funktion "SetPropChar(parentPicture, parentPictureWindow, "PictureName", "bla.pdl")" auf sich? Gibt es da eine Beschreibung wie die genaue Funktion ist bzw. wie die Übergabeparameter belegt werden?

Es lassen sich so gut wie alle Objekt-Eigenschaften auch über die SetProp... Funktionen ändern. Der Funktionsparameter mit der Eigenschaft benötigt jedoch den englischsprachigen Bezeichner der Eigenschaft. An diese kommst du heran wenn du z.B. den Editor auf englisch umstellst, oder wenn auf deutsch, dann rufst du den Animationsdialog von z.B. einem Test-Button auf, und browst dann die Objekte, wählst eines an und siehst dann die Eigenschaften.
Den Datentyp benötigst du dann noch (Bool, Int, Double, Char) und kannst dann damit die Eigenschaften entsprechend modifizieren.

Die Eigenschaft "PictureName" ist die Eigenschaft Bildname des Bildfensterobjektes.
 
Hallo
ich nochmal. Also ich haben verschiedene Sachen ausprobiert:
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
char szPictureName[ 260 ] = "";
int iIndex = 0;
int test1;
int test2;
int test3;
char* ContainerName = (char*) SysMalloc( 260 );

printf("lpszPictureName = %s\n", lpszPictureName);
printf("lpszObjectName = %s\n", lpszObjectName);
printf("lpszPropertyName = %s\n", lpszPropertyName);
printf("GetParentPicture = %s\n", GetParentPicture(lpszPictureName));
printf("GetParentPictureWindow = %s\n", GetParentPictureWindow(lpszPictureName));
printf("GetLocalPicture = %s\n", GetLocalPicture(lpszPictureName));
SetPropChar(lpszPictureName,"Test","PictureName","Hein");
printf("GetPropChar = %s\n", GetPropChar(lpszPictureName,"Test","PictureName"));
SetPropChar(lpszPictureName,"Test","PictureName","Blöd");
printf("GetPropChar = %s\n", GetPropChar(lpszPictureName,"Test","PictureName"));

printf("---------------------------SSM---------------------------- = %d\n") ;

test1 = SSMGetIndexFromObject( lpszObjectName);
printf("\nSSMGetIndexFromObject = %d\n", test1) ;
test2 = SSMGetAreaFromIndex(iIndex , NULL, 0, szPictureName, 260);
printf("SSMGetIndexFromIndex = %d\n", test1) ;
test3 = SSMChangeWorkField((SSMGetScreen(lpszPictureName)),(GetLocalPicture(lpszPictureName)),1);
printf("SSMChangeWorkField = %d\n", test2) ;
printf("SSMGetContainerToPicture = %d\n", SSMGetContainerToPicture(lpszPictureName,"WE/Filterstufe 1/Filter 1",10));

Die Antworten dazu siehe Grafik

Ich möchte jedoch den Namen des Bildes im Container "FS1_01_PARA" wissen.
Dieses Bild möchte ich dann in einem Bildfenster des Grundbildes @1001 öffnen.

Der Grund ist das ich diesen Knopf in PCS 7 nur kopieren muss ohne Änderungen zu machen.
 
Also ich sehe keine Grafik.

Was nennst du denn einen Container? Ein Bild (pdl) oder ein Bildfenster-Objekt in einem Bild?

Am Besten du zeichnest dir mal auf einem Blatt Papier die gesamte Bildhierarchie ab @1001.pdl bis zu deinem speziellen Bild auf. Also welches Bild wird in welches Bildfenster geladen. Dann weißt du auch wie du aus einem Unterbild dich wieder zu den übergeordneten Bildern und Bildfenstern durchhangeln kannst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Thomas,
Container ist der aus dem Picture Tree. Einen Bildausschnitt habe ich versucht hochzuladen, hat wohl nicht geklappt.
Ich versuche es nochmal.

Container FS1, Filter1, FS1_PARA.

FS1---+
Filter1-----+
FS1_PARA -- Bild: FS1_PARA.PDL


Das Bild "FS1_PARA.PDL" soll in irgendeinem Bildfenster im Bild @1001 dargestellt werden.

Dies soll über einen Knopf aus dem angezeigten Bild erfolgen. Ähnlich den Faceplates. Das angezeigte Bild soll geöffnet bleiben.
 
Zuletzt bearbeitet:
Also falls ihr da am System nicht herumgestrickt habt, ist die Bildhierarchie bei der Nutzung von Basic Process Control wie folgt:
Code:
@1001.pdl
|
+->@DESK
  |
  +->Prozessbild.pdl
Das ParentPicture von Prozessbild.pdl ist @1001.pdl
Das ParentPictureWindow von Prozessbild.pdl ist @DESK

Die @TOPxx Bildfenster liegen in @1001.pdl

Im einfachsten Fall kannst du ein Popup aus Prozessbild.pdl wie folgt in das TOP-Bildfenster laden:

Code:
char *parentPicture;

parentPicture = GetParentPicture(lpszPictureName);
SetPropChar(parentPicture, "@TOP01", "PictureName", "DeinPopup.pdl");
SetPropBOOL(parentPicture, "@TOP01", "Visible", TRUE);

Wenn du mehrere Bildfenster erlauben möchtest, dann musst du dir eine kleine Schleife programmieren die nachsieht welche TOPxx Bildfenster schon offen sind und ggf. ein weiteres öffnet oder das zuerst geöffnete schließt / mit dem neuen Bild lädt / was auch immer. Das ist aber nicht sonderlich schwer, ich will aber nicht alles fertig liefern.
 
Zuletzt bearbeitet:
Hi Thomas, danke schon mal für deine Mühe.
Am System verändere ich nichts. Mein Gebot heißt Standard, keine Veränderungen, je einfacher ist es bei einem Versionswechsel.

ich glaube ich habe noch nicht richtig erklärt was ich noch wissen muss.
Wie erfahre ich den Bildnamen des Bildes das eine Ebene tiefer liegt?

Also Button im Bild "FS1.pdl"
Name des Unterbildes "FS1_PARA.pdl"

Container 1 --> "FS1.pdl"
|
|- Container 2 --> "FS1_PARA.pdl"

Mit Container meine ich die Baustruktur, die du aufmachst, wenn du im Overview einen Bereichsknokoppf betätigst und die Baumstrucktur erkennst.
Ich weis jedoch nicht wie das Bild im "Container 2", also eine Ebene tiefer heist.

Der Knopf ist im Bild "FS1.pdl"

Ach wenn doch das Hochladen des Screennshot funktionieren würde.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vom Aufbau der Bilder in WinCC her macht es keinen Unterschied, wo die Bilder in der TH bzw. in der Hierarchie im Picture Tree liegen.
D.h. bei jedem Bild egal wie tief es im Menü verschachtelt ist, ist das Parent Picture immer @1001.pdl, und das Bild liegt immer im dortigen Bildfenster @DESK.
 
Zurück
Oben