1、For internal use only / ?Siemens AG 2011. All Rights Reserved. WinCC V7.0 SP2 亚洲版高级工程师训练营 2011 年4月 For internal use only / ?Siemens AG 2011. All Rights Reserved. WinCC脚本系统介绍 Lei Ming I IA/DT/BT CS HMI For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 主要内 容 WinCC 脚本系统 概 述
2、 ANSI - C 脚本概述 VBS 脚本概述 深入探讨 WinCC 脚本( C 和 VBS ) VBA 概述 WinCC 脚本调试 和 诊 断 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 脚 本 系统概述 WinCC 脚本系统由哪些部分组成? 主要由以下三部分组成:C 脚本、VBS 脚本和 VBA 。 使用 WinCC 脚本的优势在哪里? - WinCC 通过完整和丰富的编程系统实现了开放性,通过脚本可以访 问WinCC的变量、对象和归档等。 - WinCC 借助 C
3、 脚本, 还可以通过 Win32 API 访问 Windows 操作系 统及平台上的各种应用。 - 而 VBS 脚本则从易用性和开发的快速性上具有优势。 - VBA 可以使组态自动化,在一定程度上简化了用户的组态。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector C 脚本使图形和过程动态化是通过使 用函数 和动作 实现的,如下图所示: ANSI - C 脚本概述 函数是一段代码,可在多处使用,但只能在一个地方定义。WinCC 包括许多函 数。函数一般由特定的动作来调用。此外,用户还可以
4、编写自己的函数和动作。 动作用于独立于画面的后台任务,例如打印日常报表、监控变量或执行计算等。 动作由触发器启动。 标准函数 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector ANSI - C 脚本概述 触发器类型如下图所示: 使用触发器的实例: For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 项目函数、标准函数、内部函数在特 征上的 区别: ANSI - C 脚本概述 特征 项
5、目函 数 标准函 数 内部函 数 由用户自己创建 可以 不可以 不可以 由用户自己进行 编辑 可以 可以 不可以 重命名 可以 可以 不可以 口令保 护 可以 可以 NA 使用范 围 仅在项目内识别 可在项目之间识 别 项目范围内可用 文件扩 展 名 “*.fct” “*.fct” “*.icf” For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector ANSI - C 脚本概述 WinCC 提供了一系列标准函数,标准函数主要 提供了 以下的 功能: 1. Alarm 组包含了与 WinCC
6、报警相关的函数。 2. Graphics 组包含用于图形系统编程的函数。 3. Report 组包含用来启动打印作业的打印预览或 打印输 出的函 数。 4. UserArc 组包含访问和操作 WinCC 用户归档的函数。 5. WinCC 组包含WinCC 系统的函数。 6. Windows 组仅包含 ProgramExecute 函数。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector ANSI - C 脚本概述 WINCC 内部函数提供的主要功能如下: 1. Allocate 组包含
7、分配和释放内存的函数。 2. C_bib 组包含来自 C 库的 C 函数。 3. Graphics 组中的函数可以读取或设置 WinCC 图形对象的属性。 4. Tag 组的函数可以读取或设置 WinCC 变量。 5. WinCC 组的函数可以在运行系统中定义各种设 置。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector ANSI - C 脚本概述 此外,C 脚本还提供丰富的扩展功能: 1. 调用 Windows API 函数。例如,使用 GetOpenFileName 实现打开选择文
8、件对话框的功能。 2. 调用 C 函数。例如,使用 SetXGinaValue() 锁定/ 释放 Windows 组合键。 3. WinCC 还允许用户使用自定义的 DLL,例如,使 用自定 义的 DLL 实现 跟第三方设备通信。注意:使用 VB 创建的 DLL 不能被加载。 #pragma code(“.dll“) (.); #pragma code() 调用动态链接库时,在函数或动作前 需要添 加如下 代码: For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector VBS 脚本概 述 Wi
9、nCC 集成了微软基于 VB 的运行期脚本语言,使用微软标准 的工具 编辑和调试,使用 VBS 能够访问 ActiveX 控件和其它 Windows 应用 的属性和方法。 WinCC 使用 VBScript 可以实现如下功能: 1. 在 WinCC 中实现图形动态化。 2. 读写变量、启动报表。 3. 连接数据库。 4. 通过 Microsoft Outlook 发送电子邮件。 5. 集成 Microsoft Internet Explorer 。 6. 联接 Office 应用 ( Excel, Word, Access ) 。 For internal use only / ?Siemen
10、s AG 2011. All Rights Reserved. Industry Sector Creating Alarms VBS 脚本概 述 VBS 对象模型(WinCC V7.0 ) For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector VBS 脚本的过程(Procedures)、模块(Modules )和动作(Atcion ) VBS 脚本概 述 - 过程是一段代码,类似于 C 语言中的函数。模块是一 个文件 ,存放 着一个 或多个 过程。 相互 关联的过程应该存放在同 一模块 中
11、。 - 在运行状态下,如果通过 动作调 用某个 过程时 ,包含 此过程 的模块 也会被 加载。 所以, 我们 要合理的组织模块。例如 ,可以 把用于 特定系 统或画 面的过 程组织 在一个 模块中 。我们 也可以 按照功能来构建模块,例 如,可 以把具 有计算 功能的 过程放 在一个 模块中 。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 运行系统访问数据库的三种方法: 1. 使用 WinCC OLE DB Provider 访问 WinCC 过程值和消息归档(注意,如
12、果 是远程访问,Data Source 应为 “WinCC” ): VBS 脚本概 述 Set conn = CreateObject(“ADODB.Connection“) conn.open “Provider=WinCCOLEDBProvider.1;Catalog=CC_OpenArch_03_05_27_14_11_46R; Data Source=.WinCC“ Set conn = CreateObject(“ADODB.Connection“) conn.open “Provider=SQLOLEDB.1; Integrated Security=SSPI; Persist S
13、ecurity Info=false; Initial Catalog=CC_OpenArch_03_05_27_14_11_46R; Data Source=.WinCC“ Set conn = CreateObject(“ADODB.Connection“) conn.ConnectionString = “Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;“ conn.Open 2. 使用 MS OLE DB Provider 访问 WinCC 用户归档: 3.使用 VBS 脚本通过 ODBC 访问 Access 数据库: For internal use
14、 only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 变量读写 - 异步读 深入探 讨 WinCC 脚本( C 和 VBS ) C-function: GetTagXXX or VBS: read 第一次读取变量时,需要向 AS 系统请求值,并且将该过程变量添加到映像 区,此后,映像区中的变量周期地从 AS 系统请求数据。再次读取变量时,直接 将映像区中的数据返回。 关闭画面时,映像区中的变量注销;如果变量是在全局脚本动作中请求的, 在 WinCC 运行期间,变量始终保留在映像区中注册的状态。 For inte
15、rnal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) C-function: GetTagXXXWait or VBS read (1) 该方式直接从 AS 系统读取当前值。使用同步方式读 取变量 时,比 异步方式读取将花费更长的时间;所 需的时 间取决 于具体 的 AS 系统和 通道。为了避免性能问题,在周期触 发的 C 动作中不要使用这种方式。 WinCC 变量读写 - 同步读 For internal use only / ?Siemens AG 2
16、011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) 异步读和同步读的比较: 1. 异步读第一次读取变量时,需要向 AS 系统请求值,并且将该过程变 量添加到映像区,因此比同步读的第 一次读 取需要 更长的 时间。 2. 异步读要求映像区中的变量周期地从 AS 系统请求数据,这增加了系 统的基本负载,使用同步读不存在该 问题。 3. 再次读取变量时,异步读直接将映像 区中的 数据返 回,变 量读取 的时 间不受 AS 系统和总线负载的影响。同步读直 接从 AS 系统读取当前值, 比异步读方式读取将花费更长的时间
17、。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 使用动态对话框、动态向导、 C 脚本、VBS 脚本分别实现动态改变对象 的背景颜色。 方法一 使用动态对话框。根据 变量值 设置矩 形的背 景颜色 ,并且 可以根 据该变 量的状 态 指定特定的颜色。缺点是 只能分 配一个 变量。 方法二 使用动态向导 标准动态 / 基于表格的颜色动态。针对不同的 颜色需 要分别 设 定表达式或变量。针对变 量连接 错误, 单独分 配了一 种颜色 。使用 掩码筛 选条件 ,例如 , xxxxxx01
18、代表只要变量最末两位是 01 的即可满足条件。缺点 是第一 次组态 时不是 很容易 上手,需要理解各项的含 义。 方法三 使用 C 脚本。使用 C 脚本比较灵活,本例中使 用动态 向导生 成的 C 脚本即可满 足要求(推荐)。首先使 用 GetTagDWordState 获取指定变量的状态,如 果返回 值是非 0 (0=No error ),返回错误时对应的颜色; 否则, 根据变 量的值 ,返回 相应的 颜色。 方法四 使用 VBS 脚本。可以根据不同的变 量值设 置矩形 的背景 颜色, 使用质 量代码 来 判断变量的状态信息,代 码逻辑 与 C 脚本类似。 深入探 讨 WinCC 脚本( C
19、 和 VBS ) For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) 多用户系统、分布式系统的脚本运行 情况: 1. 局部动作和全局动作。局部动作保存在项目目录的 “: 。对于一对冗 余服务器,只有一个服务器前缀。 3. 在分布式系统中,只有当客户机上有 C 动作、函数或 VBS 动作以及全局脚本 的过程时,才可以在客户机上运行它们。 全局 C 和 VBS 脚本都不是数据包的组 成部分。 4. 在多用户项目中,脚本将集中存储在服务器的项目
20、文件夹中。 脚本在编辑期 间,将阻止其它客户机访问文件(脚本或画面)。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) WinCC 选件 Web Navigator 对脚本函数的支持 Web Navigator 客户机只能支持一定数量的脚本函数,当 Web Navigator 画面 脚本中调用了不支持的脚本函数时,可能会发布不成功。此外,全局脚本不能在 Web 客户机上运行。 - 不支持的C脚本函数举 例 : ReportJob RP
21、TJobPreview RPTJobPrint RptShowError GetHWDiag GetHWDiagLevel GetKopFupAwl GetKopFupAwlLevel OnDeactivateExecute OnErrorExecute OnTime - 不支持的 VBS 脚本函数举例: HMIRuntime.Stop AlarmLogs 对象 DataLogs 对象 Logging 对象 Project 对象 打 印 - 创建在WinCC Server 或WinCC client 而 非Web Navigator Client 上运行的脚本 : #ifdef RUN_ON_
22、WEBNAVIGATOR / only executed on the Web Navigator client #else DMExitWinCCEx(DM_SDMODE_SYSTEM); #endif For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) C 脚本和 VBS 脚本的交叉索引 WinCC 交叉索 引助手 是一个 在脚本 中搜索 画面名 称和变 量脚本 并补充 相关脚 本的工 具, 以便 WinCC 使用交叉索引查找画面 名
23、称和 变量, 并在交 叉索引 列表中 列出它 们。注 意,交 叉索引助手只针对 C 脚本。 WinCC 在创建交叉索引列表时, 函数调 用中的 变量和 画面名 称能被 正确识 别。为 搜索 和替换在 C 动作中使用的变量和画面 名称, 必须在 脚本的 开始处 ,分两 段声明 所有变 量和 画面名,段的结构如下: / WINCC:TAGNAME_SECTION_START / syntax: #define TagNameInAction DMTagName #define ApcV arName1 “V arName1“ / WINCC:TAGNAME_SECTION_END / WINCC:
24、PICNAME_SECTION_START / syntax: #define PicNameInAction PictureName #define ApcPictureName1 “PictureName1“ / WINCC:PICNAME_SECTION_END For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) 借助于 WinCC 交叉索引助手,在脚本管理器中已知 的所有 函数调 用由以 上描述的格式替换。 只有项目函数、画面和动
25、作被转换 。 WINCC:SCREENNAME_SECTION_START Const ScreenNameInAction = “ScreenName“ WINCC:SCREENNAME_SECTION_END WINCC:TAGNAME_SECTION_START Const TagNameInAction = “TagName“ WINCC:TAGNAME_SECTION_END GetTagDWord ( ApcV arName1 ); SetPictureName( ApcPictureName2, “PictureWindow1“,ApcPictureName1 ); VBS 脚本
26、也提供交叉索引功能,格式如 下: For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) WinCC V7 New - 实现 125ms 触发周期: 1 )在 VBS 的“改变触发器”对话框中可以选择“动画周期”(Animation Cycle)。 2 )在 VBS 脚本中,可以使用对象 “ScreenItems” 的新方法 “ActivateDynamic” 和 “DeactivateDynamic” 在运行系统中启动和停止触发器。 For
27、 internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) WinCC V7 New - 使报警控件的工具栏动态化: 1 )WinCC 控件 V7.0 或更高版本不再支持以前使用的标准函数 “AXC_OnBtn”和 “OnBtn.” 来操作工具栏按钮。替代的方法是,可以在 控件的组态对话框的 “工具栏” 选项卡中找到相应工具栏按钮对应的 “ID” ,编写脚本时,将按钮的 “ID” 设置到 “ToolbarButtonClick” 属性即 可。 2 )例
28、如,以下功能可以实现打开控件组态对话框: - VBS 脚本: ScreenItems(“Control1”). ToolbarButtonClick = 2 - C脚本: SetPropWord(lpszPictureName,”Control1”,” ToolbarButtonClick”,2); For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 深入探 讨 WinCC 脚本( C 和 VBS ) WinCC V7 New - 可以禁用变量和服务器前缀: 可以使用以下的附加项,在相应的
29、变量前面追加前缀: “NOTP” 禁用变量前缀 “NOSP” 禁用服务器前缀 “NOP” 禁用变量前缀和服务器前缀 这些附加项对于所有的动态类型都可用。 变量连接实例: 用 VBS 脚本实现的实例: For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector VBA 概述 VBA VBS 语言 Visual Basic Visual Basic 可调试 可以 可以 可访问其他应 用 程序 可以 可以 WinCC已集成功能 是 是 适用范围 WinCC 组态环境(CS ) 图形编辑器 WinCC运行
30、环境(RT ) 图形编辑器; 全 局脚 本 可访问对象 WinCC组态环境(CS) 图形编辑器; 变 量(tags ) ;报警;归档 ; 文本 ; WinCC运行环境(RT ) 图形编辑器; 变 量(tags ) ; 功能近似于 动态向导和ODK C-Script 和ODK WinCC在图形编辑器中集成了一个VBA 编辑器,可以用来使组态自动化,在一 定程度上简化了用户的组态。比较 VBA 与 VBS 如下表所示: For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector VBA 概述 VBA
31、功能表 VBA 在图 形编 辑器 中 增强图形编 辑器的功能 编辑画面 编辑对象 给画面和对 象添加动态 属性 事件处理 访问外部程 序 访问组件库 用户自定义菜 单 和 工具栏 多语言组态 访问画面属性 , 编辑层/ 缩 放设 置, 创 建菜单和 工具栏。 创建删除对象 ; 访问对象属性 ; 对某些事件做 出 反应 ( 例如 在 图形 编辑器中插入 一 个对 象 ); 可 访问外部 支持VBA 的 应 用 程序例如, 从EXCEL工作簿中读取值然后把他 分配给对象属 性 。 添加直接变量 连 结、 添 加动 态 对话 、 添加脚本、添 加 动作 For internal use only /
32、 ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 脚本调试 和 诊 断 如何调试 VBS 脚本? 1 )使用微软的脚本调试器(Microsoft Script Debugger ) 可以实现如下功能: - 使用 Running Documents 来察看需要调试的脚本源代码; - 脚本的断点设置、单步运行调试等; - 使用 Command Window 显示或修改变量和对象的属性; - 监控脚本的执行过程。 2 )使用 HMIRuntime.Trace 输出变量值和提示信息到 GSC 诊断窗口。 3 )错误诊断 - 使用
33、 LastError、ErrorDescription 和 QualityCode 等属性进行错误诊断。 注:微软脚本调试器可以在微软下载中心找到,链接如下: http:/ 在搜索栏中输入“Script Debugger” 关键字,即可下载相应的软件。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 脚本调试 和 诊 断 如何调试 C 脚本? 1 )变量监视 - 使用 printf 输出变量值和提示信息到 GSC 诊断窗口。在 GSC 诊断窗口中,按 调用的顺序输出 pri
34、ntf 指令。 2 )错误诊断 - 通过 “OnErrorExecute()” 调试功能输出诊断错误。当执行动作或函数发生错 误时,操作系统自动调用 “OnErrorExecute()” 函数,并将错误信息输出到诊断 窗口中。 3 )GSC 运行 - GSC 运行系统提供关于所有(全局脚本)动作的动态特性信息,使用它可以开 始或结束单个动作,提供每个全局动作的状态、何时启动、激活时间间隔等一系 列信息。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 脚本调试 和 诊 断
35、如何利用“OnErrorExecute()” 提供的信息进行诊断? 如何通过 函数 ID 确定函数名? - 通过图中所示的 szFunctionName 可以在 GSC 运行中查到发生错误 的全局动作的名称。 变量名称 画面名称 对象名称 属性名称 错误文本 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 脚本调试 和 诊 断 诊断工具“ApDiag.exe” 支持对故障和性能问题的分析。 使用 ApDiag.exe 主要提供以下功能: 1. 设置不同类型诊断信息的输出源。
36、 2. 监控动作的运行和等待队列的积累情况。 3. 打开或关闭内部变量中的重要诊断信息的保存选项。 4. 可将通过“诊断”菜单所生成的跟踪条目输出到窗口、文件或被删除。 5. 提供与系统有关的大量信息。 6. 改变某些跟踪点的等级。 注意,各个诊断功能均可关闭或打开,要及时关闭不用的诊断功能,以避免 在运行系统运行期间降低系统性能。 SCRIPT_COUNT_TAGS 该 变 量 包 含 了通过 脚本请 求的变 量的当 前数量 。 SCRIPT_COUNT_REQUEST_IN_QUEUES 该变量包含了 请 求的 当 前数 量 。 SCRIPT_COUNT_ACTIONS_IN_QUEUES
37、 该 变 量 包 含 了正等 待处理 的动作 的当前 数目。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 使用APDiag 工具可 以帮助 快速定 位复杂 项目的 阻塞脚 本,以 下介绍 三种重 要的方 法: 方法1 :使用 ApDiag 监控动作的运行和等待 队列的 积累情 况 如果在过小的周期内正在 运行的 动作太 多(要处理的 动作将 越聚越 多),或动作 已 被挂起(休眠、循环、输出对话 框、等 待另一 个应用 程序的 响应.) ,则等待队列可能会 溢出。所有其他动作均将
38、积聚在 等待队 列中, 不能进 行处理 。 打开菜单项“诊断配置文件 ”,组 态“检 查请求/ 动作队列“, 可对缓 慢增加 的 等待队列进行检测,否则 将导致 在几小 时或几 天之后 出现出 错消息 “More than 5000 actions in work” 。“扫描速率”值 指定了 在请求 多少次 之后将 检查等 待队列 的长度 。 如果等待队列以超出“梯 度”中 所指定 的值增 长,则 将以printf() 的形式输出一条注意 事项。 WinCC 脚本调试 和 诊 断 例如,输入“扫描速率” = 100,“梯度” = 30。每隔 100 次新请求(动作),将检查等待队 列是否以 3
39、0 个以上的条目增加(也就是 说,在 100 次新请求中,只处理不 到 70 个请求)。如果 这样, 则下列 诊断信 息将以 printf() 的 形式输 出。 举例: “扫描速率” = 100 “梯度” = 30 The ActionCount grows too fastly: ScanRate:100 projectGradient: 30 actualGradient:87 需 要注意 的是, 除了全 局动作 之外, 画面中 周期执 行的脚 本也在 检查的 范围内 。 For internal use only / ?Siemens AG 2011. All Rights Reserv
40、ed. Industry Sector 方法2 : 使用APDiag 工具, 打开菜 单项“ 诊断配置 文件” ,激活 “检查 运行需 要超 过xx 毫 秒的动 作”复 选框, 则运行 时间大 于指定 时间的 所有动 作的运 行时间 均将输 出。 例如,将xx毫秒设 置成2000毫秒, 如果有 动作执 行超出2000毫秒 ,可以 在诊断 窗口中 找到如下的输出: WinCC 脚本调试 和 诊 断 在GSC Runtime中可以查到“szFunctionName:9“ 所对应的动作的名称,该 动作很可能执行时间过长 ,导致 整个脚 本队列 的堵塞 ,需要 检查该 动作的 代码, 或者 使用方法3
41、 ,进一步核查问 题所在 。另外 “dblTime:4999.81“ 为该动作实际执行的时 间,如果该动作发生阻塞 ,则无 法计算 该动作 执行的 时间, 此时没 有以上 的输出 。 =OnTime= dwCode: (ThreadId 2296) 114 szTimeText: (ThreadId 2296) PROFILE_FOR_XX_TIME too long (ThreadId 2296) dblTime: (ThreadId 2296) 4999.81 szApplicationName: (ThreadId 2296) GSC_RT bCycle: (ThreadId 2296)
42、 cycle szFunctionName: (ThreadId 2296) 9 dwParamSize: (ThreadId 2296) 0 =OnTime= For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 方法3 :打开菜单项“ 信息 第一 个动作 ”,可 以将当 前正在 处理的 动作( 如果脚 本发 生阻塞时,为正在发生阻 塞的动 作,该 动作阻 塞了其 他需要 处理的 动作) ,以及 动作 的调用堆栈信息输出到文 本文件 中。如 果正在 执行的 动作很 多,这 将帮助 我们快
43、速定 位到发生阻塞的动作脚本 ,并从 “调用 堆栈” 信息中 查出该 动作中 究竟是 哪个函 数发 生了阻塞。 WinCC 脚本调试 和 诊 断 实例:下面以一个复杂的 客户项 目为例 ,介绍 如何快 速定位 到阻塞 的函数 名称。 首 先,使用“方法1“可以诊 断出当 前请求 队列正 在快速 增长, 说明脚 本发生 了阻塞 。 使用“方法2“,从 GSC 诊断窗口中输出的信息表 明,某 一 ID 的动作执行超出在 APDiag 中所组态的数值(2000毫秒) 。由于 所有动 作的触 发周期 均不大 于 2 秒, 说明该脚本动作可能发生 堵塞, 影响了 其它全 局动作 的执行 。在 GSC R
44、untime 中 查出该 ID 对应的动作名称。然后使用 “方法3“,发 现诊断 文件中 有如下 输出: (见下页): 结论:从下页的诊断信息 可以看 出,当 前发生 阻塞的 动作 ID 是“1d5“,在 GSC Runtime 查 询对应 的全局 动作的 名称为 “gscc1 ”,并 且从调 用堆栈 的信息 中, 可以找到发生阻塞的具体 函数名 称为:MSRTGetMsgQuit 。可见,综合利 用 APDiag 的以上方法,对快速诊断 全局脚 本的堵 塞问题 很有帮 助。关 于 APDiag 的 使用方法,请参见帮助文 档中的 “为 WinCC 诊断- 动作的运行时 监控” 一章。 关于
45、APDiag 工具的使用,大家有时间 可以在 实际的 复杂项 目中多 多实践 、灵活 应用。 For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector 阻塞脚本的诊断文件片断 如下: WinCC 脚本调试 和 诊 断 =Doku to Action= Info: The following Request is hanging. Type of Request: Action szApplicationName: GSC_RT cycle szFunctionName: 1d5 =Doku to
46、 Action= / Call stack: / Address | Frame | / - +- +- / 7C90EB94 | 0378F774 | KiFastSystemCallRet+0 / 7C90104B | 0378F78C | RtlEnterCriticalSection+46 / 02D72D8E| 0378F7BC| 0001:00051D8E C:Program FilesSiemensWinCCbinMSRTCLI.DLL / 02D51603 | 0378F808 | MSRTExport+CF7 / 02D5D667 | 0378F920 | MSRTExpor
47、t+CD5B / 02D5058D | 0378F930 | MSRTGetMsgQuit+10 / 00376850 | 0378F9A4| CissDeleteModuleEx+11A0 / 7C80B683 | 0378FFEC | GetModuleFileNameA+1B4 =Doku to Action= For internal use only / ?Siemens AG 2011. All Rights Reserved. Industry Sector WinCC 脚本调试 和 诊 断 Tips - 在 WinCC 脚本编写过程中的需要注意的问题: 1. WinCC 脚本系统只提供有限的脚本队列,过多、过于复杂的脚本势必造成队列 的堵塞,大量脚本在队列里排队等待,最终影响 WinCC 运行系统的性能。建议 用户尽量不要编写耗时的容易造成堵塞的脚本。 2. 内存泄漏也极易导致系统性能的下降。例如,WinCC 的 C 脚本中使用 SysMalloc 分配内存,使用 SysFree 释放内存,如果用户忘记调用 SysFree 函 数,会导致程序内存不断上涨。因此,在脚本中的任何位置调用分配内存的函数 后,务必要在使用后将内存释放。 3. 要善于运用脚本的诊断工具和调试方法。因为脚本通常在后台运行,一旦脚本发 生错