基于Modbus协议ARM农田服务器的设计
2014-06-28袁福营,史智兴
袁福营,史智兴(等)
摘要:将Modbus协议应用到农业信息化领域,设计了一种基于Modbus协议的嵌入式农田信息采集服务器。分析了Modbus协议,设计了系统各模块之间的数据通信接口,ARM服务器与应用层采用Modbus/TCP通信完成用户的查询,ARM服务器与数据采集层采用Modbus串口通信进行数据的存储,提出了Modbus/TCP帧与串行链路RTU帧的转换方法,实现了应用层与数据采集层的实时通信,提高了系统的有效性和可靠性。
关键词:现代农业;嵌入式服务器;农田信息采集;Modbus
中图分类号:TP274 文献标识码:A 文章编号:0439-8114(2014)07-1667-04
Modbus Protocol Based Designs of ARM Farmland Server
YUAN Fu-ying,SHI Zhi-xing,JING Li-wei,ZHANG Yi-jun
(College of Information Science and Technology, Agricultural University of Hebei, Baoding 071000, Hebei, China)
Abstract: Modbus protocol was applied in the farmland information collection system and a preliminary design of an embedded farmland information collection server based on Modbus protocol was presented. ARM server using Modbus/TCP to communicate with the application layer for completing the users query, and ARM server using seriallink to communicate with data acquisition layer for data storage were analyzed. The conversion of Modbus/TCP frame with serial link RTU frame was proposed to realize the communication for the application layer and the data acquisition layer. The design improved the effectiveness and reliability of the system.
Key words: modern agriculture; embedded server; farmland information acquisition; Modbus
随着现代农业的推动,信息技术正在迅速渗透到农业的各个领域。采用农业信息化技术,对大田种植、设施园艺和水产养殖等农业生产的各种要素进行信息采集,进一步实行数字化设计、智能化控制、科学化管理,大大提高了农业生产的标准化、自动化、产业化,促进了农业生产的高产、高效、生态和安全。信息采集技术成为了实现农业信息化的必不可少的前提。
在工业自动化领域中,控制系统普遍采用Modbus通讯协议[1]。陆晶[2]设计了一种基于Modbus协议的电厂数据采集系统,提高了数据采集的精确性和稳定性。任清娟[3]针对炼铁厂的高炉渣粒化工厂,采用Modbus通讯协议达到了对现场设备远程实时监控的目的。林勇坚[4]将Modbus现场总线应用到水处理流程控制工程项目中,解决了传统现场总线布线量大、传输精度低、信号易受干扰等问题。但是Modbus协议在农业信息化领域的应用尚且不足,为此,将Modbus协议应用到农业信息化领域,设计一种基础Modbus协议的嵌入式农田信息采集服务器。
1 基于Modbus协议ARM农田服务器的整体设计
农田信息采集系统主要包括数据采集层、数据处理控制层、应用层。系统的体系结构如图1所示。在数据采集层,数据传感器采集田间CO2浓度、空气湿度、光照度等田间参数,经过一系列数据处理之后将采集的数据信息汇总通过串口RS485上传至数据处理控制层。服务器接收到田间信息数据,进行存储。客户端可通过浏览器访问服务器浏览田间信息,也可采用C/S的Windows客户端访问服务器读取田间信息。
2 服务器到应用层的通信
设计的ARM服务器使用Linux系统采用Modbus协议,服务器与客户端通信采用Modbus/TCP,服务器与数据采集层通信采用Modbus串口。Modbus/TCP是可靠连接,保证了客户端与服务器的有效实时通信。服务器与数据采集层通过串口通信,故可将ARM服务器放置于田间,解决了传统服务器必须放置于室内的问题。
Modbus属于应用层报文传输协议,用于不同类型的总线或网络连接的设备之间的客户端/服务器通信[5]。数据通讯采用一对多的主从查询模式。主站可以单独与从机通信,也可以广播方式和所有从站通信。主站以广播方式查询,则从站不做出回应[6]。Modbus/TCP采用以太网技术(IEEE802.3)以一种简单的方式将Modbus帧嵌入到TCP/IP协议帧中,在物理层传输[7]。Modbus/TCP在TCP/IP上使用专用MBAP报文头,MBAP报文头包括传输标志(Transaction Identifier)、协议标志(Protocol Identifier)、长度域(Length)、单元标志(Unit Identifier)。Protocol Identifier为0时,表明是Modbus协议。Unit Identifier用来定义从站的设备地址。Modbus/TCP是可靠连接,因此在Modbus/TCP中不存在校验码。Modbus/TCP数据帧格式如图2所示。
Modbus有ASCII和RTU两种串行传输方式。ASCII模式通过冒号、回车字符判定数据帧的起始和结束,采用LRC 数据检验。消息中的每一个8位字节作为2个ASCII字符传输。ASCII帧字符之间的最大间隔为1 s,超过1 s则默认发送错误。RTU模式消息中的每一个8位字节含有两个4位的16进制的字符传输,因此在相同的波特率下其具有更高的数据量[8]。RTU 模式中数据以非压缩 BCD 码表示,通过时间标记实现数据帧起始判定,采用CRC数据校验,具有数据吞吐量高、传输稳定、通信效率高的优点[9]。此次设计采用了RTU传输方式,RTU报文格式如表1所示。
2.1 服务器到应用层的通信实现
Modbus客户端根据用户应用向Modbus客户机接口发送的要求中所包含的参数来建立一个Modbus/TCP请求。Modbus服务器一直处于监听TCP502端口的状态,当检测到有Modbus请求的时候,经过TCP 3次握手连接成功。服务器接收到Modbus请求帧之后,首先进行帧解析,完成事务处理,然后向用户发送返回帧。Modbus服务器处理的事件主要有:等待Modbus/TCP连接、接收请求帧、处理应答、处理差错等。Modbus服务器与客户端通信流程如图3所示。
作为通信服务器端,首先初始化并建立通信socket,bind()本地IP和端口与socket相连,并使用listen方法将其设置为侦听模式。当Modbus客户机需要对服务器进行查询时,首先会向Modbus服务器网关的502端口发起连接请求,服务器监听到请求与之建立TCP连接后,客户机发送Modbus/TCP请求帧并等待响应。服务器收到Modbus客户机的请求帧,首先进行Modbus PDU处理,依次分析处理消息帧结构,根据功能码进行事务处理,并将事物处理结果封装成Modbus/TCP应答帧,返回至Modbus客户机,然后断开连接等待下一次的连接请求。
程序中最核心的Modbus类的主要方法的声明如下:
class CModBus
{
public:
void Connect(const char*ip,ushort port);
void ReadHoldingRegistersFun(ushort strAddress,ushortnumInputs);
void WriteMultipleRegistersFun(ushort straddress,int*ptrValue,int nLen);
void WriteSingleRegistersFun(ushort address,ushort Data);
private:
void CreateReadHeader(ushort startReadAddress,ushort lenght,unsigned char function);
void CreateWriteHeader(ushort starAddaress,ushort len,unsigned char function);
void CRCChick(unsigned char*messageDate,int nLen);
void WriteAsyncDate(unsigned char*pWriteDate,int nDataLen);
void TransformParamDateFun(int len,unsigned char*Data);
void TransformControlDateFun(int len,unsigned char*Data);
void RecvReadData();
……}
Modbus类中Connect()实现服务器与客户端socket的连接,ReadHoldingRegistersFun()用来发送客户端读取数据的结果,WriteSingleRegistersFun()、WriteMultipleRegistersFun()分别实现写单个寄存器和写多个寄存器。CreateReadHeader()、CreateWriteHeader()分别创建Modbus读写寄存器帧的头部数据,WriteAsyncDate()将数据写入到socket。TransformControlDateFun()、TransformParamDateFun()转换读取控制、参数数据。RecvReadData()从连接套接字中读取信息。
服务器向客户端发送回应结果,首先调用ReadHoldingRegistersFun(),通过执行CreateReadWriteHeader()填写RTU数据帧信息,然后WriteAsyncDate()向缓冲区用SendData发送数据。具体实现程序如下:
void CModBus::ReadHoldingRegistersFun(usho
rt strAddress,ushort numInputs){
CreateReadWriteHeader(strAddress,numInputs,ReadHoldingRegisters);
WriteAsyncDate(SendDate,READ_REGISTERS_HEA
DER_LEN);
}
void CModBus::WriteAsyncDate(unsigned char *pWriteDate,int nDataLen)
{
if(nSocket>0&&nConnect>=0)
{
FD_SET(nSocket,&set);
neSlect=select(nSocket+1,NULL,&set,NULL,&tv);if(neSlect>0)
{
nSend=send(nSocket,(char*)pWriteDate,nDataLen,0);
}
if(nDataLen==READ_REGISTERS_HEAD
ER_LEN)
{
RecvReadData();
}
else
{
RecvWriteReturn();
}
}
FD_ZERO(&set);
}
若客户端要读取06号设备起始地址为4的连续2个寄存器,读取保持寄存器的功能码function为3。服务器通信结果见图4。
2.2 Modbus/TCP帧与RTU帧转换设计
当客户端需要查询当前的实时数据,而服务器还未进行存储,客户端向服务器发送Modbus/TCP请求帧并等待服务器应答,服务器接收Modbus/TCP请求帧对其进行分析处理,转化成Modus RTU串行链路响应帧并发送到与数据采集层相连的串行链路中去,监听等待数据采集层的应答。若服务器收到串行链路上的RTU应答帧,则将该应答帧重新封装成Modbus/TCP应答帧,发送给客户端。因此,在服务器端需要进行Modbus/TCP与串行链路RTU的转换。
ModToRtu()函数实现Modbus/TCP帧与串行链路RTU帧的转换功能,转换过程见图5。
Modbus/TCP帧与串行链路RTU帧相比,增加了MBAP报文,减少了CRC校验码。Modbus/TCP转串行链路RTU过程:首先从MBAP报文头中解析出地址段,并将MBAP的各字段保存。然后从Modbus/TCP帧中分别解析出功能码和数据段,并计算CRC校验码,最后封装成串行链路RTU帧。
串行链路RTU帧转换成Modbus/TCP帧:首先利用已保存MBAP字段重新封装成MBAP,然后从RTU帧中读取数据段和功能码,分别填充到Modbus/TCP帧的数据段和功能码,封装成Modbus/TCP帧。
2.3 线程池
在服务器整个工作过程中,系统通过线程与客户端和与数据采集层进行通信。传统多线程方案的服务器,多个线程在同一时间内并发运行执行相应的任务[10],采用“及时创建,及时销毁”的策略。当服务器接收到请求之后创建一个线程,由该线程执行具体任务,任务结束之后线程退出。若大量用户同时访问服务器,在短时间内,服务器将处于不停地创建线程、销毁线程的状态,容易导致消耗系统内存。因此,系统增加了线程池,大大减少了线程的开销。
线程池采用预创建技术。程序启动之后,首先创建一定数量(NUM个)的线程,这些线程处于阻塞状态,并不消耗CPU。当系统有任务需要执行时,程序唤醒一个空闲线程执行任务。任务完成之后,该线程再次回到阻塞状态,等待下次任务的到来。在线程池的数量设计上,程序所创建的线程总数不能高于THREAD_MAXNUM,当系统中的空闲线程数量低于THREAD_Max时,程序将创建一些线程,使得空闲线程维持在THREAD_AvailLow之上。当系统中的空闲线程数量高于THREAD_AvailHigh时,线程池会自动销毁一些线程,保持空闲线程的数量在一个合理的范围内。
3 服务器到数据采集层的通信
服务器通过串口定期向数据采集层发送RTU请求帧,并等待接收数据采集层的RTU返回帧,将收到的农田信息存储在数据库中。
服务器端首先打开串口,调用CreatData()准备要发送的请求数据,执行CreatCRC()生成函数获取CRC校验码,通过CreatRtu()封装程序组织生成RTU报文,发送RTU信息帧,检测串口等待返回帧。若等待超过Modbus协议规定的4个字符延时等待时间,则进行超时处理。否则,接收数据采集层的返回帧之后,返回到数据准备阶段,继续检测串口。服务器端界面采用qt设计,如图6所示。
4 小结
分析了Modbus协议,将应用在工业控制中的Modbus协议引入到农田信息采集系统,Modbus帧格式简单、紧凑、高效,同时Modbus/TCP具有实时通信的特点,更适合嵌入式设备,实现远程数据的交互,从而达到远程监测的目的。设计了基于Modbus协议的ARM农田信息采集服务器,实现了服务器与应用层、服务器与数据采集层的通信接口,提出了Modbus/TCP帧与串行链路RTU帧的转换方法,增加了线程池完成每一次的通信任务。服务器可访问数据采集端进行田间信息存储,客户端可随时访问服务器浏览田间信息。但是服务器还存在不足,如何健全服务器功能,发挥Modbus嵌入式服务器的综合优势,仍需进一步的研究。
参考文献:
[1] 刘西广.用于西门子Insight软件的Modbus协议通用网关设计[D].成都:电子科技大学,2011.
[2] 陆 晶.基于Modbus的数据采集系统[D].江苏无锡:江南大学,2011.
[3] 任清娟.基于Modbus和GPRS的高炉渣粒化配电监控系统的设计[D].内蒙古包头:内蒙古科技大学,2012.
[4] 林勇坚.基于Modbus现场总线的水处理流程控制的工程设计[J].广西民族大学学报(自然科学版),2013,19(1):79-81.
[5] 陈 辉.基于Modbus协议灌区远程智能测控系统研究[D].兰州:兰州理工大学,2012.
[6] 王 谛.基于Modbus协议的PC机与dsPIC6014处理器的通信[D].呼和浩特:内蒙古大学,2012.
[7] 景柏豪,沈孟良,唐晔钧.CAN-Modbus/TCP协议转换的设计与实现[J].计算机工程与设计,2013,34(5):1552-1556.
[8] 李振江.Linux系统下Modbus主协议栈设计与实现[D].合肥:安徽大学,2012.
[9] 吴寅华,赵 敏.基于ARM Cortex-M3的Modbus协议实现及其应用[J].电子科技,2011,24(6):19-21.
[10] 杨开杰,刘秋菊,徐汀荣.线程池的多线程并发控制技术研究[J].计算机应用与软件,2010,27(1):168-169.
{
FD_SET(nSocket,&set);
neSlect=select(nSocket+1,NULL,&set,NULL,&tv);if(neSlect>0)
{
nSend=send(nSocket,(char*)pWriteDate,nDataLen,0);
}
if(nDataLen==READ_REGISTERS_HEAD
ER_LEN)
{
RecvReadData();
}
else
{
RecvWriteReturn();
}
}
FD_ZERO(&set);
}
若客户端要读取06号设备起始地址为4的连续2个寄存器,读取保持寄存器的功能码function为3。服务器通信结果见图4。
2.2 Modbus/TCP帧与RTU帧转换设计
当客户端需要查询当前的实时数据,而服务器还未进行存储,客户端向服务器发送Modbus/TCP请求帧并等待服务器应答,服务器接收Modbus/TCP请求帧对其进行分析处理,转化成Modus RTU串行链路响应帧并发送到与数据采集层相连的串行链路中去,监听等待数据采集层的应答。若服务器收到串行链路上的RTU应答帧,则将该应答帧重新封装成Modbus/TCP应答帧,发送给客户端。因此,在服务器端需要进行Modbus/TCP与串行链路RTU的转换。
ModToRtu()函数实现Modbus/TCP帧与串行链路RTU帧的转换功能,转换过程见图5。
Modbus/TCP帧与串行链路RTU帧相比,增加了MBAP报文,减少了CRC校验码。Modbus/TCP转串行链路RTU过程:首先从MBAP报文头中解析出地址段,并将MBAP的各字段保存。然后从Modbus/TCP帧中分别解析出功能码和数据段,并计算CRC校验码,最后封装成串行链路RTU帧。
串行链路RTU帧转换成Modbus/TCP帧:首先利用已保存MBAP字段重新封装成MBAP,然后从RTU帧中读取数据段和功能码,分别填充到Modbus/TCP帧的数据段和功能码,封装成Modbus/TCP帧。
2.3 线程池
在服务器整个工作过程中,系统通过线程与客户端和与数据采集层进行通信。传统多线程方案的服务器,多个线程在同一时间内并发运行执行相应的任务[10],采用“及时创建,及时销毁”的策略。当服务器接收到请求之后创建一个线程,由该线程执行具体任务,任务结束之后线程退出。若大量用户同时访问服务器,在短时间内,服务器将处于不停地创建线程、销毁线程的状态,容易导致消耗系统内存。因此,系统增加了线程池,大大减少了线程的开销。
线程池采用预创建技术。程序启动之后,首先创建一定数量(NUM个)的线程,这些线程处于阻塞状态,并不消耗CPU。当系统有任务需要执行时,程序唤醒一个空闲线程执行任务。任务完成之后,该线程再次回到阻塞状态,等待下次任务的到来。在线程池的数量设计上,程序所创建的线程总数不能高于THREAD_MAXNUM,当系统中的空闲线程数量低于THREAD_Max时,程序将创建一些线程,使得空闲线程维持在THREAD_AvailLow之上。当系统中的空闲线程数量高于THREAD_AvailHigh时,线程池会自动销毁一些线程,保持空闲线程的数量在一个合理的范围内。
3 服务器到数据采集层的通信
服务器通过串口定期向数据采集层发送RTU请求帧,并等待接收数据采集层的RTU返回帧,将收到的农田信息存储在数据库中。
服务器端首先打开串口,调用CreatData()准备要发送的请求数据,执行CreatCRC()生成函数获取CRC校验码,通过CreatRtu()封装程序组织生成RTU报文,发送RTU信息帧,检测串口等待返回帧。若等待超过Modbus协议规定的4个字符延时等待时间,则进行超时处理。否则,接收数据采集层的返回帧之后,返回到数据准备阶段,继续检测串口。服务器端界面采用qt设计,如图6所示。
4 小结
分析了Modbus协议,将应用在工业控制中的Modbus协议引入到农田信息采集系统,Modbus帧格式简单、紧凑、高效,同时Modbus/TCP具有实时通信的特点,更适合嵌入式设备,实现远程数据的交互,从而达到远程监测的目的。设计了基于Modbus协议的ARM农田信息采集服务器,实现了服务器与应用层、服务器与数据采集层的通信接口,提出了Modbus/TCP帧与串行链路RTU帧的转换方法,增加了线程池完成每一次的通信任务。服务器可访问数据采集端进行田间信息存储,客户端可随时访问服务器浏览田间信息。但是服务器还存在不足,如何健全服务器功能,发挥Modbus嵌入式服务器的综合优势,仍需进一步的研究。
参考文献:
[1] 刘西广.用于西门子Insight软件的Modbus协议通用网关设计[D].成都:电子科技大学,2011.
[2] 陆 晶.基于Modbus的数据采集系统[D].江苏无锡:江南大学,2011.
[3] 任清娟.基于Modbus和GPRS的高炉渣粒化配电监控系统的设计[D].内蒙古包头:内蒙古科技大学,2012.
[4] 林勇坚.基于Modbus现场总线的水处理流程控制的工程设计[J].广西民族大学学报(自然科学版),2013,19(1):79-81.
[5] 陈 辉.基于Modbus协议灌区远程智能测控系统研究[D].兰州:兰州理工大学,2012.
[6] 王 谛.基于Modbus协议的PC机与dsPIC6014处理器的通信[D].呼和浩特:内蒙古大学,2012.
[7] 景柏豪,沈孟良,唐晔钧.CAN-Modbus/TCP协议转换的设计与实现[J].计算机工程与设计,2013,34(5):1552-1556.
[8] 李振江.Linux系统下Modbus主协议栈设计与实现[D].合肥:安徽大学,2012.
[9] 吴寅华,赵 敏.基于ARM Cortex-M3的Modbus协议实现及其应用[J].电子科技,2011,24(6):19-21.
[10] 杨开杰,刘秋菊,徐汀荣.线程池的多线程并发控制技术研究[J].计算机应用与软件,2010,27(1):168-169.
{
FD_SET(nSocket,&set);
neSlect=select(nSocket+1,NULL,&set,NULL,&tv);if(neSlect>0)
{
nSend=send(nSocket,(char*)pWriteDate,nDataLen,0);
}
if(nDataLen==READ_REGISTERS_HEAD
ER_LEN)
{
RecvReadData();
}
else
{
RecvWriteReturn();
}
}
FD_ZERO(&set);
}
若客户端要读取06号设备起始地址为4的连续2个寄存器,读取保持寄存器的功能码function为3。服务器通信结果见图4。
2.2 Modbus/TCP帧与RTU帧转换设计
当客户端需要查询当前的实时数据,而服务器还未进行存储,客户端向服务器发送Modbus/TCP请求帧并等待服务器应答,服务器接收Modbus/TCP请求帧对其进行分析处理,转化成Modus RTU串行链路响应帧并发送到与数据采集层相连的串行链路中去,监听等待数据采集层的应答。若服务器收到串行链路上的RTU应答帧,则将该应答帧重新封装成Modbus/TCP应答帧,发送给客户端。因此,在服务器端需要进行Modbus/TCP与串行链路RTU的转换。
ModToRtu()函数实现Modbus/TCP帧与串行链路RTU帧的转换功能,转换过程见图5。
Modbus/TCP帧与串行链路RTU帧相比,增加了MBAP报文,减少了CRC校验码。Modbus/TCP转串行链路RTU过程:首先从MBAP报文头中解析出地址段,并将MBAP的各字段保存。然后从Modbus/TCP帧中分别解析出功能码和数据段,并计算CRC校验码,最后封装成串行链路RTU帧。
串行链路RTU帧转换成Modbus/TCP帧:首先利用已保存MBAP字段重新封装成MBAP,然后从RTU帧中读取数据段和功能码,分别填充到Modbus/TCP帧的数据段和功能码,封装成Modbus/TCP帧。
2.3 线程池
在服务器整个工作过程中,系统通过线程与客户端和与数据采集层进行通信。传统多线程方案的服务器,多个线程在同一时间内并发运行执行相应的任务[10],采用“及时创建,及时销毁”的策略。当服务器接收到请求之后创建一个线程,由该线程执行具体任务,任务结束之后线程退出。若大量用户同时访问服务器,在短时间内,服务器将处于不停地创建线程、销毁线程的状态,容易导致消耗系统内存。因此,系统增加了线程池,大大减少了线程的开销。
线程池采用预创建技术。程序启动之后,首先创建一定数量(NUM个)的线程,这些线程处于阻塞状态,并不消耗CPU。当系统有任务需要执行时,程序唤醒一个空闲线程执行任务。任务完成之后,该线程再次回到阻塞状态,等待下次任务的到来。在线程池的数量设计上,程序所创建的线程总数不能高于THREAD_MAXNUM,当系统中的空闲线程数量低于THREAD_Max时,程序将创建一些线程,使得空闲线程维持在THREAD_AvailLow之上。当系统中的空闲线程数量高于THREAD_AvailHigh时,线程池会自动销毁一些线程,保持空闲线程的数量在一个合理的范围内。
3 服务器到数据采集层的通信
服务器通过串口定期向数据采集层发送RTU请求帧,并等待接收数据采集层的RTU返回帧,将收到的农田信息存储在数据库中。
服务器端首先打开串口,调用CreatData()准备要发送的请求数据,执行CreatCRC()生成函数获取CRC校验码,通过CreatRtu()封装程序组织生成RTU报文,发送RTU信息帧,检测串口等待返回帧。若等待超过Modbus协议规定的4个字符延时等待时间,则进行超时处理。否则,接收数据采集层的返回帧之后,返回到数据准备阶段,继续检测串口。服务器端界面采用qt设计,如图6所示。
4 小结
分析了Modbus协议,将应用在工业控制中的Modbus协议引入到农田信息采集系统,Modbus帧格式简单、紧凑、高效,同时Modbus/TCP具有实时通信的特点,更适合嵌入式设备,实现远程数据的交互,从而达到远程监测的目的。设计了基于Modbus协议的ARM农田信息采集服务器,实现了服务器与应用层、服务器与数据采集层的通信接口,提出了Modbus/TCP帧与串行链路RTU帧的转换方法,增加了线程池完成每一次的通信任务。服务器可访问数据采集端进行田间信息存储,客户端可随时访问服务器浏览田间信息。但是服务器还存在不足,如何健全服务器功能,发挥Modbus嵌入式服务器的综合优势,仍需进一步的研究。
参考文献:
[1] 刘西广.用于西门子Insight软件的Modbus协议通用网关设计[D].成都:电子科技大学,2011.
[2] 陆 晶.基于Modbus的数据采集系统[D].江苏无锡:江南大学,2011.
[3] 任清娟.基于Modbus和GPRS的高炉渣粒化配电监控系统的设计[D].内蒙古包头:内蒙古科技大学,2012.
[4] 林勇坚.基于Modbus现场总线的水处理流程控制的工程设计[J].广西民族大学学报(自然科学版),2013,19(1):79-81.
[5] 陈 辉.基于Modbus协议灌区远程智能测控系统研究[D].兰州:兰州理工大学,2012.
[6] 王 谛.基于Modbus协议的PC机与dsPIC6014处理器的通信[D].呼和浩特:内蒙古大学,2012.
[7] 景柏豪,沈孟良,唐晔钧.CAN-Modbus/TCP协议转换的设计与实现[J].计算机工程与设计,2013,34(5):1552-1556.
[8] 李振江.Linux系统下Modbus主协议栈设计与实现[D].合肥:安徽大学,2012.
[9] 吴寅华,赵 敏.基于ARM Cortex-M3的Modbus协议实现及其应用[J].电子科技,2011,24(6):19-21.
[10] 杨开杰,刘秋菊,徐汀荣.线程池的多线程并发控制技术研究[J].计算机应用与软件,2010,27(1):168-169.