新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 基于Modbus TCP的OPC服务器设计

基于Modbus TCP的OPC服务器设计

作者:时间:2017-06-12来源:网络收藏

由于目前广泛应用的DCS、FCS、SCADA 等传统计算机测控系统使用的智能仪表设备、分布式I/O模块、 等设备来自于不同的生产商,而各生产商为了各自的商业利益,没有遵循统一的接口规范,造成了设备之间的通信异常复杂,难以实现现场设备与上层控制软件间的信息交互和各现场设备间的直接互联与互操作,因此限制了计算机测控系统开放性、通用性的提高。

本文引用地址:http://www.eepw.com.cn/article/201706/352942.htm

OPC(OLE for Process Control,用于过程控制的对象链接和嵌入)技术为解决工业客户机与各种设备间通讯而产生的一项工业技术规范和标准。OPC 技术规范是OPC 基金会制定的,它提供了统一的软硬件接口,将现场信号按照统一的标准与SCADA(监控与数据采集系统),HMI(人机接口)等软件无缝连接起来,同时将硬件和应用软件有效地分离开。只要硬件开发商提供带有OPC接口的服务器,任何支持OPC接口的客户程序均可采用统一的方式对不同硬件厂商的设备进行存取,无须重复开发驱动程序,因此大大提高了控制系统的互操作性和适应性。


OPC技术


1.OPC核心基础


COM主要是为了实现软件复用和互操作,并且为基于Windows的应用程序提供统一的、可扩展的、面向对象的通讯标准,DCOM是COM技术在分布式计算领域的扩展,支持在局域网、广域网甚至因特网上不同计算机的对象之间的通讯。


OPC技术是COM在工业领域的一种特殊应用,实质上,OPC规范就是定义了一些用于、事件报警处理、历史等的COM对象和接口。


2.OPC DA规范


OPC DA规范是整个OPC协议族中的核心和基础,所有的其他OPC规范都以OPC DA规范为基础进行扩展而来。对于高敏感度的实时数据,将其从实时数据中分离,提出报警/事件的概念,制定了专门的OPC报警事件(OPC Alarm and Events)接口规范;对于面向趋势显示、历史分析、报表的数据,OPC制定了历史数据访问(OPC Historical Data Access)接口规范。其他的OPC规范还包括OPC安全处理(OPC Security)接口规范、OPC批处理(OPC Batch)接口规范,OPC XML数据访问(OPC XMLDA)规范,OPC数据交换(OPC Data Exchange)规范等。


在过程控制系统的架构中,整个系统以OPC DA服务器为中心,OPC AE服务器从OPC DA服务器上得到实时数据,并根据客户的设置进行逻辑分析,产生相应的事件和报警信息发送到客户端;OPC HAD服务器将从OPC DA服务器上获得的实时数据按照客户要求进行保存,便于客户端进行查询和分析数据的变化情况;OPC DX服务器将多个OPC DA服务器的数据组织起来,根据需要进行各个OPC DA服务器之间的数据交换:XML DA服务器将OPC DA服务器上的数据转换成XML文本,并发布到互联网上,实现数据更大范围内的共享;OPC Security服务器则对整个数据层的数据加上了一层安全保护。


实际应用中也主要是以OPC DA规范、OPC AE规范和OPC HDA规范应用最为广泛,尤其是OPC DA规范。因此通常提到的OPC服务器和客户端都是指OPC DA服务器和OPC DA客户端。


Modbus TCP OPC服务器的设计与实现


1. 总体结构


本文实现的OPC数据访问服务器要完成对Modbus设备的数据采集功能,提供OPC数据存取规定的定制接口,同时通过数据存取区将设备数据与OPC接口联系来。如图1所示的OPC数据存取服务器总体结构,各个功能模块相对独立又相互协作,形成了一个有机整体。


图1:OPC数据存取服务器总体结构。


本文设计的OPC数据存取服务器拥有独立的进程空间,与客户进行数据交换时稳定性高,同时提供了用户友好的人机界面,便于用户的自定义组态操作;硬件设备通讯模块实现了标准的MdbusTCP通讯协议,可以实现与标准的设备无缝互联通信,简单方便地获取硬件设备的过程数据。


2. OPC接口模块


OPC接口模块包括OPC对象部分和数据存储区部分,基于组件化的设计思想,可以设计成将COM和OPC技术细节隐藏,使得用户将开发OPC数据采集服务器的工作集中在特定的数据采集任务上。

本文采用了OPCMaster的OM_OPCSvr.dll OPC接口动态库工具来实现OPC接口模块部分,OM_OPCSvr.dll完全支持OPC数据存取规范的所有版本,包括最新的DA 3.0版,它通过提供API函数完成OPC接口模块的任务。其结构如图2红色虚线所示。


图2:OPCMaster OPC接口动态库工具结构。


OPC服务器初始化管理:通过调用InitOPCSvr(byte *pSvrCLSID,bool bExeSvr,DWord dwCoInit)来对的OPC服务器的CLSID、程序应用模型和初始化COM库的线程模式进行初始化设置。通过调用SetServerRate(DWord dwServerRate)设置OPC服务器端向客户端最快回调速率。通过调用SetVendorInfo(LPCWSTR lpVendorInfo, WORD wMajorVersion, WORD wMinorVersion, WORD wBuildNumber)设置Vendor及OPC服务器版本信息。


通过调用SetServerDelimiter(WCHAR cDelimiter)设置服务器标签ID的分隔符,在这里我们设置cDelimiter为”.”。 通过调用SetCaseSensitivity(BOOL bOnOff = FALSE)设置OPC服务器端地址空间是否区分大小写,在这里我们设置bOnOff=True,即区分地址空间大小写。


