DVP‑ES2 / EC2 / EH3 / EH5,COM2 (RS485) 作为 Modbus‑RTU 主站,读取从站设备(流量计、仪表)保持寄存器指令格式:
MODRD S1 S2 S3 D该指令本身不会自动发送报文,必须配合上升沿给 M1122,才发起一次读请求。
引脚定义
表格
| 操作数 | 含义 | 数据类型 |
|---|---|---|
| S1 | 从站站号 (Slave ID) | K1~K247 |
| S2 | Modbus逻辑起始地址 | K0~K65535 |
| S3 | 读取寄存器数量 | K1~K16(一次最多读 16 个寄存器) |
| D | PLC 内部存放数据的起始寄存器 | D 寄存器(D100、D200…) |
⚠重要地址换算:仪表手册写 40001(保持寄存器) → S2 写 K040002 → K1;40010 → K9公式:
逻辑地址 = 4xxxx地址 − 40001
功能码固定:MODRD 内部使用 03H 读保持寄存器。不能读线圈、离散输入;读线圈要用 MODR。
相关特殊继电器 / 寄存器(COM2 Modbus RTU 主站)
表格
| 元件 | 功能 |
|---|---|
| M1122 | 通讯请求触发:上升沿,发送 Modbus 报文,不能一直 ON |
| M1123 | 通讯完成标志,ON = 接收正常完成 |
| M1124 | 通讯错误标志,ON = 通讯出错 |
| M1129 | 通讯超时标志,从站无应答 |
| D1129 | 通讯错误代码,看故障原因 |
| D1120 | COM2 串口参数(波特率、校验) |
| M1136 | OFF:COM2=Modbus‑RTU 主站;ON=ASCII 模式 |
关键点:
MODRD 写在梯形图里只是配置参数,不会自动发消息;必须 PLS M1122 产生上升沿才发出读命令。
一次通讯结束(M1123 / M1124 ON)之后,才能再次触发 M1122,不能连续不停触发。
最简示例:读取流量计,从站 1,从 40001 开始读 4 个寄存器
40001→S2=K0;读 4 个寄存器,数据存 D100 开始。
plaintext
LD M0 MODRD K1 K0 K4 D100 //配置读参数:站1,起始逻辑地址0,读4个,存D100 LD M0 PLS M1122 //上升沿触发发送请求 //通讯完成或者出错,关闭M0,等待下一轮 LD M1123 OR M1124 RST M0
读到结果存放:
D100 → 40001
D101 → 40002
D102 → 40003
D103 → 40004
定时轮询完整片段(500ms 读一次流量计)
plaintext
LD M1002 MOV H81 D1120 //COM2:9600 8‑N‑1 RST M1136 //COM2设置Modbus‑RTU主站 LD T0 SET M0 TON T0 K5 //500ms = K5(100ms时基) LD M0 MODRD K1 K0 K4 D100 LD M0 PLS M1122 LD M1123 OR M1124 RST M0
32 位浮点数处理(流量计非常常见)
流量计瞬时流量、累计流量大多是32 位浮点数,占用 2 个连续寄存器。读到 D100 (高字) D101 (低字),转 REAL 浮点数:
plaintext
LD M1123 DFLT D100 D200 //D101 D100组合成32位浮点数,结果放在D200、D201
如果读出数值异常,就是高低字颠倒,改为
DFLT D101 D200。
常见错误与坑点
M1122 直接用 OUT 一直输出 ON❌错误:M1122 不能常 ON,必须上升沿 PLS 触发,否则重复发包报错。
S2 直接填 40001❌错误;S2 填逻辑地址 K0,不是 40001。
S3 读取数量超过 K16MODRD 单次最多读 16 个寄存器,超过要分多次读。
多台仪表,同时执行两条 MODRD❌错误;同一时间只能执行一条 MODRD;需要做状态机轮询,读完一台再下一台。
串口参数 D1120 没设置,M1136 没有 OFF通讯直接超时 M1129。
通讯成功但数值乱码流量计是 32 位浮点数,没有做 DFLT 转换;或者高低字顺序颠倒。
错误代码查看
D1129存放错误码:
H0001:非法从站地址
H0002:非法寄存器地址
H0003:读取数量超限
H0008:通讯超时(最常见,接线、波特率、从站不对)
补充区分:
MODRD:读保持寄存器 (03 功能码),流量计仪表绝大多数用这个;MODR:读线圈 / 输入离散;MODWR:写寄存器。

