当前位置:首页 > 行业发展 > 正文

博途中WinCC VBS 脚本的基础用法

VBS脚本可以用在WinCCComfort/AdvancedRuntime。下面就是一些很实用技巧,希望对大家有所帮助!1、为什么一个由内部变量的“数值改变”事件触发的脚本不被执行?如果使用一个内部变量调用另外一个内部变量,因此,例如被调用的变量又去执行一个脚本(比如,根据变量变化),此时一个安全机...

VBS脚本可以用在WinCCComfort/AdvancedRuntime。下面就是一些很实用技巧,希望对大家有所帮助!1、为什么一个由内部变量的“数值改变”事件触发的脚本不被执行?如果使用一个内部变......

VBS脚本可以用在WinCCComfort/AdvancedRuntime。下面就是一些很实用技巧,希望对大家有所帮助!

1、为什么一个由内部变量的“数值改变”事件触发的脚本不被执行?

如果使用一个内部变量调用另外一个内部变量,因此,例如被调用的变量又去执行一个脚本(比如,根据变量变化),此时一个安全机制会阻止这个功能被执行。

此安全功能是为了阻止连续的执行。
例如
在内部变量“HMI_Tag_01”属性下,“更改数值”事件去置位内部变量“HMI_Tag_02”中的某一位。
同时内部变量“HMI_Tag_02”的“更改数值”事件下又调用一个脚本。
结果:这个脚本不会被执行。
解决办法
使用和控制器通讯的外部变量。请注意,通过使用外部变量可以规避上述安全机制。在项目运行时可能会产生问题。

2、如何在一个脚本中访问数组中的元素?

对数组元素的访问是通过数组的名称和数组中由括号分隔的数组索引来实现的:“SmartTags("ArrayName")(arrayindex)”
例如

访问数组"DB10_HMI_Data"的第二个元素:

注意
使用下面语法访问字符串类型数组中的元素:

例如

通过一个循环描述数组"DM10_HMI_Data"的第一个元素至第十一个元素

局部脚本的数组(该数组仅在此脚本中可用)可以使用同样的方式查询,对于多维数组,各个维度通过一个逗号分隔开。
例如

访问二维数组变量"HMI_Data"没有连接控制器。

注意
当使用控制器连接的数组元素时,推荐在脚本开始前将他们赋值给脚本内部变量,然后再使用内部变量进行其他工作。结束脚本前,将内部变量赋值给数组元素。

3、如何在控制器和脚本之间有效的赋值过程变量数组?

从控制器到一个脚本赋值,过程变量数组需要在一个循环中将数组元素一个一个赋值,参考示例。然而,也可以通过一个简单的指令把局部脚本的数组的值赋给过程变量数组。
例如

把控制器的数组"CPU_Array"的值赋给内部数组"local_array"和把内部数组"local_array"的值赋给控制器的数组"CPU_Array"

注意
使用数组可能导致较高的通信负载和数据不一致。

4、如何访问动态库("动态链接库",DLLs)?

WinCCComfort和Advanced不能访问DLLs。
WinCCProfessional在用户定义的C函数里可以调用DLL函数(DLL=DynamicLinkLibrary)。

5、如何用VBS脚本确定鼠标当前的位置?

为了读取当前鼠标的位置,需要访问操作系统的API(ApplicationProgrammingInterface)。
VBS不支持通过DLLs访问操作系统的API。

6、为什么不能在脚本里使用“MsgBox”命令?

“MsgBox”命令不能用于WinCCComfort和WinCCAdvanced版本是由于安全的原因。“MsgBox”的弹出显示可能会覆盖掉元素操作,比如:阻止设备的快速操作。此外,消息框可能会阻止脚本的进一步执行。
解决办法
可以使用系统函数ShowSystemAlarm。

7、如何在一个脚本中使用十六进制符号给变量赋值?

在脚本编辑器中把字符组合"h"作为个十六进制常数的标识。
例如

8、如何在脚本里显示或隐藏各个层级?
使用层是WinCC(TIAPortal)开发系统的一个功能。层只能在这里组态及显示隐藏。
这个功能在操作面板或PC的运行系统中不可用。所以不能用脚本显示或隐藏“层”。
解决办法
在“属性动画可见性”组态变量,根据变量值控制相关对象的显示或隐藏。

9、如何在脚本中合并字符串?

可以使用“”来合并字符串:
例如

将"Tag_Text_01","Tag_Text_02"和"Tag_Text_03"合并成新字符串"Tag_01"

DimTag_01,Tag_Text_01,Tag_Text_02,Tag_Text_03
Tag_01=Tag_Text_01Tag_Text_02Tag_Text_03
注意
VB函数CStr(Expression)将相应的表达式转换为“字符串”类型。这样在连接字符串转换之前可以避免运行时出现错误。