OPC回调数据通信管理:在这里主要设置三个回调函数,分别是读设备数据回调函数、写设备数据回调函数和客户端连接或断开回调函数。


回调函数声明分别如下:

/// 从设备读数据tag回调函数

void ReadNotificationHandler(IntPtr hTag, out object Value, out UInt16 Quality, out System.Runtime.InteropServices.ComTypes.FILETIME Timestamp, out Int32 DeviceError)

/// 向设备写数据Tag回调函数

void WriteNotificationHandler(IntPtr hTag, ref object Value, ref UInt16 Quality, ref System.Runtime.InteropServices.ComTypes.FILETIME Timestamp, out Int32 DeviceError)

/// 客户端连接或断开回调函数

void ClientConnNotificationHandler(UInt32 Num, bool bConnect)


声明完回调函数后,需要调用使能回调函数EnableDeviceRead、EnableDeviceWrite和EnableClientConnNotify分别对上述3个回调函数使能,完成回调函数设置。

OPC服务器注册管理:通过调用int RegisterOPCServer(byte[] pSvrCLSID, string lpProgID, string lpDescription, string lpVendor, string lpFilePath)完成对OPC服务器的注册,以便OPC客户端通过注册表搜索到本机或本网络内的OPC服务器。


通过调用int UnregisterOPCServer(byte[] pSvrCLSID, string lpProgID)完成OPC服务器的注销功能。


3. 通信驱动模块

是Modbus协议的网络协议,TCP端口号为502。由协议头MBAP、功能码和数据域组成,协议格式如图3所示。


图3:基于ModbusTCP协议的请求和应答格式。


MBAP(Modbus Application Protocol)协议头的主要功能时对Modbus应用数据单元ADU的标识。其详细内容见表1。


表1:MBAP协议头。


功能码主要功能是标识请求什么类型数据,本通讯驱动模块主要使用6种标准的Modbus功能码,其详细内容见表2。


表2:Modbus功能码。


Modbus TCP消息帧通过TCP网络协议进行传输,因此借助Dot Net 4.0平台的Socket类定义封装了一个TcpSocket TCP通信类,通过此类可以完成TCP连接断开、发送接收数据和发现断开自动重连功能。


本Modbus TCP协议通信驱动模块属于Modbus Slave,需要对设备返回的Modbus TCP消息帧进行MBAP验证、请求数据获取。图4是对设备进行读取数据的流程。


图4:设备通信驱动模块读取设备数据流程。


4. 用户界面


OPC服务器的用户界面将数据项用树形结构标识,然后设计数据项和硬件设备的数据绑定设置的界面以及实时显示数据项列表界面,并将数据存储区与硬件通信接口联系起来,实现用户自定义组态功能。在OPC服务器程序关闭时需要将数据项的属性以及硬件设备设置参数作为组态配置文件保存起来,便于下次OPC服务器运行时能自动调入组态配置文件,自动完成初始设置。


主窗口:主窗口是OPC服务器程序的起始点,主要完成OPC服务器的初始化。主窗口是所有界面元素的组织容器,主要包括菜单栏、工具栏 、设备树形列表 、标签列表、信息列表和状态栏,如图5所示。


图5:用户界面。


添加设备:此处的设备是实际物理设备的一个逻辑引用,通过此逻辑设备设置与实际设备的通信参数及相关属性。点击菜单“添加?添加设备”,则打开设备属性设置对话框,如图6所示。用户可以设置相关参数。


图6:设备属性设置对话框。


添加组:组是包容设备中一组同类型数据的容器,只需要设置其名称即可。点击“添加?添加组”,则打开设置组属性对话框,如图7所示。用户可以设置组名称。


图7:组属性设置对话框。


添加数据标签:数据标签是实际物理设备中数据的逻辑抽象,且进行了OPC数据封装。点击菜单“添加?添加标签”,打开Modbus TCP设备数据标签属性设置对话框,用户根据实际设备情况,设置数据点名称、地址、数据类型、寄存器类型等属性,如图8所示。


图8:Modbus设备数据标签属性设置对话框。


根据实际需要重复“添加设备-添加组-添加数据标签”流程,配置好所需要存取的设备数据点。


组态配置文件:在OPC服务器程序关闭时需要将数据项的属性以及硬件设备设置参数作为组态配置文件保存起来,便于下次OPC服务器运行时能自动调入组态配置文件,自动完成初始设置。本文利用DotNet 4.0的序列化和反序列化技术,可以将数据对象序列化到文件中和将文件反序列化到数据对象。


轮询设备线程:经过组态配置好数据点后,运行OPC服务器,开始轮询设备并将实时获取的数据更新到数据缓冲区内,如图9所示。


图9:更新数据详细流程。


本文小结


鉴于Windows在工控领域的成熟度和稳定性,以及Dot Net FrameWork的跨平台性,本文基于Dot Net4.0平台封装了OPC接口,编程实现了ModbusTCP通信协议以及良好的人机交互界面,通过了功能测试和性能测试,500ms轮询周期可稳定高效地读写千点设备数据,目前国内外SCADA系统中的OPC客户端接口可以利用本OPC轻松实现与北京世纪联信公司MultiBus-RTU等产品的互联通信。


本OPC数据存取服务器目前实现的主要功能和特点包括:支持OPC 数据存取规范1.0、2.0和3.0;友好的人机交互界面;自定义组态及保存组态配置;支持标准的ModbusTCP通信协议;基于Dot Net4.0平台,可以跨平台运行;易与主流的SCADA软件平台互连通信。



关键词: 数据访问 ModbusTCP PLC

评论


相关推荐

技术专区

关闭