WinCC脚本系统指南


主要内容

         1、WinCC 脚本系统概述

         2、ANSI - C 脚本概述

         3、VBS 脚本概述

         4、探讨 WinCC 脚本( C 和 VBS )

         5、VBA 应用解析

         6、WinCC 脚本调试和诊断

 

1、WinCC 脚本系统概述

  • 为何使用 WinCC 脚本系统?

      - 使用 WinCC 脚本的优势在于,虽然 WinCC 通过组态也可以实现部分图形和过程的动态化,但是使用脚本更加灵活、功能更加丰富和强大。

 

  • WinCC 脚本系统由哪些部分组成?

      - 主要由以下三部分组成:C 脚本、VBS 脚本和 VBA 。

 

2、ANSI - C 脚本概述

  • C 脚本使图形和过程动态化是通过使用函数和动作实现的,如下图所示: 

  • 函数是一段代码,可在多处使用,但只能在一个地方定义。WinCC 包括许多函数。函数一般由特定的动作来调用。此外,用户还可以编写自己的函数和动作。
  • 动作用于独立于画面的后台任务,例如打印日常报表、监控变量或执行计算等。动作由触发器启动。

 

  • 触发器类型如下图所示:

 

•   项目函数、标准函数、内部函数在特征上的区别:

• WinCC 提供了一系列标准函数,标准函数主要提供了以下的功能:

  1. Alarm 组包含控制 WinCC 报警相关的函数。
  2. Graphics 组包含用于图形系统编程的函数。
  3. Report 组包含用来启动打印作业的打印预览或打印输出的函数。
  4. TagLog 组包含控制 WinCC 表格控件和 WinCC 趋势控件的函数。
  5. WinCC 组包含WinCC 系统的函数。
  6. Windows 组仅包含 ProgramExecute 函数。

GMsgFunction函数

函数 GMsgFunction 的传入参数提供了一系列消息数据,包括消息状态、消息号、时间戳等,具体内容参见帮助文档中结构体 MSG_RTDATA_STRUCT 的定义。

在“GMsgFunction()“ 函数中还可以获取消息的文本(或过程值、消息类别等)。

以下代码中使用了来自于 WinCC ODK 选件包中的函数“MSRTGetMsgCSData”,首先判断如果消息的状态为“到来”,根据消息号获取消息的组态数据,具体内容参见结构体 MSG_CSDATA_STRUCT 的定义;再调用”MSRTGetMsgText” 函数根据文本库中的文本 ID 得到消息文本的内容。

  •   WINCC 内部函数提供的主要功能如下:

  1. Allocate 组包含分配和释放内存的函数。
  2. C_bib 组包含来自 C 库的 C 函数。
  3. Graphics 组中的函数可以读取或设置 WinCC 图形对象的属性。
  4. Tag 组的函数可以读取或设置 WinCC 变量。
  5. WinCC 组的函数可以在运行系统中定义各种设置。

•      此外,C 脚本还提供丰富的扩展功能:

  1. 调用 Windows API 函数。例如,使用 GetOpenFileName 实现打开选择文件对话框的功能。
  2. 调用 C 函数。例如,使用 SetXGinaValue() 锁定/释放 Windows 组合键。
  3. WinCC 还允许用户使用自定义的 DLL,例如,使用自定义的 DLL 实现跟第三方设备通信。

注意:使用 VB 创建的 DLL 不能被加载。

调用动态链接库时,在函数或动作前需要添加如下代码:

 

3、VBS 脚本概述

  • WinCC 集成了微软基于 VB 的运行期脚本语言,使用微软标准的工具编辑和调试,使用 VBS 能够访问 ActiveX 控件和其它 Windows 应用的属性和方法。
  • WinCC 使用 VBScript 可以实现如下功能:

        1.在 WinCC 中实现图形动态化。

        2.读写变量、启动报表。

        3.连接数据库。

        4.通过 Microsoft Outlook 发送电子邮件。

        5.集成 Microsoft Internet Explorer。

        6.联接 Office 应用 ( Excel, Word, Access )。

• VBS 脚本的过程(Procedures)、模块(Modules)和动作(Atcion)

 -  过程是一段代码,类似于 C 语言中的函数。模块是一个文件,存放着一个或多个过程。相互关联的过程应该存放在同一模块中。

-  在运行状态下,如果通过动作调用某个过程时,包含此过程的模块也会被加载。所以,我们要合理的组织模块。

例如,可以把用于特定系统或画面的过程组织在一个模块中。我们也可以按照功能来构建模块,例如,可以把具有计算功能的过程放在一个模块中。

 

•    WinCC 运行系统访问数据库的三种方法:

1、使用 WinCC OLE DB Provider 访问 WinCC 过程值和消息归档(注意,如果是远程访问,Data Source 应为 “<计算机名称>\WinCC”):

Set conn = CreateObject("ADODB.Connection")

conn.open "Provider=WinCCOLEDBProvider.1;Catalog=CC_OpenArch_03_05_27_14_11_46R;Data Source=.\WinCC"

 

