博途中WinCC VBS 脚本的基础用法
VBS 脚本可以用在 WinCC Comfort/Advanced Runtime。下面就是一些很实用技巧,希望对大家有所帮助!
1、为什么一个由内部变量的 “数值改变” 事件触发的脚本不被执行?
如果使用一个内部变量调用另外一个内部变量,以此,例如被调用的变量又去执行一个脚本(比如,根据变量变化),此时一个安全机制会阻止这个功能被执行。
此安全功能是为了阻止连续的执行。
例如
在内部变量 “HMI_Tag_01” 属性下,“更改数值”事件去置位内部变量 “HMI_Tag_02” 中的某一位。
同时内部变量 “HMI_Tag_02” 的“更改数值”事件下又调用一个脚本。
结果:这个脚本不会被执行。
解决办法
使用和控制器通讯的外部变量。请注意,通过使用外部变量可以规避上述安全机制。在项目运行时可能会产生问题。
2、如何在一个脚本中访问数组中的元素?
对数组元素的访问是通过数组的名称和数组中由括号分隔的数组索引来实现的:“SmartTags(“Array Name”)(array index) ”
例如
访问数组 “DB10_HMI_Data” 的第二个元素 :
Dim Tag_01 'Internal tag
Tag_01 = SmartTags(“DB10_HMI_Data”)(2)
注意
使用下面语法访问字符串类型数组中的元素:
Dim Tag_01 'Internal tag
Tag_01 = SmartTags(“DB10_HMI_Data[2]”)
例如
通过一个循环描述数组 “DM10_HMI_Data” 的第一个元素至第十一个元素
Dim Tag_01
For Tag_01=0 to 10
SmartTags(“DB10_HMI_Data”)(Tag_01) = 5
Next
局部脚本的数组(该数组仅在此脚本中可用)可以使用同样的方式查询,对于多维数组,各个维度通过一个逗号分隔开。
例如
访问二维数组变量 “HMI_Data” 没有连接控制器。
Dim HMI_Data(10,10)
Dim Tag_01
Tag_01 = HMI_Data(0, 5)
注意
当使用控制器连接的数组元素时,推荐在脚本开始前将他们赋值给脚本内部变量,然后再使用内部变量进行其他工作。结束脚本前,将内部变量赋值给数组元素。
3、如何在控制器和脚本之间有效的赋值过程变量数组?
从控制器到一个脚本赋值,过程变量数组需要在一个循环中将数组元素一个一个赋值,参考示例。然而,也可以通过一个简单的指令把局部脚本的数组的值赋给过程变量数组。
例如
把控制器的数组 “CPU_Array” 的值赋给内部数组 “local_array” 和 把内部数组 “local_array” 的值赋给控制器的数组 “CPU_Array”
Dim local_array(10)
Dim i
…
’ Copy from the CPU to the :
For i = 0 To 9
local_array(i) = SmartTags(“CPU_Array”)(i)
Next
…
’ Copy back to the CPU:
SmartTags(“CPU_Array”) = local_array
注意
使用数组可能导致较高的通信负载和数据不一致。
4、如何访问动态库 ( "动态链接库 ",DLLs)?
WinCC Comfort 和 Advanced 不能访问 DLLs。
WinCC Professional在用户定义的C函数里可以调用DLL函数 (DLL = Dynamic Link Library) 。
5、如何用VBS脚本确定鼠标当前的位置?
为了读取当前鼠标的位置,需要访问操作系统的 API (Application Programming Interface) 。
VBS 不支持通过 DLLs 访问操作系统的 API 。
6、为什么不能在脚本里使用 “ MsgBox ” 命令?
“MsgBox” 命令不能用于 WinCC Comfort 和 WinCC Advanced 版本是由于安全的原因。 “MsgBox”的弹出显示可能会覆盖掉元素操作,比如:阻止设备的快速操作。此外,消息框可能会阻止脚本的进一步执行。
解决办法
可以使用系统函数 ShowSystemAlarm。
7、如何在一个脚本中使用十六进制符号给变量赋值?
在脚本编辑器中把字符组合 “&h” 作为个十六进制常数的标识。
例如
Dim Tag_01
Tag_01 = &h45E ’ Corresponds to the decimal value “1118”
8、如何在脚本里显示或隐藏各个层级?
使用层是 WinCC (TIA Portal) 开发系统的一个功能。层只能在这里组态及显示隐藏。
这个功能在操作面板或 PC 的运行系统中不可用。所以不能用脚本显示或隐藏“层”。
解决办法
在 “ 属性>动画>可见性 ” 组态变量,根据变量值控制相关对象的显示或隐藏。
9、如何在脚本中合并字符串?
可以使用 “ & ” 来合并字符串:
例如
将 “Tag_Text_01”, “Tag_Text_02” 和 “Tag_Text_03” 合并成新字符串 “Tag_01”
Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03
Tag_01 = Tag_Text_01 & Tag_Text_02 & Tag_Text_03
注意
VB函数 CStr (Expression) 将相应的表达式转换为“字符串”类型。 这样在连接字符串转换之前可以避免运行时出现错误。
10、在脚本中如何在单独的字符串之间插入一个通配符(空格)?
为了在两个文本之间插入任意数量的空格,可以使用两个引号 " "。“空格”的数量取决于两个引号间的距离 " "。
连接下一个字符需要再次使用连接操作 “&”。
例如
将字符串 “Tag_Text_01”, “Tag_Text_02” 和 “Tag_Text_03” 还有空格组合成一个新的字符串 “Tag_01”
Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03
Tag_01 = Tag_Text_01 & " " & Tag_Text_02 & " " & Tag_Text_03
11、如何组态带返回值和参数的脚本?
脚本类型必须是 “ Function ” 才可以有返回值。所以,请在TIA Portal 中添加新 VB 函数的 “Properties > General > Settings” 类型的下拉列表框中选择 “Function” 。
在 “ Parameter ” 表格中您以创建脚本变量用来将内部变量或控制器变量传入在脚本需要的时候。
组态函数返回值,在脚本中为脚本的名称分配表达式。
例如
组态函数类型,。按下面所示,在TIA Portal 组态名称为 “ VBFunction_1 ” 脚本函数的参数和返回值:
图. 01
例如,
脚本在按钮的 “ Click ” 的事件中被使用。
图. 02
在脚本中使用 “HMI_Tag_1” 的值赋给"Parameter_1" ,“HMI_Tag_2” 的值赋给"Parameter_2" ,必须有一行脚本定义了返回值。
例如
下面的例子的返回值是两个传入参数的乘积:
VB_Function_1= Parameter_1 * Parameter_2
“VB_Function_1” 是这个函数的名字,在执行这个脚本后,“HMI_Tag_3” 获得这个函数的返回值是 “HMI_Tag_1” * “HMI_Tag_2” 。
注意
定义一个 “by reference” 的参数 ,这意味着作为 "By_Ref " 参数,仅对脚本中定义的和引用的变量产生影响,对 HMI 内部变量或者控制器变量不起作用。
12、什么能导致“最大嵌套深度到达”消息被触发?
如果太多的脚本在结束前调用自己或者调用其他脚本,会引起到达最大嵌套深度消息。
解决方法
检查脚本过程的处理,如有必要,减少脚本的嵌套。
13、如何确定当前画面的编号和画面名称?
通过预定义 VB 函数 “HmiRuntime.BaseScreenName ” 的返回值提供了当前画面的名字。
注意
不能使用脚本通过相关画面的“属性”直接读取画面名称/编号。
也可以使用“画面编号”区域指针。
14、如何在脚本中使用多路复用变量?
多路复用变量不能用在脚本中。
15、如何在脚本里使用 HMI UDT 变量?
可以使用“SmartTags” 访问数据类型是HMI UDT的变量元素(用户定义的数据类型)。
例如
访问 UDT 变量 " Recipe " 的元素 “x”
SmartTags(“Recipe.x”)
注意
这适用于在项目中已创建库类型 HMI UDT的实例。不能直接访问库类型。
16、如何在脚本中保存变量值当他们在两个脚本之间调用?在两个脚本间相互传递数据需要使用全局变量。全局变量可以是 HMI 或者 PLC 变量。
脚本中定义的变量总是在脚本结束时删除。
17、如何通过脚本修改文本域的内容?
文本域的文本在运行时可以通过修改相应的对象属性而改变。
例如
在画面 “MachineData” 中,将文本 “NewText” 分配给 文本域 “Text_Field_01” :
Dim obj
Set obj = HmiRuntime.Screens(“MachineData”).ScreenItems(“Text_Field_01”)
obj.Text = “NewText”
注意
文本的变化只是“暂时”的。当屏幕更改后这个被修改后的文本将被组态的文本覆盖。
18、如何在脚本中从密码列表或用户视图中读取用户密码?
由于安全原因这个功能在 WinCC (TIA Portal) 中不能实现。
19、如何通过脚本关闭 WinCC 运行系统和关闭PC和面板?
通过系统函数 “StopRuntime” 可以关闭 WinCC 运行系统和操作系统 。
可以通过修改 “StopRuntime” 函数的参数方式选择仅关闭运行系统或者将运行系统和操作系统都关闭。
Parameter Meaning
0 = hmiStopRuntime
Ends on the Runtime
1 = hmiStopRuntimeAndOperationSystem
Ends both the Runtime and the OS
例如
StopRuntime hmiStopRuntime
StopRuntime 1
注意
Windows-based 面板的操作系统不能通过这种方式关闭。
20、如何在脚本中访问一个画面或者模板的对象?
组态 “Runtime” 对象的属性 “ ActiveScreen ”,可以找到画面上组态对象的名字和修改相关的属性。
例如
把激活屏幕中的对象 “Circle_01” 设置为不显示
HmiRuntime.ActiveScreen.ScreenItems(“Circle_01”).Visible=False
注意
在画面中被组态对象必须有唯一的名字。对象的属性修改仅是暂时的,当屏幕更改后视图使用组态时的配置。
21、如何在运行时选择一个画面对象(例如输入输出域)?
获得一个对象的焦点通过 “Activate” 功能,文本输入会直接自动指向那个对象。
例如
获得屏幕 “Screen_1” 的 输入/输出域 “IOField_1” 的焦点
HMIRuntime.Screens(“Screen_1”).ScreenItems(“IOField_1”).Activate
博途中WinCC VBS 脚本的基础用法相关推荐
- 工控随笔_10_西门子_WinCC的VBS脚本_01_基础入门
很多人都认为VB语言或者VBS脚本语言是一种很low的语言,从心里看不起VB或者VBS, 但是其实VBS不仅可以做为系统管理员的利器,同样在工控领域VBS语言大有用武之地. 西门子的WinCC提供了两 ...
- 博图当前项目包含冗余服务器组态,博途中WINCC组态问题
SIMATIC WinCC和SIMATIC WinCC Flexible由于名称的原因造成了一些混淆,可能会被误认为是同一个软件,但是这两个软件无论从应用范围还是功能和使用上都有很大的区别,特此说明. ...
- 博途 WinCC VBS 记录笔记
如何在一个脚本中访问数组中的元素? 对数组元素的访问是通过数组的名称和数组中由括号分隔的数组索引来实现的:"SmartTags("Array Name")(array i ...
- SQL数据库脚本操作(WINCC VBS脚本)
1.首先看下数据库的连接:连接字符串 '连接字符串' 1."Provider=SQLOLEDB.1;Persist Security Info=False;User ID=;PassWord ...
- linux编写一个博客脚本,Linux 脚本编写基础 - 凌度 - 博客园.pdf
Linux 脚本编写基础 - 凌度 - 博客园 Linux 脚本编写基础 1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始 (必须放在文件的第一行): # ...
- Unity 3D开发-C#脚本语言的一些基础用法
Unity 中C#语言的一些基础用法 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lerp -- ...
- TIA博途WinCC PRO中通过脚本控制图层的显示和隐藏
TIA 博途WinCC PRO中通过脚本控制图层的显示和隐藏 WinCC Professional 项目中,可以使用脚本来控制画面上某个层的隐藏和显示,一旦设置该层隐藏,那么层中的对象也将隐藏,显示同 ...
- 【web安全学习篇1】VBS脚本基础编写总结
[web安全学习篇1]VBS脚本基础编写总结 VBS初始及变量 常量 注释与数学运算 布尔类型 if判断 select语句实现多条件循环 循环结构 循环嵌套 数组的定义与应用 定义二维数组及应用 初识 ...
- wincc里vbs脚本
各位大佬好,初学代码,有很多疑问请教 wincc里变量从别的地方录入后,它的数值是在不断变化的,在变量归档后可以在表格控件里显示, 如果我想对表格里的某列数据进行运算操作,实际就是把某个变量的历史值做 ...
最新文章
- python单词大全-python词汇大全
- 【Paper】2015_Leader–follower consensus of linear multi-agent systems with unknown external disturbanc
- 预测流失准确率超 82%,这个功能让“防流失+促留存大于 2”
- 嵌入式驱动自学者的亲身感受,有什么建议?
- jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势
- 用java写注册表单_利用HTML表单标签编写一个注册页面
- Hbase 协处理器之将数据保存到es (二级索引)
- 武汉大学linux课程,武汉大学超算中心
- ObjC学习4-多态、动态类型、动态绑定及异常处理
- Elastic Search Java Api 创建索引结构,添加索引
- 十大经典算法图解(详细版)
- File和IO流应用,剪切文件夹
- Validation参数校验注解
- Roguelike到底是啥?讲讲和Roguelike 相关知识(搬运)
- [Ember Zigbee]zigbee应用程序RAM
- 003java面试笔记——【java基础篇】从团八百失败面试总结的java面试题(未完待续)
- Spark程序编译报错error: object apache is not a member of package org
- Docker深入浅出系列 | 容器初体验
- windows 定时任务:schtasks,定时关闭网易云音乐
- 配置hadoop时,Linux主机名称不要带有下划线