×
Siemens Industry Online Support
Siemens AG
文档类型 常问问题 文档编号 57132412, 文档发布日期 2020年3月12日
(36)
评估

WinCC 脚本使用方法和技巧 (TIA Portal )

推荐文档: 西门子工程师推荐本文档!
  • 文档
  • 涉及产品
关于 WinCC Comfort 和 WinCC Advanced 脚本编程语言 VBS 的实用技巧

常规信息

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

如何在脚本中访问数组中的元素?

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

如何访问动态库(“动态链接库”,DLLs)?

如何用 VBS 确定鼠标当前的位置?

为什么不能在脚本里使用 "MsgBox"指令?

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

如何在脚本中显示或隐藏各个层级?

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

如何在脚本中连接的字符串之间插入通配符(空格)?

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

如何在运行时改变对象的属性(颜色、长度等)?

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

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

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

如何在脚本中使用 HMI UDT 变量?

如何在脚本中保存变量,以便实现在两个脚本调用之间保留它们?

如何通过脚本更改文本域的内容?

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

如何通过脚本关闭  WinCC 运行系统 ,然后关闭 PC 或面板?

如何在脚本中访问画面或模板中的对象?

如何在运行时将焦点放在特定的画面对象上(比如,输入域)?


常规信息

VBS 脚本可以用在 WinCC Comfort/Advanced Runtime。

基本信息和可用的参考


  • 在手册  “ SIMATIC STEP 7 Basic/Professional V15 and SIMATIC WinCC V15”  (条目 ID: 109755202) 下 "可视化过程> 使用系统函数和运行系统脚本 "。
    在 PC 运行站系统和操作员面板上是否可以执行一个脚本取决于很多方面。  更多设备需要的可用信息请参考手册中  “ 可视化过程 >使用系统函数和运行系统脚本> 参考”。
  • SIMATIC WinCC WinCC Engineering V15 - 编程参考 (条目 ID: 109755216)。



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

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

例如
在内部变量 “HMI_Tag_01” 属性下,“更改数值”事件去置位内部变量 “HMI_Tag_02” 中的某一位。
同时内部变量 “HMI_Tag_02” 的“更改数值”事件下又调用一个脚本。
结果:这个脚本不会被执行。

解决办法
使用和控制器通讯的外部变量。请注意,通过使用外部变量可以规避上述安全机制。在项目运行时可能会产生问题。


如何在脚本中访问数组中的元素?

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

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

Dim Tag_01    'Internal script tag
Tag_01 = SmartTags("DB10_HMI_Data")(2)

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

Dim Tag_01   'Internal script 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)


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

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

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

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

Dim local_array(10)
Dim i
...
' Copy from the CPU to the script:
For i = 0 To 9
    local_array(i) = SmartTags("CPU_Array")(i)
Next
...
' Copy back to the CPU:
SmartTags("CPU_Array") = local_array


注意
使用数组可能导致较高的通信负载和数据不一致。这里请参考 WinCC ( TIA ) 系统手册 Entry ID 109755202 下 "可视化过程 > 使用变量 > 使用数组> 关于数组的基础知识 "。
 

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


WinCC Comfort 和 Advanced  不能访问  DLLs。
WinCC Professional在用户定义的C函数里可以调用DLL函数 (DLL = Dynamic Link Library) 。
 在 “ SIMATIC STEP 7 Basic/Professional V15 and SIMATIC WinCC V15 ” 系统手册(条目 ID 109755202) 下 "可视化过程  > 使用系统函数和运行系统脚本 > 创建用户定义的C函数 > 在用户自定义 C 函数中调用 DLL 中的函数 (RT Professional)".

  

如何用 VBS 确定鼠标当前的位置?


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

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


“MsgBox” 命令不能用于 WinCC Comfort 和 WinCC Advanced 版本是由于安全的原因。 “MsgBox”的弹出显示可能会覆盖掉元素操作,比如:阻止设备的快速操作。此外,消息框可能会阻止脚本的进一步执行。

解决办法
可以使用系统函数 ShowSystemAlarm。

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


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

例如

