西南地区西门子代理商-伺服电机驱动变频器代理
(1)为什么一个由内部变量的 “数值改变” 事件触发的脚本不被执行?如果使用一个内部变量调用另外一个内部变量,以此,例如被调用的变量又去执行一个脚本(比如,根据变量变化),此时一个安全机制会阻止这个功能被执行。此安全功能是为了阻止连续的执行。例如在内部变量 “HMI_Tag_01” 属性下,“更改数值”事件去置位内部变量 “HMI_Tag_02” 中的某一位。同时内部变量 “HMI_Tag_02” 的“更改数值”事件下又调用一个脚本。结果:这个脚本不会被执行。解决办法使用和控制器通讯的外部变量。请注意,通过使用外部变量可以规避上述安全机制。在项目运行时可能会产生问题。(2)如何在一个脚本中访问数组中的元素?对数组元素的访问是通过数组的名称和数组中由括号分隔的数组索引来实现的:“SmartTags("Array Name")(array index) ”例如 访问数组 "DB10_HMI_Data" 的第二个元素 :Dim Tag_01 'Internal script tagTag_01 = SmartTags("DB10_HMI_Data")(2)注意使用下面语法访问字符串类型数组中的元素:Dim Tag_01 'Internal script tagTag_01 = SmartTags("DB10_HMI_Data[2]")例如 通过一个循环描述数组 "DM10_HMI_Data" 的第一个元素至第十一个元素Dim Tag_01For Tag_01=0 to 10 SmartTags("DB10_HMI_Data")(Tag_01) = 5Next局部脚本的数组(该数组仅在此脚本中可用)可以使用同样的方式查询,对于多维数组,各个维度通过一个逗号分隔开。例如 访问二维数组变量 "HMI_Data" 没有连接控制器。Dim HMI_Data(10,10)Dim Tag_01Tag_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 script: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) 。DLL 位于“..\Common Files\Siemens\bin”文件夹中,或位于 PATH 系统变量所定义的文件夹中。此变量由操作系统的系统属性指定。步骤按如下步骤执行,以通过 DLL 调用函数:(1)打开要调用 DLL 函数的用户自定义 C 函数。(2)在用户自定义 C 函数的开始位置添加以下代码: #pragma code(".dll")//声明在 DLL 中存储的函数:(...);(...);...(...);#pragma code结果<名称.dll> 中的函数 <函数名称 1=""> ... <函数名称 n=""> 被声明。可在用户自定义 C 函数中调用这些函数。示例:以下示例显示如何集成“kernel32.dll”文件和调用“GetLocalTime”函数: #pragma code("kernel32.dll")VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);#pragma code() SYSTEMTIME st; GetLocalTime(&st); (5)如何用VBS脚本确定鼠标当前的位置?为了读取当前鼠标的位置,需要访问操作系统的 API (Application Programming Interface) 。VBS 不支持通过 DLLs 访问操作系统的 API 。(6)为什么不能在脚本里使用 “ MsgBox ” 命令?“MsgBox” 命令不能用于 WinCC Comfort 和 WinCC Advanced 版本是由于安全的原因。 “MsgBox”的弹出显示可能会覆盖掉元素操作,比如:阻止设备的快速操作。此外,消息框可能会阻止脚本的进一步执行。解决办法可以使用系统函数 ShowSystemAlarm。如何在一个脚本中使用十六进制符号给变量赋值?在脚本编辑器中把字符组合 "&h" 作为个十六进制常数的标识。例如Dim Tag_01Tag_01 = &h45E ' Corresponds to the decimal value "1118" (7)如何在脚本里显示或隐藏各个层级?使用层是 WinCC (TIA Portal) 开发系统的一个功能。层只能在这里组态及显示隐藏。这个功能在操作面板或 PC 的运行系统中不可用。所以不能用脚本显示或隐藏“层”。解决办法在 “ 属性>动画>可见性 ” 组态变量,根据变量值控制相关对象的显示或隐藏。 (8)如何在脚本中合并字符串?可以使用 “ & ” 来合并字符串:例如 将 "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) 将相应的表达式转换为“字符串”类型。 这样在连接字符串转换之前可以避免运行时出现错误。 (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(10)如何组态带返回值和参数的脚本?脚本类型必须是 “ 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 内部变量或者控制器变量不起作用。
展开全文
相关产品