翟伟翔 苏 适
(云南电力试验研究院新能源及智能电网研究所,云南 昆明 650217)
随着节能调度、低碳减排等政策的实施,火电厂相继安装了厂级自动化发电控制(automatic generation control,AGC)负荷分配系统、厂级母线电压控制系统、节能指标管理和煤耗上传等专用系统。如果这些系统与DCS连接采用传统的硬接线方式,会带来DCS、电缆和PLC设备的扩容以及建设费用的剧增。目前,与全厂机组DCS间的实时、双向、多点的数据通信已成为这类系统的配置主流。
云南电网省调火电厂发电机组投产于1995~2005年,大多配置了相对先进的DCS系统,包括美国艾默生的Ovation、美国美卓的maxDNA、日本日立的HIACS和国电智深的EDPF。上述DCS系统均提供了形式各样的数据通信接口方式,其中国电智深EDPF仅支持单向读取数据。有的机组老版本的DCS系统针对数据通信接口的支持并不完善,例如Max1000和Max1000 Plus系统。前者通过硬件Modbus主站模件的形式提供外接通信,数据量与通信速率皆有限制;后者尽管提供了API数据接口开发方式,但由于DCS令牌环网限制,这种跨DPU的大量数据通信会造成环网数据拥堵和传输缓慢等故障。
2010年,云南电网省调7家火电厂相继投运了厂级AGC负荷分配系统,将原来的单机AGC调度升级为全厂AGC调度方式。厂级AGC负荷分配系统与DCS间通信接口方案如图1所示。
图1 DCS通信接口方案Fig.1 Solution of DCS communication interface
系统经DCS数据接口采集全厂机组运行参数,通过机组性能计算、基于快速性与全厂经济性的优化分配,同时充分考虑到机组运行工况,发出全厂机组指令分配结果,由DCS协调控制系统调节负荷,以实现厂级AGC调度模式。该系统符合“统一调度、分级管理”的原则,在电厂的节能减排、优化运行中发挥着重要作用。其中DCS为美国美卓maxDNA系统。
①负荷分配工作站计算机
工作站计算机安装值长操作画面软件“力控”、机组性能计算软件、负荷经济性优化分配软件和DCS通信接口OPC服务器软件。通过DCS数据通信接口OPC服务器,全部机组运行信息汇集于“力控”实时库与画面。运行人员根据调度下达的全厂AGC总指令,按既定分配模式、策略和约束条件,向各机组下达分配后负荷指令。
②机组DCS系统Link站与历史站
DCS系统通常配备Link站、历史站、工程师站、操作员站和大屏显示站。maxDNA DCS通过软件背板(software backplane,SBP)机制完成DPU间和DPU与计算机间的网络通信,与分布式实时库的软件接口类似。SBP支持数据注册、同步读写、异步读写和异步例外报告回调等方式,通信效率较高。按功能与权限划分原则,DCS通信接口软件安装在历史站与Link站较为合适。又因为这些DCS计算机安装软件多且杂,可靠性较弱,需要不定期的重启维护,所以通信接口软件被开发成冗余OPC服务器,一个处于运行态的激活SBP通信,另一个处于备用态同步数据。
maxDNA外部通信接口开发属于API方式。安装maxDNA软件后,系统会注册一个ActiveX控件MCS SbpCtl,控件可直接插入Visual C++和Visual Basic开发的对话框(或视图面板)中使用[2]。Windows模板类库 (Windows template library,WTL)为 Visual C++ 内嵌开发平台,通常用于具有窗口界面com服务器的开发,使用方法与活动模板类库 (active template library,ATL)类似,而ATL通常开发的是没有窗口的dll或exe类型的com服务器。
WTL中控件的使用方法如下。
为提高通信效率,接口软件采用异步回调的变量读写方式。首先,通过控件的PutMaxTime和PutMin-Time配置最大与最小更新时间;其次,通过控件的FillDataObject函数向SBP注册读写变量;然后,数据变化超过死区或更新时间到达时,控件已注册事件响应函数OnDataUpdate被调用。该函数原型有八个Variant变量和注册点索引号被传回,但只有第一个变量有值,其余都为空。该函数调用时,变量名字符串BSTR同时被传回,即使没有用,也一定要用SysFreeString释放掉,因为该类字符串是堆空间构造、接收端释放的。DCS写入点命名为XX.ForcedVal(不区分大小写),相应功能块输入量选为.ForcedVal,功能块工作模式选择为自动。
HIACS DCS H-5000M通过通信站(communication interface station,CIS)提供外部通信数据接口。CIS完成DCS与其他多个系统(最多8个接口)的异步通信,允许对通信数据和参数进行组态,推荐使用Modbus/TCP 通信协议[3]。
Modbus是一种事实工业标准,广泛应用于制造业、电力、水电、冶金等工业领域中的数据采集和过程控制。从通信介质上,Modbus分为 RS-485总线与TCP/IP以太网;从协议帧格式上,Modbus分为远程终端(remote terminal unit,RTU)、ASCII和 TCP 三种协议。TCP协议数据传输数量大、效率高、使用广泛。Modbus/TCP 通信系统结构如图2 所示[4-5]。
图2 Modbus/TCP通信系统结构Fig.2 Structure of Modubs/TCP communication system
图2中,Modbus主站一般发起问题帧,是采用Modbus通信协议时通信的控制者,对于TCP来说,是客户端。
Modbus从站应答问题帧,是采用Modbus通信协议时通信的被动执行者,对于TCP来说,是服务器。Modbus/TCP 常用的 Modbus功能码有1、2、3、4、5、6、15和16,分别表示读线圈、读输入状态、读保持寄存器、读输入寄存器、写单个线圈、写单个寄存器、写多个线圈和写多个保持寄存器。15号和16号命令用于接口应用程序批量接收DCS数据,其帧格式与其他命令略有不同,如图3所示。
图3 Modbus/TCP协议15、16号命令帧格式Fig.3 The format of the 15thand 16thcommand frames in Modbus/TCP
其中,对于2字节数据,高字节在前,低字节在后。事务ID为顺序标志,2字节,Modbus协议标志为0。长度字段为后续帧字节长度,为7加实际数据区长度,除15、16号外,其余命令没有实际数据区长度字段,为6加实际数据区长度。线圈地址为1~10000,写寄存器地址通常为40001~50000,起始地址按0基地址相对量算。写入模拟量无论是浮点型还是16位整型,都应变换原有字节序,高字节在前,低字节在后。一个字节写8个开关量,按地址排序从低位起。Modbus帧形成后,利用winsock的send函数发送时,其函数参数“len”应配置为实际帧长度。
Ovation为美国艾默生过程控制公司的代表性DCS,广泛应用于国内超临界与超超临界大型火力发电机组的主机控制系统。Ovation使用Unix作为操作员站和工程师站,并将一台专用的Windows电脑作为OPC服务器与外界做通信接口。
DCS所有点都可通过OPC服务器对外发布。对于写入DCS的点,必须配置在OPC服务器上。OPC服务器重启后,其上配置的写入点会被重新初始化,不能恢复原有值,如其他控制器使用到这些点,需做数据保护,例如可以利用“心跳”信号逻辑,发现OPC服务器故障时,进行数据保持,待OPC服务器恢复后再重新选入。
OPC是国际工业标准,OPC规范把硬件供应商和软件开发商分离开来,在设备、数据库等数据源和客户之间架起了一座桥梁,提供了一种软件协议规范。管理这个标准的国际组织是OPC基金会,它是由一些世界上占领先地位的自动化公司与微软(Microsoft)紧密合作而建立的,成员有400多家,几乎所有电厂DCS供应商都参与其中。OPC规范主要包括OPC数据访问规范、OPC历史数据访问规范等。OPC数据访问规范用于从OPC服务器获取实时数据,应用广泛[6-9]。
OPC通信采用Server/Client架构,Ovation通信接口的开发主要就是OPC客户端的开发。OPC服务器通常支持两种类型的访问接口:自定义接口和自动化接口,它们分别为不同的编程语言环境提供访问机制,自定义接口适合VC++设计,运行性能优良。开发步骤如下。
①将OPC数据访问规范的头文件添加入VC++工程:opccomn.h,opccomn_i.c,opcda.h,opcda_i.c,opcda_catsid.c,opcEnum.h,opcEnum_i.c,opcenum_clsid.c。
②枚举指定计算机上的OPC服务器。首先使用CoCreateInstance(CLSID_OpcServerList,NULL,CLSCTX_LOCAL_SERVER,IID_IOPCServerList,(void**)&pOPCSvrList)或 CoCreateInstanceEx(CLSID_Opc-ServerList,NULL,CLSCTX_REMOTE_SERVER,pServerinfo,1,&mqi)创建接口 IOPCServerList实例;再使用EnumClassesOfCategories(1,&OPCDA_ImpList,1,&OPCDA_ImpList,&pEnum)创建 IEnumGUID 对象实例;最后通过IEnumGUID对象的next函数逐一获得所有服务器的CLSID,再调用ProgIDFromCLSID就获得了OPC服务器程序名。经过该步可确认OPC服务器的安装情况与服务器名。
③连接OPC服务器。首先调用CLSIDFromProgID,由程序名获得服务器的CLSID,然后利用CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,IID_IUnknown,(void**)&pUnknown)或 CoCreateInstanceEx(clsid,NULL,CLSCTX_REMOTE_SERVER,pServerinfo,1,&mqi),最终获得服务器的IUnknown接口指针。
④注册连接点关断函数。定义COPCShutdown,从IOPCShutdown接口派生,实现其关断回调函数。利用IUnknown的QueryInterface(IID_IConnectionPoint-Container)查询到连接点容器对象,再由容器的Find-ConnectionPoint(IID_IOPCShutdown)进一步找到关断回调的IConnectionPoint对象。然后通过连接点对象的Advise()将步骤②中的COPCShutdown对象的IUnknown接口告知服务器对象。
⑤创建OPC项容器——OPC组。利用步骤③中IUnknown的 QueryInterface(IID_IOPCServer)查询到OPC服务器对象指针,再调用AddGroup函数创建组,通过服务器对象的GetGroupByName获得组对象指针。
⑥向组中添加OPC项。首先OPC项对象按OPCITEMDEF结构数组组织。然后通过组对象再次获得组的IOPCItemMgt接口指针。IOPCItemMgt对象指针调用AddItems添加OPC项,函数返回OPCITEMRESULT中包含项在服务器中的句柄。
⑦同步读所有项。通过组的IUnknown接口找到IID_IOPCSyncIO接口,再用 CoTaskMemAlloc构造OPCHANDLE数组,并逐单元填入步骤⑥返回的项服务器句柄。接口的 Read()函数调用后返回的OPCITEMSTATE数组包含读回数据,根据其中的客户端句柄找到该数据,并正确赋值。
⑧注册数据变化等回调函数。定义COPCData-CallBack类,使其从IOPCDataCallback接口派生,实现数据变化、写结束、读结束回调函数。服务器注册方法同步骤④,找到IID_IOPCDataCallback接口指针,调用其Advise()完成注册。
⑨异步写OPC项。利用组接口指针找到IID_IOPCAsyncIO2接口指针,调用其Write()函数,传递事前构造的OPCHANDLE和VARIANT数组完成数据项异步写。
至此,当OPC服务器数据到达更新时间或数据变化超过死区时,会通过步骤⑨中的回调函数通知OPC客户端。OPC使用完毕后,应严格按以下顺序断开OPC连接。
①断开连接点。分别得到关断连接点和数据回调连接点指针,通过其Unadvise调用,注销连接点。
② 注销OPC组对象。切勿直接使用组对象的Rlease(),而应通过服务器对象的RemoveGroup函数传递服务器组对象句柄的方式来释放掉组对象。
③释放OPC服务器对象。调用服务器对象Release()函数完成。
此外,在开发OPC客户端时一定要注意内存释放问题。客户端堆中分配的内存和服务器函数返回的指针类型在使用完毕后必须通过CoTaskMemFree释放掉。通过QueryInterface查询到的接口指针在使用完毕后,必须通过Release减少引用计数。
北京国电智深控制技术公司生产的DCS系统EDPF,在国内也有较广泛的应用,其性能稳定,经过几次升级,组态软件也得到很大改善。EDPF通过历史站上的网关程序对外发布DCS数据点,用户通过专用Excel文件组态发送点,网关程序采用UDP无连接的发送方式,每个网关程序有固定的点数限制,但可以启动多个。UDP数据包格式如下。
UDP数据包接收程序开发方法很多,MFC下最简单的方法就是直接从CAsyncSocket类继承,依次经过其Create()创建socket、Connect()连接对端等步骤,最后从其OnReceive()回调函数中就能接收到UDP数据包,再按其包格式进行解析。EDPF的UDP网关发送软件需要注册运行,一台历史站可以运行多个这种程序。
HIACS DCS也定义了这种UDP发送程序,不过与SIS站的Modbus/TCP接口软件相比,它是单向的。它通过操作员站 (process operation control,POC)和历史站上的CoreView软件添加发送点,配置发送周期(最小为2 s)、接收方IP地址以及端口号。
配置完后,需要启动managnet.exe开始发送。对于本地通信,发送数据报大小最好限制在8 kB以内,模拟量数据包格式如下:包头标志符(1字节)、包数量(1字节,分次传送包总量+1)、传送的数据类型数(1字节)、分次传送序号(1字节)、机组单元号(1字节)、传送的数据类型(1字节)、接口号(1字节)、包类型标志‘A’(1字节)、‘A’数据长度(2字节,模拟量字节数)和模拟量数据区(模拟量float类型)。开关量包类型标志为‘D’,数据区内8个开关量点占一个字节。
DCS通信接口程序是开展数据采集、运行指标计算与考核、电厂运行优化、机组负荷分配等工作的基本条件。由于篇幅所限,本文结合实际工程总结了四类分散控制系统数据通信接口实现方案与软件开发的关键技术问题。
OPC作为标准化的技术规范,应将DCS通信接口软件开发成OPC服务器,从而直接与第三方监控软件或应用软件互连互通。基于本文方案和原理开发的DCS OPC服务器已在7个电厂的厂级AGC系统中得到应用,具有运行稳定、可靠和占用资源少等优点。
[1]翟伟翔,刘友宽,苏适,等.火电厂厂级负荷优化分配系统研制[J].电力自动化设备,2011,31(3):126 -130.
[2]美国美卓公司.Visual Basic and MCSSbpCtl user reference manual[EB/OL].[2011 -02 -16].软件安装目录McsmaxDOCSAppsDocsMAXSbpCtl.html.
[3]日本日立控制系统有限公司.HIACS系统CoreView对外通讯组态工具使用说明书[EB/OL].[2011-02-18].http://wenku.baidu.com/view/4169bc8371fe910ef12df806.html.
[4]白焰,钟艳辉,秦宇飞.基于VC的Modbus协议通信测试软件的实现——Modbus串口通信与Modbus/TCP通信[J].现代电力,2008(6):64-67.
[5]汪义旺,崔鸣,祁春清.RS-485/Modbus在FFU控制系统中的应用[J].自动化仪表,2010,31(6):39 -41,44.
[6]陆凤兰.OPC标准通信接口在电厂辅控系统集成中的应用评论推荐[J].华东电力,2006,34(10):34 -37.
[7]王树东,董蕾,刘旭东,等.OPC技术在城市污水处理中的应用[J].自动化仪表,2010,31(5):52 -54,58.
[8]陆会明,邓慧,张智光.实现电站DCS开放性的OPC开发方案[J].电力自动化设备,2007,27(7):95 -97.
[9]卢湛.火电厂辅控系统的集成与应用[J].自动化仪表,2010,31(2):43-46.