, ,
(华北电力大学 控制与计算机工程学院,河北 保定 071003)
基于Qt平台的OPC服务器的开发及仿真应用
黎邦腾,梁薇,马平
(华北电力大学控制与计算机工程学院,河北保定071003)
OPC(OLE for Process Control)技术自1996年被提出,就迅速在自动化领域得到了广泛的应用;它为工业控制软件与硬件之间的交互定义了一个标准的接口,使得工业软件及硬件之间的通讯变得非常便利;针对这个特点,提出了一种将OPC服务器作为“中转站”的仿真方案,即两个或多个支持OPC客户端功能的应用程序将OPC服务器作为“中转站”,实现程序间的相互访问与控制;采用OPC开发工具包方式开发OPC服务器,并且在Qt平台实现;这摒弃了传统的基于MFC平台开发模式,充分利用了Qt在界面设计上的优势;最后利用Matlab建立了两个Simulink工程作为OPC客户端进行仿真测试,实现了两个客户端之间通过“中转站”完成信息交互;测试结果控制效果与预期一致,验证了本方案的可行性。
OPC服务器;OPC开发工具包;Qt平台;仿真测试;OPC客户端
随着计算机技术和自动机技术的迅猛发展,越来越多的智能设备应用到了工业现场中,给我们提供了更多的现场信息。但是,在这种需求下,一个控制系统可能包含几十种或者更多的来自不同厂商的智能设备,这些设备遵循各自通讯规范,只能与特定的应用软件通讯,使得计算机内部应用程序与现场设备之间进行信息沟通和传递变得非常困难[1-2]。正是在这种背景下,一个工业标准 OPC技术规范被制定了出来[3]。OPC技术在应用程序与设备之间建立起了一道桥梁,使得各工控软件之间的信息交互非常方便,极大的提高了系统的互操作性和适应性。本文提出了一种将OPC服务器作为“中转站”的仿真方案,即通过OPC技术实现不同应用程序之间的相互访问与相互控制。因此,该文首先介绍了一种在OPC开发工具包WTOPCSvr.DLL的基础上开发OPC服务器软件的方法。
传统上的OPC服务器或者客户端主要基于MFC实现。MFC执行代码效率高,并且目前技术也比较成熟,但是它固有的架构使得MFC去实现一个相对美观灵活的用户界面就会变得很繁琐。因此,该软件采用Qt实现,摒弃了传统的MFC平台开发模式,充分的利用了Qt在界面开发上的优势。最后,利用matlab建立了两个simulink工程作为OPC客户端进行仿真测试,验证了利用OPC服务器作为中转站,实现不同应用程序之间相互访问和控制这个方案的可行性。
OPC是一个工业标准,它采C/S模式,即OPC服务器与硬件通讯由厂商负责,工业软件通过OPC客户端与OPC服务器建立连接,而不再与设备直接通讯,把软、硬件开发彻底分开。这样,一方面硬件开发商仅仅需要将硬件设备驱动程序和通信程序封装成独立的OPC服务器,当硬件升级时只需要更新对应的驱动程序,而不会对OPC接口产生任何影响。另一方面应用程序软件开发商不必关心设备与OPC服务器如何通信及通讯接口之间的兼容性问题,他们只需要遵循OPC数据协议,开发相应OPC客户端就能从OPC服务器获取相应的数据[4]。图1所示为采用OPC技术之后工业控制软件与硬件设备之间的通讯框架示意图。
图1 工业控制软件与硬件设备之间的通讯框架
为了满足多种系统和设备之间的通信需求,OPC定义了一系列规范,如OPC数据存取(data access)规范、OPC报警与事件(alarm and event)规范和OPC历史数据存取(historical data access)规范等。不同类型的服务器和客户端程序对应不同的规范,本文主要介绍OPC数据存储规范和数据存取服务器的开发[5]。
OPC数据存取规范是OPC基金会针对现场设备的在线数据存取制定的一个工业标准,它主要定义了OPC DA Sever (数据存取服务器)。OPC DA Server主要由3个对象组成:服务器对象(server object)、组对象(group object)和项对象(item object)[6]。图2所示为OPC DA Server的组成模型。
图2 OPC DA Server的组成模型
如图2所示,OPC服务器对象管理服务器的所有组信息,它是OPC组对象的包容器,能够完成组对象的添加和释放。在一个OPC服务器对象中,允许包含一个或者多个OPC组对象。OPC组对象管理本组的所有信息,并提供了组织和管理项的机制,从逻辑上实现对OPC 项对象的管理。OPC组包含Name(组的名字),Active(组的激活状态标志),Update Rate(刷新速率)和Percent Deadband (数据死区)。客户端程序可以设置组对象的死区、刷新频率和需要组织的项。OPC项对象表示了OPC服务器到数据源的连接,它是读写数据的最小逻辑单位,它包括了值、品质、时间戳3个基本属性。其中,数据值以 Variant 形式表示,品质代表了数值的可信度,时间戳则代表了数据的存取时间[2]。OPC项对象不能直接被访问,所有对OPC项的操作都需要通过该项隶属的组来完成。
目前,OPC服务器开发主要有通过MFC提供的COM支持开发OPC服务器、通过ATL开发OPC服务器和通过开发工具开发OPC服务器3种方式。
MFC采用面向对象的方式将COM的基本功能封装在若干的C++类中,能够深入的掌握 COM 内部技术细节等特点。但是要从底层开始编写代码,工作量大,工程也非常复杂。ATL 同样需要对 COM 机制有非常深入的理解。因此,不管MFC还是ATL,都会使得整个开发过程变得异常困难,不易实现。本文采用的是第三种方法,通过工具开发OPC服务器。它大大简化了OPC服务器的开发过程,缩短开发周期,开发人员不用了解COM知识和OPC规范,仅仅需要调用相应的API函数就能完成OPC服务器的开发[7]。
软件基于VS2010+Qt平台实现,摒弃了传统的MFC开发模式,充分发挥了Qt在界面设计上的优势。Qt是一个跨平台C++图形用户界面应用程序开发框架,建立了信号(SIGNAL)和槽(SLOT)机制。利用SIGNAL可以实现任意参数的传递,这与MFC中纷繁芜杂的消息相比,Qt对事件的处理更加的自由灵活。在界面处理上,Qt完全从MFC的各种条条框框束缚解放出来,可以灵活地使用视图和组织控件。
软件是在WTOPCSvr.DLL工具包的基础上完成的,WTOPCSvr.DLL是以DLL形式提供的一个OPC服务器快速开发工具。WTOPCSvr.DLL将COM和OPC处理的所有细节封装起来,用户不用去关心底层接口的实现,仅仅通过调用几个API函数就能快速地开发出自己的OPC服务器[8]。基于这个平台,使得整个OPC开发过程就变得非常简单。整个OPC服务器的系统框架如图3所示。
图3 OPC服务器开发系统框架
因为该软件侧重点是建立一个“中转站”,实现两个OPC客户端之间的通信。因此,并不需要考虑服务器对象接口与设备驱动部分,所有数据的交换都是两个客户端之间发起的。当OPC服务器起来完成初始化后,用户就可以创建相应的标签,不同的OPC客户端通过访问该服务器,就可以实现两个客户端之间的信息交互。
2.3.1 OPC服务器核心功能实现
OPC服务器的开发主要有以下主要步骤:
1) 调用UpdateRegistry注册OPC服务器。
该函数的原型是:BOOL WINAPI UpdateRegistry (BYTE *pCLSID_Svr, LPCSTR Name, LPCSTR Descr, LPCSTR ExePath),其中参数pCLSID_Svr是服务器的类标识,这是唯一的。参数Name指定了服务器的名称。参数Descr是对服务器的描述,而参数ExePath则定义了可执行程序的完整路径。
2)调用InitWTOPCsvr完成开发包初始化。
该函数原型:BOOL WINAPI InitWTOPCsvr (BYTE *pCLSID_Svr, UINT ServerRate),其中参数pCLSID_Svr含义同上,参数ServerRate定义了客户的数据刷新速率,单位是毫秒。该函数实现了对DCOM的初始化和OPC服务器对象的创建。
3)注册回调函数。
WTOPCSvr.DLL为用户提供了很多回调函数,方便服务器与客户端之间的事件处理。当特定的事件或者调解发生时,服务器及时响应客户端的操作,这是非常方便的。以函数EnableWriteNotification为例。
该函数原型: BOOL WINAPI EnableWriteNotification (WRITENOTIFYPROC lpCallback, BOOL ConvertToNativeType)。这个函数定义了当OPC客户端些一个已定义的标签时,函数会产生一个来自DLL的调用返回。展开类型WRITENOTIFYPROC的定义:typedef VOID (CALLBACK* WRITENOTIFYPROC)(HANDLE, VARIANT*, DWORD*)。它实际定义了一个函数指针,用户调用EnableWriteNotification函数传入对应函数的指针,当客户端修改标签时,会立即响应该函数,服务器可以对事件进行处理。
4)创建标签和移除标签。
完成相应的准备工作后,就可以调用CreateTag函数创建标签了。
该函数原型:HANDLE WINAPI CreateTag (LPCSTR Name, VARIANT Value, WORD InitialQuality, BOOL IsWritable)。其中参数Name指定了创建的点名,它可以是任何文本字符串,也可以使用分层名字,中间用“.”分隔,如group.item。前者属于扁平结构,后者属于多层结构。参数Value定义了标签的初始值,参数InitialQuality则定义了标签的属性,参数IsWritable指定了标签是否可写。标签一旦被创建,它就能够在任何一个客户端中参数列表中被检索到。
与CreateTag相对应的就有RemoveTag函数,它用于标签的移除。其函数原型:BOOL WINAPI RemoveTag (HANDLE TagHandle),参数TagHandle是一个句柄,即调用CreateTag创建标签时返回的句柄。值得注意的是,标签被移除后,该标签就不能够在客户端的参数列表中检索到了,但是已连接的这个标签仍然有效,只不过没有新的数据来刷新该标签了。对于标签操作比较重要的API函数还有UpdateTag、UpdateTag-WithTimeStamp等,这里就不再一一介绍。
5)注销及关闭服务器。
服务器注销需要调用辅助函数NumbrClientConnections获得当前连接到服务器的客户数,在有客户端连接的情况下,服务器应该不允许被注销。只有在服务器需要关闭时,程序才会调用RequestDisconnect函数请求所有客户端断开连接。最终服务器调用函数UnregisterServer 完成注销。该函数原型:BOOL WINAPI UnregisterServer (BYTE *pCLSID_Svr, LPCSTR Name),其中参数pCLSID_Svr、Name均与UpdateRegistry函数中的pCLSID_Svr、Name一致。在关闭服务器时还需要调用UninitWTOPCsvr函数,完成资源的释放。
2.3.2 OPC服务器界面实现
OPC服务器界采用Qt实现。Qt引入了模型/视图框架完成数据与表现的分离,这来源与经典的MVC三层结构。M即模型(Model),表示数据;V即视图(View),表示用户界面;C即控制(Controller),定义了用户在界面上的操作。通过使用MVC模式,有效地分离了数据和用户界面,使得设计更加的灵活。而在Qt中,应该叫“MVD”模式了。在Qt中没有Controller的说法,而是使用了代理(delegate)概念。通过使用代理,能够自定义数据条目的显示和编辑方式。其结构如图4所示[9]。
图4 “MVD”模式结构
这种模式使得用户对数据的处理变得非常方便。用户可以自己定义模型,对数据进行灵活的处理,当底层数据源发生改变,只需要处理Model就可以了。
该软件界面正是基于此种模式完成。用户进行添加、修改、删除对应标签后,程序通知Model数据发生变化,从而迅速更新内部数据存储,然后发出信号通知View数据改变。在模型中的条目有不同的角色,这样可以在不同的情况下提供不同的数据。该软件中视图中行颜色交替的变化正是修改了Qt::BackgroundRole角色。如图5所示是该软件的最终显示界面。
图5 软件界面
图6 PID控制组
图7 控制对象组
程序首先使用QLocalSocket了保证在一台机器上只允许运行一个实例。然后启动定时器,实时刷新数据列表,更新当前客户端的连接状态。最后通过API注册了相应的回调函数,积极响应客户端的操作,及时更新服务器界面状态。当用户操作或者客户端的操作引起数据变化时,Model会立即通知View更新视图状态。
基于此界面,用户能够实现服务器注册、服务器注销、添加参数、修改参数和删除参数等功能,非常便利。
为了验证本OPC服务器的功能,我们选取了某300 MW热电机组主汽温控制系统进行测试[9]。系统导前气温控制对象为:
主汽温控制对象为:
采用串级控制系统,主、副控制器均使用PI控制。分别取δ1=1.51,Ti=202,δ2=0.55,Ti=48.6,利用simulink搭建仿真平台如图6、图7所示。
其中图6为PID控制组,图7为控制对象组,PID控制器与控制对象的交互通过OPC服务器完成。整个测试步骤如下:
1)启动OPC服务器,分别添加浮点型标签Group0.e1,Group0.e2,Group0.u1和Group0.u2作为两个PID控制器的输入输出。
2)在PID控制器组添加OPC读写模块,并且分别设定PID控制器1的输入读取的是标签Group0.e1的值,输出写入到标签Group0.u1中;PID控制器2的输入读取的是标签Group0.e2的值,输出写入到标签Group0.u2中。同时设定两个OPC读取模块的采样时间和simulink仿真步距均为3 s,保证仿真的实时性。
3)同理,往控制对象组添加OPC读写模块,并与对应的标签绑定。
4)设定仿真时间为1 500 s,运行仿真程序。
如图8所示可以看到,当前OPC服务器状态栏显示有2个客户端连接,即PID控制器组和控制对象组,消息对话框准确地打印我们的操作记录。
图8 服务器界面
等待1 500 s,程序运行结束,最终仿真结果如图9所示。
图9 仿真结果
可以看到,在PID控制作用下,导前气温与主汽温在1 100 s左右趋于稳定,主汽温达到了期望值。这与实际情形相符,验证了本方案的可行性。
OPC技术为设备集成提供了一个新的解决方案,它把硬件供应商和应用软件开发者分离开了,大大简化了设备之间的复杂通讯过程。本文简单介绍了OPC技术,详细的分析了基于WTOPCSvr.DLL 工具包开发OPC服务器的过程,并结合Qt在界面设计上的优势,开发了一款用户界面友好的OPC服务器,提出了一个将OPC服务器作为中转站,实现OPC客户端之间的通讯方案。本文最后给出了该OPC服务器在仿真上的应用,验证了方案的可行性。同样,在完成相应的COM配置后,利用OPC的远程访问功能,就可以实现两台计算机中任意支持OPC客户端服务的应用软件之间的相互通讯。接下来,为OPC服务器完善更多的功能,如实现历史数据查询,历史或实时曲线查看及支持参数越限报警等诸多功能将是下一步研究的方向。相信随着OPC 技术的推广和应用, OPC技术必将会被应用到更加广泛的领域。
[1] 朱耀春, 陆会明, 张永庆. OPC数据服务器的开发与测试[J]. 现代电力, 2003, 20(6): 63-66.
[2] 邹云涛, 吴重光. OPC技术初探及国内应用现状[J]. 石油化工自动化, 2003(6): 1-5.
[3] 戚中奎, 林果园, 孙统风. OPC数据访问服务器的研究与实现[J]. 计算机工程与设计, 2011, 32(4): 1517-1520.
[4] 纪强君, 唐秀昆, 曹长修. 基于Visual C++的OPC客户端实现[J]. 计算机应用, 2007, 26(4): 70-73.
[5] 凌志浩, 陈伟彬, 马 欣,等. 基于OPC数据存取规范的服务器研究与实现[J]. 华东理工大学学报, 2004, 30(3): 318-321.
[6] 张庆军. OPC及OPC服务器的设计与实现[A]. 智能检测控制技术及仪表装置发展研讨会论文集[C]. 上海: 上海自动化仪表股份有限公司技术中心, 2007.
[7] 王 平, 李大庆, 王 颋. OPC服务器开发工具包软件的设计与实现[J]. 计算机工程, 2009, 35(22): 275-277.
[8] 陈丹丹, 钱 美, 夏 立, 等. OPC服务器开发的几种方法[J]. 微计算机信息, 2006,22(6): 28-29.
[9] 蔡志明, 卢传富, 李立夏,等. 精通Qt 4编程[M]. 北京:电子工业出版社, 2008.
[10] 韩 璞, 董 泽, 王东风,等.智能控制理论与应用[M]. 北京:中国电力出版社, 2012.
[11] 刘暾东, 余齐齐, 柳小鹏. OPC服务器软件开发及在DCS中的应用[J]. 化工自动化及仪表, 2007, 34(1): 46-48.
[12] 乔加新. OPC客户端与OPC服务器的交互方式的研究[J]. 信息技术, 2005(8): 122-124.
[13] 张 河, 鲁五一. OPC客户端与实时数据库通信的实现[J]. 计算机工程与科学, 2008, 30(5): 81-83.
[14] 王 杰, 高昆仑, 朱晓东. OPC通讯技术在可视化界面监控系统中的应用研究[J]. 计算机测量与控制, 2012, 20(1): 74-77.
[15] 李安伏, 崔亚量.基于OPC的Matlab与组态王的数据通信[J]. 电力自动化设备, 2007, 27(7): 113-115.
[16] 胡开明, 傅志坚, 葛远香. 基于OPC与组态技术的自动控制实验教学仿真平台开发[J]. 实验技术与管理, 2013, 30(6): 50-53.
[17] 李二超, 李 炜, 李战明,等. 基于OPC技术的网络控制系统仿真平台设计[J]. 实验技术与管理, 2012, 29(6): 90-93.
DevelopmentandSimulationApplicationofOPCServerBasedonQtPlatform
Li Bangteng, Liang Wei, Ma Ping
(School of Control and Computer Engineering, North China Electric Power University, Baoding 071003,China)
OPC(OLE for Process Control) technology has been widely used in the field of automation since it was put forward in 1996. It defines a standard interface for the interaction between industrial control software and hardware, which makes the communication very convenient. For this feature, a scheme of OPC server as “transfer station” is proposed, that is, two or more applications that support OPC client functionality consider the OPC server as a “transfer station” to implement mutual access and control between programs. The development of OPC server uses the way of OPC development toolkit, and it is implemented on Qt platform. It makes full use of the advantages of Qt in the interface design, abandoning the traditional MFC platform development mode. Finally, in order to demonstrate the function of two clients completing the information interaction through the “transfer station”, we use matlab to build a two simulink project as an OPC client for simulation testing. The test results are consistent with the expected results, which verify the feasibility of the program.
OPC servers; OPC development kit; Qt platform; simulation testing; OPC client
2017-04-18;
2017-05-23。
黎邦腾(1991-),男,湖南郴州人,硕士研究生,主要计算机应用方向的研究。
马 平(1961-),女,湖南长沙人,教授,硕士研究生导师,主要从事计算机原理及应用方向的研究。
1671-4598(2017)11-0154-05
10.16526/j.cnki.11-4762/tp.2017.11.039
TP311
A