一种用低成本实现的Modbus/TCP转换器
2010-03-20李勇黄健
李勇,黄健
(中山职业技术学院,中山528404)
1 Modbus协议分析
Modbus协议是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。Modbus通信栈模型如图1所示[1]。物理层协议以EIA/TIA-232、EIA/TIA-485串行链路协议和以太网II/802.3协议为代表。Modbus协议定义了一个与基础通信层无关的简单协议数据单元PDU,PDU中的功能码向服务器指示将执行哪种操作,如对线圈、寄存器的读写操作。特定总线或网络上的Modbus协议映射能够在应用数据单元ADU上引入一些附加域。
图1 Modbus通信栈模型
串行链路上的Modbus帧数据结构如图2所示。其中,地址域即为附加域,占用一个字节,按编码形式可分为ASCII和RTU两种。
图2 Modbus串行链路数据单元
Modbus/TCP协议的数据帧格式如图3所示。其中,MBAP报文头占7个字节,这种报文头提供一些与串行链路上使用的Modbus RTU应用数据单元的差别:
图3 Modbus TCP/IP数据单元
①用MBAP报文头中的单个字节单元标识符取代Modbus串行链路上通常使用的Modbus从地址域。这个单元标识符用于设备的通信,这些设备使用单个IP地址支持多个独立Modbus终端单元(例如网桥、路由器和网关)。
②用接收者可以验证完成报文的方式设计所有Modbus请求和响应。对于Modbus PDU有固定长度的功能码来说,仅功能码就足够了。对于在请求或响应中携带一个可变数据的功能码来说,数据域包括字节数。
③当在TCP上携带Modbus时,即使将报文分成多个信息包来传输,也需在MBAP报文头上携带附加长度信息,以便接收者能识别报文边界。显式和隐式长度规则的存在以及CRC-32差错校验码的使用(在以太网上)将对请求或响应报文产生极小的未检出干扰。
MBAP报文头包括下列域:事务元标识符,2个字节,作为Modbus请求/响应事务处理的识别码;协议标识符,2个字节,约定为0;长度域,2个字节,指示接下来字节的数量;单元标识符,1个字节,串行链路或其他总线上连接的远程从站的识别码。要实现Modbus/TCP转换器,进行Modbus TCP ADU与ASCII ADU之间,Modbus TCP ADU与RTU ADU之间的转换是核心内容。
2 网络单片机PIC18F67J60
PIC18F67J60系列单片机具有嵌入式以太网控制器模块。它是一个完整的连接解决方案,完全实现介质访问控制和物理层收发器模块,只需使用2个脉冲变压器和一些无源器件即可将单片机直接与以太网相连。以太网模块包含以下5个主要功能模块:
①PHY收发器模块。对传输双绞线接口上的模拟数据进行编码和解码,并通过网络发送和接收。
②MAC模块。实现了符合IEEE802.3规范的MAC逻辑,并提供用以控制PHY的MIIM(Media Independent Interface Management)。
③独立的8 KB RAM缓冲区。用于存储已经接收和将要发送的数据包。
④判优器。在单片机内核、DMA、发送和接收模块发出请求时,控制对RAM缓冲区的访问。
⑤寄存器接口。作为以太网模块和单片机特殊功能寄存器(SFR)之间的命令和内部状态信号译码器[2]。
PIC18F67J60的以太网模块符合IEEE802.3中所有关于双绞线网络10-Base T连接的规定。其内部实现了一些数据包过滤机制,用于限制传入的数据包;同时,还提供了1个用于实现快速数据吞吐的内置DMA模块、硬件IP的校验和计算,以及2个用于指示链路和网络活动的LED输出。
PIC18F67J60还提供了2个增强型USART(支持RS232和RS485)、5个定时器、27个中断源、128 KB的代码存储空间、接近4 KB的RAM空间,为TCP/IP协议栈和Modbus协议转换提供了硬件支持。
3 Microchip TCP/IP协议栈分析
Microchip公司提供免费的TCP/IP软件栈,它服务于标准的、基于TCP/IP的应用程序,或者使用在定制的、基于TCP/IP的应用程序中。本应用系统使用的是该协议栈的4.02版本。类似于TCP/IP参考模型,Microchip TCP/IP协议栈将TCP/IP协议栈分为多层,如图4所示。每层的实现代码驻留在一个独立的源文件中,而服务和应用程序编程接口(API)是通过头文件或包含文件定义的。
图4 Microchip TCP/IP协议栈结构
与TCP/IP参考模型不同的是,Microchip TCP/IP协议栈中的许多层可以直接访问在它下面的一层或多层。关于一个层是否绕过相邻模块来获得所需的服务,主要根据开销的大小,以及服务是否需要智能处理后才能传递到下一层来决定[3]。与传统TCP/IP协议栈实现方法的不同之处是,添加了2个新模块——Stack Task和ARPTask。Stack Task管理协议栈及其所有模块的操作,而ARPTask管理地址解析协议(Address Resolution Protocol,ARP)层的服务。
Microchip TCP/IP协议栈使用了协同式多任务处理技术。在协同式多任务处理系统中同时存在多个任务,每个任务执行自己的作业然后交回控制权,这样下一个任务才能够执行作业。Stack Task和ARPTask都是协同式任务。通常,协同式多任务处理(或任何其他类型的多任务处理)是由操作系统或主应用程序自身来实现的。Microchip TCP/IP协议栈被设计为独立于任何操作系统,可实现它自己的协同式多任务处理系统。因此,它可以被应用在任何系统中,而不论该系统是否为多任务操作系统。但是,使用Microchip TCP/IP协议栈的应用程序自身必须使用协同式多任务处理方法。
4 软件实现框架
本转换器需要实现以下4种工作模式:
①TCP从站转RTU从站。在本工作模式下把和转换器相连的Modbus/RTU从站转化为Modbus/TCP从站,这样Modbus/TCP主站就可以通过以太网访问Modbus/RTU从站。
②TCP从站转ASCII从站。在本工作模式下把和转换器相连的Modbus/ASCII从站转化为Modbus/TCP从站,这样Modbus/TCP主站就可以通过以太网访问Modbus/ASCII从站。
③ASCII主站转TCP主站。在本工作模式下把和转换器相连的Modbus/ASCII主站转化为Modbus/TCP主站,这样Modbus/TCP从站就可以通过以太网访问Modbus/ASCII主站。
④RTU主站转TCP主站。在本工作模式下把和转换器相连的Modbus/RTU主站转化为Modbus/TCP主站,这样Modbus/TCP从站就可以通过以太网访问Modbus/RTU主站。
转换器软件系统框架如图5所示。RS232/485传输管理模块中的“参数控制”部分管理通信波特率的设置,Modbus串行链路协议中要求整条链路上的Modbus设备设置为同样的波特率;“超时管理”中根据设置的波特率启动两个定时,分别记录Modbus定义的报文间超时和字符间超时。协议转换模块根据本机设置,在TCP ADU和ASCII/RTU ADU之间进行用户数据包格式转换。TCP管理层中“连接管理”负责管理报文的传输连接。系统设置为用户提供各种参数设置和工作模式设置的接口。
图5 转换器软件系统框架
5 总 结
PIC18F67J60丰富的片上资源为本文实现的转换器提供了单片的、低成本的实现方案,免费并且开源的Microchip TCP/IP协议栈能轻松地支持Microchip 8位单片机,很大程度上节约了开发时间,同时也保证系统运行稳定。本套系统相对市面上其他同类转换器,具有成本低、体积小、便于安装等特点,具有一定市场价值。
[1]Microchip Technology Inc.Modbus协议中文版,2006.
[2]Microchip Technology Inc.PIC18F67J60 datasheet,2008.
[3]Microchip Technology Inc.Microchip TCP/IP协议栈,2006.