以下內容以VB腳本為主,僅在VB腳本無法實現的功能中使用C腳本。
畫面導航
畫面導航的作用是打開起始畫面、前一張畫面和后一張畫面等,只能用C腳本實現。
- 打開起始畫面: OpenHomePicture();
- 打開前一張畫面: OpenPrevPicture();
- 打開后一張畫面: OpenNextPicture();
- 存儲畫面: StorePicture();
- 打開存儲畫面: OpenStorePicture();
切換畫面窗口中的畫面
WinCC通過“畫面窗口”控件將其他畫面嵌套顯示在另一個畫面中 ,可以根據需要讓“畫面窗口”顯示不同的畫面。
“畫面窗口”控件通過寫入不同的畫面名稱調用不同的畫面。“畫面窗口”控件有兩個屬性跟畫面名稱相關,分別是ScreenName和PictureName,這兩個屬性有什么區別呢?
'畫面名稱不能帶后綴名 ScreenItems("Window1").ScreenName = "Newpicture" ScreenItems("Window1").PictureName = "Newpicture"
通過ScreenName屬性切換畫面后,使用 OpenPrevPicture() 切換到上一個畫面將會回到切換畫面之前,而用PictureName屬性切換畫面,WinCC的畫面導航中不會記錄這次畫面的切換,使用 OpenPrevPicture() 切換到上一個畫面實際是回到了上上個畫面。
通過一個實驗更清楚的了解這個結論,用一個畫面窗口引用三個畫面,這三個畫面分別標為A、B、C,用ScreenName和PictureName各做兩個切換按鈕。
(1)初始畫面為A;
(2)使用ScreenName切換到畫面B;
(3)使用ScreenName切換到畫面C;
(4)使用OpenPrePicture()返回前一個畫面,此時返回到畫面B,ScreenName屬性切換的畫面是有導航路徑記錄的;
(5)使用PictureName切換到畫面C;
(6)使用OpenPrePicture()返回前一個畫面,此時返回到畫面A,PictureName屬性切換的畫面沒有導航路徑記錄,事實上返回到了第4步的上一張畫面,第4步是畫面B,所以上一張畫面是畫面A。
如何切換基畫面
WinCC圖形系統運行時第一張打開的畫面就是基畫面,沒有畫面窗口控件可以操作基畫面,如何切換基畫面?
WinCC的VB腳本中的HMIRuntime對象的BaseScreenName屬性保存了基畫面的畫面名稱,通過修改 HMIRuntime.BaseScreenName 屬性可以切換基畫面。當調用畫面時會自動加上畫面后綴名,因此畫面名稱中不要添加 .pdl 后綴名,否則會報錯。
'畫面名稱不能帶有后綴名 HMIRuntime.BaseScreenName = "NewPicture"
如何引用父窗口的對象
在畫面窗口中引用了一個畫面,點擊嵌套畫面中的按鈕后切換自身的畫面,如何做?
WinCC的VB腳本中有Parent對象,Parent對象即為當前腳本環境的父對象,當在嵌套的畫面的按鈕中調用Parent對象,Parent對象就是引用該畫面的畫面窗口對象。
於是用以下代碼就可以調用畫面窗口的ScreenName屬性。
Parent.ScreenName = "NewPicture"
同樣還可以將畫面窗口設成不可見,這樣能夠用畫面窗口實現顯示一個對話框,然后關閉對話框的效果。
Parent.Visible = False
如果要引用上層畫面中的對象,這時就需要連續使用兩個Parent對象。第一個Parent表示畫面窗口,第二個Parent表示畫面窗口所在的畫面,然后再用 ScreenItems() 方法引用畫面上的控件。
Parent.Parent.ScreenItems("矩形1").BackColor = RGB(0,255,0)
如下,點擊嵌套畫面中的按鈕,修改基畫面上矩形控件的背景顏色。
如何引用畫面窗口中的畫面的控件
如何在基畫面中執行腳本,修改嵌套畫面中的控件屬性呢?
在WinCC的VB腳本中,畫面窗口控件有Screen屬性,該屬性即為畫面窗口引用的畫面對象,通過Screen屬性可以引用嵌套畫面中的控件。
Dim SubScreen Set SubScreen = screenItems("Window1").Screen SubScreen.ScreenItems("矩形1").BackColor = RGB(0,255,0)
如下,點擊基畫面中的按鈕,修改嵌套畫面中矩形控件的背景顏色。
如何引用多層嵌套畫面窗口中的控件
方法之一是用 screenItems().Screen.screenItems().Screen 去調用嵌套畫面,這樣太麻煩,更簡單的方法是用 HMIRuntime.Screens("win1.win2") ,函數參數是畫面窗口的控件名,嵌套的畫面窗口用點 . 分隔。
HMIRuntime.Screens() 函數使用的是畫面窗口的絕對路徑,即從基畫面開始排序畫面窗口控件名。假設嵌套了兩層畫面,畫面窗口名分別為win1、win2,不管是在基畫面中執行代碼,還是在win1畫面中執行代碼,代碼都是 HMIRuntime.Screens("win1.win2") 。舉個更具體的例子,如果在同一個畫面中使用了兩個畫面窗口,假設它們的嵌套關系為 win1.win2 和 win3.win4 ,win1和win3兩個畫面窗口同在基畫面中,在win4的畫面中執行代碼,修改win2畫面中控件的屬性,那么它的代碼還是 HMIRuntime.Screens("win1.win2") ,如果用 Parent 和 ScreenItems().Screen 方法,就要寫很長的相對路徑了。
如下,嵌套了三層畫面窗口,畫面窗口的控件名分別是Window1、Window2、Window3,矩形控件在Window3引用的畫面中,點擊基畫面的按鈕,修改嵌套畫面中控件的顏色。
Dim SubScreen Set SubScreen = HMIRuntime.Screens("Window1.Window2.Window3") SubScreen.ScreenItems("矩形1").BackColor = RGB(0,255,0)
為畫面添加變量前綴或服務器前綴
有這樣一種情況,有兩組或多組變量,假設其中一組變量名為A_tag1、A_tag2、A_tag3,另一組變量名為B_tag1、B_tag2、B_tag3,綁定這兩組變量的畫面完全一樣,只是綁定的變量名不同。能否只做一張畫面,根據需要顯示不同的變量?
畫面窗口提供了兩個屬性:變量前綴和服務器前綴。寫入了變量前綴后,在運行時畫面窗口引用的畫面中所有的變量都會添加上變量前綴;寫入服務器前綴后,引用的畫面中所有變量和嵌套的畫面都會添加上服務器前綴,即從服務器調用變量和畫面。
上面的例子中,只需做一張畫面,其中變量名為tag1、tag2、tag3,顯示第一組變量就用帶有變量前綴 A_ 的的畫面窗口,顯示第二組變量就用 B_ 的畫面窗口,運行時會自動給變量添加上前綴再調用。
調用不帶前綴的變量
畫面窗口添加變量前綴屬性后,所有變量都有了前綴,有時個別變量不需前綴,例如在畫面中調用系統變量 @CurrentUser 顯示當前登錄的用戶就不能加前綴,如何取消這些變量的前綴?
- 取消變量前綴:@NOTP
- 取消服務器前綴:@NOSP
- 取消變量前綴和服務器前綴:@NOP
在變量前面添加以上標簽,即使畫面窗口有前綴,該變量也是調用不帶前綴的版本。以讀取不帶前綴的 @CurrentUser 變量為例。
HMIRuntime.Tags("@NOP::@CurrentUser").Read