物联网测试 物联网 - 工业物联 modbus 通信协议介绍与测试经验分享

啊木森 · 2023年03月24日 · 最后由 忽忽dan 回复于 2024年07月29日 · 56205 次阅读
本帖已被设为精华帖!

作者:李可福

1、简介

Modbus 协议是一种通信协议,用于工业自动化系统中的设备间通信。该协议最初由 Modicon 公司开发,并于 1979 年发布。
Modbus 协议通过串行通信格式进行通信,在物理层上支持 RS-232、RS-422 和 RS-485 等多种通信方式。在协议层面,Modbus 协议分为应用层、数据链路层和物理层。
应用层定义了 Modbus 消息的格式和内容,包含功能码、数据地址、数据长度以及数据内容等信息。数据链路层则负责传输 Modbus 消息,包括帧起始符、帧结束符、校验位等。物理层则定义了消息的物理传输方式,如电气特性、传输速率等。
Modbus 协议广泛应用于工业自动化系统中的各种设备之间的通信,如 PLC、传感器、伺服控制器等。它已成为一个通用的标准,被广泛采用和支持。
RS-485 通信距离可以达到 1200 米,但实际距离取决于许多因素,例如通信速度、电缆质量、环境噪声和阻抗匹配等。在高速通信和长距离通信的情况下,建议采用特殊的通信线缆并添加信号放大器以提高通信质量。此外,在布置电缆时要注意避免电缆与强电设备或其他干扰源的交叉干扰。
注释:下文描述主机(上位机),从机(下位机)

2、应用场景

目前大部分工业产品,串口有线通信基本上使用 Modbus 协议 RS-485 通信方式,实现设备与设备之间数据传输;设备与设备直接接线,接线方式很多,比如树型接线,星型接线,推荐方式为 “手拉手接线(菊花链接法)”,应用方案和场景很多,需要根据实际业务设定,以下简单介绍,熟悉的应用场景。
1、主控和线控模式:主控作为 “主”,线控作为 “从”,主控自动查询线控状态;
2、从机设备可以为同类产品,也可以不同类产品,举例子:使用 1-8 从机为温度控器,9-15 从机为混水控制器,16-20 为新风控制器等

繁杂的应用场景:

遇到这样的复杂系统测试时,首先不要慌张,先查看各个产品的通信协议,逐步拆解到每一个设备,进行单元测试,确保每一部分的功能正常和数据正常;比如首先使用 modbus poll 模拟主机设备,测试每一个设备功能是否正常,数据上报格式是否正常;再次使用 modbus Slave 模拟从机设备,查看设备实际运行逻辑是否正常,获取从机数据显示是否正常。如果在集成测试时,遇到问题时,可以使用 SSCOM 软件,查看主从机直接通信情况。

3、RS-485 通信协议基础

一、基础知识

RS485 是一个定义平衡数字多点系统中的驱动器和接收器的电气特性的标准,该标准由电信行业协会和电子工业联盟定义。使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。RS-485 使得连接本地网络以及多支路通信链路的配置成为可能。
RS485 有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,很多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接 256 个节点,挂最多少节点,决定在于芯片。
在 RS485 通信网络中一般采 用的是主从通信方式,即一个主机带多个从机。
RS485 硬件工具:

二、Modbus 协议

Modbus 协议可以说是工业自动化领域应用最为广泛的通讯协议,因为他的开放性、可扩充性和标准化使它成为一个通用工业标准。有了它,不同厂商的产品可以简单可靠的接入网络,实现系统的集中监控,分散控制功能。
在串行通信中,用 “波特率” 来描述数据的传输速率。国际上规定了一个标准波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4Kbps、19.2Kbps、28.8Kbps、33.6Kbps、56Kbps。例如:9600bps,指每秒传送 9600 位,包含字符的数位和其它必须的数位,如起始位、停止位和奇偶校验位等。
编码系统:8 位二进制,十六进制 0-9,A-F
数据位: 1 起始位
8 位数据,低位先送
奇/偶校验时 1 位;无奇偶校验时 0 位
带校验时 1 位停止位;无校验时 2 位停止位
错误校验区:循环冗余校验 (CRC)
从站地址设置:信息地址包括 2 个字符 (ASCII) 或 8 位 (RTU),有效的从机设备地址范围 0-247(十进制)。

