李杨,邓有纬
(南京南自科林系统工程有限公司,江苏 南京 210032)
随着人们安全生产意识的增强,国家对安全生产日益重视,现代化电厂在自动化生产过程中,对于事故根源确定、事故原因确认的要求也越来越急迫。iFIX组态软件作为目前国内常用的生产过程监控软件已在国内大部分现代化电厂中使用。操作记录作为可能与事故有关的重要信息,已被越来越多的自动化电厂所重视。为了在事故发生后准确地找出事故根源,清楚地判定是否由于误操作或其他因素造成的事故,操作员操作记录应准确地记录每台操作员站发出的操作指令信息,操作指令信息应包括指令发出时间、操作对象、操作指令及操作员等具体内容。
iFIX组态软件因集成了大量的向导和专家,使得用户不需要进行任何编程就可自动完成多种功能。以往在实现操作记录时,大家也充分利用了这些专家和向导,在实现过程中大部分采用以下4种方法。
(1)在iFIX组态软件中,启用报警开放数据库互联ODBC(Open Database Connectivity),利用了报警记录设备状态的改变。该方法在实现的过程中会比较频繁地打开、关闭数据库,生产系统负荷会越来越大。
(2)在iFIX组态软件中,启用报警文件记录,在每天生成的报警文件(.alm)中筛选操作记录。该方法需将过程数据库中的标签名中文描述提前设置好,这样,造成标签名的中文描述与实际意义不完全相符。
(3)在动作的按钮脚本中添加 SendOperatorMessage,然后在报警ODBC中进行查询。该方法能比较真实地反映操作员的操作指令,但同样需要频繁地打开关闭数据库,造成系统负荷越来越大。
(4)利用事件调度将操作记录写入数据库中。该方法能比较真实地反映操作员的操作指令,但实现起来工作量大,而且会造成系统负荷增大。
在这些实现方法中,大部分都利用了iFIX组态软件对消息事件进行了处理,而消息事件不仅包括操作记录,还包括所有的报警信息,这就决定了操作记录文件中不仅有操作员的操作记录,还有所有的报警信息。另外,消息事件是基于过程数据库中数据值的变化,而数据值的变化除了可由操作产生外,还可在设备联锁控制或设备自动控制时产生。因此,上述大部分实现方法都不能准确、真实地反映出操作员的操作状况,而是记录设备的运行情况。而事件调度虽然可以准确、真实地反映操作员的操作,但实现工作量大,在实际工程应用中使用也比较少。
在iFIX组态软件中,虽然有众多的专家和向导,但对于操作记录而言,iFIX组态软件自身并未提供专家式或向导式工具。在这种情况下,可通过自主编程来完成,自主编程在iFIX组态软件中也显得非常轻松,这主要得益于iFIX组态软件在内部集成了微软(Microsoft)的VBA开发环境,它与微软的操作系统的兼容性非常好。
通过iFIX组态软件内部集成的微软VBA开发环境,开发一个自定义的操作记录工具。该操作记录工具应该能够有效地记录操作员的每次操作指令信息。根据国内现代化电厂的运行习惯,经过需求分析可以得出,需要完成的操作记录应具有如下功能:
(1)确定操作记录的存贮位置。作为现代化电厂的管理者,非常希望在事故发生后能够方便、迅速地查询操作记录。在需要对事故进行详细分析时可将最近的操作记录导出并保存。因此,需要快速定位操作记录并将所需的操作记录置于统一位置,以便导出保存。
(2)确定操作记录的存贮文件。当管理人员或事故分析人员需要查询操作记录时,可根据查询规则快速地查询所需要的记录。一般来说,以时间顺序来记录操作员的操作指令信息符合人们的认知习惯,最好是将一定时间段内的操作指令信息记录在同一个文件中,以自然天为单位的时间段能够方便地帮助管理人员或事故分析人员确定他们所需要的操作记录。
(3)操作时间。操作时间是操作指令信息的重要组成部分,它指示了操作指令发出的具体时间,是事故分析时必不可少的重要因素,一般操作时间应精确到秒。
(4)操作对象。操作对象是操作指令信息的重要组成部分,它指示了操作指令所针对的设备。对于生产系统中所有可程控操作设备被操作时都应在操作记录中生成相应的记录。
(5)操作指令。操作指令是操作指令信息的重要组成部分,它指示了操作员对设备发出的指令。对于生产系统中所有可程控操作设备的所有操作,都应在操作记录中生成相应的记录。
(6)操作员。操作员是操作指令信息的重要组成部分,它指示了发出操作指令的操作人,是操作设备的责任人。
根据上述功能描述,可以得出操作记录应是一个文件夹的结论,该文件夹包含了若干文件,每个文件都以时间顺序记录了当天时间段内的某一时刻,某个设备被如何操作,操作人是谁。文件形成的内容见表1。
表1 操作记录(2012-03-01)
对于上述功能的实现,在iFIX组态软件中可以创建一个全局的VBA子程序,该VBA子程序可以被生产过程中的任一操作调用,调用完成后,自动生成相应的操作信息记录。在调用该VBA子程序时,首先应检查所需的存贮位置和存贮文件是否存在,存在则生成操作记录。否则,应先创建存贮空间和存贮文件。
在自动生成操作指令信息时,对于操作时间可以获取生产系统当前的日期和时间;对于操作员则可以获取生产系统当前登录的用户。
操作对象和操作指令可在iFIX组态软件组态时,由组态人员根据设备和指令编写在相应的动作脚本下。当组态完成后,运行人员在生产系统上操作设备,则可自动生成如表1所示的操作记录。
考虑到操作记录主要是为了事故发生后准确地找出事故根源,清楚地判定是否由于误操作或其他因素造成事故的发生。因此,对于操作记录不需要保存很长的时间,这样,也可大大地节约操作员站的存贮空间。对此可对操作记录采用循环存贮的方式来实现,亦即若需保存n天的操作记录,则第n+1天的操作记录覆盖第1天的操作记录。其操作记录子程序OperateRecord具体实现过程如下:
操作记录子程序作为一个自定义的全局子函数,应置于iFIX组态软件VBA编辑器的Project_User中,这样,可保证在iFIX组态软件的任一位置都可调用。为了确保操作记录的完整性,在画面上的任何一次有效操作(包括有效地操作按钮,修改数据等),都应可通过操作记录子程序OperateRecord的调用而自动地记录到当天的文件中。
下面以某电厂输煤程控系统中皮带机的操作记录实现来具体说明操作记录子程序的调用。
皮带操作画面如图1所示。从图1中可以看出,对于#3B皮带机的操作总共为12种指令,分别为启动、停止、鸣警铃、置联锁、解联锁、置自动、解自动、置检修位、置工作位、解除撕裂保护、投入撕裂保护、解除打滑保护、投入打滑保护、解除重跑偏保护和投入重跑偏保护。
图1 皮带操作画面
因此,在画面上对于按钮的每次有效点击之后,在按钮的点击脚本下调用操作记录子程序OperateRecord,将定义好的操作指令信息自动生成到相应的文件中。由于iFIX组态软件中采用了标签组,即多个相同类型的设备可以使用同一控制画面,当打开一个画面或切换当前画面时,系统可以读取标签组文件,并且使用其中所定义的过程值替代控制画面中的标记。因此在operaterecord"程控手动启动"&Text1.Caption ,user.UserName_SM.CurrentValue语句中并没有出现设备名称#3B皮带机,而是在运行时由对应设备的标签组的内容来替换Text1.Captionuser.UserName_SM.Current_Value则是生产系统当前的登录用户名。
下面分别以启动按钮和联锁按钮的操作为例来说明操作记录子程序的调用过程。程序4启动按钮脚本如下:
程序5联锁按钮脚本如下:
在联锁按钮脚本中,增加了对联锁按钮内容值的判断,根据判断可以自由地写入操作指令是置联锁或是解联锁。
由于操作记录写入到了记事本文件中,在查询时为了防止人员随意修改已经生成的操作记录,同时也为了保证iFIX的安全性,可以在iFIX组态软件中新建一个画面,利用WebBrowser控件来调用用户需求的操作记录。其调用效果如图2所示。
图2 操作记录
WebBrowser控件调用脚本如下:
对操作记录的功能需求进行了分析,给出了操作记录子程序、操作记录子程序调用、操作记录查询的实例。通过在河南丰鹤电厂输煤程控系统及广东云浮电厂C厂输煤程控系统的实际应用,该操作记录子程序能够准确、详实、完整地记录每一用户的任一操作信息。为事故发生后准确地找出了事故根源,清楚地判定是否由于误操作或其他因素造成事故的而提供了有力的证据。
[1]沈大林.中文 Visual Basic 6.0案例教程[M].北京:人民邮电出版社,2005.
[2]刘炳文.Visual Basic程序设计教程[M].3版.北京:清华大学出版社,2006.
[3]胡静,方彦军.基于ODBC的iFIX工控组态软件与关系数据库通讯探讨[J].微计算机信息,2003,19(2):19 -20.