WinCC Unified PopUp immer zentriert am Panel anzeigen

Tom390

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

aktuell rufe ich meine PopUps via Skript auf da ich diese an mehreren Stellen am Panel öffnen kann.
PopUps werden bei uns grundsätzlich mittig zentriert am Panel geöffnet, dazu haben wir bis dato eine Excel Tabelle wo hier Höhe/ Breite des PopUps eingeben und uns so je nach Panel Größe die Koordinaten für die zentrierte Darstellung ausgerechnet werden.

Mit dem Umstieg auf WinCC Unified bin ich nun am überlegen ob es nicht möglich wäre die Höhe und Breite des PopUps wia Skript auszulesen und anschließend direkt die Koordinaten zu berechnen. Das würde mir bei Änderung der PopUp-Größe das ständige Ändern der Koordinaten ersparen.

Leider habe ich mit JavaScript bisher keine Erfahrungen gemacht und hoffe jemand von euch kann mir weiterhelfen.

Besten Dank schon mal im Voraus!

Gruß Thomas
 
Hi,

grundsätzlich kann man dem Popup in Unified beim Aufruf die Position und das Fensterverhalten mit geben. Also bspw. einstellen an welchen Koordinaten es auftauchen soll, aber auch, ob diese ausgehend vom Grundbild oder nur dem aktuellen Bildfenster gezählt werden.
Mittlerweile ist es in der Doku auch ganz gut beschrieben:

Man kann auch nachträglich per Skript auf geöffnete Popups und deren Eigenschaften zugreifen, dazu gibt es hier ein sehr umfangreiches Anwendungsbeispiel:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann man auch bei einem geöffneten Popup die Position ändern? Sprich das Popup ist in der Mitte geöffnet und wenn man auf einen Button in diesem Popup drückt, wird das Popup an den linken oben Bildrand oder halt an entsprechende Koordinaten für x und y verschoben?
 
Kann man auch bei einem geöffneten Popup die Position ändern? Sprich das Popup ist in der Mitte geöffnet und wenn man auf einen Button in diesem Popup drückt, wird das Popup an den linken oben Bildrand oder halt an entsprechende Koordinaten für x und y verschoben?
Natürlich.
Du kannst sowohl von innen, als auch von außen auf die top/left Eigenschaft (also die Position) zugreifen und diese jederzeit ändern.
Gleiches gilt für height/witdh.
Genauso kannst du auch das Pop-up durch den Anwender verschiebbar machen und über das onChange Event der Eigenschaften auf ein Verschieben reagieren.

Über UI.GetClientInfo() kannst du auf die Auflösung des Anzeige den Monitors zugreifen und die Position des Bildfensters entsprechend in Relation zum Client ändern.
Uffbasse:
GetClientInfo() gibt dir die tatsächliche Bildschirmauflösung des Clients.
Das solltest du beachten wenn du per Webclient im PC-Browser auf ein kleines HMI-Panel zugreifst.
 
Wie würde ich dem Popup sagen, es soll sich an Stelle x,y verschieben?
Das Popup selber kann ich größer machen wie von dir erwähnt aber ich weis nicht wie ich die Position ändere.
Gibt es dazu ein Beispiel in Java Script? Ich verwende WinCC Unified V20 die PC Runtime.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie würde ich dem Popup sagen, es soll sich an Stelle x,y verschieben?
Du schreibst einfach den neuen Wert in die Eigenschaft des ScreenWindows welches das Pop-up enthält.
Den Rest macht die Runtime automatisch.

Das Bildfenster des Popups sprichst du wie jedes andere Bildelements an.
Du kannst es per UI.FindItem() machen, wobei sich, wenn du aus dem Pop-up heraus seine Eigenschaft ändern willst, eher UI.Screen.Parent.[Eigenschaftsname] anbieten würde.

Aus Faceplates bzw Faceplate Popups funktioniert es analog dazu über Faceplates.Parent.[Eigenschaftsname].
Hier musst du allerdings berücksichtigen, dass nochmal zwischen dem Faceplate selbst und dem Faceplate Container unterschieden wird.
Willst du den Container ändern, wäre also Faceplates.Parent.Parent korrekt.
 
Danke erstmal für die Hilfe.

Habe versucht das von dir geschriebene umzusetzen. Leider hat es nicht funktioniert.

In dem PopupFaceplate habe ich auf den Button folgendes drangeschrieben:

1.)
Faceplate.Parent.Left = 10;

Das hat mir in meinem Popup das was da angezeigt wird um 10 nach rechts geschoben. Aber nur den Inhalt. Das Popup selber ist da geblieben wo es ist.

2.)
Faceplate.Parent.Parent.Left = 10;

Hier hat mir der TraceViewer folgendes ausgegeben:
session: 0011, trace: PROPERTY_GET Invoke failed (property='Faceplate->Parent->Parent', id=1, error=0x80000005
Call stack: (read in less than 1 ms)
at [Schaltfläche_1_OnDown] (/screen_modules/FaceplatePopupWindow_726/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_35/Events.js:120:18)
| Faceplate.Parent.Parent.Left = 10;

session: 0011, trace: Engine ExecuteScript Result is empty and error is:
Function: [/screen_modules/FaceplatePopupWindow_726/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_35/Events.js].[Schaltfläche_1_OnDown]
Error: /screen_modules/FaceplatePopupWindow_726/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_35/Events.js:120: Uncaught TypeError: Cannot set properties of undefined (setting 'Left')
Faceplate.Parent.Parent.Left = 10;
^
TypeError: Cannot set properties of undefined (setting 'Left')
at Object.Schaltfläche_1_OnDown (/screen_modules/FaceplatePopupWindow_726/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_35/Events.js:120:30)

session: 0011, trace: Executing command failed (ResultCode: 0x802010cc Error: Description: (File: D:\agent\_work\6\s\source\CCScriptComp\ScriptCommands.h, Func: CCScriptFW::CGenericCommand<struct CCScriptFW::ExecuteCommandData>::Execute))

Es hat isch nichts verschoben, weder Inhalt noch das Popup selber.

3.)