三、Modbus 的功能码


一般使用到功能码 03、06、16。

03(0x03) 功能码——查询多个寄存器

下文中所示例的发送和接收数据,其格式全部为 16 进制,例如 01 为 0x01,C5 为 0xC5
集成系统发送: 01 03 00 00 00 06 C5 C8
集成系统接收: 01 03 0C 00 00 00 02 00 19 00 01 00 00 00 00 3F 11
集成系统发送码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID),出厂默认为 01。如果是 00,表示广播
第 2 字节(03)——MODBUS 功能码,其意义为读取一系列寄存器的值。
第 3,4 字节(00 00)——从 00 00 位置开始读取一系列寄存器的值
第 5,6 字节(00 06)——从 第 3,4 字节指定的寄存器开始,共读取 00 06 个寄存器。
第 7,8 字节(C5 C8)——该帧数据的校验字节(校验方式:CRC16)
集成系统接收码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(03)——MODBUS 功能码。
第 3 字节(0C)——对应于查询指令,空调网关共返回 0C(十进制:12)个字节的数据
第 4~15 字节 —— 空调网关返回 12 字节的被读取数据
第 16,17 字节( 3F 11)——该帧数据的校验字节(校验方式:CRC16)

06(0x06) 功能码——操作单个寄存器

01 06 0F A0 00 01 4B 3C --- 开启
01 06 0F A0 00 01 4B 3C --- 回复开启
集成系统发送码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(06)——MODBUS 功能码,其意义为设定一个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始设定一个寄存器的值。
第 5,6 字节(00 01)——将 第 3,4 字节所指定的寄存器写入值 00 01
第 7,8 字节(4B 3C)——该帧数据的校验字节(校验方式:CRC16)
*集成系统接收码含义: *
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(06)——MODBUS 功能码,其意义为设定一个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始设定一个寄存器的值。
第 5,6 字节(00 01)——将 第 3,4 字节所指定的寄存器写入值 00 01
第 7,8 字节(4B 3C)——该帧数据的校验字节(校验方式:CRC16)

16(0x10) 功能码——操作多个连续寄存器

01 10 0F A0 00 04 08 00 01 00 04 00 14 00 03 C0 B1
--- 同时设定 4 项参数 (开启 送风 20 度 高风) 其中温度和风向无效
01 10 0F A0 00 04 C2 FC --- 回复 4 项变更
集成系统发送码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(10)——MODBUS 功能码,其意义为一次设定多个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始一次设定多个寄存器的值。
第 5,6 字节(00 04)——从第 3,4 字节指定位置开始,一次设定 4 个寄存器的值。
第 7 字节(08)——要设定写入的总字节数为 8( 4 个寄存器 x 2 字节/寄存器)
第 8~15 字节 ——要设定的 4 个寄存器的具体值,第 8,9 字节写入第一个寄存器,第 10, 11 字节写入第 2 个寄存器,第 12,13 字节写入第 3 个寄存器,第 14,15 字节写入第 4 个寄存器
第 16,17 字节(C0 B1)——该帧数据的校验字节(校验方式:CRC16)
集成系统接收码含义:
第 1 字节(01)——空调网关设备地址(MODBUS 定义为 Slave ID)
第 2 字节(10)——MODBUS 功能码,其意义为一次设定多个寄存器的值。
第 3,4 字节(0F A0)——从 0F A0 位置开始,一次设定多个寄存器的值。
第 5,6 字节(00 04)——从第 3,4 字节指定位置开始,一次设定 4 个寄存器的值。
第 7,8 字节(C2 FC)——该帧数据的校验字节(校验方式:CRC16)
PS:只支持修改连续的寄存器地址值;

4、测试工具介绍

