画面模板是使用WinCC组态画面时的常用工具。现实工作中经常遇到多个设备需要显示相同参数(组)的情况。使用画面模板,可以避免反复组态相同画面布局的工作,减少项目后期某些细节部位的修改而带来的工作量;画面模板与结构变量的配合使用,可以在一个画面中根据条件显示具有相同类型参数的多个对象(如电机),极大地丰富了画面信息。本文描述的是在WinCC V6.0sp3中使用结构变量组态画面模板的步骤和注意事项,WinCC V6.2版本组态方法与其相同。对于WinCC V7.0版本,组态步骤相同,但组态细节会有轻微变化.
本文详细描述了四种不同的实现方式:
-
用户自定义对象
-
画面原型
-
使用变量前缀的画面窗口
-
使用动态向导的画面窗口
1. 用户自定义对象
图1 用户自定义对象的样例
用户自定义对象是由多个WinCC对象组合而成的, 如图1所示。可以挑选其中的某些用户需要的属性作为用户自定义属性,因此生成的新对象可作为模板连接不同的变量,这种模板不适用于结构变量。观看制作演示请双击下面的压缩文件,运行其中的可执行文件。
( 649 KB )
2. 画面原型
图2 画面原型的样例
在用户自定义对象的基础上,如果要支持结构变量的使用,可以用动态向导的方法来简化工作。首先做好自定义对象的模板,如图2所示。利用标准动态下的”Add dynamics to the prototype”在输入输出值属性里连接结构变量,将这个模板拷贝成多份,分别创建标准动态下的“Link a prototype to a structure or rename an existing link”,在创建的过程中,您可以选择和原型结构类型相同的其它前缀,用这个模板迅速生成连接不同结构变量的自定义对象。观看制作演示请双击下面的压缩文件,运行其中的可执行文件。
( 708 KB )
注:以上两种方式主要用于一些对象集合需要多次使用,连接多套参数的情况,但是不能使用脚本,动态对话框等,如果要实现复杂的功能,则需要画面窗口。画面窗口也分为两种实现方式,使用变量前缀型和动态向导型。
3. 使用变量前缀的画面窗口
图3 画面窗口的样例
这是本篇讲述的重点,因为画面窗口作为模板来使用,它所提供的功能最丰富,也最灵活。标准做法是首先组态好在画面窗口对象要调用的模板画面,其中的对象连接变量为结构变量的元素名(如Structure.a,则连接名为a),连接包括“变量连接“,”直接连接”,“动态对话框”和C脚本(小技巧:作动态对话框或C-脚本中的变量连接时,如果只连接元素名,系统会因为找不到这个变量而报警告,可以预先生成内部变量a用于连接)。然后在主画面中组态画面窗口对象,画面名称选择模板画面,变量前缀可以静态定义或者动态定义为相应的结构变量前缀。关键步骤的如下:
3.1 生成结构变量
具体做法请参照以下样例:
( 379 KB )
3.2 使用项目中已经生成的结构变量来控制画面模板
具体做法请参照以下样例:
( 911 KB )
3.3 动态修改画面窗口的变量前缀
若要动态修改画面窗口的变量前缀,有两种方法可以实现,基本思路都是先给变量 前缀重新赋值,然后给画面名称重新赋值。
3.3.1 方法一:变量前缀更改的事件触发画面名称的重新赋值
( 441 KB )
3.3.2方法二:利用SetPropChar修改画面窗口的TagPrefix属性
(1) 重新设置相关图片窗口的“变量预设定”,如:SetPropChar ("TestPicture", "TestPictureWindow", "TagPrefix", "TestTagPrefix.").(2) 然后重设图片窗口的“图片名”属性。重要的是图片窗口的“图片名”属性的赋址。如:SetPropChar ("TestPicture", "TestPictureWindow", "PictureName", "TestPictureWindowPictureName") 或SetPictureName ("TestPicture", "TestPictureWindow", "TestPictureWindowName").参数说明:"TestPicture" 图片名,在该图片名中图片窗口对象被调用"TestPictureWindow" 图片窗口对象名"TestTagPrefix." 新变量前缀名,该前缀将在图片窗口中与元素合并 为完整的变量 名称。"TestPictureWindowName" 显示在图片窗口中的图片的名字"TagPrefix" 图片窗口的“变量预设定”属性"PictureName" 图片窗口的“图片名”属性
具体做法请参照以下样例:
( 464 KB )
注:使用变量前缀的缺陷是它会在画面窗口中所有变量出现的地方都加载变量前缀,后面我们将会有一节讲述如何在带有变量前缀的画面窗口对象中避免变量前缀。
4. 使用动态向导的画面模板
图4 利用动态向导做得画面模板的样例
模板的做法和第三种方法一致,先在模板画面中组态好要用到的对象,但是不用连接变量,画面做好后保存,如module.pdl。
然后点击该模板画面背景,创建画面模板的动态向导,双击动态向导Picture modules下的Picture Module template-V1.14,出现对话框要求连接画面中的对象与结构变量元素的连接,动态向导创建完成后会生成一个新的模板画面@TYPE_module.pdl,这个画面与于原来画面的不同在于它的变量前缀不用写在画面窗口的变量前缀属性里,新模板上 方有一个蓝色的输入输出域,它可以连接WinCC中任意一个字符串型的变量,修改这个字符串的值为某一个变量前缀,则画面窗口中元素名前会自动加载这个前缀名,从而显示结构变量。或者可以利用动态向导Picture-Module instances – V.1.14给画面模板加载前缀。
使用演示:
( 628 KB )
动态向导在蓝色输入输出域中加入的脚本,实现了对象属性和变量的连接。
#include "PicBlck.h"TypeConnectionTable ={"Button2","Visible",1,0,".PA_0","IOField1","OutputValue",1,0,".PA_0","StatusDisplay1","Index",1,0,".PA_0",};LinkInstance;
但是,这种方法的元素名连接只限于与对象属性之间的,不能用于动态对话框,直接连接或者脚本,所以如果画面窗口中有不希望加载变量前缀的对象或者事件,可以用这种方法实现。如果用户不想在画面窗口中显示那个蓝色的变量前缀名,可以使用画面窗口的画面Y偏移量来调整,隐藏这个对象。
注:一般情况下,如果不做特殊设置,画面窗口中从变量管理器添加过来的变量都会自动添加变量前缀,如果用户希望使用全局变量,则必须对对象或变量进行特殊处理才能实现,共有三种方法可用,分述如下:
(1) 利用Get/SetOutputValue函数获得父窗口输入输出域的输出值(如果不想在主窗口里 显示,可以利用偏移量隐藏这个对象)。
在画面窗口中的I/O域输出中加C脚本:
{
char* pszPicName=NULL;
char szPicName[_MAX_PATH+1];
pszPicName=GetParentPicture(lpszPictureName);//获得父窗口的画面名称
if (pszPicName!=NULL)
{
strncpy(szPicName,pszPicName,_MAX_PATH);
}
return GetOutputValueDouble(szPicName,"IOField1");//将父画面中的IO域的值取出 并返回
}
使用演示:
(2) 使用全局C变量
图5 全局C变量的样例
凡是在画面窗口的脚本中使用变量,通常也会自动添加变量前缀,若要使用全局变量,使用下述方法处理既可:
在项目函数外部定义变量,需要使用的时候在脚本里先声明再使用如: int global_c_var=0;void global_var(){}画面窗口的脚本:{....extern global_C_var;.......}
(3) 利用间接寻址
画面窗口里要显示全局变量的I/O域连接字符串型变量,间接寻址。在主窗口里用脚本将全局变量的名字赋值给TagPrefix1.VarName
加一些操作效果,使选中按钮高亮显示并且不可再操作