宋志刚,蔡伟周,李剑波,胡 阳,陈 佳,张 昆
随着计算机技术、通讯技术及软件技术的发展,大量采用不同通讯协议的智能设备或系统被广泛应用于工业现场。为了实现这些使用不同通讯协议的设备或系统之间信息互联互通,人们设计了多种协议转换方法,如:比特型固定格式数据协议通用转换方法[1]、参考编译原理的通讯协议转换方法[2]、基于特征关键字的协议转换方法[3]、基于通用协议模版的协议转换方法等[4]。文献[5]设计了一种基于WEB的数据采集与监控系统。本文设计了一种基于组件式[6-7]软件平台架构的通用协议转换器,具有良好的灵活性、可维护性和扩展性。为叙述方便本文将以MODBUS协议为例介绍该协议转换器的软件设计。
通用协议转换器的硬件使用嵌入式工业计算机MOXA UC系列来实现,具有2个10/100M LAN口和8个RS232/422/485可配置串口。CPU选用IXP-422,板上配置128MB DRAM和32MB FLASH。操作系统选用嵌入式uC⁃Linux[8]。
协议转换模块的软件系统应满足如下功能需求:
(1)适用于多种标准协议,包括但不限于MODBUS/RTU、MODBUS/TCP、IEC104等;
(2)支持用户自定义协议;
(3)支持多个通道同时进行通讯;
(4)可以适应各种对接设备的不同通讯速率,且不同通讯通道不会互相拖慢处理速度;
(5)可以通过远程工具配置端口通讯参数,配置文件可以上传下载;
(6)可以在远程监视到各个通讯通道的报文收发,并可记录系统日志;
(7)预留开发接口,允许用户使用编程语言针对特定协议进行自主开发;
(8)部分通讯端口故障不影响整体运行;
(9)支持对用户身份及权限的校验和管理。
为了使协议转换器具有良好的可扩展性,通用协议转换器的软件系统采用组件式架构,包括:协议转换器主服务程序(下简称主服务程序)、协议通讯组件(下简称通讯组件)和远程监视及配置工具(下简称监视配置工具)。主服务程序与监视配置工具构成客户端/服务器(C/S)结构。
主服务程序运行于协议转换器的uCLinux系统之下,随操作系统自启动,负责根据配置文件加载通讯组件,并提供协议转换服务。同时,主服务程序也负责响应监视配置工具的命令请求,完成系统配置的上传、下载、备份以及对各个端口通讯状态的监视功能。为了节约系统资源,主服务程序采取单一进程多个线程的方式提供通讯及系统管理服务。
通讯组件采用动态链接库(.SO文件)方式实现,用于实现与协议转换器某一端口所连接的设备实现数据通讯。在主服务程序启动后被动态加载。
监视配置工具运行于与协议转换器处于同一网络下的某台工作站上。该工作站操作系统采用WINDOWS系列。监视配置工具与协议转换器之间的命令交互及通讯监视功能采用TCP协议实现。
协议转换器件系统软件逻辑结构如图1所示。
图1 协议转换器件系统软件逻辑结构
监视配置工具作为客户端运行于同一网络内的某WINDOWS系统计算机上。监视配置工具与协议转换器之间通过TCP协议传递配置命令及被监视端口的实时通讯数据。
监视配置工具采用分层式架构、模块化设计,使用C++语言进行开发。
2.2.1 逻辑结构设计
如图2所示,监视配置工具软件分为三个逻辑层次,分别为界面层、业务层、通讯服务层。业务层划分为三个功能模块,包括用户管理模块、器件配置管理模块、端口通讯监视模块。
图2 监视配置工具逻辑结构
业务层的用户管理模块主要实现用户登录验证,用户权限判断,新用户创建,用户身份配置,用户密码修改等功能。
器件配置管理模块用于对端口的配置,包括端口的通讯参数、通讯协议、数据点表、点位映射关系表等。配置信息可以存储为文件并予以保存。配置信息的收发采用命令报文实现。
端口通讯监视模块用于接收协议转换器上报的通讯报文及设备警告信息。
通讯服务模块封装了TCP报文的收发。在该模块内对于业务层下发的命令报文采用缓冲队列进行缓存并逐一发送。
2.2.2 通讯报文设计
监视配置工具与协议转换器之间的通讯报文基本结构如图3所示。0XFFFF为报文起始标志,0XEEEE为报文结束标志。FC为报文功能类别码。PT为端口类型,用数字0表示串口,用数字1表示网口。PI为端口ID,用于区分同类别的不同端口。LEN为后续内容到报文结束标志之前的数据的长度。DIRC为报文传递方向,进入协议转换器的方向设为0,离开协议转换器的方向设为1。
定义 2[9] Hom-Jordan李代数(L,[·,·]L,α,δ)由空间L,一个二元双线性运算L×L→L满足
图3 监视配置工具与协议转换器的通讯报文结构设计
参见表1,根据报文功能,将报文分为如下几类,分别用FC的不同数值表示。
表1 监视配置工具与协议转换器的通讯报文类型
协议转换器中的主服务程序和通讯组件共同完成协议转换功能。主服务程序作为单一进程跟随系统启动,启动后将根据端口所使用的通讯协议类型加载对应的动态链接库。
2.3.1 程序设计
如图1所示,协议转换器软件逻辑上包括配置管理服务模块、通讯监视服务模块、用户管理服务模块和数据通讯服务模块。
配置管理服务模块在主线程运行,负责响应监视配置工具的配置命令,接收端口配置文件或上传端口配置文件。配置发生更改后系统将重新启动,并重新载入配置文件。端口配置文件内容包括:端口通讯参数设置、端口通讯协议、端口所连接的设备的地址或标识、端口所连接设备的数据点位等。每个通讯口上所连接的设备个数多于1个时通过设备地址或标识予以区分。
通讯监视服务模块以主线程的子线程运行,负责转发端口通讯报文、端口警告信息给监视配置工具。在该模块内部维护了一个循环缓冲队列,用于存储需要转发的通讯报文或警告信息。使用互斥锁来防止对缓冲队列的数据访问冲突。同时,在该模块内部设置一个客户端列表,记录每个客户端具体订阅了哪些端口的通讯或警告消息。
用户管理服务模块功能在主线程实现,负责响应监视配置工具的用户操作命令。用户配置信息以文件的形式存储于主服务程序的工作目录,并进行加密。
数据通讯服务模块以单独的工作线程运行,用于管理每个端口上的数据通讯。该线程启动后,根据各个端口的名字找到对应的端口配置文件,并根据配置文件中所配置的通讯协议,加载对应的通讯组件,随后开启该端口的通讯线程。通讯组件在发现数据出现更新时,调用主服务程序中的回调函数OnPortDataChange,通知主服务程序本端口上某个数据点位已发生变化。主服务程序通过查配置表找到该数据点位的对端端口点位,并将该点位的更新信息发送给对端端口的通讯组件。对端端口的通讯组件将对应点位的数值更新到数据缓存区,并通过通讯报文,将对端端口的数据缓冲区中的数据变化信息传递给对端所连接的设备。
协议转换器对不同协议进行转换的数据处理流程如图4所示。
图4 端口协议转换处理流程
2.3.2 组件设计
协议转换器通讯组件采用动态链接库实现。协议通讯组件对应于某个特定的通讯协议,如MODBUS-RTU主站、MODBUS-RTU从站、MODBUS-TCP主站、MOD⁃BUS-TCP从站、IEC104主站、IEC104子站等。
通讯组件对外需提供一组接口函数用于与主服务程序的交互。StartComm接口函数用于协议转换器主服务程序控制端口通讯的启动过程。SetDataBuf用于设置该端口对应的数据缓存区,数据缓存区由主服务程序根据设备的配置信息从内存池获取,并把申请到的内存地址传递给通讯组件,通讯组件使用该段内存缓存数据,并把数据变化信息通过回调函数OnPortDataChange通知给主服务程序,主服务程序调用对端端口通讯组件的SetDataExchange函数将数据变化更新到对端端口的数据缓存区并通过通讯报文同步到对端所连设备。对于某些主动上报型通讯协议如(IEC104子站),SetDataExchange函数需要将数据变化主动发送给所连设备,而对于轮询类型的通讯协议(如MOD⁃BUS-RTU从站)只需要等待本端口外接的设备发起数据轮询。
由于采用了组件式架构,对于该协议转换器暂未支持的工业标准通讯协议或某些设备厂家的自定义协议,只需按照通讯组件接口规范来开发出相应的通讯组件即可予以支持。对于文献1、文献3等文献中所介绍的种种协议转换算法,也均可以通讯组件的方式予以实现。
设计了一种通用协议转换器的软件系统,该软件系统以组件式架构实现,具有较好的灵活性,可以适应复杂的通讯协议转换需求。同时,该软件系统提供了开发接口,方便于协议转换器的功能扩展和升级。