一、SSCOM 软件使用分享

主要用途:通过 RS485 控制设备或者监听同路上接 N 个从机设备与主机通信
缺点:需要熟悉 modbus 协议内容,分析数据比较麻烦,需要将看到 16 进制数转为 10 进制数;

配置文件,查看产品开发协议文档
举例子:
端口号(Port):选择连接电脑 RS485 设备端口号;
波特率(Baud rate):9600,4800
数据位(Data bits): 8 位
停止位(Stop bits):1
校验(Parity):N
步骤 1:连接 RS485 工具的端口
步骤 2:设置 modbus 协议的环境参数
步骤 3:选择连接从机设备的波特率,如果手中的设备和设置的波特率不一致,会导致不能正常通信;
步骤 4:打开串口,连接设备,若提示以下信息,说明端口被占用等;

步骤 5:发送指令内容;详情查看 Modbus 的功能码讲解
举例子:02 06 10 01 00 00 DC F9 向从机地址 2,1001(开关机),设置 00(关机)
PS:工具功能比较多,不一一讲解,详情自己探索:比如 “扩展” 功能自动定时发送不同指令参数;

二、modbus Poll 软件使用分享


主要用途:代替为主机,时刻查询从机设备状态,并且实时展现
优点:参数值默认转为十进制,查看参数通俗易懂,设置参数值操作简单,支持同时查询多个设备情况,参数表支持保存下次继续使用;
缺点:设备只能为从机,若设备为主机协议,需使用 modbus Slave 软件工具测试;

工具介绍:


1、工具栏:
新键配置表、导入配置表、保存配置表、打印配置表、取消、配置从机参数、断开连接、连接设备、功能码区域(05/06/15/16/17/22/23)、TC、日志查询
2、当前寄存器地址:显示为十进制数
3、寄存器地址描述,支持自定义
4、寄存器的读取参数值

操作介绍:

第一步:设置参数值

第二步:设置从机地址和初始寄存器地址,读取参数数量

点击 Setup →Read/Write Definition

Slave ID: 当前设备的 RS485 地址,2 代表当前设备 RS485 地址为 2
Address:读取设备的初始地址,填写十进制地址,比如初始地址十六进制为 1001,转成十进制为 4097
Quantity:需读取参数数量,若超过设备参数范围,会导致参数异常的现象
ScanRate :查询参数的速度值,默认为 1000ms(此参数可能影响到设备的丢包现象)
TX :表示总共发送多少次查询指令
Err:表示返回错误值次数(丢包次数)
ID:表示当前的设备 RS485 地址
F:表示功能吗:03
SR:表示查询速率:1000ms

第三步:修改参数值

双击参数值后,会弹窗显示以下内容

举例子:修改设备开关机状态,双击开关机地址,在 Value 中填写 0-关机或者 1-开机,点击 Send 发送指令。06 和 16 分别表示功能码,需要查看设备是否支持 06 和 16 功能码。

查看日志:

在工具栏中,点击日志按钮,支持暂停日志和保存日志功能,若需要分析日志内容,可以返回查看基础讲解的 Modbus 的功能码。
日志显示数据为 16 进制数,因此需要转换为 10 进制数

通信日志监听:

在日常工作中,总是想着监听一些参数值,在一段时间中时刻变化,但又不想着时刻去记录这些数据,此软件提供日志系统,直接输出到 Excel 或者 Text;
操作步骤:Setup →Excel log 或者 log

参数值显示类型切换:

在日常工作中,遇到参数为 Bit 类型参数,如果使用十进制数查看比较麻烦,需要转换为二进制,软件支持显示类型转换;如果参数为 Bit 类型,请使用 Binary 类型

三、Modbus Slave 软件使用分享


主要用途:模拟从机设备,并且支持同时模拟多个从机设备;
优点:参数值默认转为十进制,查看参数通俗易懂,设置参数值操作简单,支持同时模拟多个从机设备情况,参数表支持保存下次继续使用;

工具介绍