Ui.Screen.Parent.Left = 10;

Hier hat mir der TraceViewer folgendes ausgegeben:
session: 0012, trace: Engine ExecuteScript Result is empty and error is:
Function: [/screen_modules/FaceplatePopupWindow_745/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_36/Events.js].[Schaltfläche_1_OnDown]
Error: /screen_modules/FaceplatePopupWindow_745/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_36/Events.js:119: Uncaught ReferenceError: Ui is not defined
Ui.Screen.Parent.Left = 10;
^
ReferenceError: Ui is not defined
at Object.Schaltfläche_1_OnDown (/screen_modules/FaceplatePopupWindow_745/HMI_RT_3::/faceplate_modules/FP_TrendValues_type_SIZE_V_0_0_36/Events.js:119:1)

session: 0012, trace: Executing command failed (ResultCode: 0x802010cc Error: Description: (File: D:\agent\_work\6\s\source\CCScriptComp\ScriptCommands.h, Func: CCScriptFW::CGenericCommand<struct CCScriptFW::ExecuteCommandData>::Execute))

Es hat sich am Faceplate nicht verändert und das Popup ist auch geblieben wo es ist.


Mache ich was falsch?
 
Das hat mir in meinem Popup das was da angezeigt wird um 10 nach rechts geschoben. Aber nur den Inhalt. Das Popup selber ist da geblieben wo es ist.
Das passt ja, da du nur das Faceplate innerhalb seines Faceplatecontainers verschoben hast.
Faceplate.Parent.Parent.Left = 10;
Hmmm, das müsste eigentlich funktionieren...
Dem Tace-Eintrag nach findet er die "Left" Eigenschaft nicht.
Prüf mal per Trace ob bei "Faceplate.Parent.Parent.Name" der Name des Faceplate Containers ausgegeben wird.
Ui.Screen.Parent.Left = 10;
Du hast versucht in einem Faceplate UI zu verwenden, das funktioniert nicht.
Innerhalb von Faceplates ist das Scripting eingeschränkt.
Alle verfügbaren Funktionen des jeweiligen Kontextes findest du im Dropdown-Menü der Autovervollständigung im Editor.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So wie ich den Trace verstehe findet er das zweite Parent nicht. Deswegen kann er dann auch auf nichts zugreifen.

Der Test mit "Faceplate.Parent.Parent.Name" gibt den identischen Trace Eintrag aus.
 
So wie ich den Trace verstehe findet er das zweite Parent nicht. Deswegen kann er dann auch auf nichts zugreifen.

Der Test mit "Faceplate.Parent.Parent.Name" gibt den identischen Trace Eintrag aus.
Das würde natürlich Sinn machen...
Wobei das "Stapeln" von Parents eigentlich über den kompletten Objektpfad hinweg funktionieren müsste Σ⁠(⁠ಠ⁠_⁠ಠ⁠)

Kannst du mal schauen ob es vllt "Faceplate.ParentScreen" in den Faceplates gibt?
Ich kann leider Grade nicht selber nachschauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, wenn ihr die Caption des Popups kennt, dann könnt ihr mal folgendes versuchen:

let ui = UI;
let count = ui.PopupScreenWindows.Count;
let title = "Titel1";

for (let i = 0; i < count; i++) {
let popup_title = ui.PopupScreenWindows(i).Caption.Text;
if (popup_title == title) {
return ui.PopupScreenWindows(i).Left = 123;
}
}

so etwas ähnliches habe ich mal als globales Skriptmodul genutzt um Informationen aus einer Instanz zu bekommen, ob man damit auch Eigenschaften schreiben kann müsst ihr mal probieren.
 
Das Caption habe ich mir mit übergeben, um dann den Namen von dem Popup mir ausgeben zu lassen und in dem Popup selber anzuzeigen.
Dacht wenn ich den Namen habe, kann ich das Popup ansprechen und die Position beeinflussen, wo ich aber nicht weitergekommen bin.

Habe jetzt das obige Beispiel mal probiert und kann jetzt die Position mit Left und Top beeinflussen. So wollte ich das haben aber dass das so umständlich ist hätte ich nicht gedacht.
Verstehe nicht wieso der Zugriff auf den Popup Namne und dann dessen Eigenschaften so kompliziert sein muss.

Hier mal mein Code auf einem Button in dem Faceplate:

//hier beeinflusse ich die Größe vom Faceplate, die Höhe muss noch bearbeitet werden
Tags("MyWidth").Write(1020);
Faceplate.Items("TrendControl").Width=1000;

//Test Tags um Werte zum Testen einzutragen
let top1 = Tags("LocalTop");
let tagTop1 = top1.Read();
let left1 = Tags("LocalLeft");
let tagLeft1 = left1.Read();

//Hier ändere ich die Position des Popups (ursprüngliche Skript siehe ein Post über mir)
let ui = UI;
let count = ui.PopupScreenWindows.Count;
let title = "Titel1";

for (let i = 0; i < count; i++) {
let popup_title = ui.PopupScreenWindows(i).Caption.Text;
if (popup_title == Faceplate.Properties.PopNameTrend) {
ui.PopupScreenWindows(i).Left = tagLeft1;
ui.PopupScreenWindows(i).Top = tagTop1;
}
}

//Blende meinen Button aus
Faceplate.FindItem("Size").Visible = false;
 
Zurück
Oben