Dim Tag_01
Tag_01 = &h45E     ' Corresponds to the decimal value "1118"
 
如何在脚本里显示或隐藏各个层级?

使用层是 WinCC (TIA Portal)  开发系统的一个功能。层只能在这里组态显示隐藏。
这个功能在操作面板或 PC 的运行系统中不可用。所以不能用脚本显示或隐藏“层”。

解决办法
在 “ 属性>动画>可见性 ” 组态变量,根据变量值控制相关对象的显示或隐藏。
 

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


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

例如  将  "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) 将相应的表达式转换为“字符串”类型。 这样在连接字符串转换之前可以避免运行时出现错误。
 

如何在脚本中连接的字符串之间插入通配符(空格)?


为了在两个文本之间插入任意数量的空格,可以使用两个引号 " "。“空格”的数量取决于两个引号间的距离 "   "
连接下一个字符需要再次使用连接操作 "&"。

例如  将字符串 "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


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


脚本类型必须是 “ 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 内部变量或者控制器变量不起作用。
 

如何在运行时改变对象的属性(颜色,长度等)?


手册中提供了对象的属性和使用的信息:

SIMATIC WinCC WinCC Engineering V15 - 编程参考(条目 ID 109755216) 下 "VB脚本编写 > VBS 对象模型 > 属性"。


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


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

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

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

通过预定义 VB 函数 “HmiRuntime.BaseScreenName ” 的返回值提供了当前画面的名字。

注意
不能使用脚本通过相关画面的“属性”直接读取画面名称/编号。
也可以使用“画面编号”区域指针。


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


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

如何在脚本中使用 HMI UDT 变量?


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

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

SmartTags("Recipe.x")

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


如何在脚本中保存变量,以便实现在两个脚本调用之间保留它们?


在两个脚本间相互传递数据需要使用全局变量。全局变量可以是 HMI 或者 PLC 变量。

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

如何通过脚本更改文本域的内容?


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

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

Dim obj

Set obj = HmiRuntime.Screens("MachineData").ScreenItems("Text_Field_01")
obj.Text = "NewText"

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

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


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


如何通过脚本关闭 WinCC 运行系统,然后关闭 PC 或面板?


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

0 = hmiStopRuntime

结束运行系统

1 = hmiStopRuntimeAndOperationSystem

关闭运行系统和操作系统

例如
StopRuntime hmiStopRuntime
StopRuntime 1

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

如何在脚本中访问画面或模板中的对象?


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

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

 HmiRuntime.ActiveScreen.ScreenItems("Circle_01").Visible=False

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


如何在运行时将焦点放在特定的画面对象上(比如输入域)?


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

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

HMIRuntime.Screens("Screen_1").ScreenItems("IOField_1").Activate


更多信息
下面的常见问题列表对 WinCC Advanced 中关于脚本的各种问题进行了解答。


  • " 在 WinCC (TIA Portal)中有哪些 VBS 信息和 VBS 编程帮助"
    条目号: 59885894
  • "在 WinCC Runtime Professional V11 和更高的版本中如何通过 C 或 VB 脚本改变 f(t) 趋势的趋势变量"
    条目号: 55741262
  • "如何在 WinCC Runtime Advanced 版本中使用脚本来访问 SQL 数据库"
    条目号: 61883659
  • "在 SIMATIC WinCC (TIA Portal) 精智面板中如何使用脚本向文件写数据或从文件读取数据"
    条目号: 59604194
  • "如何在 WinCC Comfort 和 WinCC Advanced 中使用脚本来组态动态对象"
    条目号: 53752382
安全性信息
为了保护技术基础设施、系统、机器和网络免受网络威胁,有必要实施并持续维护一个全面、最先进的IT安全方案。西门子的产品和解决方案构成了这一方案的一个要素。有关网络安全的更多信息,请访问
https://www.siemens.com/cybersecurity#Ouraspiration.
评估文档
无评估
请求和反馈
您想要做什么?
注意:反馈总是与当前的条目/产品相关。您的消息将被转发给我们在线支持团队的技术编辑们。如果我们需要就您的反馈提供答复,您将在几天内收到答复。如果没有其它问题,您将不会收到答复。