Modbus详细笔记
Modbus详细笔记
结合自己毕业以来一年的工作经验,记录下自己对Modbus485的理解和应用,方便自己学习使用,也可给广大网友学习参考,欢迎指正我的错误和补充不足。
更新记录
时间 | 更新内容 |
---|---|
2024/6/14 | 更新异常反馈:错误码和异常码的认识 |
Modbus 简介
Modbus协议是一种用于工业自动化领域的通信协议,它是最常用的串行通信协议之一。Modbus协议最初是由Modicon(现在是施耐德电气公司的一部分)开发的,用于连接PLC(可编程逻辑控制器)和其他设备,现在单片机上也广泛应用。Modbus协议可以在串行通信(如RS-232、RS-485)和以太网通信(如Modbus TCP/IP)中使用。它可以通过简单的读写寄存器来传输数据,通常用于监控和控制设备之间的通信。
Modbus协议有三种不同的传输模式:
- ASCII模式:ASCII模式使用可见字符来传输数据
- RTU模式:RTU模式使用二进制数据传输,
- TCP/IP模式:TCP/IP模式适用于网络通信。
本文主要介绍Modbus RTU
Modbus协议使用从站和主站的概念,主站负责发送请求并控制通信的流程,而从站则响应主站的请求并提供数据。modbus是一个 master 设备控制一个或多个 slave 设备;即一主多从。它支持多种数据类型的读写,如数字、浮点数、字符串等。
注意!
Modbus 是一种通讯协议,而 RS-485 是一种物理层通讯标准。Modbus 的不是物理层传输方式,Modbus 是数据格式,接收、应答和错误处理机制。Modbus 协议可以在 RS-485 物理层上运行,但也可以在其他物理层上运行,比如以太网,Wi-Fi等等,RS-485 是一种串行通讯标准,适用于远距离高速数据传输。在工业自动化领域,常常会将 Modbus 协议应用于 RS-485 物理层上,以实现各种设备之间的通讯。因此,可以说 Modbus 和 RS-485 是可以结合使用的,但它们之间的主要区别在于一个是通讯协议,一个是物理层标准。
为了便于理解我们直接自定义一些寄存器地址
Modbus 帧结构
寄存器地址 | 字节数量byte | 数据格式 | 名称 | 值 | 范围 | 单位 | 传输 |
---|---|---|---|---|---|---|---|
0x2600 | 2 | U16 | 实时电流 | 0-1000 | A | HEX | |
0x2601 | 2 | U16 | 实时电压 | 0-1000 | V | HEX | |
0x2602 | 2 | U16 | 输入电流 | 0-1000 | A | HEX | |
0x2603 | 2 | U16 | 输出电压 | 0-1000 | V | HEX |
Modbus协议的帧结构
- Modbus RTU帧结构:
- 起始符:1个字节,为冒号“:”。
- 从站地址:1个字节,表示数据传输的目标设备地址。
- 功能码:1个字节,指示数据的操作类型,如读操作、写操作等。
- 数据域:N个字节,包含传输的数据。
- CRC校验:2个字节,用于检测数据传输中是否出现错误。
- 结束符:2个字节,表示帧的结束。
如读寄存器地址发送读多个寄存器:01 03 26 00 00 06 B7 0D
- 01:从站地址;
- 03:功能码;
- 22 00:读取寄存器起始地址;
- 00 06:读取寄存器数量;
- B7 0D:CRC校验码;
返回:01 03 0C 00 2D 00 3E 00 4R 00 5Y 00 7U 00 8P 1D 2C
- 01:从站地址;
- 03:功能码;
- 0C:数据长度;
- 00 2D 00 3E 00 4R 00 5Y 00 7U 00 8P:数据 每两个byte为一个,如00 2D是寄存器0x26 00的值;
- 1D 2C:CRC校验码;
从这个例子中可以知道Modbus的要素
从站地址 | 功能码 | 起始地址 高位 | 起始地址 低位 | 数量 高位 | 数量 低位 | CRC低位 | CRC高位 |
---|---|---|---|---|---|---|---|
0x01 | 0x03 | 0x26 | 0x00 | 0x00 | 0x06 | 0xB7 | 0x0D |
补充:从站地址(1字节) 功能码(1字节) 数据(0-252字节) CRC(2字节)
数据长度是有限制的
Modbus 功能码
功能码 | 异常功能码(功能码+0x80) | 中文名称 | 位操作/字操作 | 操作数量 |
---|---|---|---|---|
0×01 | 0x81 | 读线圈状态 | 位操作 | 单个或多个 |
0×02 | 0x82 | 读离散输入状态 | 位操作 | 单个或多个 |
0×03 | 0x83 | 读保持寄存器 | 字操作 | 单个或多个 |
0×04 | 0x84 | 读输入寄存器 | 字操作 | 单个或多个 |
0×05 | 0x85 | 写单个线圈 | 位操作 | 单个 |
0×06 | 0x86 | 写单个保持寄存器 | 字操作 | 单个 |
0×0F | 0x8F | 写多个线圈 | 位操作 | 多个 |
0×10 | 0x90 | 写多个保持寄存器 | 字操作 | 多个 |
Modbus 异常反馈
Modbus错误码常见有以下几种:
错误码 | 名称 | 意义 |
---|---|---|
01 | Illegal Function Code | 功能码不合法,表示Modbus主机请求使用了不支持的功能码。 |
02 | Illegal Data Address | 数据地址不合法,表示Modbus主机请求的数据地址超出范围或者不存在。 |
03 | Illegal Data Value | 数据值不合法,Modbus主机请求的数据值不符合规范,例如超出最大值或者格式错误。 |
04 | Slave Device Failure | 从机设备故障,表示从机设备出现了故障或者无法响应Modbus主机的请求。 |
05 | Acknowledge | 从机设备收到了请求但是无法完成处理,从机设备正在处理其他请求无法立即响应。 |
06 | Slave Device Busy | 从机设备忙,通常表示从机设备正在处理其他请求无法立即响应。 |
08 | Memory Parity Error | 内存奇偶校验错误,通常表示从机设备的内存数据校验错误。 |
0A | GatewayPathUnavailable | 网关路径不可用 专用于Modbus网关。表示网关配置错误。 |
0B | GatewayTargetDeviceFailedToRespond | 网关目标设备未响应 专用于Modbus网关。表示未收到目标设备的响应。 |
Modbus错误码的帧格式通常是一个8字节的字节序列,包含了以下几个字段:
-
地址码(Address):1个字节,表示Modbus从机设备的地址,范围为1-247。
-
异常码(Function Code):1个字节,表示Modbus主机请求功能码对应的异常响应码。
-
错误码(Exception Code):1个字节,表示Modbus从机设备返回的错误码,报错原因。
-
错误数据(Exception Data):1个字节,包含了导致错误的相关数据,通常用于详细描述错误原因。
-
CRC校验(CRC Check):2个字节,用于校验报文的完整性和准确性。
-
结束符(End of Frame):2个字节,标识报文的结尾。
如下是错误码
01: 从站地址 (Slave Address),表示响应来自地址为1的设备。
90: 异常码 (Error Code),表示功能码0x10的异常响应。
02: 错误码 (Exception Code),表示非法数据地址 (Illegal Data Address)。
CD C1: CRC校验码 (CRC Checksum),用于错误检测。
总体来说,Modbus错误帧格式是一个固定长度的8字节字节序列,其中包含了地址码、功能码、错误码、错误数据、CRC校验和结束符等字段。通过解析错误帧格式,可以帮助用户快速定位和解决通信问题。
这些错误码通常会在Modbus通信过程中出现,通过查看错误码可以排查通信问题并进行相应的解决。
RS485介绍
RS-485是一种串行通信标准,通常用于在工业控制系统和自动化设备中进行数据通信。RS585s 差分传输信号线路,半双工,多点通信的标准。RS485 仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协议。RS-485具有较高的抗干扰能力和较远的传输距离,通常可以覆盖数千英尺的距离。由于其可靠性和稳定性,RS-485常被用于工业环境中对稳定数据通信要求较高的场合。RS-485的数据最高传输速率为10Mbps RS485需要 2 个匹配电阻。
在RS-485通信中,串口控制器和收发器起着重要的作用:
- 串口控制器:串口控制器通常是一种集成电路,负责控制串行通信的各个方面,包括数据的发送和接收、波特率的设定、数据格式的处理等。串口控制器可被用来配置和控制RS-485通信,确保数据能够准确地被发送和接收。
- 收发器:RS-485是一种差分信号传输标准,要与传统的单端信号通信设备进行通信时,需要使用收发器进行信号的转换和适配。收发器主要负责将串行数据转换成差分信号发送,并将接收到的差分信号转换回串行数据。收发器在RS-485通信中起到了信号转换和隔离的作用,确保数据能够在不同设备之间稳定传输。
RS485差分信号电平
-
信号
不要以为RS485中的逻辑1就是B>A,逻辑0就是A>B。要分为两种情况考虑,要把RS485的逻辑分成驱动器(发送器)和接收器。 对于驱动器(发送器),逻辑1(正)是A>B, AB之间电压为+2至+6V,而逻辑0(负)是A<B,AB之间的电压为-2~-6V.而对于接收器,则逻辑1(正)则是B>A,BA之间的电压不小于200mV,逻辑0则是A>B,BA之间的电压小于-200mv,即正负逻辑,电压绝对值都大于200mv。 -
测量
测量方法两种:一种探头接地端接在B上,探头接在A上(这种方法有可能导致485通信突然不正常,是因为示波器导致的,具体原因大家帮忙给出原因),另一种方法:需要两个探头,一个探头接A,另一个探头接B,两个探头接地端都接在板内参考地上,然后使用示波器math功能CH1-CH2就是485波形。 -
485波形解析
还在不断补充中。。。