10.4.3 Modbus常用功能码
Modbus功能码占用1字节,取值范围是1127。之所以127以上不能用,是因为Modbus规定当出现异常时,功能码+0x80(十进制128)代表异常状态,因此129(1+128)255(127+128)的取值代表异常码。
Modbus常用功能码
功能码可以分为位操作和字操作两类。位操作的最小为1位(bit),字操作的最小单位为2字节。
①位操作指令:读取线圈状态的功能码01,读(离散)输入状态功能码02,写单个线圈功能码05和写多个线圈功能码15。
②字操作指令:读保持寄存器功能码03,读输入寄存器功能码04,写单个保持寄存器功能码06,写多个保持寄存器功能码16。
10.4.4 Modbus协议类型
Modbus可以在各种介质上传输,那么他的传输模式也分为三种。包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型。
常用Modbus协议:
Modbus协议 | Modbus协议 |
Modbus RTU | Modbus RTU Over TCP/IP |
Modbus ASCII | Modbus ASCI Over TCP/IP |
Modbus TCP/IP | Modbus RTU Over UDP/IP |
Modbus UDP/IP | Modbus ASCII Over UDP/IP |
Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII模式采用LRC校验,RTU模式采用16位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。
10.4.5 Modbus报文帧
一个报文就是一帧数据,一个数据帧就一个报文:指的是一串完整的指令数据,本质就是一串数据。
Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。
1. Modbus ASCII模式
当控制器设为在Modbus网络上以ASCII模式通信时,在消息中每个8位(b)字节都将作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间可隔可达到1秒且不产生错误。
在ASCII模式下,消息以冒号(:)字符(ASCII码为0x3A)开始,以回车换行奇结束(ASCII码为0x0D、0x0A)。消息的其他字段(域)可以使用的传输字符是十六进制的0···9、A···F。处于网络上的Modbus设备不断侦测“:”字符,当接收到一个冒号时,每个设备进入解码阶段,并解码下一个字段(地址域)以判断是否是发给自己的。消息帧中的字符间发送的时间间隔最长不能超过1秒,否则接收设备将认为发生传输错误。
下表是一个典型的ASCII报文格式:
开始字符 | 地址 | 功能码 | 数据 | LRC校验 | 结束字符 |
1byte(:) | 2byte | 2byte | Nbyte | 2byte | CR、LF |
2. Modbus RTU模式
Modbus协议RTU报文格式如下所示:
从机地址 | 功能码 | 数据 | CRC校验 |
1byte | 1byte | Nbyte | 2byte |
帧结构=从机地址+功能码+数据+校验
从机地址:每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)
功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能。
数据:根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。
校验:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。
3. 串行报文帧总结:
ModbusASCII有开始字符(和结束字符(CR LF),可以作为一帧数据开始和结束的标志,而ModbusRTU没有这样的标志,需要用时间间隔来判断一帧报文的开始和结束,协议规定的时间为3.5个字符周期,就是说一帧报文开始前,必须有大于3.5个字符周期的空闲时间,一帧报文结束后,也必须要有3.5个字符周期的空闲时间否则就会出现粘包的情况。
注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括 11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=38.5/9600=0.00401s*1000=4.01ms。
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待续
推荐阅读
学习Modbus的快速方法 - RZ MPU工业控制教程连载(23)
初识Modbus - RZ MPU工业控制教程连载(24)
虚拟串口与Modbus互联 - RZ MPU工业控制教程连载(25)