编者说:
ModBus通信协议结构简单,编程方便,在工业应用现场被广泛使用,特别是PLC应用场合。需要指出的是,ModBus只是一种通信协议,即设备之间的数据约束方式,使用时需要有底层的驱动程序支持,例如,串口通讯。串口通信使用简单,在ModBus协议中应用广泛。在信号的传输方式上又分为RS-232通信,RS-485通信,这种区分只是在数据的传输方式方作划分,底层的驱动程序完全一样。需要长距离、长距离、可靠性高的传输方式时,我们就选择RS-485通信,需要短距离、高速率通信时,我们就用RS-232通信。
这篇博客主要讲述ModBus-RTU通信协议的编程方法,实现时采用串口通信,RS-232的传输方式,采用的单片机为TMS320F280049C。
(1)ModBus通信协议简介
Modbus协议可以说是工业自动化领域应用最为广泛的通讯协议,因为他的开放性、可扩充性和标准化使它成为一个通用工业标准。有了它,不同厂商的产品可以简单可靠的接入网络,实现系统的集中监控,分散控制功能。
目前Modbus规约主要使用的是ASCII, RTU, TCP等,并没有规定物理层。目前Modbus常用的接口形式主要有RS-232C,RS485,RS422,也有使用RJ45接口的,ModBus的ASCII, RTU协议则在此基础上规定了消息、数据的结构、命令和应答的方式。ModBus数据通信采用Master/Slave方式(主/从),即Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。
Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。
(2)ModBus信息帧结构
当设备之间进行通信时,都是以信息帧的结构进行数据之间的传送。信息帧即数据的组成方式,一个信息帧由多位字节数据组成,具体格式如下所示(这里主要讲述RTU格式的信息帧):
开始 | 设备地址 | 功能码 | 数据位 | 校验位 | 终止 |
T1-T2-T3-T4 | 8bit | 8bit | N * 8bit | 16bit | T1-T2-T3-T4 |
RTU模式中,信息开始至少需要有3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止的时间(如下图中的T1-T2-T3-T4)。接着,第一个区的数据为设备地址。
设备地址:当与主机进行通信的设备有多个时,主机通过设备地址号来选择与哪个设备进行通信。设备地址号为1字节。
功能码:当主机与从机通信时,主机通过功能码来选择对从机进行什么操作。部分功能码列出如下表所示,详细的功能码列表请查阅相关资料。功能码数据长度为1字节
功能码 | 名称 | 作用 |
0x03 | 读取保持寄存器 | 读取保持寄存器数据 |
0x06 | 预置单寄存器 | 将数据写入到某寄存器 |
数据位:要传送的具体数据,由多个字节组成。
校验位:主机或从机可用校验码进行判别接收信息是否出错。错误校验采用CRC-16校验方法。CRC校验的算法后边讲解。
(3)ModBus功能码详解
1. 0x03号命令,读可读写模拟量寄存器(保持寄存器):