- 1. 一、概述
- 2. 二、Modbus功能码与可访问装置
- 3. 三、DVP作从站:内部装置通信地址映射表(核心)
- 4. 3.1 装置通信地址总览(官方地址表)
- 5. 3.2 位装置地址换算
- 6. 3.3 字装置(T/C/D)地址换算
- 7. 3.4 与第三方主站软件(Modbus Poll / SCADA / 触摸屏)的地址对照
- 8. 四、DVP作主站:MODRD / MODWR / MODRW 通信指令
- 9. 4.1 三条通信指令一览
- 10. 4.2 MODRW(API 150)操作数定义(官方)
- 11. 4.3 官方程序范例(可直接套用)
- 12. 4.4 MODRW 使用要点(官方注意事项)
- 13. 五、通信参数、特殊寄存器与标志位配置(COM2 RS-485)
- 14. 5.1 硬件接线
- 15. 5.2 D1120 通信格式设置(官方值)
- 16. 5.3 D1121 通信站号
- 17. 5.4 RTU/ASCII 选择与收发标志位(重点,纠正常见错误)
- 18. 六、读写台达变频器实例(VFD-E / MS300 / C2000 等通用地址)
- 19. 七、常见问题与排障指南
- 20. 7.1 通讯完全无响应
- 21. 7.2 能通信但读不到数据 / 报非法地址
- 22. 7.3 数据不对或乱码
- 23. 7.4 偶发通信失败
- 24. 八、与其他品牌PLC的区别
- 25. 九、总结
- 26. 十、相关链接
一、概述
台达DVP系列PLC(DVP-ES2/EX2/SS2/SA2/SX2/SE、EH3等)内建COM2 RS-485通信端口,原生支持标准Modbus ASCII/RTU协议,既可作主站(Master)主动读写变频器、温控器、仪表等从站,也可作从站(Slave)被动响应上位机、触摸屏、SCADA的读写请求。本文严格依据台达官方《DVP-PLC应用技术手册(程序篇/通信篇)》《DVP系列PLC通信协议(Communication Protocol)》及《DVP-ES2系列操作手册》编写,所有装置地址、指令操作数、特殊寄存器/继电器均以官方手册为准。
DVP系列PLC的两种Modbus工作模式:
- Modbus主站(Master):使用 MODRD(API 100,读)、MODWR(API 101,写)、MODRW(API 150,通用读写)三条专用指令主动发起通信。
- Modbus从站(Slave):只需设置通信格式与站号,PLC按内置协议自动应答,无需编写任何通信程序。
一个必须先澄清的关键问题:台达DVP内部软元件(X/Y/M/S/T/C/D)在Modbus报文中使用的是固定的十六进制通信地址(例如 X0=0400H、Y0=0500H、M0=0800H、D0=1000H)。网上部分教程流传的”高字节填元件类型代码(H1/H3/H4/H10)、低字填编号”,拼出 H100064、H100100 这类24位地址的写法,在台达官方手册中并不存在——MODRW/MODRD 的地址操作数是16位,H100064 本身就是非法值。本文第三、四章将按官方地址体系彻底讲清。
二、Modbus功能码与可访问装置
台达DVP从站支持的功能码及其可访问的内部装置如下表(来源:台达《DVP系列PLC通信协议》):
| 功能码(十进制/十六进制) | 名称 | 可访问的DVP装置 | 数据类型 | 读/写 |
|---|---|---|---|---|
| 01(H01) | 读线圈状态 Read Coil Status | S、Y、M、T(触点)、C(触点) | 位(bit) | 读 |
| 02(H02) | 读离散输入 Read Input Status | S、X、Y、M、T、C | 位(bit) | 读 |
| 03(H03) | 读保持寄存器 Read Holding Registers | T(当前值)、C(当前值)、D | 字(word) | 读 |
| 05(H05) | 写单个线圈 Force Single Coil | S、Y、M、T、C | 位(bit) | 写 |
| 06(H06) | 写单个寄存器 Preset Single Register | T、C、D | 字(word) | 写 |
| 15(H0F) | 写多个线圈 Force Multiple Coils | S、Y、M、T、C | 位(bit) | 写 |
| 16(H10) | 写多个寄存器 Preset Multiple Registers | T、C、D | 字(word) | 写 |
| 17(H11) | 报告从站标识 Report Slave ID | —(返回从站状态) | — | 读 |
台达与”标准Modicon地址模型”的两点重要差异:
- 台达DVP不使用功能码04(读输入寄存器)。输入继电器 X 是用功能码02读取的(02在台达中可访问 S/X/Y/M/T/C 全部位装置)。
- 位装置(S/Y/M/T/C触点)走功能码 01/02/05/15;字装置(T/C/D当前值)走功能码 03/06/16。定时器 T、计数器 C 同时占用”触点(位)”和”当前值(字)”两个地址区。
三、DVP作从站:内部装置通信地址映射表(核心)
当DVP作为Modbus从站时,外部主站(上位机、触摸屏、另一台PLC、Modbus Poll等)必须使用下表的十六进制通信地址(0-based PDU地址)访问其内部装置。
3.1 装置通信地址总览(官方地址表)
| 装置 | 类型 | 编号进制 | 通信地址(十六进制) | 装置范围 | 适用功能码 |
|---|---|---|---|---|---|
| S(步进继电器) | 位 | 十进制 | 0000H~03FFH | S0~S1023(每256点一段) | 01/02/05/0F |
| X(输入继电器) | 位 | 八进制 | 0400H~04FFH | X0~X377(八进制,共256点) | 02 |
| Y(输出继电器) | 位 | 八进制 | 0500H~05FFH | Y0~Y377(八进制,共256点) | 01/02/05/0F |
| T(定时器) | 位/字 | 十进制 | 0600H~06FFH | T0~T255(触点用01/02,当前值用03) | 01/02/03/05/06/0F/10 |
| M(辅助继电器) | 位 | 十进制 | 0800H~0DFFH;B000H~B9FFH | M0~M1535;M1536~M4095 | 01/02/05/0F |
| C(计数器) | 位/字 | 十进制 | 0E00H~0EFFH | C0~C199(16位);C200~C255(32位) | 01/02/03/05/06/0F/10 |
| D(数据寄存器) | 字 | 十进制 | 1000H~1FFFH;9000H~A70FH | D0~D4095;D4096~D9999 | 03/06/10 |
说明:0700H、0F00H~0FFFH 等区段为预留空段,不可访问;不同机型(ES2/SS2/SA2/EH3)实际装置点数有差异,以对应机型手册为准。
3.2 位装置地址换算
- X(八进制编号):通信地址 = 0400H + 八进制编号对应的十进制序号。X0=0400H,X7=0407H,X10=0408H(注意跳过X8、X9),X377=04FFH。
- Y(八进制编号):通信地址 = 0500H + 序号。官方通信范例明确 Y0 = H0500,Y17(八进制,即十进制第15点)= 050FH。
- M(十进制编号):M0~M1535 通信地址 = 0800H + n,如 M0=0800H、M100=0864H;M1536~M4095 改映射到 B000H~B9FFH。
- S(十进制编号):通信地址 = 0000H + n,如 S0=0000H、S100=0064H。
| 装置 | 编号 | 通信地址(hex) | 功能码 |
|---|---|---|---|
| 输入 | X0 / X7 / X10 | 0400H / 0407H / 0408H | 02 |
| 输出 | Y0 / Y17(八进制) | 0500H / 050FH | 01/02/05/0F |
| 辅助继电器 | M0 / M100 / M1535 | 0800H / 0864H / 0DFFH | 01/02/05/0F |
| 步进继电器 | S0 / S100 | 0000H / 0064H | 01/02/05/0F |
3.3 字装置(T/C/D)地址换算
- 定时器当前值 Tn:0600H + n,如 T0=0600H(官方写单寄存器范例即为 06H 00H)。
- 计数器当前值 Cn:0E00H + n,如 C0=0E00H、C232=0EE8H(官方范例 0EH E8H)。其中 C0~C199 为16位计数器,C200~C255 为32位高速计数器(占双字长度)。
- 数据寄存器 Dn(n=0~4095):1000H + n,如 D0=1000H、D10=100AH、D100=1064H、D1000=13E8H(均为官方手册实例);D4096~D9999 改映射到 9000H 起,即地址 = 9000H +(n − 4096)。
| 装置 | 编号 | 通信地址(hex) | 官方报文示例(功能码 06 写单寄存器) |
|---|---|---|---|
| 定时器 | T0 | 0600H | 01 06 06 00 12 34 … |
| 计数器 | C0 / C232 | 0E00H / 0EE8H | 01 06 0E 00 … / 01 06 0E E8 … |
| 数据寄存器 | D10 | 100AH | 01 06 10 0A 12 34 … |
| 数据寄存器 | D1000 | 13E8H | 01 06 13 E8 12 34 … |
3.4 与第三方主站软件(Modbus Poll / SCADA / 触摸屏)的地址对照
Modbus报文里传输的是上表的 0-based PDU地址(即十六进制通信地址)。但不少上位机软件、HMI要求填写 1-based 的”参考号”(4xxxx / 0xxxx / 1xxxx),两者换算关系如下:
- 保持寄存器参考号 = 40001 + 十六进制地址的十进制值。例如 D0 的地址 1000H = 十进制 4096,参考号 = 40001 + 4096 = 44097;D100 的地址 1064H = 4196,参考号 = 44197。
- 线圈参考号 = 1 + 地址值;离散输入参考号 = 10001 + 地址值。例如 M0(0800H=2048)线圈参考号 = 2049;X0(0400H=1024)离散输入参考号 = 11025。
- 若软件支持”0-based/PLC地址”模式,直接填十六进制对应的十进制(如读D0填4096)最不易出错。
| 装置 | 通信地址(hex) | 十进制偏移 | 1-based 参考号 | 功能码区 |
|---|---|---|---|---|
| D0 | 1000H | 4096 | 44097 | 保持寄存器 4xxxx |
| D100 | 1064H | 4196 | 44197 | 保持寄存器 4xxxx |
| M0 | 0800H | 2048 | 02049 | 线圈 0xxxx |
| X0 | 0400H | 1024 | 11025 | 离散输入 1xxxx |
| Y0 | 0500H | 1280 | 01281 | 线圈 0xxxx |
再次强调八进制问题:X、Y 的装置编号是八进制(没有X8/X9),但通信地址是连续排列的——X7(0407H)之后紧跟 X10(0408H),而不是 0408H 对应”X8″。
四、DVP作主站:MODRD / MODWR / MODRW 通信指令
4.1 三条通信指令一览
| 指令 | API编号 | 用途 | 支持功能码 |
|---|---|---|---|
| MODRD | API 100 | 读取从站数据 | H02(读位)、H03(读字)等 |
| MODWR | API 101 | 向从站写数据 | H05/H06/H0F/H10 |
| MODRW | API 150 | 通用读/写(功能最全,推荐) | H01~H06、H0F、H10、H17 |
4.2 MODRW(API 150)操作数定义(官方)
指令形式:MODRW S1 S2 S3 S n
| 操作数 | 含义 | 取值说明 |
|---|---|---|
| S1 | 从站通信地址(站号) | K0~K254;K0 为广播(功能码 H02/H03/H04/H17 读操作时不能为 K0) |
| S2 | 功能码 | H01 读多个位 / H02 读离散位 / H03 读多个字 / H04 读输入字 / H05 写单位 / H06 写单字 / H0F 写多位 / H10 写多字 / H17 读写多个字 |
| S3 | 待读写数据的起始装置地址 | 对端装置的十六进制通信地址,如 H0500(Y0)、H1064(D100)、H2100(变频器状态) |
| S | 数据寄存器 | 读回数据 / 待写数据在本机存放的起始 D(如 D0、D50);用 H17 时 S 为读数据起始、S+1 为写数据起始 |
| n | 数据长度 | H01/H02/H0F 单位为 bit,H03/H04/H10 单位为 word;H05 时 n=0 表 ON、n=1 表 OFF;H17 时 n 为读字数、n+1 为写字数 |
请特别注意操作数位置:S2 永远是功能码,S3 才是装置地址。网上有教程把”元件类型代码”填进 MODRD 的第2个操作数(S2),这是错误的。
4.3 官方程序范例(可直接套用)
范例1:读取另一台DVP(站号1)的 Y0~Y17(共16点,位)——来源:台达《DVP-ES2操作手册》MODRW Program Example 1。
| 指令 | S1站号 | S2功能码 | S3地址 | S数据 | n长度 |
|---|---|---|---|---|---|
| MODRW | K1 | K2(H02 读位) | H0500(Y0) | D0 | K16(16 bit) |
ASCII模式请求报文:01 02 0500 0010;RTU模式请求报文:01 02 05 00 00 10 79 0A。手册明确标注 Data address Y0 = H0500。
范例2:读取另一台DVP(站号1)的 D100(1个字)
| 指令 | S1站号 | S2功能码 | S3地址 | S数据 | n长度 |
|---|---|---|---|---|---|
| MODRW | K1 | K3(H03 读字) | H1064(D100 = 1000H + 100) | D0 | K1(1 word) |
读 M100 则把 S3 改为 H0864(M100 = 0800H + 100)、功能码用 H01。
范例3:读取台达变频器(站号1)状态/频率等6个字——来源:台达《DVP-PLC应用手册》MODRW 官方范例。
| 指令 | S1站号 | S2功能码 | S3地址 | S数据 | n长度 |
|---|---|---|---|---|---|
| MODRW | K1 | K3(H03) | H2100 | D0 | K6(6 word) |
ASCII模式请求报文:01 03 2100 0006,读回 2100H~2105H 共6个寄存器。
范例4:向台达变频器(站号1)2000H写1个运行命令字
| 指令 | S1站号 | S2功能码 | S3地址 | S数据 | n长度 |
|---|---|---|---|---|---|
| MODRW | K1 | K6(H06 写单字) | H2000 | D50(待写数据) | K1(1 word) |
ASCII模式请求报文:01 06 2000 [数据](官方范例 D50=H1770 时报文为 01 06 0100 1770,对应早期VFD-S地址定义;新机型命令字地址为2000H)。
关于”H100064″类地址的明确结论:S3 直接填写对端装置的连续十六进制通信地址(读D100填 H1064,而不是 H100100 或 H100064)。MODRW 的地址操作数为16位,H100064、H40100 这类超过16位或编码自相矛盾的数值在台达指令中非法,部分网络资料据此给出的”X=H1、Y=H3、M=H4、D=H10 高字节代码表”并非台达官方定义,请勿在工程中使用。
4.4 MODRW 使用要点(官方注意事项)
- 每条 MODRW 指令必须紧邻对应的”发送请求”标志(SET M1122),端口按 COM1 → COM3 → COM2 的顺序判定,避免数据存取错位。
- 同一通信口同一时刻只允许一条 MODRW 执行,需等待收发完成标志 M1127 置位后再发下一条(轮询时用 M1127 做步进条件)。
- 读功能码 H01~H04、H17 的驱动触点禁止使用 LDP/ANDP/ORP/LDF/ANDF/ORF 等上升/下降沿触点,否则接收数据会出错,应用普通 LD 触点。
- ASCII 模式下,接收数据以ASCII形式存入起始 D 后,PLC自动转换为hex存入特殊寄存器 D1296~D1311(转换期间 M1131 置ON);待发送数据放在 D1256~D1295。RTU 模式下数据直接以hex存储。
五、通信参数、特殊寄存器与标志位配置(COM2 RS-485)
5.1 硬件接线
- DVP 的 COM2 为 RS-485 口,端子标识为 D+(SG+)和 D-(SG-):D+ 接总线 A 线,D- 接总线 B 线,多台设备手拉手并联。
- 总线首、末两端各接一只 120Ω 终端电阻;通信线使用屏蔽双绞线,屏蔽层单端可靠接地,远离动力线。
- 所有主从站波特率、数据位、校验位、停止位必须一致;站号不可重复。
5.2 D1120 通信格式设置(官方值)
| D1120 设置值 | 通信格式 | 典型用途 |
|---|---|---|
| H86 | 9600 bps,7 数据位,偶校验 E,1 停止位(9600,7,E,1) | 出厂默认,Modbus ASCII |
| H87 | 9600 bps,8 数据位,偶校验 E,1 停止位(9600,8,E,1) | Modbus RTU 最常用 |
D1120 高4位选择波特率(H8=9600、H9=19200、HA=38400、HB=57600、HC=115200),低4位选择数据位/校验/停止位;设置后须 SET M1120 保持通信格式。官方变频器通信范例统一使用 MOV H87 D1120 + SET M1120。
5.3 D1121 通信站号
- D1121 设置本机(作从站时)或目标(作从站设备时)的通信站号,范围 1~254,0 为广播地址。
- 例如
MOV K1 D1121表示站号为1。出厂默认站号为1。
5.4 RTU/ASCII 选择与收发标志位(重点,纠正常见错误)
| 特殊继电器 / 寄存器 | COM2(RS-485)作用 |
|---|---|
| M1143 | 通信协议选择:OFF = ASCII 模式,ON = RTU 模式(RTU/ASCII 由 M1143 决定,不是 D1130) |
| M1120 | 置 ON 后保持 D1120 设定的通信格式 |
| M1122 | 发送请求标志,置 ON 触发一次 MODRD/MODWR/MODRW 通信 |
| M1127 | 数据收发完成标志(完成后置 ON,由程序 RST) |
| M1140 | 接收数据错误标志(校验/格式错误时 ON) |
| M1141 | 通信地址非法 / 数据返回错误标志 |
| D1130 | 通信错误码寄存器:M1141 ON 时存放错误码(例如对端报”非法数据地址”时 D1130=2)。它不是协议模式寄存器 |
| D1129 | 通信超时时间设置(官方范例 K100 = 100 ms) |
标准初始化程序(RTU 9600,8,E,1,站号1):上电第一个扫描周期 M1002 接通时执行:
LD M1002
MOV H87 D1120 // 通信格式 9600,8,E,1
SET M1120 // 保持通信格式
MOV K100 D1129 // 通信超时 100ms
SET M1143 // 选择 RTU 模式(OFF 则为 ASCII)
MOV K1 D1121 // 本站站号 1(作从站时)
需要通信时 SET M1122 发送请求,等待 M1127 置位表示收发完成,再处理接收数据并 RST M1127。
六、读写台达变频器实例(VFD-E / MS300 / C2000 等通用地址)
台达变频器普遍采用下表的通信地址(具体单位、位定义以该机型《通信协议手册》为准):
| 监控 / 控制项目 | 通信地址 | 功能码 | 说明 |
|---|---|---|---|
| 运行/停止命令 | 2000H | 06 / 10(写) | 位命令字:bit0-1 运行/停止/急停/JOG,bit2-3 正转/反转,具体位定义见变频器手册 |
| 频率指令 | 2001H | 06 / 10(写) | 给定频率,多以 0.01 Hz 为单位(如 50.00 Hz 写 5000) |
| 运行状态字 | 2100H | 03(读) | 运行/转向/故障等状态位 |
| 输出频率 | 2101H | 03(读) | 实际输出频率,0.01 Hz |
| 输出电流 | 2102H | 03(读) | 输出电流,0.01 A(台达 VFD-B 官方范例即读 2102H) |
| 输出电压 / DC母线电压 | 2103H | 03(读) | 不同系列定义略有差异 |
对应的 MODRW 指令:
- 连续读取状态/频率/电流等6个字:
MODRW K1 K3 H2100 D0 K6 - 写运行命令(正转运行,数据按机型位定义预先送入 D50):
MODRW K1 K6 H2000 D50 K1 - 写频率给定 50.00 Hz(D51=K5000):
MODRW K1 K6 H2001 D51 K1
变频器侧还需设置通信站号、波特率、通信格式与PLC一致,并将运行/频率来源设为通信控制。不同系列(VFD-E、MS300、C2000、MH300)的地址与单位可能不同,工程实施前务必核对该变频器的通信协议手册。
七、常见问题与排障指南
7.1 通讯完全无响应
- 检查接线:D+(SG+)/D-(SG-)是否接反,A/B 是否对应;多站是否手拉手、有无分支。
- 检查通信格式:D1120 是否为 H87(RTU 8E1)或 H86(ASCII 7E1),主从双方是否一致;是否已 SET M1120。
- 检查协议模式:RTU 必须 SET M1143,ASCII 必须 RST M1143,主从双方必须一致(最常见的”不通”原因之一)。
- 检查站号:D1121 与目标从站是否一致,总线站号不可重复。
- 检查终端电阻:总线两端是否各加 120Ω;用万用表测量总线空闲时差分电压约数百mV。
7.2 能通信但读不到数据 / 报非法地址
- 看错误标志:M1141 置 ON、D1130 存错误码(如=2)说明 S3 装置地址非法,应按第三章 hex 地址表核对。
- 核对功能码与装置类型:读 X 用 02、读 D 用 03、写 Y/M 用 05/0F、写 D 用 06/10,不可混用。
- 核对八进制:X/Y 编号为八进制,X10 紧跟 X7;地址按连续序号换算。
- 不要使用 H100064 类地址:访问 D100 应填 H1064,访问 M100 应填 H0864。
- 检查时序:是否 SET M1122 后等待 M1127;同一口是否并发了多条 MODRW。
7.3 数据不对或乱码
- 数据宽度:C200~C255 为32位计数器,占2个寄存器/双字,注意按双字读取。
- 字节序/字序:32位数据确认高低字节、高低字顺序与对端一致。
- 缩放倍率:频率 0.01Hz、电流 0.01A 等需按手册乘除倍率还原工程量。
- RTU/ASCII 混淆:模式不一致时会出现帧错乱或乱码,确认 M1143 状态。
7.4 偶发通信失败
- 使用屏蔽双绞线,屏蔽层单端接地;通信线远离变频器输出线等动力线。
- 控制总线长度与台数(必要时降低波特率),两端加终端电阻。
- 合理设置 D1129 超时与重试;用 M1127/M1140/M1141 做完成与错误判断,避免指令堆积。
八、与其他品牌PLC的区别
| 对比项 | 台达DVP | 三菱FX3U | 西门子S7-200 SMART |
|---|---|---|---|
| X/Y寻址方式 | 八进制 | 八进制 | 十进制 |
| 内部装置地址 | 固定hex映射(X0400/Y0500/M0800/D1000) | FX3U-MB固定映射+可分配 | 通过 HoldStart / MaxHold 配置保持寄存器区 |
| 主站通信指令 | MODRD/MODWR/MODRW(API 100/101/150) | ADPRW(FNC276),一条指令按功能码读写 | MBUS_CTRL / MBUS_MSG 库指令 |
| RTU/ASCII选择 | M1143(OFF=ASCII,ON=RTU) | 通信参数中设置 | 库指令 Mode 参数(仅RTU) |
| 通信端口 | 内建 COM2(RS-485) | 需外接 FX3U-485ADP-MB | 板载 RS-485 口 |
| 主要配置寄存器 | D1120(格式)/D1121(站号)/M1143(模式) | D8120/D8121 等特殊寄存器 | 库指令参数(波特率/校验/超时) |
九、总结
台达DVP系列PLC的Modbus通信可归纳为以下几条速记:
- 从站装置地址(hex):S=0000H、X=0400H、Y=0500H、T=0600H、M=0800H、C=0E00H、D=1000H;X/Y八进制编号、地址连续,D0~D4095 对应 1000H~1FFFH。
- 功能码:位装置用 01/02/05/0F(X用02),字装置 T/C/D 用 03/06/10;台达不使用功能码04。
- 主站指令:MODRW S1(站号) S2(功能码) S3(hex装置地址) S(数据D) n(长度);S2是功能码、S3才是地址,地址直接写hex(D100=H1064)。
- 通信配置:D1120=H87(RTU 9600,8,E,1)/H86(ASCII 7E1)、SET M1120、M1143 选RTU/ASCII、D1121设站号、SET M1122发送、M1127完成、M1140/M1141/D1130查错。
- 务必避免:使用网传”H1/H4/H10+编号”拼出的 H100064 类24位地址、把元件代码填入S2、把D1130误当协议模式寄存器。
建议工程实施前先用 Modbus Poll 等主站调试工具连接DVP从站,按本文hex地址表逐区验证(读D0应填地址4096/参考号44097),确认地址、功能码、数据格式全部正确后,再编写MODRW主站程序。
十、相关链接
- Modbus RTU通讯基础教程
- 台达DVP PLC Modbus通信配置实例
- 台达变频器(VFD-E/MS300/C2000)Modbus控制指南
- 三菱FX3U / 西门子S7-200 SMART Modbus寄存器映射指南
- RS485总线接线与终端电阻规范
发表回复