1、工具栏:
新键配置表、导入配置表、保存配置表、打印配置表、配置从机参数、断开连接、连接设备
2、状态栏:
ID=10 表示模拟从机地址为 10 的设备
F = 03 表示功能码为 03

01 Coil Status 寄存器地址用于获取数字输出(Coil)的状态信息。这些数字输出通常是硬件上的继电器或开关等,可以通过 Modbus 协议进行控制。读取 01 Coil Status 寄存器地址将返回一个位图(bitmap),每个位代表一个数字输出的状态,通常为 0 或 1,表示关闭或打开。
02 Input Status 寄存器地址用于获取数字输入(Input)的状态信息。这些数字输入通常是传感器或其他设备提供的信号,可以通过 Modbus 协议获取。读取 02 Input Status 寄存器地址将返回一个位图,每个位代表一个数字输入的状态,通常为 0 或 1,表示低电平或高电平。
03 Holding Register 寄存器地址用于读取和写入模拟量输出(Holding Register)的值。这些模拟量输出通常是一些设备的状态量或控制量,可以通过 Modbus 协议进行读写操作。读取 03 Holding Register 寄存器地址将返回一个字(16 位),表示模拟量输出的当前值;写入 03 Holding Register 寄存器地址将设置模拟量输出的目标值。
04 Input Registers 寄存器地址用于读取模拟量输入(Input Registers)的值。这些模拟量输入通常是传感器或其他设备提供的模拟量信号,可以通过 Modbus 协议获取。读取 04 Input Registers 寄存器地址将返回一个字(16 位),表示模拟量输入的当前值。
3、寄存器地址描述,支持自定义
4、寄存器的写入参数值,若遇到写入的值为 Bit 类型时,选择需要参数值,右键选择 “Format” 改成 Binary

3、参数设置:

Slave ID:表示模拟从机地址
Address:表示初始地址
Quantity: 表示模拟 39 位数据
Fit ot Quantity:表示垂直显示数据

查看日志:

在工具栏 “Display“,点击 communication Traffic,支持暂停日志和保存日志功能,若需要分析日志内容,可以返回查看基础讲解的 Modbus 的功能码。
日志显示数据为 16 进制数,因此需要转换为 10 进制数

5、测试事项介绍

Modbus RS-485 通信测试方法和 APP 测试相似,比如稳定性测试,功能逻辑,参数边界值、等价值测试等;
1、RS-485 参数值输入范围仅支持-32768 到 32767 整数范围;
2、在 RS-485 修改参数时,需要结合参数公式转换,比如温度值上报 225,显示端应显示为 “22.5”℃
3、主要协议点位计量单位,比如协议中单位为 W,但是显示端(APP 或者设备)需要显示为 kW,因此 10000W,最终应该显示为 10kW
4、遇到复杂的设备系统时,比如多设备直接互相通信时,先确认每一个对接产品的功能是否正常,再组装成完整系统测试;

一、基本功能测试

产品 RS-485 协议文档中,规定当前值的类型和参数范围如下所示:
PS:DIGI1,TEMP1 定义由自己公司制定,没有统一标准
DIGI1:表示无符号 byte,单位 1,显示 123 时,数据传输是 123。
TEMP1:有符号 byte,0.1℃分辨率,公式:T*10,温度范围为-30~97℃(显示 25 度时,其协议传输的数据根据上述公式是 250;显示-25 度时,其协议传输的数据是-250;bit15 为 1 时表示负数,bit15 为 0 时,表示整数;),当该值为 32767 时表示对应传感器故障。

| Address
(10 进制) | Function | Content | | Byte length | mode | Description | Remark |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1001 | 03/16/06 | 开关机 | | 双字节 | 读/写 | 0-关机/1-开机 | DIGI1 |
| 1002 | 03/16/06 | 设定温度 | | 双字节 | 读/写 | 5.0℃~50.0℃ | TEMP1 |

