文中介绍了Modbus RTU通讯协议的特点,阐述了该协议在VC2005编程环境下申口调试软件的具体实现方法。并编制了相关的程序,该程序采用了模块化思想,结构清晰,操作简便,实现了良好的ModbusRTU报文储存及管理机制,使用多线程兼顾界面显示和数据通讯,完全兼容ModbuaRTU通讯协议,可用于自定义功能码的Modbus兼容设备的调试,克服了普通Modbus调试软件仅能用于Modbus标准功能码调试的不足。实践证明,该程序编制思想合理、运行稳定、操作简便易行,为工业自动化中Modbus设备的调试带来方便。
Modbus通信协议是Modieon公司开发的一种通信协议,它采用主从问答方式工作,是一种真正开放、标准的、免收许可费的网络通信协议。广泛用于自动化控制器和测控仪表,现已成为一种公认的通用工业标准。如今Modbus协议已经成为我国工业自动化网络协议规范的国家标准之一。不同厂商生产的控制设备可以籍此连成工业网络。进行集中监控。该协议有2种传输模式,即RTU模式和ASCII模式。对于ASCII模式,一个信息帧中的每8位的字节作为2个ASCII字符传输;而对于RTU模式。信息帧中的8位数据作为2个4位16进制字符,相对于ASCII模式,RTU模式表达相同的信息需要较少的位数,且在相同通信速率下具有更大的数据流量。因此通常情况下,一般工业智能仪表仪器都是采用RTU模式的Modbus规约。
信息传输为异步方式,并以字节为单位。在主站和从站之间传递的通讯报文的信息帧格式如表1所示。
ModbusRTU采用主从方式,若主机设备发送一个信息,则可从一台从机设备返回一个响应,类似的,当一台从机设备接受信息时,它就组织一个从机设备的响应信息,并返回至原发送信息的主机设备。
当通讯命令由主机发送至从机时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果返送给主机。
表1 Modbus RTU信息帧格式
Modbus RTU的查询响应周期如图1所示。
3.1主体架构
软件采用两个线程,主线程显示主界面,用来设置数据。报文处理线程用来监听报文帧、分析报文、取出主界面设置的数据并打包作出回应[6l。
对于各部分的功能用类进行封装处理,力求使程序简洁易懂、便于移植。程序中所用的各种模块如下[7,8]:
(1)线程问数据传送模块:用于主线程与子线程间传送主界面所设置的数据,采用全局变量进行线程间通信,使用互斥体(CMutex)进行线程同步。
(2)串口数据收发模块:用于串口打开、关闭等常用操作及串口数据的收发,为保证串口收发模块的灵活性,模块中串口数据的收发程序采用了串口操作相关的WindowsAPI函数。
(3)Modbus协议模块:对串口数据收发模块再次封装并实现了ModbusR,rU的各种报文规范。定义了报文格式的两种结构——PDU(协议数据单元)和ADU(应用数据单元),及两者相互转化的方法。并在此基础上实现了对接受报文的判断解析和对欲发送报文组织打包。
(4)CRC校验模块:用于生成发送报文的16位CRC校验码,并对接受的报文再次生成CRC校验码以便于与原校验码进行比对。
报文处理线程的流程图如图2所示。
3.2报文数据的存储及管理
为了存储报文中的数据,在内存中划分出来一个256Bytes大小的报文缓冲区。收到的报文和打包好的报文都暂存在该区域中。也就是说对报文的解析和打包就变成了对报文缓冲区的操作[9,10]。为了更好地管理报文缓冲区,定义了两个结构PDU一HANDLE模拟是PDU(报文数据单元),其中PDU—HANDLE模拟的是PDU(报文数据单元),ADU一CONTROI模拟的是ADU(协议数据单元)[11l。二者定义如下:
struet PDU—HANDLE
{
unsignedchar*PDUBuffPtr;//PUD数据指针
urlsigned
char FunctionCode;//请求功能代码
umigrled$l'92rt PD‰h;//PDU字节长度
unsigned
char Exeeptiong硝e;//异常代码
};
Sta"uct ADU_CONTROL,
{
unsigned char*ADUBuffPtr;//ADU缓冲区指针,指向报文缓冲区
unsigned char ADULength;//设备地址
unsigned short ADULength;//ADU字节长度
};
对PDU_HANDIE和ADU_CONTROL操作的函数主要有PackDU2PDU()、ClearPDUBuf()、PackP_DU2ADU()。其主要流程是:
1)收到合法的报文后,对结构ADU-CONTROL进行填充。报文被存储在ADU—CoNTROL的成员AD切3uffPtr指向的内存单元中。报文其它相关信息(从机地址,报文长度)填充到ADU—CONTRoI.的剩余成员中。
2)执行PackADU2PDU()。完成ADU向PDU的转换。此步主要完成CRCl6校验码比对,并依据ADU—CONTRoI的成员完成对PDU_HANDLE的填充,以便于后续对PDU内容的分析处理。
3)执行ClearPDUBuf() ,清空PDU数据缓冲区内容。此时已经完成对接受报文的分析,要清空PDU数据缓冲区内容.以装填欲发送的PDU数据。
4)执行PackPDU2ADU()。使PDU头部加上设备地址,尾部附加CRcl6校验码。此时封装成了完整的报文,以便发送。
3.3功能码及相应处理函数本程序对不同的功能码设置了不同的处理函数。
出了部分标准功能码及相应的处理函数。Modbus调试软件一般作为从机。对主机发来的符合Modbus协议的报文进行解析回应。普通的Modbus调试软件一般只能对上述四种标准功能码进行解析回应。但是对于实际的Modbus设备来说。这四种功能码是远远不够的,更多的时候需要自定义功能码来完成相关的功能。为了完成对自定义功能码的调试。可以在调试软件中加入自定义功能码处理函数。这样便可以使此程序有更强的针对性[7]。
表2部分标准Modbus功能码及其处理函数
功能码 | 对应函数 | 功能描述 |
0x01 | ReadCoils | 读线圈 |
0x02 | ReadDiscretlnputs | 读离散输入量 |
0x03 | ReadHoldReg | 读保持继存器 |
0x04 | ReadInputReg | 读输入继存器 |
3.4程序的界面
图3所示为MoDbusRTU串日调试软件的主界面。图4为上位机软件与ModbosRTU串口调试软件的通信界面。可以看出该Modbus RTU调试软件工作正常。
图3 ModbusRTU串口调试软件界面
图4上位机软件与ModbusRTU串口调试软件的通信界面
利用上述方法,在VC2005环境下编制的基于ModbusRTU的串口调试软件,在某自动化企业小型PLC研发项目的上位机与下位机通信调试中得到应用。既能对标准Modbus功能码进行调试,也可对自定义功能码进行调试。实践证明程序运行稳定、可靠,操作简便、易行。为自定义功能码的Modbus RTU串口调试提供了一条简洁、可行的解决方法。