WinCC画面嵌套技巧
画面导航
画面导航的作用是打开起始画面、前一张画面和后一张画面等,只能用C脚本实现。
打开起始画面:OpenHomePicture();
打开前一张画面:OpenPrevPicture();
打开后一张画面:OpenNextPicture();
存储画面:StorePicture();
打开存储画面:OpenStorePicture();
切换画面窗口中的画面
WinCC通过”画面窗口”控件将其他画面嵌套显示在另一个画面中
,可以根据需要让”画面窗口”显示不同的画面。
画面窗口”控件通过写入不同的画面名称调用不同的画面。”画面窗口”控件有两个属性跟画面名称相关,分别是ScreenName和PictureName,这两个属性有什么区别呢?
1 2 3 |
'画面名称不能带后缀名 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 后缀名,否则会报错。
1 2 |
'画面名称不能带有后缀名 HMIRuntime.BaseScreenName = "NewPicture" |
如何引用父窗口的对象
在画面窗口中引用了一个画面,点击嵌套画面中的按钮后切换自身的画面,如何做?
WinCC的VB脚本中有Parent对象,Parent对象即为当前脚本环境的父对象,当在嵌套的画面的按钮中调用Parent对象,Parent对象就是引用该画面的画面窗口对象。
于是用以下代码就可以调用画面窗口的ScreenName属性。
1 |
Parent.ScreenName = "NewPicture" |
同样还可以将画面窗口设成不可见,这样能够用画面窗口实现显示一个对话框,然后关闭对话框的效果。
1 |
Parent.Visible = False |
如果要引用上层画面中的对象,这时就需要连续使用两个Parent对象。第一个Parent表示画面窗口,第二个Parent表示画面窗口所在的画面,然后再用 ScreenItems() 方法引用画面上的控件。
1 |
Parent.Parent.ScreenItems("矩形1").BackColor = RGB(,,) |
如下,点击嵌套画面中的按钮,修改基画面上矩形控件的背景颜色。
如何引用画面窗口中的画面的控件
如何在基画面中执行脚本,修改嵌套画面中的控件属性呢?
在WinCC的VB脚本中,画面窗口控件有Screen属性,该属性即为画面窗口引用的画面对象,通过Screen属性可以引用嵌套画面中的控件。
1 2 3 |
Dim SubScreen Set SubScreen = screenItems("Window1").Screen SubScreen.ScreenItems("矩形1").BackColor = RGB(,,) |
如下,点击基画面中的按钮,修改嵌套画面中矩形控件的背景颜色。
如何引用多层嵌套画面窗口中的控件
方法之一是用 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引用的画面中,点击基画面的按钮,修改嵌套画面中控件的颜色。
1 2 3 |
Dim SubScreen Set SubScreen = HMIRuntime.Screens("Window1.Window2.Window3") SubScreen.ScreenItems("矩形1").BackColor = RGB(,,) |
为画面添加变量前缀或服务器前缀
有这样一种情况,有两组或多组变量,假设其中一组变量名为A_tag1、A_tag2、A_tag3,另一组变量名为B_tag1、B_tag2、B_tag3,绑定这两组变量的画面完全一样,只是绑定的变量名不同。能否只做一张画面,根据需要显示不同的变量?
画面窗口提供了两个属性:变量前缀和服务器前缀。写入了变量前缀后,在运行时画面窗口引用的画面中所有的变量都会添加上变量前缀;写入服务器前缀后,引用的画面中所有变量和嵌套的画面都会添加上服务器前缀,即从服务器调用变量和画面。
上面的例子中,只需做一张画面,其中变量名为tag1、tag2、tag3,显示第一组变量就用带有变量前缀 A_ 的的画面窗口,显示第二组变量就用 B_ 的画面窗口,运行时会自动给变量添加上前缀再调用。
调用不带前缀的变量
画面窗口添加变量前缀属性后,所有变量都有了前缀,有时个别变量不需前缀,例如在画面中调用系统变量 @CurrentUser 显示当前登录的用户就不能加前缀,如何取消这些变量的前缀?
取消变量前缀:@NOTP
取消服务器前缀:@NOSP
取消变量前缀和服务器前缀:@NOP
在变量前面添加以上标签,即使画面窗口有前缀,该变量也是调用不带前缀的版本。以读取不带前缀的 @CurrentUser 变量为例。
1 |
HMIRuntime.Tags("@NOP::@CurrentUser").Read |
PictureWindow控件
假设有一家集团公司,其第一分厂下属第一车间有4个非常重要的水泵,我们希望在集团公司这个层级页面上就能够直接调出这4个水泵的控制面板,大概是这个样子:
项目各画面名字如下:
我们假设总厂总貌的名字叫做NewPdl0,总貌上有一个PictureWindow控件名字叫做_PW0。
第一分厂画面的名字叫做factory1,第二分厂的画面名字叫做factory2;
第一分厂画面上有一个picturewindow控件,控件名字叫做_PW1;第二分厂画面上有一个picturewindow控件,控件名字叫做_PW2;
第一分厂的第一车间的画面名字叫做workshop1_1,这个画面上也有一个画面窗口控件,控件名字叫做_PW1_1;
第一分厂的第一车间的用于交互控制的4个泵的画面名字叫做pump1_1_4。
画面pump1_1_4上放置两个圆,动态表示每个泵的Remote和Fault信号,4个按钮用于操控Auto、Start、Stop信号。
在画面NewPdl0上有一排按钮,其中4个用于弹出水泵控制面板。泵1按钮的鼠标点击事件中添加以下VBS脚本:
1 2 3 4 5 6 7 8 9 10 |
Sub OnClick(ByVal Item) Dim PW1,PW3 Set PW1=ScreenItems("factory1") PW1.PICTURENAME="factory1" '确保画面窗口PW1装入的是第一分厂画面 Set PW3=HMIRuntime.Screens("NewPdl0._PW0:factory1._PW1").ScreenItems("_PW1_1") PW3.Visible =False PW3.TagPrefix="S7$程序(1)/Pump1." PW3.captiontext="泵1控制" PW3.Visible =True End Sub |
上面的脚本中Set PW3=HMIRuntime.Screens(“NewPdl0._PW0:factory1._PW1”).ScreenItems(“_PW1_1”)
很关键,它描述了这种嵌套关系的画面和控件,“NewPdl0._PW0”表示画面NewPdl0画面上的画面窗口控件_PW1,二者之间用圆点.分隔;画面窗口控件_PW1装载的是画面factory1,它们之间使用英文冒号:分隔,始终按照这个格式书写:
1 |
HMIRuntime.Screens("画面名.画面窗口控件名:画面名.画面窗口控件名:画面名…….画面名").ScreenItems("画面窗口控件名") |
无论有多少层级,都是按照这个思路处理,Wincc允许多少层级我不知道,但一般3层结构应该足够了。
坐等大佬D盘更新,祝大佬全家福寿安康
有公众号之类的吗,之前这个网站打不开了
[…] 关于使用Change…
[…] 关于使用Functi…
谢谢提醒,已删 :)