2、使用 MS OLE DB Provider 访问 WinCC 用户归档:

Set conn = CreateObject("ADODB.Connection")

conn.open "Provider=SQLOLEDB.1; Integrated Security=SSPI; Persist Security Info=false; Initial

Catalog=CC_OpenArch_03_05_27_14_11_46R; Data Source=.\WinCC"

 

3、使用 VBS 脚本通过 ODBC 访问 Access 数据库:

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = "Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;" conn.Open

 

4、探讨 WinCC 脚本( C 和 VBS )

•   WinCC 变量读写 - 异步读

 

•    C-function: GetTagXXX or VBS: read

第一次读取变量时,需要向 AS 系统请求值,并且将该过程变量添加到映像区,此后,映像区中的变量周期地从 AS 系统请求数据。再次读取变量时,直接将映像区中的数据返回。

关闭画面时,映像区中的变量注销;如果变量是在全局脚本动作中请求的,在 WinCC 运行期间,变量始终保留在映像区中注册的状态。

 

•   WinCC 变量读写 -同步读

•    C-function: GetTagXXXWait or VBS read (1)

该方式直接从 AS 系统读取当前值。使用同步方式读取变量时,比异步方式读取将花费更长的时间;所需的时间取决于具体的 AS 系统和通道。为了避免性能问题,在周期触发的 C 动作中不要使用这种方式。

 

•   异步读和同步读的比较:

  1. 异步读第一次读取变量时,需要向 AS 系统请求值,并且将该过程变量添加到映像区,因此比同步读的第一次读取需要更长的时间。
  2. 异步读要求映像区中的变量周期地从 AS 系统请求数据,这增加了系统的基本负载,使用同步读不存在该问题。
  3. 再次读取变量时,异步读直接将映像区中的数据返回,变量读取的时间不受 AS 系统和总线负载的影响。同步读直接从 AS 系统读取当前值,比异步读方式读取将花费更长的时间。

•   WinCC 全局脚本和画面脚本的队列概览:

  • C 脚本包含如下三个脚本队列,
  • 1. 全局脚本的请求。
  • 2. 画面的由事件触发的请求。
  • 3. 画面的循环请求。
  • VBS 脚本包含如下三个脚本队列,
  • 1. 全局脚本的请求。
  • 2. 画面的由事件触发的请求。
  • 3. 画面的循环请求。

WinCC 脚本线程的测试方法举例(1):

实验1 :全局脚本的阻塞问题

描述:全局脚本的各个动作同时运行在同一个线程中,其中一个动作发生阻塞,会影响另外一个动作。

动作1:设定每隔 2 秒钟执行一次,变量1 加 1。

动作2:设定每隔 2 秒钟执行一次,变量2 加 1,使用 Sleep 函数延迟 5 秒钟。

结论:使用输入\输出域显示两个变量,两个变量都是大约每隔 5 秒钟加 1。

如果没有 Sleep 函数,两个变量都是大约每隔 2 秒钟加 1。

因此,全局脚本的多个动作是互相影响的。

WinCC 脚本线程的测试方法举例(2):

实验2 :测试画面中由事件触发的脚本和全局动作是否在同一线程

步骤1:在画面中加入按钮1,设置某一内部变量的值,触发一个全局动作,在全局动作中使用 Sleep 函数延迟 5 秒钟。

步骤2:在画面中加入按钮2,实现某个内部变量加 1。

结论:点击按钮 1 触发全局动作后(动作1),立刻点击按钮 2(动作2),内部变量可以立即加 1,说明画面中由事件触发的脚本线程和全局动作互不干扰,分别运行在不同的线程。

 

•  使用动态对话框、动态向导、 C 脚本、VBS 脚本分别实现动态改变对象的背景颜色。

方法一 :使用动态对话框。根据变量值设置矩形的背景颜色,并且可以根据该变量的状态指定特定的颜色。

方法二 :使用动态向导 [标准动态] / [基于表格的颜色动态]。针对不同的颜色需要分别设定表达式或变量。

                针对变量连接错误,单独分配了一种颜色。使用掩码筛选条件,例如,xxxxxx01 代表只要变量最末两位是01 的即可满足条件。缺点是第一次组态时不是很容易上手,需要理解各项的含义。

方法三 :使用 C 脚本。使用 C 脚本比较灵活,本例中使用动态向导生成的 C 脚本即可满足要求(推荐)。

               首先使用 GetTagDWordState 获取指定变量的状态,如果返回值是非 0(0=No error),返回错误时对应的颜色;否则,根据变量的值,返回相应的颜色。

方法四 :使用 VBS 脚本。可以根据不同的变量值设置矩形的背景颜色,使用质量代码来判断变量的状态信息,代码逻辑与 C 脚本类似。

 

•    画面窗口与脚本相关的几个问题(1):

1、画面窗口隐藏时,画面窗口中画面的循环请求的脚本是否还在运行?

结论:当画面窗口隐藏或关闭时,画面窗口中画面的循环请求的脚本将立即停止执行,画面窗口再次显示时继续执行脚本。

 

