1.概要
Modbus是一种单主/多从的通信协议,特点:在同一时间总线上只能有一个主设备,但可以有一个或者多个从设备(最多247);从设备不会主动上报数据;
2.Modbus寄存器
2.1寄存器种类
线圈状态:输出端口:可设置可读
离散输入状态:输入端口:可读不可写(拨码开关)
保持寄存器:输出参数或保持参数;可读可写
输入寄存器:输入参数:可读不可写
2.2 存储区
输出线圈 0 00001-09999
离散输入状态:1 10001-19999
保持寄存器:4 40001-49999
输入寄存器:3 30001-39999
寄存器种类
寄存器 | PLC地址 | 寄存器modbus协议地址 | 简称 | 读写状态 |
---|---|---|---|---|
线圈状态 | 00001-0ffff | 0000H-FFFFH | 0X | 可读可写 |
离散输入状态 | 10001-1ffff | 0000H-FFFFH | 1X | 只读 |
保持寄存器 | 40001-4ffff | 0000H-FFFFH | 4X | 可读可写 |
输入寄存器 | 30001-3ffff | 0000H-FFFFH | 3X | 只读 |
扩展 :因为对于寄存器的操作无非 就是读与写;因此相对于基础功能码为
读输出线圈 | 01 |
---|---|
读离散输入状态 | 02 |
读保持寄存器 | 03 |
读输入寄存器 | 04 |
写单个线圈 | 05 |
写单个保持寄存器 | 06 |
写多个线圈 | 15 |
写多个保持寄存器 | 16 |
3串行消息帧格式
3.1ASCII
传输过程中每个8位(b)的字节都将作为两个ASCII字符发送。
优点:字符发送时间间隔可达1s,且不产生错误;
消息帧格式
起始位: 冒号“ : ”(0x3A)
结束符: 回车(0D)和换行(0A)
数据表示:将一个字节的十六进制拆分成了两个字节的字符表示
例如:0x12表示成 字符 “1“”2”
在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制0xAF(1010 1111),会被分解成ASCII字符“A”(对应的十六进制 41 0100 0001)和”F”(对应的十六进制 46 0100 0110)进行发送,其发送量显然比RTU增加一倍。ACII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(LRC)。
3.2RTU
消息的接收和发送以至少3.5个字符时间的停顿间隔为标志。如果消息中两个字符之间的空闲间隔大于1.5个字符时间,则认为报文帧不完整。
4 校验
4.1 LRC校验
每一个需要传输的数据字节迭加后取反加1即可。它检测了消息帧中除开始的冒号及结束的回车换行号外的内容,即不包括起始和结束标志。
4.2 CRC校验
相关知识点:
1.异或运算(XOR/“⊕”)相同得0,相异得1;
-
0101010 1011001 1110011(XOR)
2.多项式 CRC用到的除数,即多项式的各项系数组成
eg: 多项式 x6+x4+x^2+x+1
那么提取系数为 1010111
3.原始数据末端添加n个0;n值取决于多项式最高阶数值;
eg:多项式 x6+x4+x^2+x+1 最高次幂为6
准备传输的数据串为 1101011011
那么进行CRC校验前是需要在 传输数据串 添加6个0;即1101011011000000
4.CRC校验码计算示例
现假设选择的 CRC生成多项式为 G(X)= x6+x4+x^2+x+1,要求出二进制序列 1101011011的 CRC校验码。下面是具体的计算过程 :
①将多项式转化为二进制序列,由 G(X)= x6+x4+x^2+x+1可知序列为1010111
②多项式的最高次幂为n=6,则在数据帧的后面加上6位0,数据帧变为 1101011011000000,然后使用模2除法除以除数111011,得到余数。(CRC校验码位数比除数位数少一位,如果前面位是0也不能省略,或者不足(n-1)位时,需要在得到余数左侧补0)
步骤 商数 余数
( 0) 1 0111100011000000
( 1) 1 010111111000000
( 2) 1 00010001000000
( 3) 0 0010001000000
( 4) 0 010001000000
( 5) 1 00100110000
( 6) 0 0100110000
( 7) 1 001101100
( 8) 0 01101100
( 9) 1 0111011