主控 Modbus 通信可将工业设备数据传输效率提高 50%。
RS485 它不是通信协议,而是一种接口标准。它有两个同级标准:RS232 和 RS422。

RS485接口的正确接线方式是手拉手菊花链连接。如果通信距离较长(例如超过100米),应在网络的起始端和终止端并联一个120Ω的电阻,以减少两端的信号反射。通常情况下,如果距离超过100米,应考虑增加终端电阻;如果距离超过1000米,则应考虑增加RS485总线中继器。

一条RS485总线上可以连接多少个RS485设备?具体数量取决于RS485转换器的负载能力。通常,RS485芯片的负载能力分为三个等级,分别可支持32个、128个和256个设备。我们常用的RS485转换器的负载能力一般为32个设备。
ModbusRTU 是应用层的通信协议,而 RS485 是物理层的接口标准。我们通常所说的 ModbusRTU 通信是指基于 RS485 的通信。然而,ModbusRTU 协议也可以基于 RS232/RS422,甚至以太网 TCP/UDP。同时,RS485 并非 ModbusRTU 的专属接口,任何协议都可以通过 RS485 传输。一个主站能否与多个从站通信取决于协议层是否设计了设备地址。实现一个主站与多个从站通信需要两个条件:物理层和应用层的支持,两者都不可或缺。例如,如果物理层使用 RS232,即使应用层使用 ModbusRTU 协议,也无法实现一个主站与多个从站通信(RS232 采用单发送单接收模式)。

通信速度主要受两个因素影响:数据量和硬件层速度。数据量指的是需要传输的数据量,而硬件层速度则与通信设备和网络基础设施密切相关。硬件层速度与波特率和通信距离均有关,因为主从轮询机制不可避免地会导致通信效率下降。
通信协议分为三种类型:标准协议,例如 Modbus 协议;品牌协议,例如西门子 S7 协议、三菱 MC 协议;以及自定义协议。ModbusRTU 的通用消息格式如下:

[1] 从属地址:此消息发送给谁或从谁发送。
[2] 功能代码:做什么,读/写/线圈/寄存器。

[3] 数据部分:提供与函数代码对应的参数。
[4] 验证部分:确保消息的正确性和完整性。
读取输出线圈

【1】从设备地址:0x01 表示从从设备 1 读取数据。
[2] 功能码:0x01 表示正在读取的数据来自输出线圈存储区。
[3] 起始地址:十六进制 0x00 0x13 对应十进制 19,表示读取从线圈 19 开始。与此 19 对应的 Modbus 地址为 00020。(注:Modbus 地址遵循“偏移量 + 1”的编号规则。十六进制 0x13(十进制 19)是线圈的“实际偏移地址”。Modbus 地址需要通过将偏移量加 1 来获得,即 19+1=20,对应于线圈地址 00020(线圈地址通常以 000xx 格式表示)。
- 地址类型区分:在 Modbus 中,线圈(离散输出)的地址范围默认从“00001”(而不是 0)开始。这里,“00001”对应于实际的偏移地址 0(十六进制 0x00)。
- 转换逻辑:实际偏移地址(十进制 N)→ Modbus 线圈地址 = N + 1。这里,N=19 (0x13),所以 19+1=20,格式化为 5 位数字 00020。)[4] 线圈数:十六进制 0x00 0x1B 对应于十进制 27,表示读取的线圈数为 27。
[5] CRC 校验:0x8D 0x4C 表示对所有前面的数据执行 CRC 校验的结果。
主站发送此消息以读取1号从站输出线圈存储区的状态值,该存储区的Modbus地址范围为00020至00046,共包含27个线圈。1号从站收到此消息并理解主站意图后,将回复如下消息:

[1] 从设备地址:0x01 表示从设备 1 响应的消息。
[2] 功能码:0x01 表示响应是针对 0x01 功能码消息的。
[3] 字节计数:0x04 表示返回的数据由 4 个字节组成。
[4] 字节 1 至字节 4:返回的具体数据分别为 0xCD、0x6B、0xB2 和 0x05。这四个字节对应于 32 个线圈值,其中前 27 个线圈值对应于 00020 至 00046 的值。
[5] CRC校验:0x00 0x02 表示对所有先前数据执行CRC校验的结果。主站收到响应消息后,获取所需数据。具体对应关系如下:
0xCD=1100 1101 对应于 00027-00020
0x6B=0110 1011 对应于 00035-00028
0xB2=1011 0010 对应于 00043-00036
0x05=0000 0101 对应于 00051-00044
【说明:要将字节 0xCD (11001101) 转换为 Modbus 地址,核心是首先明确 Modbus 地址类型(位地址/寄存器地址),然后根据“字节到地址映射规则”进行转换——Modbus 没有通用的“字节到地址”标准,关键在于设备定义的“起始参考 + 地址类型”。】
最常见的场景:转换为 Modbus 位地址(离散输入/线圈,1 位 = 1 个地址)
在 Modbus 中,1 字节等于 8 位二进制数,每一位对应一个“位地址”(例如离散输入 1xxx 区、线圈 0xxx 区)。转换分 3 个步骤完成:
- 确定字节的“基地址”
假设设备定义:此字节的起始位地址参考为 N(请参阅设备手册,例如常用参考 20、100 等),1 个字节占用 8 个连续位地址。
- 按位分配地址
字节 0xCD=11001101 由 8 位(第 0 位到第 7 位)组成,对应的地址为:
位0→N、位1→N+1、位2→N+2、位3→N+3、位4→N+4、位5→N+5、位6→N+6、位7→N+7
例如:如果 N=20,则 8 位地址为 20~27(即,您之前看到的“00020-00027”,按照注释约定,以相反的顺序写成 27-20)。
- 补充地址区域前缀
离散输入(只读)以 1→10020~10027 为前缀;线圈(可读写)以 0→00020~00027 为前缀(设备通常省略前缀,直接写入 00020~00027)。】(注:原文似乎是一个不完整的句子,因此翻译也不完整或仅是占位符。如果原文不完整,翻译也无法完成。)
目前,Modbus 通信交互已完成。










