Modbus协议-------RS485
一、Modbus协议介绍
1、主要特点:
1、主从结构:网络中有一个主设备向多个从设备发起请求,从设备响应请求
2、功能码:Modbus协议定义了一系列功能码,每个功能码对应一种操作,如读取线圈状态、寄存器值,写入线圈状态、寄存器值等。
3、数据组织:Modbus协议中的数据传输包括设备地址、功能码、数据区和校验码。
4、数据传输模式:Modbus支持ASCII、RTU和TCP/IP三种传输模式。其中ASCII模式适合于低速听信和易于调试,RTU模式适用于高速通信且效率较高,TCP/IP模式则支持在网络环境中传输Modbus协议。
二、Modbus协议的数据帧结构:
- RTU模式:包含设备地址、功能码、数据区(长度根据功能码决定)、CRC校验码。
- ASCII模式:在RTU模式基础上增加了起始字符、结束字符、和LRC校验码。
- TCP/IP模式:以TCP报文的形式封装Modbus数据,包含设备地址(在TCP连接中隐含,不再在报文中携带)、功能码、数据区、CRC校验码(TCP层不需要,MODBUS-TCP层可选)。
三、Modbus常用功能码:
功能码 | 名称 | 作用 |
---|---|---|
01 | 读取线圈状态 | 取得一组逻辑线圈当前的状态 |
02 | 读取输入状态 | 取得一组开关输入的当前状态 |
03 | 读取保持寄存器 | 在一个或多个保持寄存器中取得当前的二进制值 |
04 | 读取输入寄存器 | 在一个或多个输入寄存器中取得当前的呃二进制值 |
05 | 强置单线圈 | 强置一个逻辑线圈的通断状态 |
06 | 预置单寄存器 | 把具体二进制值装入一个保持寄存器 |
15 | 强置多线圈 | 强置一串连续逻辑线圈的通断 |
16 | 预置多寄存器 | 把具体的二进制值装入一串连续的保持寄存器 |
上述功能码可以分为位操作和字操作两类,其中,位操作的是线圈和离散输入,两者区别在于,线圈是可读可写的,而离散输入是只读。字操作的是保持寄存器和输入寄存器,两者区别在于,保持寄存器事可读可写的,而输入寄存器是只读的。
四、线圈
读线圈功能码01
主节点发送帧格式(其中MSB为高字节,LSB为低字节):
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
字段定义 | ADDR | CMD | MSB | LSB | MSB | LSB | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 线圈起始地址 | 线圈个数 | CRC校验 |
从节点正常应答帧格式:
序号 | 0 | 1 | 2 | 3 | 4 | ... | L+2 | L+3 | L+4 |
字段定义 | ADDR | CMD | Length | Data1 | Data2 | ... | DataN | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 发送字节数L=n/8+(1) | 第一个字节数据值 | 第二个字节数据值 | ... | 第N个字节数据值 | CRC校验 |
注:数据从低位开始填充,填充完成后还有剩余的高位则全部补0.
从节点异常应答格式:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
线圈值 | 首地址+7 | 首地址+6 | 首地址+5 | 首地址+4 | 首地址+3 | 首地址+2 | 首地址+1 | 首地址 |
写单个线圈功能码05
主节点发送帧格式:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
字段定义 | ADDR | CMD | MSB | LSB | MSB | LSB | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 线圈地址 | 数据 | CRC校验 |
注:数据为0xFF00表示设置线圈状态为ON,数据为0x0000表示设置线圈状态为OFF。
从节点正常应答帧格式(同发送帧):
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
字段定义 | ADDR | CMD | MSB | LSB | MSB | LSB | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 线圈地址 | 数据 | CRC校验 |
从节点异常应答格式:
序号 | 0 | 1 | 2 | 3 | 4 |
字段字义 | ADDR | CMD+128 | ErrCode | LSB | MSB |
解释 | 从节点地址 | 命令类型+128 | 错误码 | CRC校验 |
写多个线圈功能码15
主节点发送帧格式:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ... | L+6 | L+7 | L+8 |
字段定义 | ADDR | CMD | MSB | LSB | MSB | LSB | Length | Data1 | ... | DataN | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 起始线圈地址 | 线圈数n | 发送字节数L=n/8+(1) | 第一个字节数据值 | ... | 第N个字节数据值 | CRC校验 |
字节数据值的定义:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
线圈值 | 首地址+7 | 首地址+6 | 首地址+5 | 首地址+4 | 首地址+3 | 首地址+2 | 首地址+1 | 首地址 |
注:数据从低位开始填充,填充完成后还有剩余的高位全部补0。
从节点正常应答帧格式:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
字段定义 | ADDR | CMD | MSB | LSB | MSB | LSB | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 线圈起始地址 | 线圈个数 | CRC校验 |
从节点异常应答格式:
序号 | 0 | 1 | 2 | 3 | 4 |
字段字义 | ADDR | CMD+128 | ErrCode | LSB | MSB |
解释 | 从节点地址 | 命令类型+128 | 错误码 | CRC校验 |
读保持寄存器功能码03,可读单个或多个
主节点发送帧格式:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
字段定义 | ADDR | CMD | MSB | LSB | MSB | LSB | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 寄存器起始地址 | 寄存器个数 | CRC校验 |
从节点正常应答帧格式:
序号 | 0 | 1 | 2 | 3 | 4 | ... | L+1 | L+2 | L+3 | L+4 |
字段定义 | ADDR | CMD | Length | MSB | LSB | ... | MSB | LSB | LSB | MSB |
解释 | 从节点地址 | 命令类型 | 发送字节数L=n*2 | 第一个寄存器值 | ... | 第N个寄存器值 | CRC校验 |
从节点异常应答格式:
序号 | 0 | 1 | 2 | 3 | 4 |
字段字义 | ADDR | CMD+128 | ErrCode | LSB | MSB |
解释 | 从节点地址 | 命令类型+128 | 错误码 | CRC校验 |
RS485介绍
RS485特点:
- 支持多节点:一般最大支持32个节点。
- 传输距离远:最远通讯距离可达1200米。
- 抗干扰能力强:差分信号传输。
- 电平标准:逻辑“1”时,A相对于B为正,逻辑“0”时相反,典型差分电压范围为±200mV至±2V
- 通讯速率:最高可达10Mbps,但常用速率通常在9600bps至115200bps之间。
- 接口安全性:接口电平低,相对其他标准更不容易损坏芯片。