RS485 总线组网:地址、终端电阻、菊花链、半双工收发时序
- 搞懂 RS485 菊花链拓扑的正确走法,以及为什么不能用星型/分支接法
- 理解 120Ω 终端电阻的作用,知道装在哪里、装几个
- 学会设备地址分配和半双工收发切换时序
- 认识总线 AB 线序、GND 是否要接的工程实践
- 拿到故障排查表:只有一台不通、全线乱码、信号反射怎么查
你刚把一台灯光控制器用 RS485 搞通了,然后领到下一个任务:机房里要接一整排设备——8 台科星 IO 控制器、4 台灯光控制器——都走 RS485,一条总线管到底。结果把线接上,发第一台的地址正常,发其他台要么没反应、要么两台同时乱码应答,或者只要接线超过 3 台就开始时好时坏。
这不是偶发的玄学问题。RS485 多设备组网有一套固定的工程规范,按规范来就稳,违反规范就乱。 这一节把每个细节从原理到接法讲清楚,你看完再接总线,会快很多。
涉及设备接线与工业总线配置(R2)。RS485 电气特性参数以 TI 应用手册(SLLA272D)和 Modbus over Serial Line 官方规范为准(见文末来源);具体设备的地址配置方式以该设备手册为准,不同型号不通用。
RS485 总线的本质:差分信号 + 地址广播
在串口协议入门里我们讲过,RS232 是一对一私聊,RS485 是一条总线上拉群。这里先把"拉群"的底层逻辑说清楚:
RS485 是差分信号:总线上有 A、B 两根线,发送方同时驱动这两根线到相反的电压方向(A 比 B 高为逻辑 1,B 比 A 高为逻辑 0),接收方根据两者的电压差(而不是绝对电压)来判断 0/1。这就是它抗干扰强的根本原因——干扰通常是共模的,同时叠加到 A 和 B 上,差值几乎不变,数据照样能解出来。
但差分优势带来一个新约束:每个时刻只能有一个设备在驱动总线。如果两台设备同时把 A、B 往不同方向拉,信号就乱了。这就是为什么 RS485 必须是半双工(同一时刻只能发或只能收),而且多设备共线时要靠地址来区分"这条指令是给谁的"。
拓扑:为什么菊花链,不能星型
RS485 总线的标准接法是菊花链(Daisy Chain),即设备一台台串联在同一条总线上:
主控 ─────────────────────────────────
│ │ │
设备1 设备2 设备3
不是:
主控
/ | \
设备1 设备2 设备3 ← 错误:星型接法
也不是从主控拉一根线出来、在中间某个位置"T 形"引出分支去另一台设备:
主控 ──────────┬──────── 设备1
│
设备2(T 形分支)← 尽量避免
为什么不行? 信号电平在总线上是以电磁波的形式传播的,在阻抗不匹配的"分叉点"(T 形或星型节点)会产生反射:部分信号被反射回源头,和后续信号叠加,造成波形畸变,表现为数据错误、时好时坏,而且越长越严重。
菊花链结构中,信号从主控端出发,经过每台设备,一直走到末端,沿途是连续的传输线,阻抗均匀,反射最小。这是 RS485 多设备组网最重要的一条硬规矩。
现实展厅里做不到完美菊花链怎么办?分支线长度小于总线长度的 1/5 且不超过 3 米时,分支引起的反射在低波特率(9600 以下)通常不显著。但这是工程妥协,不是规范推荐。如果超过这个距离,信号完整性就无法保证——要用 RS485 中继器或换拓扑。 以 TI RS485 应用手册(SLLA272D)中的分析为参考依据。
终端电阻:为什么是 120Ω,装在哪
菊花链的两端——最靠近主控的那端和最末尾设备的那端——各装一个 120Ω 的电阻,接在 A 和 B 之间。
为什么 120Ω? 标准双绞线的特征阻抗通常在 100~120Ω 范围内,终端电阻的值要和传输线的特征阻抗匹配,才能最大程度吸收信号到达末端后的反射。所以 120Ω 不是随便取的,是和传输线阻抗匹配的结果。
为什么装两端? 信号从主控发出,经总线一路传到末端,末端是"终点",不加终端电阻就有反射,往回打。主控端同理——从末端反射回来的信号还会在主控端再次反射,形成"来回弹",在高波特率下对信号质量影响明显。两端都加,把两个反射点都消掉。
120Ω 菊花链走向 120Ω
├─ 主控 ─ 设备1 ─ 设备2 ─ 设备3 ─┤
A B A B A B A B
实际工程中很多设备的接线端子上自带"终端电阻使能"拨码,比如有人 USR-TCP232 的 RS485 口旁边就有一个终端电阻跳线,主控侧接的第一台设备和末尾设备把这个拨码打开就行,省掉外接电阻的麻烦。具体以你手上型号的手册为准。
只有一台设备时要不要终端电阻? 理论上一台设备的总线非常短,反射影响极小。但工程实践上建议同样加上——代价几乎为零,省掉一个潜在问题根源。
中间的设备要不要加终端电阻? 不要。中间设备加了终端电阻,相当于在总线中间"插了一堵墙",把总线并联上了一个额外的低阻抗,信号被大量吸收,总线上的驱动能力不够,后面的设备就看不到信号了。
设备地址:怎么分配,怎么配置
每台 RS485 设备必须有唯一的地址(在 Modbus 协议中叫从站地址,Slave ID)。主控发一条指令,指令帧里带上目标地址,只有地址匹配的那台设备才响应,其余保持沉默。
地址范围(Modbus over Serial Line 规范):
| 地址值 | 含义 |
|---|---|
| 0 | 广播地址(所有从站都响应,但通常广播指令不含应答,防总线碰撞) |
| 1 ~ 247 | 有效从站地址,每台设备占一个,不重复 |
| 248 ~ 255 | 保留,不使用 |
地址配置方式(以手册为准,常见两种):
- 硬件拨码开关:设备上有一排 DIP 开关,用二进制编码地址(如 4 位拨码,可设 1~15)。拨完断电再上电生效。
- 软件配置:通过设备的配置软件或 Web 配置界面写入地址,上电保存。
工程习惯:地址从 1 开始分配,按设备物理位置顺序来(最靠近主控的叫 1 号,依次往后)。建一张地址表存到项目文档里,记录每台设备的从站地址、型号、物理位置、用途。三个月后再来加设备,有这张表不会踩地址重复的坑。
地址冲突的后果:两台设备配了同一个地址,主控发指令时两台同时试图应答,信号在总线上叠加,就是乱码。典型表现是接收区出现双倍字节的乱码,和单台设备的乱码(波特率不对)长相不一样——单台乱码是字符不对、字节数可能正常;地址冲突的乱码是字节数多出来、内容混乱。
AB 线序:正接还是反接
RS485 的 A、B 线对应关系:
- A 线(-):逻辑 0 时电压高于 B;逻辑 1 时电压低于 B。(各厂商定义有差异,以下是 TIA-485 标准)
- B 线(+):逻辑 0 时电压低于 A;逻辑 1 时电压高于 A。
听起来绕,实际接线只记住:A 接 A,B 接 B。不同设备之间、主控和从设备之间,A 线接在一起、B 线接在一起,这是正接。接反了(A 接 B、B 接 A),差分信号极性反了,接收方看到的 0/1 全部反转,接收区显示乱码。
一个常见的坑:不同厂商的接线标注不统一。有的厂商叫 A(+)、B(-);有的叫 D+、D-;有的叫 RS485+、RS485-。两台设备对接时,看正负标注,正接正、负接负,不要只看字母 A/B,因为 A/B 的极性定义在不同品牌之间并不统一(EIA-485 标准对 A/B 极性有定义,但工程实践中混用导致标注混乱)。如果接完第一次收到乱码,先把 A/B 对调试一次,很多时候就通了。
GND(参考地)要不要接
RS485 理论上是差分传输,不依赖绝对电压,理论上不需要 GND。但实际工程中,GND 要接,理由:
- RS485 收发器有一个工作电压范围,通常是 -7V ~ +12V 对 GND。如果两个设备的 GND 电位差太大,超出这个范围,接收器就可能工作异常甚至损坏。
- 长距离、多设备的 RS485 总线里,两个设备的 GND 可能因为不同供电来源而有几伏的电位差,这在工业现场很常见。
- Modbus over Serial Line 官方规范也明确建议连接信号地(Signal Ground)。
接法:在总线里拉第三根线作为 GND,每台设备的 GND 接在上面。不要把 GND 和强电地(PE)混在一起,那是另一回事。
半双工收发时序:切换太慢为什么会乱码
RS485 是半双工,同一时刻总线要么处于"发送状态"(某台设备在驱动总线),要么处于"接收状态"(所有设备监听)。主控发完一条指令后,需要在极短时间内把总线切换到接收状态,才能接到从站的应答。
发送和接收之间有两个关键时间参数:
- 发完切收延迟(Transmit-to-Receive delay, t_TX_RX):主控发完最后一个字节后,需要等发送器关闭、总线上的驱动电流消散,才能开启接收器。如果切换太快,总线还没"静下来",从站的应答就会混入主控自己发出的信号尾声,造成应答乱码。
- 从站应答延迟(Response delay):从站收到完整帧、校验通过,到开始发应答帧,有一段处理时间。Modbus over Serial Line 规范定义:从站应答必须在最后一个请求字节发完后 3.5 个字符时间内开始,最多不超过 1 秒(正常情况下毫秒级)。
主控 发指令帧 ─────────────┐
│ t_TX_RX(切收延迟)
从站 收到完整帧,处理 ──────┘─→ 开始发应答帧 ──────────┐
│
主控 进入接收状态 ──────────────────────────────────→ 读应答
实际工程里,这个时序问题通常不需要你手动处理——中控软件(SoftControl 等)和串口服务器(有人 USR 系列)已经把收发切换逻辑内置了,默认配置在大多数场景下没问题。但当你自己写代码控制 RS485 设备时,比如用 Arduino 或 Python 配合 USB-RS485 转换器,必须在发完一帧后加一个延迟(通常 2~10ms,以设备手册为准)再开接收器,否则会漏掉应答的头几个字节。
典型的半双工切换代码节奏(伪代码):
# 使能发送
set_tx_enable(True)
uart.write(frame_bytes)
uart.flush() # 等所有字节从 UART FIFO 发完
time.sleep(0.003) # 等总线驱动电流消散,3ms 是保守值,以硬件手册为准
# 切换到接收
set_tx_enable(False)
response = uart.read(expected_bytes, timeout=1.0)
总线挂多少台设备?能跑多快?
标准 RS485 规范(TIA-485)定义:
- 单段总线最多 32 个单位负载(Unit Load, UL)。一台标准负载设备是 1 UL,所以理论上最多 32 台。配合"四分之一负载"或"八分之一负载"芯片,可以挂到 128 或 256 台,但这依赖收发器芯片的规格,以芯片 datasheet 为准。
- 传输距离和波特率成反比:9600 bps 可达约 1200 米,115200 bps 约 100 米(以标准双绞线,这是近似参考值,实际受线材质量、干扰、连接数影响,以 TI SLLA272D 手册数据为准)。
展厅实际组网建议:
| 场景 | 建议 |
|---|---|
| 单总线设备数 | 控制在 20 台以内,留有余量,避免接近极限 |
| 总线长度 | ≤300 米时用 9600 bps 基本无问题;更长考虑光电隔离或分段 |
| 波特率 | 优先用 9600,稳定性最好;速度需求大时用 38400 |
| 线材 | 用双绞屏蔽线(STP),屏蔽层一端接地;降低共模干扰 |
故障排查表
| 现象 | 最可能的原因 | 怎么查 / 怎么办 |
|---|---|---|
| 所有设备都无响应 | 主控端 AB 线接反 / 总线主干断开 | 用万用表量 A-B 电压:空闲时有约 +0.2V 偏置说明接法有效;线接反则对调 A/B |
| 某一台从不响应,其他正常 | 该台地址配错 / 拨码错 / AB 接线松 | 重新确认拨码地址=发出帧的目标地址;单独隔出来一对一测试 |
| 只要接超过 3 台就开始乱码 | 终端电阻缺失 / 总线反射 | 两端各加 120Ω 终端电阻;确认中间设备没有接终端电阻 |
| 发一条指令两台同时应答且乱码 | 两台地址相同(地址冲突) | 逐台断开测试,找到重复地址台,改为唯一地址 |
| 时好时坏,慢速(9600)就稳,快了就乱 | 分支/星型接法引起信号反射 | 改成菊花链;若有 T 形分支且分支线 >3m,换路由或用中继器 |
| 应答首字节乱码/截断,后续正常 | 半双工切换延迟不够 | 在发完帧后增加延迟(2~10ms)再切收;自写代码时加 flush() 等待发完 |
| 总线长距离偶发错误(CRC 错) | 线路干扰 / GND 电位差 | 检查是否用双绞屏蔽线;屏蔽层一端接地;加总线 GND 线 |
| 只有末端设备不稳 | 末端缺终端电阻,信号反射回头叠加 | 末端设备旁加 120Ω 终端电阻 A-B 间 |
一个典型展厅组网实例(拓扑示意)
以"1 台有人 USR-TCP232 串口服务器(主控侧 RS485 口)+ 6 台科星网络 IO 控制器"为例(具体型号支持情况以各厂商手册为准):
网口──→ USR-TCP232 ──RS485 A/B──→ 科星IO #1(Addr:1) ──→ #2(Addr:2) ──→ ... ──→ #6(Addr:6)
[终端电阻] [终端电阻]
A-B间120Ω 菊花链,线到线串联 A-B间120Ω
(或拨码使能) 每台拨码地址唯一 (或拨码使能)
波特率:所有设备和 USR-TCP232 的 RS485 串口参数一致(如 9600-8-N-1)。 总线 GND:从串口服务器地端拉一根 GND 线到每台设备的 GND 端子(第三根线)。
小结 · 你现在掌握了什么
- RS485 多设备组网的拓扑铁律:菊花链,不要星型/分支,根源是信号反射。
- 两端各一个 120Ω 终端电阻,中间不加;选有终端电阻拨码的设备可以省掉外接。
- 每台设备地址唯一(1~247);接线 A 接 A、B 接 B,正负标注不同品牌有差异时认准正负符号。
- 半双工切换:发完帧需等 2~10ms 再切收,中控软件已内置,自写代码时要显式处理。
- GND 接上,不浮空,避免共模超范围。
下一步:总线接好了,下面要学总线上跑的协议——Modbus RTU / TCP 入门:功能码、寄存器、从站地址、CRC,把地址、线圈、寄存器这套数据模型搞清楚,就能读写展厅里任意一台 Modbus 设备。