举例子:
1、设定温度类型为 “TEMP1” 类型,若需要设置温度为 25.5℃,需要在协议中输入 “255”,并同时查看界面显示值为 25.5℃;
2、设定开关机类型为 “DIGI1” 类型,若设置 1-开机,则输入 “1”,并查看界面确认设备是否开机;
3、超过范围值输入,需求不一样,呈现效果不一样;
比如需求为超过范围值时,设置成为范围值最大或者最小值,比如设定温度最小值为 5℃,最大值为 50℃,因此输入 40(4℃),会直接设定为 50(5℃),若输入为 611(61.1℃),会设定为 500(50℃);
比如需求为超过范围值时,设置成为范围值不处理,比如当前设定温度值为 200(20℃),输入 40(4℃),不接收,依然为 200(20℃);

二、通信丢包率测试

我司测试标准,查看 Err 标识数,通信在 1/100000 丢包率;

三、稳定性测试

方法一、设备为从机情况下,通过 SSCOM 软件中 “扩展” 功能,设定循环执行的指令
勾选循环发送,会无限循环发送指令
发送字符串内容,可以为读取 03 指令,写入 06 或者 16 指令,同时内容为异常值和正常值

方法二、通过编写自动化脚本,循环发送指定指令内容(后期讲解)

四、测试遇到问题及解决方案

1、短距离通信时,遇到丢包率比较高的现象

原因分析:
一、通信代码逻辑问题,初代产品时,遇到过此现象;
二、产品周围存在信号干扰;
解决方案:
一、优化代码逻辑,比如将响应时间变短;
二、使用双层的屏蔽线,或者直接将信号干扰源关闭

2、设备手拉手通信,长距离时遇到远距离的设备,通信异常

原因分析:
通信信号随着距离增加性能将降低;
解决方案:
在 485 通信距离超过 300 米的情况下,要在 485 通讯的开始端和结束端增加终端电阻或者在仅一端加电阻。

注释:图片来源电子发烧友

3、接线时遇到烧掉 RS485 芯片

原因分析:
RS485-A 和 RS485-B 接到供电口,直接烧坏芯片
解决方案:
接线时,主要 RS485-AB 口不能接到供电口,并且 RS485-A 接对应 RS485-A 口,RS485-B 接对应 RS485-B 口

4、测试业务功能时,需要记录某段时间内,点位数据变化情况

解决方案:
如果设备为从机时,使用 modbus Poll 软件中 “通信日志监听” 功能,会输出 exlce 表或者 Log 表,同时带有时间标识;比如在测试睡眠功能时,需求是每个小时都会将设定温度调节,因此使用此功能,第二天过来,将表格过滤分析,就知道测试结果。

5、遇到过主机设备,接 16 台设备超过设备会通信异常现象,都是有一些产品可以支持 32 台设备通信

原因分析:
RS-485 芯片的性能问题
解决方案:
使用高性能的 RS-485 芯片,或者限制设备仅支持设备数量;
对接设备越多,轮询时间越长,用户体验越差;目前我司产品,最多支持 32 台设备联动

6、单主控,多从机,如何让从机每一个状态都与主控同步

一、备份和同步逻辑
二、广播指令机制下发参数
三、定时查询全部设备

7、遇到设备端存在丢包或者不响应的问题

解决方案:主控存在重发机制,比如发送第一包数据,没回应,会触发重发机制,再次发送两次,判定是否 RS-485 在线(断开)

8、设备遇到数据包错位情况

举例子:主控发送 A 数据段查询,从机回应 B 数据内容
解决方案:回应的数据段中,包含当前数据段标识值,比如 A 段包中有某个点位参数中包含 A 标识符;

共收到 3 条回复 时间 点赞
TesterHome小助手 将本帖设为了精华贴 03月28日 09:00

还是那个协议,还是那个工具

LZ 写挺详细的,就是该说不说有些表达实在难以理解
“因此使用此功能,第二天过来,将表格过滤分析,就知道测试结果”
“5、遇到过主机设备,接 16 台设备超过设备会通信异常现象,都是有一些产品可以支持 32 台设备通信”
我真的看的很累

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册