创建脚本的技巧与窍门

  1. 为什么通过一个内部变量的“数值变化”事件所触发的脚本不执行?
    如果使用一个内部变量调用另一个内部变量,例如,数值变化时,执行一个脚本。安全机制会防止该脚本的执行。
    安全功能防止连续的循环。

    举例
    内部变量“HMI_Tag_01”的属性里, 在“更改数值”事件下对内部变量“HMI_Tag_02”进行置位。
    在内部变量“HMI_Tag_02”的“更改数值”事件下调用一个脚本。
    结果: 脚本不执行。

    注意
    因为这个循环断路器,用户只能依靠直接输入值来改变内部变量的值触发脚本的执行。

    补救
    使用控制器的一个外部变量。

  2. 在脚本中如何访问数组中的单个元素?
    数组中的单个元素可以通过数组名并指明数组位置的方法进行访问。-> SmartTags(“数组名”)(数组位置)

    举例 (数组型外部变量)
    Dim Tag_01 '内部脚本变量

    Tag_01 = SmartTags("DB10_HMI_Data")(2)

    局部脚本数组(该数组只在脚本中可用)相同的选择方法。如果是多维局部数组,使用逗号分隔单个数组的维度。

    举例 (内部数组变量)
    Dim HMI_Data(10,10) '内部脚本数组变量
    Dim Tag_01 '内部脚本变量

    Tag_01 = HMI_Data(0, 5)

    注意
    当使用“具有控制器连接的数组”,建议在脚本开始处复制这些数组到“内部脚本变量”,在后续脚本编程中以内部变量使用这些数组。
    在脚本结尾处,数值必须从内部变量写回到外部数组变量中。

  3. 如何高效地在控制器和本地脚本 之间反复拷贝过程变量数组?
    将过程变量数组拷贝到脚本中,需要逐个拷贝数组元素,例如通过循环。而将本地脚本数组拷贝到过程变量数组,可以直接通 过一个指令。

    举例
    'CPU_Array是过程变量数组
    Dim local_array(10)
    Dim i
    ...
    '从 CPU 拷贝到脚本:
    For i = 0 To 9
    local_array(i) = SmartTags("CPU_Array")(i)
    Next
    ...
    ' 拷贝回 CPU:
    SmartTags("CPU_Array") = local_array

    注意
    使用数组将导致较高的通信负荷和数据不一致。请参考 WinCC flexible系统手册在条目中 18796010Array Basics的说明.

  4. 在 WinCC flexible 中如何访问动态链接库?
    在 WinCC flexible 中无法使用动态链接库(DLL)。
  5. 如何确定当前鼠标的位置?
    为了读取当前鼠标的位置,必须访问操作系统的 API (应用程序访问接口)。
    VB 脚本不支持通过动态链接库访问操作系统的 API 。作为替代,当前鼠标的位置可以通过自行编写的能够访问操作系统 API 的 ActiveX 控件读取。

    注意
    在 WinCC flexible 中使用的 ActiveX 控件必须在“开放程序接口平台”(OPP)上创建。

  6. 为什么通过 WinCC flexible “MsgBox” 命令不能在脚本中使用?
    由于安全因素 “MsgBox” 命令在 WinCC flexible 中被禁用。
  7. 在脚本中如何将十六进制数赋给变量?
    十六进制数的数值在 WinCC flexible 脚本编辑器中用前缀 “&h” 进行转换。

    实例
    Dim Tag_01

    Tag_01 = &h45E '定义十进制数值“1118”

  8. 如何在脚本中显示或隐藏单个图层?
    使用图层工作是 WinCC flexible 工程软件开发系统的一项功能。这些图层在 WinCC flexible 工程软件中作为组态帮助能够被显示或隐藏。这项功能在 WinCC flexible 运行系统中是可用的。

    补救
    在相应对象的“属性>动画>可见性”根据变量值改变对象的可见和隐藏。

  9. 在脚本中如何连接字符串?
    连接符 "&" 能够用于将字符串连接起来。

    实例
    Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03

    Tag_01 = Tag_Text_01 & Tag_Text_02 & Tag_Text_03

  10. 在脚本中两个字符串之间如何插入一个通配符(空格)?
    为了在两个文本间插入一个空格,例如,使用两个引号“ ”。空格的数量取决于引号“ ”之间的距离。再次使用连接运算符“&”链接下一个字符。

    实例 1
    Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03

    Tag_01 = Tag_Text_01 & " " & Tag_Text_02 &" " & Tag_Text_03

    实例 2
    文本中插入一个控制变量作为索引“machine index”,通过脚本输出报警消息。

    ShowSystemAlarm "Machine" & "_" & SmartTags("Tag_MachineIndex") & " " & "must be checked"

    结果
    Machine_15 must be checked

  11. 在脚本中如何组态一个返回值?
    “函数”类型脚本必须有返回值。
    在脚本的“属性>常规>设置”标签,下拉菜单选择“函数”。
    在“参数”菜单项定义哪个变量传送到脚本中。

    组态将已分配的一个变量的值或者动作作为当前脚本的返回值。

    脚本名称: Sample_01
    脚本类型: Function
    参数: Param_01, Param_02
    返回值: Tag of the "Integer" type

    打开“Sample_01”脚本。

    Dim Result
    Result = Param_01 +Param_02
    Sample_01 = Result '这里“Sample_01” 被赋值为计算的结果-->返回值

    当通过一个按钮调用脚本,参数放置在属性里(“Param_01” 和 “Param_02”),附加给一个变量作为“返回值”参数。

  12. 如何通过脚本改变线性对象的长度?
    在线性对象中“高度”和“宽度”参数是只读的。
    获取水平和垂直位置,可以使用矩形替代线性对象并通过在脚本中的属性动态更新。

    关于此项的更多信息可在条目号 24249449 中获得。

  13. 什么原因可导致系统达到它的最大嵌套层数?
    例如,如果一个脚本在另一个脚本中通过数值变化被二次调用,根据这样原则的调用会达到最大的嵌套层数。
    一个反复调用自身的脚本,在被一个递归脚本调用时这样现象同样可以很快的达到。

    补救
    检查脚本的处理,如果必要,减少脚本的嵌套。

  14. 如何确定当前画面号和画面名称?
    在实例 01 中, 通过脚本的返回值输出完整的画面名称。
