热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vbs获取当前运行脚本的上级目录_TIAPortal中WinCC脚本使用技巧汇总

(1)为什么一个由内部变量的“数值改变”事件触发的脚本不被执行?如果使用一个内部变量调用另外一个内部变量,以此,例如被调用的变量又去执行一

(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 FilesSiemensbin”文件夹中,或位于 PATH 系统变量所定义的文件夹中。此变量由操作系统的系统属性指定。

步骤

按如下步骤执行,以通过 DLL 调用函数:

(1)打开要调用 DLL 函数的用户自定义 C 函数。

(2)在用户自定义 C 函数的开始位置添加以下代码:

#pragma code(".dll")

//声明在 DLL 中存储的函数:

(...);

(...);

(...);

#pragma code

结果

中的函数 ... 被声明。可在用户自定义 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_01

Tag_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 ” 脚本函数的参数和返回值:

835621c85b18b72f25cb3f1c1128f4ad.png

图. 01

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

37f1ad0712c59bf70b8069ee6d7bb68a.png

图. 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 内部变量或者控制器变量不起作用。

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

以下手册中提供了对象的属性和使用的信息:SIMATIC WinCC WinCC Engineering V15 - 编程参考下 "VB脚本编写 > VBS 对象模型 > 属性"。(没有该手册的可以联系主编)

(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 objSet obj = HmiRuntime .Screens("MachineData").ScreenItems("Text_Field_01")obj .Text = "NewText"

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

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

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

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

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

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

ParameterMeaning

0 = hmiStopRuntime

Ends on the Runtime

1 = hmiStopRuntimeAndOperationSystem

Ends both the Runtime and the OS

例如

StopRuntime hmiStopRuntimeStopRuntime 1

注意

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

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

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

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

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

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

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

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

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

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

85008875ffe74c73acaa5cd90b08f4cf.png



推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 本文介绍了如何使用动态尺寸巧妙地将R中的数组子集化。作者通过解释数组的三个维度以及第三个维度的长度可变性,提出了一种周期性子集化数组的方法,并举例说明了如何创建第二个数组。这个方法对于制作模拟模型非常有用。 ... [详细]
  • 摘要1:ElasticSearch比较两个时间的大小_gaojie_csdn的博客-CSDN博客_es时间比较摘要2:zlasticsearch脚本教 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
雨蝶馨菲_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有