- 1. 各品牌 PLC Modbus 实现方式对比总览
- 2. 西门子 S7-1200/1500 Modbus 编程详解
- 3. MB_COMM_LOAD — 通信模块初始化
- 4. MB_MASTER — Modbus 主站通信指令
- 5. MB_SLAVE — Modbus 从站通信指令
- 6. 完整梯形图示例:读温湿度传感器
- 7. 三菱 FX5U Modbus 编程详解
- 8. ADPRW 指令详解
- 9. ADPRW 关键Precautions
- 10. 梯形图示例:FX5U 读取变频器参数
- 11. 台达 DVP/AS 系列 Modbus 编程详解
- 12. MODRW 指令参数说明
- 13. 梯形图示例:台达 DVP 读取智能电表
- 14. 台达 AS 系列 M_MODRW 增强Function
- 15. 汇川 H3U Modbus 自由口编程详解
- 16. H3U 自由口通信基本原理
- 17. CRC-16 校验算法实现
- 18. 完整自由口 Modbus RTU 主站示例
- 19. 各品牌address映射关系对照表
- 20. address偏移Rules详解
- 21. 常见Error与陷阱
- 22. 1. address偏移Error
- 23. 2. endianness(Endianness)问题
- 24. 3. 超时设置不当
- 25. 4. 多主站冲突
- 26. 5. Communication parameters不一致
- 27. 与 SCADA system的集成
- 28. 典型集成架构
- 29. SCADA configuration要点
- 30. debug技巧与Tools推荐
- 31. 必备Debug Tools
- 32. debug方法论
- 33. 四大品牌 Modbus 编程全面对比
- 34. FAQ Frequently Asked Questions
- 35. Q1:西门子 S7-1200 的 Modbus 通信需要额外的硬件模块吗?
- 36. Q2:三菱 FX5U 的 ADPRW 指令一次可以读写多少A device?
- 37. Q3:台达 MODRW 指令通信失败如何排错?
- 38. Q4:汇川 H3U 自由口编程实现 Modbus 的可靠性如何?
- 39. Q5:如何解决 Modbus 通信中 32 位浮点数的endianness问题?
- 40. 结语
Modbus 在主流 PLC 中的编程实战指南(西门子、三菱、台达、汇川全系列)
在Automation领域,Modbus PLC 编程是每一位自动化工程师必须掌握的核心技能。无论是西门子 S7-1200/1500 的专用通信指令,还是三菱 FX5U 的 ADPRW 指令,亦或是台达 DVP 系列的 MODRW 指令和汇川 H3U 的自由口编程,不同品牌的 PLC 在 Modbus 通信的实现方式上existence显著差异。本文作为 modbus.cn 系列Tutorial的重要组成部分,将system性地对比四大主流 PLC 品牌的 Modbus 编程方法,提供完整的梯形图示例和address映射关系,帮助工程师快速掌握跨品牌 PLC 的 Modbus 通信开发。
各品牌 PLC Modbus 实现方式对比总览
在深入具体编程之前,我们先理解一个关键区别:不同品牌的 PLC 对 Modbus protocol的支持方式分为”专用指令”和”自由口编程”两大类。专用指令方式由 PLC 厂商封装好 Modbus protocol栈,工程师只需调用指令并配置参数即可Complete通信;而自由口编程方式则需要工程师手动构建 Modbus message帧,通过串口逐byte收发来实现协议。两种方式各有优劣,下表给出了直观对比。
| 品牌/系列 | 实现方式 | 核心指令/机制 | 开发难度 | 灵活性 |
|---|---|---|---|---|
| 西门子 S7-1200/1500 | 专用指令 | MB_COMM_LOAD / MB_MASTER / MB_SLAVE | 低 | 中 |
| 三菱 FX5U | 专用指令 | ADPRW | 低 | 中 |
| 三菱 FX3U | 专用指令 | ADPRW(需适配器) | 中 | 中 |
| 台达 DVP 系列 | 专用指令 | MODRW | 低 | 中 |
| 台达 AS 系列 | 专用指令 | MODRW / M_MODRW | 低 | 高 |
| 汇川 H3U | 自由口编程 | RS 指令 + CRC verification | 高 | 高 |
| 汇川 AM600 | 专用指令 | Modbus Function块 | 低 | 中 |
从上表可以看出,西门子 Modbus RTU 和 三菱 Modbus 通信 均采用专用指令方案,开发门槛较低;而 汇川 Modbus 编程 中的 H3U 系列则需要自由口编程,对工程师的协议理解能力要求更高。台达 PLC Modbus 的 MODRW 指令则以其简洁易用著称。
西门子 S7-1200/1500 Modbus 编程详解
西门子博途(TIA Portal)平台为 S7-1200 和 S7-1500 系列 PLC 提供了完整的 Modbus 通信库,包含三个核心指令:MB_COMM_LOAD(通信初始化)、MB_MASTER(主站通信)和 MB_SLAVE(从站通信)。这些指令位于”通信”指令组的”其它”→”Modbus”路径下。
MB_COMM_LOAD — 通信模块初始化
在使用任何 Modbus 通信之前,必须先调用 MB_COMM_LOAD 指令对通信模块进行配置。该指令的Function类似于设定串口的Baud rate、check digit、data bit和stop bit等基本参数,同时指定 Modbus 的工作模式(RTU 或 ASCII)。
| 参数 | data type | 说明 | 典型值 |
|---|---|---|---|
| REQ | Bool | 上升沿触发配置 | M0.0 |
| PORT | UInt | 通信模块硬件标识符 | 269(CM1241 RS485) |
| BAUD | UInt | Baud rate | 9600 / 19200 / 38400 / 115200 |
| PARITY | UInt | check digit:0=无 1=奇 2=偶 | 2(even parity) |
| FLOW_CTRL | UInt | 流控制:0=无 1=RTS/CTS | 0 |
| RTS_ON_DLY | UInt | RTS Open延时(ms) | 0 |
| RTS_OFF_DLY | UInt | RTS Close延时(ms) | 0 |
| RESP_TO | UInt | Response超时(ms) | 1000 |
| MB_DB | Variant | MB_MASTER/SLAVE 的背景data块 | 对应指令的 DB 号 |
| DONE | Bool | 配置Complete标志 | — |
| ERROR | Bool | Error标志 | — |
| STATUS | Word | 状态码(16#0000=无Error) | — |
MB_MASTER — Modbus 主站通信指令
MB_MASTER 指令使 S7-1200/1500 作为 Modbus RTU 主站,向从站设备send读写Request。该指令支持function code 01(读线圈)、02(读离散输入)、03(读保持register)、04(读输入register)、05(写单线圈)、06(写单register)、15(写多线圈)和 16(写多register)。
// MB_MASTER 梯形图参数说明(SCL 表示)
"MB_MASTER_DB"(
REQ := #Start_Read, // 上升沿触发
MB_ADDR:= 1, // From station address (1-247)
MODE := 0, // 0=读 1=写
DATA_ADDR := 40001, // 从站datastarting address
DATA_LEN := 10, // dataLength(字数)
DATA_PTR := P#DB1.DBX0.0 WORD 10 // 本地data存储区指针
);
// 常见模式:
// MODE=0, DATA_ADDR=40001 → function code 03 读保持register
// MODE=1, DATA_ADDR=40001 → function code 06/16 写保持register
MB_SLAVE — Modbus 从站通信指令
MB_SLAVE 指令使 S7-1200/1500 作为 Modbus RTU 从站,Response主站的读写Request。该指令允许主站访问 PLC 内部的特定data area域(线圈、离散输入、输入register、保持register)。
// MB_SLAVE 梯形图参数说明(SCL 表示)
"MB_SLAVE_DB"(
MB_ADDR := 1, // 本slave address
MB_HOLD_REG := P#DB2.DBX0.0 WORD 100 // 保持Register Mapping区
);
完整梯形图示例:读温湿度传感器
以下是一个完整的西门子 S7-1200 读取 Modbus 温湿度传感器的程序示例。传感器slave address为 1,温湿度分别存储在保持register 40001 和 40002 中,Baud rate 9600,even parity。
网络 1:初始化通信模块(首次扫描调用)
┌──────────────────────────────┐
│ M0.0 MB_COMM_LOAD │
│──┤P├────┤EN DONE├──M0.1
│ │PORT: 269 ERROR├──M0.2
│ │BAUD: 9600 STATUS├──MW2
│ │PARITY:2 │
│ │FLOW_CTRL:0 │
│ │RESP_TO:1000 │
│ │MB_DB:MB_MASTER_DB │
└──────────────────────────────┘
网络 2:周期性读取传感器data(每 500ms)
┌──────────────────────────────┐
│ M0.5 MB_MASTER │
│──┤P├────┤EN DONE├──M1.1
│ │MB_ADDR:1 ERROR├──M1.2
│ │MODE:0 STATUS├──MW4
│ │DATA_ADDR:40001 │
│ │DATA_LEN:2 │
│ │DATA_PTR:P#DB3.DBX0.0 WORD 2
└──────────────────────────────┘
// 读取结果:
// DB3.DBW0 = temperature值(需要除以 10 得到实际temperature)
// DB3.DBW2 = 湿度值(需要除以 10 得到实际湿度)
关于西门子博途平台更详细的 Modbus 配置,请参考 modbus.cn 上关于西门子通信模块硬件选型的Related文章。也可以View我们的西门子 Modbus RTU 完整配置Tutorial。
三菱 FX5U Modbus 编程详解
三菱 Modbus 通信在 FX5U 系列上通过 ADPRW 专用指令实现,相比 FX3U 时代需要额外适配器的方案有了质的飞跃。FX5U 内置的 RS-485 端口直接支持 Modbus RTU 协议,无需额外硬件投入。ADPRW 指令的强大之处在于一条指令即可Complete Modbus function code的指定和data的收发。
ADPRW 指令详解
| Operation数 | 说明 | 设定范围 | 示例 |
|---|---|---|---|
| S1 | slave address | H1-HF7(1-247) | H1 |
| S2 | function code | H1-H6, HF, H10 | H3(读保持register) |
| S3 | Modbus address | H0-HFFFF | H0(对应 40001) |
| S4 | data点数 | H1-H7D0(字) | K2 |
| D1 | send/receivedatastart软元件 | 位/字软元件 | D100 |
ADPRW 指令在执行时,PLC 自动构建 Modbus message帧、计算 CRC verification码、sendmessage并等待从站回复。对于写Operation(function code H6/H10),D1 指定的软元件区域存储待send的data;对于读Operation(function code H1-H4),D1 指定的软元件区域存储receive到的data。
ADPRW 关键Precautions
- address偏移Rules:Modbus protocoladdress从 0 开始编号,但Document中的address(如 40001)从 1 开始。在 ADPRW 的 S3 Operation数中,保持register从 H0 开始对应 40001,线圈从 H0 开始对应 00001。
- function code H3(读保持register)一次最多读取 125 个字(H7D)。
- function code H10(写多register)一次最多写入 123 个字(H7B)。
- ADPRW 指令为执行Complete型指令,需要连续多个扫描周期才能Complete一次通信。
- 必须通过特殊继电器 SM 和特殊register SD 进行通信状态判断。
梯形图示例:FX5U 读取变频器参数
// 网络 1:Communication parameters设置(通过 PLC 参数配置,无需梯形图)
// 通道 1(CH1):内置 RS-485
// 协议:Modbus RTU
// Baud rate:19200 bps
// data bit:8
// stop bit:1
// Verification:even parity
// 网络 2:读取变频器运行频率和输出电流
┌──────────────────────────────┐
│ M0 [ADPRW ]│
│──┤├──────────────┤S1: H1 │ // slave address 1
│ │S2: H3 │ // function code:读保持register
│ │S3: H100 │ // starting address:40101(频率)
│ │S4: K2 │ // 读取 2 个字
│ │D1: D100 │ // data存储到 D100-D101
└──────────────────────────────┘
// 网络 3:data处理
// D100 = 运行频率(单位 0.01Hz,需要除以 100)
// D101 = 输出电流(单位 0.1A,需要除以 10)
// 网络 4:写入运行频率设定
┌──────────────────────────────┐
│ M1 [ADPRW ]│
│──┤├──────────────┤S1: H1 │ // slave address 1
│ │S2: H6 │ // function code:写单register
│ │S3: H200 │ // 目标address:40201
│ │S4: K0 │ // 写Operation时忽略
│ │D1: D200 │ // 写入的data
└──────────────────────────────┘
三菱 FX5U 的 Modbus 通信速度可达 115200 bps,在多站轮询Scene下表现出色。关于三菱 Modbus 通信的更深入内容,请参考 modbus.cn 上的三菱 Modbus 通信完整Tutorial。
台达 DVP/AS 系列 Modbus 编程详解
台达 PLC Modbus 通信在 DVP 和 AS 系列上有非常优雅的实现。MODRW 指令是台达 PLC 进行 Modbus 通信的核心指令,其设计理念是”一条指令解决所有问题”——无论是读取还是写入、线圈还是register,都通过这条指令Complete。AS 系列更是提供了增强版的 M_MODRW 指令,支持Morefunction code。
MODRW 指令参数说明
| 参数 | 含义 | DVP 系列 | AS 系列 |
|---|---|---|---|
| S | 联机装置address | K1-K254 | K1-K254 |
| S1 | function code | K1/K2/K3/K4/K5/K6/K15/K16 | 同上+扩展 |
| S2 | 目标装置address | 0-9999 | 0-65535 |
| S3 | dataLength | 1-127 | 1-200 |
| D | 本机datastartregister | D register | D register |
梯形图示例:台达 DVP 读取智能电表
// 台达 DVP-ES2 通过 COM2(RS-485)读取智能电表data
// 电表slave address:1,Baud rate 9600,无校验
// 网络:触发读取电表data
┌───────────────────────────────┐
│ M1002 [ SET M0 ]│ // 上电初始化
└───────────────────────────────┘
┌───────────────────────────────┐
│ M1013 [ MODRW ]│ // 1 秒时钟脉冲触发
│──┤├───────────────┤S: K1 │ // slave address 1
│ │S1: K3 │ // function code:读保持register
│ │S2: K0 │ // starting address:040001
│ │S3: K6 │ // 读取 6 个字
│ │D: D0 │ // 存储到 D0-D5
└───────────────────────────────┘
// 读取结果映射(某品牌智能电表):
// D0 = 电压(单位 0.1V → D0/10 = 实际电压)
// D1 = 电流(单位 0.01A → D1/100 = 实际电流)
// D2 = 有功功率(单位 1W)
// D3 = 无功功率(单位 1Var)
// D4 = 功率因数(单位 0.001 → D4/1000)
// D5 = 频率(单位 0.01Hz → D5/100)
台达 AS 系列 M_MODRW 增强Function
台达 AS 系列 PLC(如 AS228T-A)在 MODRW 基础上提供了 M_MODRW 指令,主要增强包括:支持 32 位data读写、支持字符串传输、支持位写入、通信超时可配置,以及最多可同时激活 8 条通信指令。这些增强使得 AS 系列在复杂 Modbus 通信Scene下具有明显优势。
// 台达 AS 系列 M_MODRW 示例:读取 32 位电能累计值
┌───────────────────────────────────┐
│ M0 [ M_MODRW ]│
│──┤├────────────────┤S: K1 │ // slave address
│ │S1: K3 │ // function code:读register
│ │S2: K100 │ // starting address
│ │S3: K2 │ // 读取 2 个字(含 32 位data)
│ │D: D100 │ // 存储到 D100(低字)、D101(高字)
│ │Mode: D200 │ // 模式设定
└───────────────────────────────────┘
台达 PLC 的 Modbus 编程体验在国产品牌中堪称一流,MODRW 指令的简洁性大幅降低了开发门槛。More台达 PLC Modbus 通信的技术细节,请访问 modbus.cn 查阅台达 PLC Modbus 通信完整指南。
汇川 H3U Modbus 自由口编程详解
汇川 Modbus 编程在 H3U 系列上有独特之处。不同于其他品牌提供专用 Modbus 指令的做法,H3U 采用自由口通信方式,工程师需要手动构建 Modbus message帧并通过 RS 指令send。这种方式虽然增加了开发难度,但给予了工程师对通信过程的完全控制权,在非标准协议或特殊需求Scene下非常有用。
H3U 自由口通信基本原理
汇川 H3U 的串口通信基于 RS 指令(datasend指令)和 RC 指令(datareceive指令)。要实现 Modbus RTU 通信,需要按照 Modbus protocol specification手动构建message帧,包括slave address、function code、data域和 CRC verification码。
CRC-16 校验算法实现
Modbus RTU 的 CRC verification码是自由口编程中最关键的部分。以下是在 H3U 上实现 CRC-16 校验的梯形图逻辑说明(校验多项式:0xA001)。
// CRC-16 计算流程(Modbus RTU 标准算法)
// 输入:待校验data存储在 D100-D105(6 byte,不含 CRC),byte count存于 D0
// 输出:CRC16 结果高byte存于 D200,低byte存于 D201
//
// 算法伪代码:
// 1. 预置 16 位 CRC register为 0xFFFF
// 2. 将第一个 8 位data与 CRC register低byte异或,结果存入 CRC register
// 3. CRC register右移一位,最高位补 0
// 4. 移出位如果为 1,则 CRC register与 0xA001 异或
// 5. 重复步骤 3-4 共 8 次
// 6. 处理下一个byte,重复步骤 2-5
// 7. 所有byte处理Complete后,CRC register的值即为 CRC16 校验码
// H3U 梯形图中的实现(使用循环指令)
// 注意:H3U 内置了 CRC verification指令(CRC),可将校验码追加到senddata末尾
// CRC D100 D106 K6
// Function:对 D100 开始的 6 byte count据计算 CRC,结果存入 D106-D107
完整自由口 Modbus RTU 主站示例
// 汇川 H3U 自由口通信实现 Modbus RTU 主站
// 目标:读取slave address 1 的保持register 40001(2 个字)
// 网络 1:构建 Modbus 读保持registermessage
// messageformat:[slave address][function code][starting address高][starting address低][字数高][字数低][CRC低][CRC高]
//
// sendmessagedata准备:
// D100 = H0103 // slave address 01 + function code 03
// D101 = H0000 // starting address 0000(对应 40001)
// D102 = H0002 // 读取 2 个字
// CRC verification放入 D103
// 网络 2:配置Serial port parameters(通过特殊register)
// D8120 = H0C81 // 8位data+even parity+1stop bit+9600bps
// M8161 = ON // 8位data处理模式
// 网络 3:senddata
┌──────────────────────────────┐
│ M0 [ RS ]│
│──┤├──────────────┤D100 │ // sendstartregister
│ │K8 │ // send 8 个byte(含 CRC)
│ │D200 │ // receivestartregister
│ │K9 │ // receive 9 个byte(含 CRC)
└──────────────────────────────┘
// 网络 4:receivedata处理
// D200 = slave address(应为 H01)
// D201 = function code(应为 H03)
// D202 = byte count(应为 04)
// D203 = 第一字高byte
// D204 = 第一字低byte
// D205 = 第二字高byte
// D206 = 第二字低byte
// D207 = CRC lowbyte
// D208 = CRC highbyte
汇川 AM600 系列(Codesys 平台)则提供了更现代化的 Modbus 通信方式,通过专用Function块实现,与西门子方案更为接近。关于汇川全系列 PLC 的 Modbus 编程对比,请参考 modbus.cn 上的汇川 Modbus 编程全系列指导。
各品牌address映射关系对照表
Modbus 通信中最容易出错的环节之一就是address映射。不同品牌的 PLC 对 Modbus address的表示方式各不相同,而且在编程时address偏移Rules也有差异。下表整理了四大品牌 PLC 的 Modbus address映射关系,覆盖超过 2000 条address映射Rules的核心逻辑。
| Modbus address区 | 协议address | 西门子 | 三菱 FX5U | 台达 DVP | 汇川 H3U |
|---|---|---|---|---|---|
| 线圈 00001-09999 | 0-9998 | Q0.0-Qx.y | M0-Mx | M0-Mx | M0-Mx |
| 离散输入 10001-19999 | 0-9998 | I0.0-Ix.y | X0-Xx | X0-Xx | X0-Xx |
| 输入register 30001-39999 | 0-9998 | IW0-IWx | SD 特殊register | — | — |
| 保持register 40001-49999 | 0-9998 | DBx.DBW0+ | D0-D7999 | D0-D9999 | D0-D7999 |
| 保持register 400001-465535 | 0-65534 | 需扩展寻址 | D0-D7999 / R0+ | D0-D9999 / 扩展 | D0-D7999 / 扩展 |
address偏移Rules详解
理解address偏移是避免 Modbus 通信Error的基石。Modbus protocol定义的address从 0 开始编号,但应用层编号(如 40001)从 1 开始。不同品牌的 PLC 在指令中使用的address通常是协议address(0-based),这导致了一个常见的”差 1″Error。
| Scene | Documentaddress | 协议address(指令中用) | 偏移量 |
|---|---|---|---|
| 读保持register 40001 | 40001 | 0x0000(H0/K0) | -1 |
| 读保持register 40100 | 40100 | 0x0063(H63/K99) | -1 |
| 读线圈 00001 | 00001 | 0x0000(H0/K0) | -1 |
| 写单register 40010 | 40010 | 0x0009(H9/K9) | -1 |
| 读输入register 30050 | 30050 | 0x0031(H31/K49) | -1 |
常见Error与陷阱
在实际工程中,Modbus 通信的debug往往占据了大量开发time。以下是Author整理了数百个实际项目中最常见的Error和陷阱,帮助读者少走弯路。
1. address偏移Error
这是最常见的Error没有之一。设备手册上写的register address是”40001″,工程师在 PLC 指令中将starting address填写为”1″或”40001″都是Error的。正确做法是填入”0″(协议address = 应用address – 1)。西门子 MB_MASTER 的 DATA_ADDR 参数填入 40001 是正确的(西门子做了封装),但三菱 ADPRW 的 S3 参数应填入 H0,台达 MODRW 的 S2 参数应填入 K0。
2. endianness(Endianness)问题
当 Modbus 传输 32 位data(如浮点数、双字整数)时,endianness问题会导致dataParseError。常见的endianness组合有四种:Big-Endian endianness + Big-Endian 字序(标准 Modbus)、Big-Endian endianness + Little-Endian 字序、Little-Endian endianness + Big-Endian 字序,以及 Little-Endian endianness + Little-Endian 字序。西门子 PLC 采用 Big-Endian,三菱和台达采用 Little-Endian,跨品牌通信时必须注意endianness转换。
3. 超时设置不当
Modbus RTU 的帧间间隔标准为 3.5 个字符time(在 9600 bps 下约 3.6ms)。如果主站的超时设置过短,会因为正常帧间间隔而误判超时;如果过长,则在设备掉线时会浪费大量扫描time。建议将Response超时设置为「(最大Response字符数 × 字符time)+ 设备处理time + 余量」,例如 9600 bps 下读取 10 个register,合理的超时设置为 200-500ms。
4. 多主站冲突
Modbus RTU 是单主站协议,同一总线上不允许existence多个主站。当 HMI 触摸屏和 PLC 同时作为主站访问同一设备时,会产生总线冲突。解决方案是让 HMI 通过 PLC 的透明传输Function间接访问设备,或者使用 Modbus TCP 网关进行协议转换。
5. Communication parameters不一致
Baud rate、data bit、stop bit、check digit必须与从站完全一致。注意:某些设备声称支持”9600,8,N,1″,但实际data bit为 9 位(8 data bit + 1 check digit),通信时会因为byteLength不匹配而失败。建议使用 Modbus Debug ToolsConfirm设备的实际Communication parameters。
与 SCADA system的集成
PLC 通过 Modbus protocol与 SCADA(监控与Data Acquisition)system集成是Automation中最常见的架构之一。以下介绍几种典型的集成方式和最佳实践。
典型集成架构
- 直连模式:SCADA 通过 Modbus RTU/TCP 驱动直接connect PLC。适用于小型system(1-5 台 PLC),优点是架构简单、延迟低;缺点是扩展性差、SCADA 负担重。
- OPC 服务器中转模式:PLC → OPC Server(如 Kepware、Matrikon)→ SCADA。适用于中大型system,优点是协议解耦、多客户端支持;缺点是增加了中间层和维护成本。
- data网关模式:PLC → Modbus data网关 → SCADA/MES/ERP。适用于Enterprise级system,优点是统一data出口、支持data缓存和转发。
SCADA configuration要点
在 SCADA 中配置 Modbus 驱动时,最关键的是正确设置register address映射。常见的 SCADA 平台(如 WinCC、configuration王、力控、Intouch)对 Modbus address的表示方式各不相同。例如,WinCC 使用 “4×0001” 表示保持register,而configuration王使用 “4-1” 的format。必须查阅各平台的 Modbus 驱动Document,Confirmaddressformat后再进行配置。
debug技巧与Tools推荐
高效的debug是 Modbus 通信开发成功的关键。以下是Author推荐的Tools和方法论。
必备Debug Tools
| Tools名称 | Type | 适用Scene | 推荐理由 |
|---|---|---|---|
| Modbus Poll | 桌面软件 | 主站模拟 | 界面直观,支持所有function code,可定时轮询 |
| Modbus Slave | 桌面软件 | 从站模拟 | 可与 Poll 配对使用,仿真从站行为 |
| QModMaster | 开源软件 | 主站debug | free开源,支持 RTU/TCP,跨平台 |
| ModScan | 桌面软件 | 主站扫描 | 批量扫描从站register,快速建立address映射表 |
| 串口监控Tools | 硬件/软件 | 总线监听 | USB 转 485 的监听模式,记录Original message |
| Wireshark | 网络抓包 | Modbus TCP 分析 | 支持 Modbus TCP 协议Parse,Function强大 |
debug方法论
- 分层验证法:先用电表Confirm物理层(线缆、终端电阻、偏置电阻),再用 Modbus Poll Confirm链路层(Baud rate、校验),最后用 PLC 程序Confirm应用层(address、data format)。
- 最小化测试:先用最简单的function code(03 读单register)进行通信测试,Confirm基本链路正常后再测试复杂Function。
- message记录法:使用串口监控Tools记录Complete message,通过人工分析message帧定位问题。Modbus message结构简单,通常一眼就能识别问题所在。
- 超时递进法:从较长的超时(如 3000ms)开始debug,Confirm通信正常后逐步缩短超时,找到最佳值。
四大品牌 Modbus 编程全面对比
| 对比维度 | 西门子 S7-1200/1500 | 三菱 FX5U | 台达 AS 系列 | 汇川 H3U |
|---|---|---|---|---|
| 实现方式 | 专用指令(库) | 专用指令 | 专用指令 | 自由口编程 |
| 核心指令 | MB_COMM_LOAD/MB_MASTER/MB_SLAVE | ADPRW | MODRW/M_MODRW | RS+CRC |
| 编程难度 | ★★☆☆☆ | ★★☆☆☆ | ★★☆☆☆ | ★★★★☆ |
| function code支持 | 01/02/03/04/05/06/15/16 | 01/02/03/04/05/06/15/16 | 01/02/03/04/05/06/15/16 | All(手动) |
| 最多从站数 | 247 | 247 | 254 | 247(受扫描周期限制) |
| 单次最多data量 | 125 字(读)/123 字(写) | 125 字(读)/123 字(写) | 127 字(读)/123 字(写) | 无限制(手动) |
| address容错 | 自动处理偏移 | 需手动偏移(-1) | 需手动偏移(-1) | 需手动偏移(-1) |
| 多指令并行 | 不支持(需排队) | 不支持(需排队) | 支持(最多8条) | 手动管理 |
| Error诊断 | STATUS 详细状态码 | SM/SD register | Error标志位 | 手动判断 |
| TCP 支持 | MB_CLIENT/MB_SERVER | 内置以太网口 | 内置以太网口 | 需扩展模块 |
| 浮点数支持 | 需endianness转换 | 需endianness转换 | 需endianness转换 | 需endianness转换 |
| 开发环境 | TIA Portal | GX Works3 | ISPSoft/DIAStudio | AutoShop |
| 学习资源 | 丰富 | 较丰富 | 中等 | 较少 |
| 典型通信速率 | 19200-115200 | 9600-115200 | 9600-115200 | 9600-19200 |
| 适合Scene | 大型system/标准化项目 | 中小型设备/快速开发 | 国产替代/性价比优先 | 定制化需求/深度控制 |
FAQ Frequently Asked Questions
Q1:西门子 S7-1200 的 Modbus 通信需要额外的硬件模块吗?
是的。S7-1200 CPU 本体通常只有以太网口和普通的 RS-232/RS-485(部分型号),需要进行 Modbus RTU 通信时,Recommended for use CM1241 RS485 通信模块(硬件标识号 269)或 CB1241 信号板。对于 Modbus TCP 通信,CPU 自带的以太网口即可支持,无需额外硬件。S7-1500 类似,使用 CM PtP 通信模块。
Q2:三菱 FX5U 的 ADPRW 指令一次可以读写多少A device?
ADPRW 指令每次只能与一个从站设备进行通信。如果需要轮询多个从站,需要在程序中使用多组 ADPRW 指令,并确保同一time只有一条指令在激活状态。可以通过上一个指令的Complete标志来触发下一个指令,实现串行轮询。典型的多站轮询周期 = 站点数 × (Requesttime + Responsetime + 帧间间隔)。
Q3:台达 MODRW 指令通信失败如何排错?
首先检查Communication parameters是否一致(Baud rate、check digit、data bit、stop bit)。然后Confirm RS-485 的 A/B 线是否接反——这是最常见的硬件问题。使用台达 PLC 内置的特殊register可以View通信Error码。最后,确保 MODRW 指令的目标address与从站实际address匹配。台达 PLC 的 COM2 端口默认是 Modbus 从站模式,如需作为主站使用,需要在程序中将 M1143 设置为 ON。
Q4:汇川 H3U 自由口编程实现 Modbus 的可靠性如何?
汇川 H3U 的自由口 Modbus 通信在Baud rate不超过 19200 bps 时非常可靠。为了保证通信稳定性,建议在程序中加入以下机制:超时重试(建议 3 次)、CRC verification结果验证、receivedataLength校验、Responseaddress校验(Confirm回复的slave address与Request一致),以及通信失败后的Error count和报警。如果是大规模批量项目,建议使用汇川 AM600 系列(Codesys 平台),其 Modbus Function块更为成熟稳定。
Q5:如何解决 Modbus 通信中 32 位浮点数的endianness问题?
32 位浮点数在 Modbus 中使用两个连续的 16 位register传输,endianness由设备决定。西门子和施耐德通常使用 Big-Endian 字序(register N 存高 16 位,N+1 存低 16 位),而三菱、台达、汇川通常使用 Little-Endian 字序(register N 存低 16 位,N+1 存高 16 位)。解决方法是在receive端进行byte交换:西门子可使用 SWAP 指令,三菱可使用 SWAP 指令或直接进行Word exchange,台达可使用 XCH 指令,汇川可使用循环移位。
结语
Modbus PLC 编程是Automation工程师的核心竞争力之一。从西门子 Modbus RTU 的 MB_MASTER 指令到三菱 Modbus 通信的 ADPRW 指令,从台达 PLC Modbus 的 MODRW 指令到汇川 Modbus 编程的自由口实现,不同品牌各有其设计哲学和最佳实践。掌握跨品牌 PLC 的 Modbus 通信能力,不仅能够应对各种项目需求,更能够深入理解工业通信协议的本质。
本文作为 modbus.cn Modbus 技术系列的重要篇章,与平台上的其他文章形成了完整的技术体系。建议读者结合以下几篇文章深入学习:
- Modbus protocol基础与message结构详解
- Modbus TCP 与 RTU 通信方式全面对比
- Modbus address映射完全指南
- Modbus Debug Tools与故障排查实战
- Modbus 通信安全最佳实践
工控之路,道阻且长。愿本文能成为你 Modbus 编程路上的可靠伴侣。
发表回复