画面名称:Screen_01
脚本名称:Script_01
脚本类型:Function
返回值:Tag of the "String" type

打开 "Script_01" 脚本

Dim Obj, StrScreenName

Set Obj = HmiRuntime
StrScreenName = Obj.BaseScreenName
Script_01 = StrScreenName 'Return value'

结果
名称的返回值是“Screen_01

在实例 02中,画面名称被“分割”。只有下横线“_”前的字母/名称可作为脚本的返回值输出。

画面名称: 02_MachineData
脚本名称: Script_02
脚本类型: Function
返回值: Tag of the "String" type

打开 "Script_02" 脚本

Dim Obj, StrScreenNumber

Set Obj = HmiRuntime
StrScreenNumber = Split(Obj.BaseScreenName, "_")
Script_02 = StrScreenNumber(0) 'Return value'

结果
名称的返回值是“02”。

注意

  • 不能通过相关画面的“属性”直接在“脚本”中输出画面名称/编号。
  • 另外也可使用“画面编号”区域指针。通过组态一个具有相同地址区域的变量作为区域指针,那么画面编号能够通过控制器读出。在 这个选项中,需要考虑总线波特率和变量的采集周期。
  1. 如何在脚本中使用多重变量?
    指针变量不能在脚本中使用。
  2. 如何在脚本中使用结构变量?
    结构变量不能在脚本中使用。
  3. 如何在静态变量中保存信息当下一次脚本被调用时能够再次可用?
    在脚本结束后被保留的信息必须保存在全局变 量中。 查看下表:

    声明

    有效性

    脚本中

    脚本 WinCC flexible 项目 控制器
    外部变量 X X X 全局
    内部变量 X X --
    脚本变量 X -- -- 局部
  4. 脚本中如何改变文本域中的文本?
    文本域中的文本能够通过脚本改变。注意文本的改变只能是“临时的”。画面切换后已改变的文本会被原组态的文本覆盖。

    画面名称: MachineData
    脚本类型: Sub
    文本域的画面名称: Text_Field_01

    打开编写的脚本

    Dim obj

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

  5. 如何通过脚本从口令列表或用户视图中读取用户密码?
    为了安全起见在 WinCC flexible 中不能实现。
  6. 如何终止 WinCC flexible 运行系统并关闭 PC 或面板?
    可以使用“StopRuntime mode”命令终止WinCC flexible运行系统和操作系统。

    注意
    基于 Windows 面板的操作系统不能被关闭。

    模式
    参数 含义

    0 = hmiStopRuntime

    终止 runtime

    1 = hmiStopRuntimeAndOperationSystem

    终止 runtime and OS

    实例
    StopRuntime hmiStopRuntime
    StopRuntime hmiStopRuntimeAndOperationSystem

  7. 如何通过脚本访问画面或模板中的对象?
    面板中的对象只能通过“激活画面”功能访问。

    举例,在一个画面中组态一个圆,对象的名称是“Circle_01”。通过点击画面中的按钮控制圆的“隐藏”。注意对象的可见性是“临时的”。当一个画面 切换后,会被原组态覆盖。

    脚本类型: Sub
    圆的对象名称: Circle_01

    打开脚本

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

    注意
    画面中的对象名称必须唯一。

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc323583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论