MODBUS是一种主从规约。它允许读或写一个或多个字(16位)操作,但任何情况下都不支持字节的读写。
信息交换是以主站采取主动实现的,即由主机启动交换。除广播命令外,所有的一个完整交换由下行和上行两个报文组成:
·下行报文:主站发出的一个请求
·上行报文:从站发回的一个回答
1.通信参数和传输特性
传输方式:异步串行通信方式
MODBUS规约模式:RTU模式
传输速率:2400bps,9600bps,19200bps
串行口通信数据格式:1个起始位,8个数据位,无校验位,一个停止位
最大传输距离:1200m
通信介质:推荐采用0.5mm的双绞线,不带屏蔽层。原因是如果使用屏蔽双绞线,但现场接地处理不好反而影响通信质量
网络连接主站数目:1个
网络连接从站数目:最多31个
应答时间:小于4.5个byte传输时间(帧间隔最小时间)+10ms[1]
2.通信连接方式
RS-485网络的匹配电阻选取,以现场通信正常为准,一般地1.2km时取120Ω,600m时取220Ω,300m时取330Ω,如果通信误码率较大,观察通信时的波形,匹配电阻做适当改变。
3.报文格式
每个MODBUS帧都包括地址域 功能域 数据域 错误检测域
(1)RTU方式
帧定界 :MODBUS RTU方式下,每两个字符之间发送或者接收的时间间隔不能超过1.5倍字符传输时间。如果两个字符时间间隔超过了3.5倍的字符传输时间,规约就认为一帧数据已经接受,新的一帧数据传输开始。
(2)ASCII方式
帧定界:“:”帧起始 “CR LF” 帧结束
ASCII方式用两个ASCII字符表示一个8位数据,比如16进制的3A用字符“3”和字符“A”表示。
4.RTU类数据帧
①从站号
从站号位1字节,取值范围为0-FFH,例外的如果此值为0,则作为主站的广播信文标识,因此,物理上使用的从站号只能在01H-FFH之间(即1-255之间)。
②功能码
功能码为1字节,它被用来选择一个命令(读、写或回答校验是否正确等),功能码范围为1-255之间。
③数据区
数据区为n字节,它包含与功能码相关的一串十六进制数据。
功能码概述
功能码与数据分类
ModBus是通过功能码来实现数据的交换通信的。读取“线圈状态”就是读出数字量输出的位是true还是false。
Modbus可以读写四种类型的数据。分别是 读取数字量输入位 读写数字量输出位 读取输入寄存器 读写输出寄存器。上位机想要读取下位机某个特定寄存器的内容,就向下位机发送“读取线圈状态”。实际上读取的是一个开关量。
5.数据帧格式
①MODBUS-RTU报文模型:
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
②主机对从机写数据操作:
如果单片机接收到一个报文那么就对报文进行解析执行相应的处理
③主机对从机读数据操作:
④单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的。
从机对主机返回内容:
6.报文示例
举例:
Modbus协议中寄存器地址从1开始,而实际存储中地址从0开始。假如要读取寄存器编号为40005(4为块编号,5为modbus中寄存器地址)的寄存器的数据,则应把00
04放入报文的地址域。寄存器定义,又名码表或者信息点表,应由厂家提供的。
如要读A相电压,则应将0x00 0x00放入寄存器起始地址域中。
①读40005、40006两个寄存器,假设从机地址为1
下行报文:01 03 00 04 00 02 85 ca
上行报文:01 03 04 00 00 00 00 21 33
②向40005寄存器中写入0x12,0x34,假设从机地址为1
下行报文:01 06 00 04 00 01 12 34 4a b0
上行报文:01 06 00 04 00 01 12 34 4a b0
7.CRC简单函数如下:
unsugned short CRC16(puchMsg,usDataLen)
unsigned char *puchMsg;/要进行CRC校验的消息/
unsugned short usDataLen;/消息中字节数/
{
unsigned char uchCRCHi =0xFF;/高CRC字节初始化/
unsigned char uchCRCLo=0xFF;/低CRC字节初始化/
Unsigned uIndex;/CRC循环中的索引/
While (usDataLen–)/传输消息缓冲区/
{
uLndex=uchCRCHi ^ *puchMsgg++;/计算CRC/
uchCRCHi=uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo=auchCRCLo[uIndex];
}
Return(uchCRCHi<<8|uchCRCLo);
}