1、项目级变量
2、全局DataSet
3、函数级变量
4、画面级变量
本文以实现画面中按钮按下计数为例,来说明一下VBS脚本各级变量的定义与使用。这里所说的各级变量,指的就是变量的作用域。
项目全局变量是项目级变量,顾名思义就是在整个项目范围内(如不同的全局动作脚本,画面脚本,项目、标准模块/过程)可访问的VBS变量。
注意:项目全局变量分别作用于:不同的全局动作;同一画面的不同动作及事件。就是说无法使用项目全局变量在全局动作和画面动作及事件脚本之间交换数据,不能在不同画面动作及事件脚本之间交换数据。也不能在同一画面的动作脚本与事件脚本之间交换数据。
那你肯定会说,这不是挂羊头卖狗肉,还叫啥全局。是的,如何定义真正的全局变量稍后讲,先看下项目全局变量怎么定义:
项目全局变量需要在项目模块中定义。
打开全局VBS脚本编辑器,先添加一个项目模块如ModuleA,然后在模块中添加一个sub过程如 PRJSubA,并在上面声明一个变量 ButtonPressedCounter
要在画面动作脚本、事件脚本、全局动作中使用此全局变量,分别需先调用模块中的过程PRJSubA,以便将模块ModuleA加载到其中。
如在画面按钮事件脚本中调用:
VBScript本身并没有模块,一个VBScript程序就是一个.vbs脚本文件。WINCC VBS脚本中模块其实引入的是VB/VBA模块的概念。如下图,WINCC VBA定义的一个“模块1”,其中定义了一些变量、过程。一个模块对应一个命名空间,其中的变量、过程就是模块级别的,在模块的所有过程中都可见。加载模块之后生成。
访问模块中变量、过程,需要带上模块名,如:模块1.a。
而WINCC VBS脚本中直接使用变量、过程名访问,所以每个模块中定义的全局变量、过程的名称不可相同。
对于WINCC VBS脚本中这个定义在其模块中的似是而非的全局变量,把它作为一个存储相互关联的过程模块的过程的共享变量比较合适。
那如果需要同步来自全局和画面之间的脚本,画面动作和事件脚本,实现真正的项目全局变量,怎么实现?可以使用全局 DataSet 对象。
在 WinCC 中存在两种 DataSet:全局“DataSet”和基于画面的智能对象“DataSet”。
全局 DataSet 可以看作是真正 VBS 全局变量,在不同 VBS 脚本之间进行数据传送。
全局 DataSet 的基本用法如下:
通过 Add 方法添加全局 DataSet 变量:
HMIRuntime.DataSet.Add "变量名",变量初始值
使用 Value 属性读取或设置方法添加全局 DataSet 变量的值:
HMIRuntime.DataSet("变量名").Value = 变量值
通过 Remove 删除全局 DataSet 变量:
HMIRuntime.DataSet.Remove("变量名")
注意:如果添加已存在变量,访问不存在变量,删除不存在变量,将会出错。
添加两个画面如NewPdl0.Pdl、NewPdl1.Pdl,分别添加一个按钮如ButtonA
可以在画面NewPdl0的打开事件中添加如下脚本:向全局DataSet列表添加ButtonPressedCounter 变量
Sub OnOpen() Dim PRJItemDim PRJDataSetSet PRJDataSet=HMIRuntime.DataSet'检查ButtonPressedCounter是否已经存在For Each PRJItem In PRJDataSet If PRJItem.name = "ButtonPressedCounter" Then Exit Sub End IfNextHMIRuntime.DataSet.Add "ButtonPressedCounter",0End Sub
在两个按钮的点击事件函数中添加如下脚本:
Sub OnClick(ByVal Item) HMIRuntime.DataSet("ButtonPressedCounter").Value=HMIRuntime.DataSet("ButtonPressedCounter").Value+1HMIRuntime.Trace HMIRuntime.DataSet("ButtonPressedCounter").Value & vbCrlfEnd Sub
打开NewPdl0画面,每按下ButtonA,ButtonPressedCounter累计1。打开NewPdl1,每按下ButtonA,ButtonPressedCounter在原来的值继续累计1。
如果只是记录NewPdl0画面中按钮ButtonA的按下计数,不用项目全局变量,那如何实现。
可以在画面中一个事件脚本的声明区声明变量,这样变量可用于本画面的所有事件。 脚本如下:
注意:声明区声明的变量名称不要与已经加载的模块中全局变量名称相同,这种重复编辑时是无法检查的。 打开NewPdl0画面,每按下ButtonA,ButtonPressedCounter累计1。当关闭NewPdl0其创建的所有资源将释放,包括其中脚本。所以当重新打开NewPdl0,ButtonPressedCounter会初始化。
以上内容详细说明了VBS各级变量的定义及使用,通过深入研究这些内容,希望小伙伴们可以更好地理解如何应用这些技术来解决实际问题。启发您在自己的项目和探索中取得更大的成功。
文章基于WINCC V8.0
---
如果你有与本文相关问题可以后台发消息,可发“加群”进WINCC脚本群交流。欢迎点赞、分享、关注。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!