一、硬件接线
RS485 两根线:A ↔ A,B ↔ B(很多仪表标注 485+、485-)
总线末端(最远一台仪表)并 120Ω 终端电阻
屏蔽层单端接地,不要两头接地,避免地环流
一条总线最多 32 个从站,每个仪表唯一站号(1~247)
二、仪表侧参数设置
看仪表手册,设置:
通讯站号:比如站号 = 1
波特率:9600(常用)
数据格式:8,N,1
协议:Modbus RTU
找到要读取的寄存器地址
坑:很多仪表手册写寄存器 0001(十进制),对应 Modbus 地址 H0000(台达 MODRD 直接填 H0000);部分仪表是偏移 + 1,一定要区分【寄存器编号】和【Modbus 起始地址】
三、PLC 通讯寄存器(COM2)
D1120:COM2 通讯格式
H87 = 9600,8,N,1,RTU
H88 = 19200,8,N,1,RTU
M1120:通讯格式保持标志,ON 锁定 D1120 设置 M1143:RTU 模式选择(ON=RTU;OFF=ASCII) M1122:发送请求触发位(上升沿启动 MODRD) M1127:通讯完成标志(ON = 收发成功) D1129:通讯超时时间(单位 ms,建议 K100~K300)
收到的数据默认存放:D1050 开始,读到 N 个字就占用 D1050、D1051……
四、MODRD 指令格式
MODRD S1 S2 N
S1:从站站号(K1 = 1 号仪表)
S2:仪表 Modbus 起始寄存器地址(十六进制 Hxxxx)
N:读取寄存器个数(一次最多读 16 个字)
示例:读取 1 号仪表,从 H0000 开始读 2 个字(温度 + 湿度)
M1002
MOV H87 D1120 // COM2:9600,8,N,1 RTU
SET M1120 // 锁定格式
MOV K200 D1129 // 超时200ms
SET M1143 // RTU模式
X0
SET M1122 // 触发发送
M1122
MODRD K1 H0000 K2
M1127
RST M1122 // 通讯完成,清除触发位
结果: D1050 = H0000 寄存器的值 D1051 = H0001 寄存器的值
五、数值换算
仪表很多是放大输出,例如:温度 25.5℃ → 寄存器存 255
读到 D1050=255,PLC 里做:DIV D1050 K10 D200,D200 就是 25.5
如果是浮点数(32 位 float):需要连续读 2 个字,D1050 低字、D1051 高字,台达要用程序拼接,或者用支持浮点数的仪表库
六、备选:RS 自由指令
RS 指令适合非标准 Modbus;MODRD 是封装好的标准 Modbus RTU,优先 MODRD。
七、常见报错 & 排查顺序
M1127 一直不 ON,没有应答
A/B 线接反(最高发)
站号、波特率、校验、RTU/ASCII 和仪表不一致
终端电阻没加、总线太长
M1127 会 ON,但数据固定 0 或者乱码
寄存器地址偏移搞错(手册写的地址 + 1 坑)
仪表是功能码 04 输入寄存器,MODRD 默认 03,此时 MODRD 不能直接用,要用 RS 报文
偶尔通讯中断
超时 D1129 设太小;干扰大,加屏蔽、降低波特率
八、补充重点
COM1 是 RS232,COM2 才是内置 RS485;ES3 新款部分机型 COM3 也支持 485
一条 485 总线多个仪表:轮询!不能同时多个 MODRD 触发,用 M1127 完成标志切换下一站读取
仪表是 Modbus ASCII:M1143=OFF,D1120 换成 ASCII 对应的格式码
调试神器:USB 转 485 + Modbus Poll,先电脑单独读通仪表,确认地址和报文没问题,再接 PLC
九、轮询多仪表简单框架思路
M1127 上升沿 → 判断当前站号,切换下一个站号,RST M1122,触发下一次 MODRD。