10、在脚本中如何在单独的字符串之间插入一个通配符(空格)?

为了在两个文本之间插入任意数量的空格,可以使用两个引号""。“空格”的数量取决于两个引号间的距离""。

连接下一个字符需要再次使用连接操作""。

例如

将字符串"Tag_Text_01","Tag_Text_02"和"Tag_Text_03"还有空格组合成一个新的字符串"Tag_01"

DimTag_01,Tag_Text_01,Tag_Text_02,Tag_Text_03
Tag_01=Tag_Text_01""Tag_Text_02""Tag_Text_03

11、如何组态带返回值和参数的脚本?

脚本类型必须是“Function”才可以有返回值。所以,请在TIAPortal中添加新VB函数的"PropertiesGeneralSettings"类型的下拉列表框中选择“Function”。

在“Parameter”表格中可以创建脚本变量用来将内部变量或控制器变量传入在脚本需要的时候。
组态函数返回值,在脚本中为脚本的名称分配表达式。

例如

组态函数类型,。按下面所示,在TIAPortal组态名称为“VBFunction_1”脚本函数的参数和返回值:

图.01

例如,

脚本在按钮的“Click”的事件中被使用。

图.02

在脚本中使用"HMI_Tag_1"的值赋给"Parameter_1","HMI_Tag_2"的值赋给"Parameter_2",必须有一行脚本定义了返回值。

例如

下面的例子的返回值是两个传入参数的乘积:

"VB_Function_1"是这个函数的名字,在执行这个脚本后,"HMI_Tag_3"获得这个函数的返回值是"HMI_Tag_1"*"HMI_Tag_2"。

注意

定义一个"byreference"的参数,这意味着作为"By_Ref"参数,仅对脚本中定义的和引用的变量产生影响,对HMI内部变量或者控制器变量不起作用。

12、什么能导致“最大嵌套深度到达”消息被触发?

如果太多的脚本在结束前调用自己或者调用其他脚本,会引起到达最大嵌套深度消息。

解决方法
检查脚本过程的处理,如有必要,减少脚本的嵌套。

13、如何确定当前画面的编号和画面名称?

通过预定义VB函数“”的返回值提供了当前画面的名字。
注意
不能使用脚本通过相关画面的“属性”直接读取画面名称/编号。
也可以使用“画面编号”区域指针。

14、如何在脚本中使用多路复用变量?

多路复用变量不能用在脚本中。

15、如何在脚本里使用HMIUDT变量?

可以使用“SmartTags”访问数据类型是HMIUDT的变量元素(用户定义的数据类型)。

例如

访问UDT变量"Recipe"的元素"x"

SmartTags("")

注意
这适用于在项目中已创建库类型HMIUDT的实例。不能直接访问库类型。

16、如何在脚本中保存变量值当他们在两个脚本之间调用?在两个脚本间相互传递数据需要使用全局变量。全局变量可以是HMI或者PLC变量。

脚本中定义的变量总是在脚本结束时删除。

17、如何通过脚本修改文本域的内容?

文本域的文本在运行时可以通过修改相应的对象属性而改变。

例如

在画面"MachineData"中,将文本"NewText"分配给文本域"Text_Field_01":

注意
文本的变化只是“暂时”的。当屏幕更改后这个被修改后的文本将被组态的文本覆盖。

18、如何在脚本中从密码列表或用户视图中读取用户密码?

由于安全原因这个功能在WinCC(TIAPortal)中不能实现。

19、如何通过脚本关闭WinCC运行系统和关闭PC和面板?

通过系统函数“StopRuntime”可以关闭WinCC运行系统和操作系统。

可以通过修改"StopRuntime"函数的参数方式选择仅关闭运行系统或者将运行系统和操作系统都关闭。

ParameterMeaning

0=hmiStopRuntime

sontheRuntime

1=hmiStopRuntimeAndOperationSystem

sboththeRuntimeandtheOS

例如
StopRuntimehmiStopRuntime
StopRuntime1

注意
Windows-based面板的操作系统不能通过这种方式关闭。

20、如何在脚本中访问一个画面或者模板的对象?

组态“Runtime”对象的属性“ActiveScreen”,可以找到画面上组态对象的名字和修改相关的属性。

例如

把激活屏幕中的对象"Circle_01"设置为不显示

注意
在画面中被组态对象必须有唯一的名字。对象的属性修改仅是暂时的,当屏幕更改后视图使用组态时的配置。

21、如何在运行时选择一个画面对象(例如输入输出域)?

获得一个对象的焦点通过"Activate"功能,文本输入会直接自动指向那个对象。

例如

获得屏幕"Screen_1"的输入/输出域"IOField_1"的焦点

最新文章