2、对于画面的循环请求的脚本,主画面和画面窗口中的脚本在同一个线程中吗?

结论:它们位于同一个线程。在主画面和画面窗口中分别对两变量执行加 1 的操作,在其中一段脚本中添加Sleep 函数延时,另一段脚本也会发生堵塞,所以两脚本在同一线程中顺序执行。

•    多用户系统、分布式系统的脚本运行情况:

1. 局部动作和全局动作。局部动作保存在项目目录的 “\<computer_name\Pas” 子目录中,局部动作可指定给单独的计算机, 因此可以确保只在服务器上打印报表。全局动作保存在 WinCC 项目的 “\Pas” 子目录中,与局部动作相反,全局动作在客户机-服务器项目的所有项目计算机上执行。

2.在分布式系统中,如果客户使用脚本访问服务器上的变量,需要在变量前添加服务器前缀或设置标准服务器,格式为<服务器前缀>::<变量名称>。对于一对冗余服务器,只有一个服务器前缀。

   新版本中:“@NOTP”取消变量前缀。“@NOSP”取消服务器前缀。“@NOP”取消变量前缀和服务器前缀。

3、在分布式系统中,只有当客户机上有 C 动作、函数或 VBS 动作以及全局脚本的过程时,才可以在客户机上运行它们。 全局 C 和 VBS 脚本都不是数据包的组成部分。

4、在多用户项目中,脚本将集中存储在服务器的项目文件夹中。 脚本在编辑期间,将阻止其它客户机访问文件(脚本或画面)。

 

•  WinCC 选件 Web Navigator 对脚本函数的支持

Web Navigator 客户机只能支持一定数量的脚本函数,当 Web Navigator 画面脚本中调用了不支持的脚本函数时,可能会发布不成功。此外,全局脚本不能在 Web 客户机上运行。

•  C 脚本和 VBS 脚本的交叉索引

WinCC 交叉索引助手是一个在脚本中搜索画面名称和变量脚本并补充相关脚本的工具,以便 WinCC 使用交叉索引查找画面名称和变量,并在交叉索引列表中列出它们。注意,交叉索引助手只针对 C 脚本。

WinCC 在创建交叉索引列表时,函数调用中的变量和画面名称能被正确识别,为搜索和替换在 C 动作中使用的变量和画面名称,必须如下编写脚本,在脚本的开始处,必须分两段声明所有变量和画面名,段的结构如下:

•   借助于 WinCC 交叉索引助手,在脚本管理器中已知的所有函数调用由以上描述的格式替换。 只有项目函数、画面和动作被转换。

 

 5、VBA 应用解析

•  VBA功能表

 

 

6、WinCC 脚本调试和诊断

 

•     如何调试 C 脚本?

1)变量监视

- 使用 printf 输出变量值和提示信息到 GSC 诊断窗口。在 GSC 诊断窗口中,按调用的顺序输出 printf 指令。

2)错误诊断

- 通过 “OnErrorExecute()” 调试功能输出诊断错误。当执行动作或函数发生错误时,操作系统自动调用

“OnErrorExecute()” 函数,并将错误信息输出到诊断窗口中。

3)GSC 运行

- GSC 运行系统提供关于所有(全局脚本)动作的动态特性信息,使用它可以开始或结束单个动作,提供每个全局动作的状态、何时启动、激活时间间隔等一系列信息。

 

•  如何利用“OnErrorExecute()” 提供的信息进行诊断?

•     如何调试 VBS 脚本?

1)使用微软的脚本调试器(Microsoft Script Debugger )可以实现如下功能:

-  使用 [ Running Documents ] 来察看需要调试的脚本源代码;

-  脚本的断点设置、单步运行调试等;

-  使用 [ Command Window ] 显示或修改变量和对象的属性; - 监控脚本的执行过程。

2)  使用 HMIRuntime.Trace 输出变量值和提示信息到 GSC 诊断窗口。

3)  错误诊断

- 使用 LastError、ErrorDescription 和 QualityCode 等属性进行错误诊断。

 

•  Tips -- 在 WinCC 脚本编写过程中的需要注意的问题:

  1. WinCC 脚本系统只提供有限的脚本线程,过多、过于复杂的脚本势必造成线程队列的堵塞,大量脚本在队列里排队等待,最终影响 WinCC 运行系统的性能。建议用户尽量不要编写耗时的容易造成堵塞的脚本。
  2. 内存泄漏也极易导致系统性能的下降。例如,WinCC 的 C 脚本中使用 SysMalloc 分配内存,使用 SysFree释放内存,如果用户忘记调用 SysFree 函数,会导致程序内存不断上涨。因此,在脚本中的任何位置调用分配内存的函数后,务必要在使用后将内存释放。
  3. 要善于运用脚本的诊断工具和调试方法。因为脚本通常在后台运行,一旦脚本发生错误,不容易被发现,诊断工具能够及时地发现错误,调试工具能够帮助客户快速的发现问题所在。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM