文章目录
Modbus
从OSI七层模型来看,Modbus位于应用层。
协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址, 识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出.在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构.这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换, 这就不会在使它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。
modbus请求模式
广播模式
所有从站必须执行主站命令,无需应答返回
单播模式
一个事务处理包含两个报文,一个来自主节点(主站)请求,一个来自子节点应答
主节点发送请求后进入等待应答状态,只有特定子节点应答后,主节点才可以进行下一个事务处理。**同一时刻,Modbus只会发起一个事务处理,**主节点在等待响应时会同步响应超时机制避免主节点永远处于等待应答状态。
子节点不会主动发送数据,子节点之间不会相互通信。
Modbus分类
Modbus RTU(串口):这种方式常采用RS-485做为物理层,一般利用芯片的串口实现数据报文的收发,报文数据采用二进制数据进行通信。传输大量数据,适合工业
Modbus ASCII(串口):报文使用 ASCII 字符。ASCII 格式使用纵向冗余校验和。Modbus ASCII 报文由冒号 (“:”)开始 和换行符 (CR/LF) 结尾构成。传输少量数据,适合计算机
Modbus TCP/IP 或 Modbus TCP(网口):这是一种 Modbus 变体版本,使用 TCP/IP 网络进行通信,通过 502 端口进行连接。报文不需要校验和计算,因为以太网底层已经实现了CRC32 数据完整性校验。传输严谨,效率低。
Modbus UDP(网口),这个需要错误重传机制,传输效率高
modbus 寄存器
寄存器种类 | 访问类型 | 对象类型 |
---|---|---|
线圈寄存器(DO)) | 读写 | 单个比特 |
离散输入寄存器(DI) | 只读 | 单个比特 |
保持寄存器(AO) | 读写 | 16比特 |
输入寄存器(AI) | 只读 | 16bit |
对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
Modbus RTU
Modbus RTU报文
地址域 | 功能域 | 数据域 | 差错校验 |
---|---|---|---|
8bit | 8bit | N*8bit(0-255) | 16bit |
主站发送:01 02 00 00 00 04 79 C9
从站应答:01 02 01 0F E1 8C
报文的请求与应答的起始位都是地址域。
地址域中:
0为广播地址
1-247为子节点单独地址
248-255保留
地址域只和从站有关,主站无标识
每个从站的地址域都是唯一的,以便与其他从站区分
理论上最多支持247台从设备
PDU(协议数据单元),在Modbus中包含功能域和数据域。
功能域1字节,常用的就01/02/03/04/05/06/15/16.
功能码 | 名称 | 功能 |
---|---|---|
01 | 读取线圈状态 | 取得一组逻辑线圈的当前状态(ON/OFF) |
02 | 读取离散输入状态 | 取得一组开关输入的当前状态(ON/OFF) |
03 | 读取保持寄存器 | 在一个或多个保持寄存器中取得当前的二进制值 |
04 | 读取输入寄存器 | 在一个或多个输入寄存器中取得当前的二进制值 |
05 | 强置单线圈 | 强置一个逻辑线圈的通断状态 |
06 | 强置单寄存器 | 把具体二进制值装进一个保持寄存器 |
15 | 强置多线圈 | 强置一串连续逻辑线圈的通断 |
16 | 强置多寄存器 | 把具体二进制值装进一串连续的保持寄存器 |
数据域长度由具体功能决定,一般含起始地址、数量、数据三部分,大端模式(写多个线圈时是小端模式)。
大端模式是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
小端模式是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
CRC校验的数据范围为:地址码+功能码+数据区,小端模式
Modbus CRC校验
预置一个值为FFFFH的16位寄存器,此寄存器为CRC寄存器
把通信数据帧的第1个8位二进制数据与CRC寄存器的低8位进行异或运算,异或的结果仍存放于该CRC寄存器中
把CRC寄存器的内容右移1位,用0填补最高位,并检测移出的位是0还是1
如果移出的位为0,则重复步骤3,如果移出的位为1,则CRC寄存器与A001H进行异或运算
重复步骤3和4,直到右移8次,这样通信数据帧的第1个8位二进制数据就全部进行了处理
重复步骤2、3、4、5,依次进行通信数据帧中的剩余字节
将该通信数据帧中所有字节数据按上述步骤计算完成后,得到的16位CRC寄存器的高、低8位进行交换
最后得到的CRC寄存器内容即为CRC校验码
Modbus ASCII
Modbus ASCII报文
Modbus ASCII协议传输过程,每一个字节都作为两个ASCII码字符进行传输。
起始符 | 地址域 | 功能域 | 数据域 | 校验码 | 结束符 |
---|---|---|---|---|---|
1个字符 | 2个字符 | 2个字符 | N字符 | 2个字符 | 2个字符(CR)(LF) |
起始符:数据格式帧头,用字符:表示,ASCII:34H
地址域:从站地址,理论范围1-254
功能域:主站发送,范围1-255
数据域:具体数据内容
校验码:LRC校验码,校验范围由地址域开始,到数据域结束,不含起始符和结束符
结束符:数据格式帧尾,用回车(CR)和换行(LF)表示,ASCII:0DH/0AH
Modbus ASCII协议LRC校验
1.不包括起始”冒号”和结束符的报文中的所有字节相加到一个8位域,故此进位被丢弃。
2.从FF 中减去域的最终值,产生1的补码(二进制反码)。
3.加1产生二进制补码,将LRC置于报文当8位LRC(2个ASCII字符)在报文中传送时,高位字符首先发送,然后是低位字符。
举例说明:求数据01、03、21、02、00、02的LRC校验码
求和, 01+03+21+02+00+02=29
相减, FF-29=D6
加1, D6+01=D7即就是最终的LRC校验码为D7,转换为ASCII码就是44、37。
Modbus TCP
Modbus TCP报文
MBAP报文头 | 功能域 | 数据域 |
---|---|---|
7字节 | 1字节 | N*1字节 |
MBAP由事务处理标识、协议标识符、长度、单元标识符组成
域 | 长度 | 描述 |
---|---|---|
事务处理标识符 | 2字节 | modbus请求/响应事务处理的识别(报文序列号) |
协议标识符 | 2字节 | modbus协议=0 |
长度 | 2字节 | 随后字节的数量 |
单元标识符 | 1字节 | 串行链路或其他总线上连接的远程从站的识别(设备地址) |
Modbus TCP常用功能码与Modbus RTU相同,报文区别就是TCP协议的指令内容在RTU指令内容的基础上增加了一个MBAP报文头,删除了CRC校验。