Modbus 在主流 PLC 中的プログラミング実践ガイド(シーメンス、三菱、台達、インバーター全系列)
在工业自動化领域,Modbus PLC プログラミング是每一位自動化エンジニア必须掌握的核心技能。无论是シーメンス S7-1200/1500 的专用通信指令,まだ三菱 FX5U 的 ADPRW 指令,亦或是台達 DVP 系列的 MODRW 指令和インバーター H3U 的自由口プログラミング,不同ブランド的 PLC 在 Modbus 通信的実装方式上存在显著差异。本記事作为 modbus.cn 系列チュートリアル的重要组成部分,将系统性地对比四大主流 PLC ブランド的 Modbus プログラミング方法,提供完全的ラダー図サンプル和アドレスマッピング关系,帮助エンジニアスピードマスター。跨ブランド PLC 的 Modbus 通信开发。
ブランド別のブランド PLC Modbus 実装方式对比总览
在深入具体プログラミング之前,我们先理解一个关键区别:不同ブランド的 PLC 对 Modbus protocol的サポート方式分为"专用指令"和"自由口プログラミング"两大类。专用指令方式由 PLC 厂商封装好 Modbus protocol栈,エンジニア只需调用指令并設定参数即可完成通信;而自由口プログラミング方式则需要エンジニア手动构建 Modbus 报文フレーム,経由シリアルポート逐バイト收发来実装协议。两种方式各有优劣,下表给出了直观对比。
| ブランド/系列 | 実装方式 | 核心指令/机制 | 开发难度 | 灵活性 |
|---|---|---|---|---|
| シーメンス 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 機能ブロック | 低 | 中 |
从上表可以看出,シーメンス Modbus RTU 和 三菱 Modbus Communication 均采用专用指令方案,开发门槛较低;而 インバーター Modbus プログラミング 中的 H3U 系列则需要自由口プログラミング,对エンジニア的协议理解能力要求更高。台達 PLC Modbus 的 MODRW 指令则以其简洁易用著称。
シーメンス S7-1200/1500 Modbus プログラミング详解
シーメンス博途(TIA Portal)プラットフォーム为 S7-1200 和 S7-1500 系列 PLC 提供了完全的 Modbus 通信库,包含三个核心指令:MB_COMM_LOAD(通信の初期化)、MB_MASTER(マスター通信)和 MB_SLAVE(スレーブ通信)。这些指令位于"Communication"指令组的"其它"→"Modbus"路径下。
MB_COMM_LOAD — 通信モジュール初期化
在使用任何 Modbus 通信之前,まず必要です。调用 MB_COMM_LOAD 指令对通信モジュール进行設定。该指令的功能类似于设定シリアルポート的ボーレート、check digit、データ·ビット和ストップ·ビット等基本参数,同时指定 Modbus 的工作モード(RTU 或 ASCII)。
| parameter | 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 开启延时(ms) | 0 |
| RTS_OFF_DLY | UInt | RTS 关闭延时(ms) | 0 |
| RESP_TO | UInt | レスポンス·タイムアウト(ms) | 1000 |
| MB_DB | Variant | MB_MASTER/SLAVE その背景はデータ块 | 对应指令的 DB No. |
| DONE | Bool | 設定完了フラグ | — |
| ERROR | Bool | エラーフラグ | — |
| STATUS | Word | ステータス码(16#0000=エラーなし。) | — |
MB_MASTER — Modbus マスター通信指令
MB_MASTER 指令使 S7-1200/1500 作为 Modbus RTU master,向スレーブデバイス読み取りおよび書き込み要求の送信。该指令サポート機能コード 01(リードコイルを読む)、02(read discrete inputs)、03(read holding registers)、04(read input registers)、05(シングルコイルを書く。)、06(単一レジスタの書き込み)、15(マルチコイルを書く)和 16(マルチレジスタの書き込み)。
// MB_MASTER ラダー図参数説明(SCL 表示)
"MB_MASTER_DB"(
REQ := #Start_Read, // 上昇エッジトリガー
MB_ADDR:= 1, // From station address (1-247)
MODE := 0, // 0=读 1=写
DATA_ADDR := 40001, // スレーブデータ開始アドレス
DATA_LEN := 10, // データ長さ(字数)
DATA_PTR := P#DB1.DBX0.0 WORD 10 // 本地データストア区指针
);
// 常见モード:
// MODE=0, DATA_ADDR=40001 → function code 03 Read the hold register
// MODE=1, DATA_ADDR=40001 → function code 06/16 写レジスタを保持する。
MB_SLAVE — Modbus スレーブ通信指令
MB_SLAVE 指令使 S7-1200/1500 作为 Modbus RTU slave,レスポンスマスター的読み書きリクエスト。该指令允许マスターアクセス PLC 内部的特定データエリア(コイル、ショップ型入力、入力レジスタ。、レジスタを保持する。)。
// MB_SLAVE ラダー図参数説明(SCL 表示)
"MB_SLAVE_DB"(
MB_ADDR := 1, // 本駅からの住所
MB_HOLD_REG := P#DB2.DBX0.0 WORD 100 // レジスタマップを保持区
);
完全ラダー図サンプル:读温湿度センサー
以下是一个完全的シーメンス S7-1200 read Modbus 温湿度センサー的程序サンプル。センサーは駅からの住所为 1,温湿度分别存储在レジスタを保持する。 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:周期性読み取りセンサーはデータ(每 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 = 温度值(需要除以 10 得到实际温度)
// DB3.DBW2 = 湿度值(需要除以 10 得到实际湿度)
についてシーメンス博途プラットフォーム更详细的 Modbus 設定,请参照 modbus.cn 上についてシーメンス通信モジュール硬件选型的関連記事。也可以表示我们的シーメンス Modbus RTU 完全な構成チュートリアル。
三菱 FX5U Modbus プログラミング详解
三菱 Modbus Communication在 FX5U 系列上経由 ADPRW 专用命令の実装,相比 FX3U 时代需要额外适配器的方案有了质的飞跃。FX5U 内置的 RS-485 ポート直接サポート Modbus RTU Protocol,无需额外硬件投入。ADPRW 指令的强大之处在于一条指令即可完成 Modbus 機能コード的指定和データ的收发。
ADPRW 指令详解
| 操作数 | 説明 | 设定範囲 | example |
|---|---|---|---|
| S1 | slave address | H1-HF7(1-247) | H1 |
| S2 | function code | H1-H6, HF, H10 | H3(read holding registers) |
| S3 | Modbus address | H0-HFFFF | H0(对应 40001) |
| S4 | データ点数 | H1-H7D0(字) | K2 |
| D1 | send/受信データ起始软元件 | 位/字软元件 | D100 |
ADPRW 指令在执行时,PLC 自动构建 Modbus 报文フレーム、result CRC verification码、送信报文并待機中スレーブ回复。对于書き込み操作。(function code H6/H10),D1 指定的软元件エリア存储待送信的データ;对于読み取り操作。(function code H1-H4),D1 指定的软元件エリア存储受信到的データ。
ADPRW 关键注意事項について
- アドレス偏移ルール:Modbus protocolアドレス从 0 开始编号,但ドキュメント中的アドレス(如 40001)从 1 开始。在 ADPRW 的 S3 操作数中,レジスタを保存する H0 开始对应 40001,コイル从 H0 开始对应 00001。
- function code H3(read holding registers)1回限り。読み取り 125 个字(H7D)。
- function code H10(マルチレジスタの書き込み)1回限り。写入 123 个字(H7B)。
- ADPRW 指令为実行完了の完了型指令,需要连续多个スキャンサイクル才能完成一次通信。
- 必须経由特殊继电器 SM 和特殊レジスタ SD 进行通信ステータス判断。
ラダー図サンプル:FX5U 読み取り周波数変換器参数
// 网络 1:通信パラメータ設定(経由 PLC 参数設定,无需ラダー図)
// 通道 1(CH1):内置 RS-485
// Protocol: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:read holding registers
│ │S3: H100 │ // starting address:40101(频率)
│ │S4: K2 │ // read 2 个字
│ │D1: D100 │ // データストア到 D100-D101
└──────────────────────────────┘
// 网络 3:データの処理
// D100 = 動作頻度は(単位 0.01Hz,需要除以 100)
// D101 = 出力電流は(単位 0.1A,需要除以 10)
// 网络 4:写入動作頻度は设定
┌──────────────────────────────┐
│ M1 [ADPRW ]│
│──┤├──────────────┤S1: H1 │ // slave address 1
│ │S2: H6 │ // function code:単一レジスタの書き込み
│ │S3: H200 │ // 目标アドレス:40201
│ │S4: K0 │ // 書き込み操作。时忽略
│ │D1: D200 │ // 写入的データ
└──────────────────────────────┘
三菱 FX5U 的 Modbus 通信速度可达 115200 bps,在多站ポーリング场景下表现出色。について三菱 Modbus 通信的更深入内容,请参照 modbus.cn 上的三菱 Modbus 通信完全チュートリアル。
台達 DVP/AS 系列 Modbus プログラミング详解
台達 PLC Modbus 通信在 DVP 和 AS 系列上有非常优雅的実装。MODRW 指令是台達 PLC 进行 Modbus 通信的核心指令,其设计理念是"一条指令解決すべての問題"——无论是読み取りまだ写入、コイルまだレジスタ,都経由这条命令の完了。AS 系列更是提供了增强版的 M_MODRW 指令,サポートもっと見る機能コード。
MODRW 命令パラメータ説明
| parameter | 含义 | DVP 系列 | AS 系列 |
|---|---|---|---|
| S | 联机装置アドレス | K1-K254 | K1-K254 |
| S1 | function code | K1/K2/K3/K4/K5/K6/K15/K16 | 同上+扩展 |
| S2 | 目标装置アドレス | 0-9999 | 0-65535 |
| S3 | データ長さ | 1-127 | 1-200 |
| D | 本机データ起始レジスタ | D register | D register |
ラダー図サンプル:台達 DVP 読み取りスマートメーター
// 台達 DVP-ES2 経由 COM2(RS-485)読み取りスマートメーターデータ
// 電気メーター駅からの住所:1,Baud rate 9600,検証なし。
// 网络:触发読み取り電気メーターデータ
┌───────────────────────────────┐
│ M1002 [ SET M0 ]│ // 電気の初期化
└───────────────────────────────┘
┌───────────────────────────────┐
│ M1013 [ MODRW ]│ // 1 秒时钟脉冲触发
│──┤├───────────────┤S: K1 │ // slave address 1
│ │S1: K3 │ // function code:read holding registers
│ │S2: K0 │ // starting address:040001
│ │S3: K6 │ // read 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 增强功能
台達 AS 系列 PLC(如 AS228T-A)在 MODRW 基础上提供了 M_MODRW 指令,主要增强包括:サポート 32 ビット·データ読み書き、サポートストリング·ストリング传输、サポート位写入、通信タイムアウト可設定,以及最多可同时激活 8 条通信指令。这些增强使得 AS 系列在复杂 Modbus 通信场景下具有明显优势。
// 台達 AS 系列 M_MODRW example:read 32 位电能累计值
┌───────────────────────────────────┐
│ M0 [ M_MODRW ]│
│──┤├────────────────┤S: K1 │ // slave address
│ │S1: K3 │ // function code:读レジスタ
│ │S2: K100 │ // starting address
│ │S3: K2 │ // read 2 个字(含 32 ビット·データ)
│ │D: D100 │ // 存储到 D100(低字)、D101(高字)
│ │Mode: D200 │ // モード设定
└───────────────────────────────────┘
台達 PLC 的 Modbus プログラミング体验在国产ブランド中堪称一流,MODRW 指令的简洁性大幅降低了开发门槛。もっと見る台達 PLC Modbus 通信的技术细节,ご訪問ください。 modbus.cn 查阅台達 PLC Modbus 通信完全ガイド。
インバーター H3U Modbus 自由口プログラミング详解
インバーター Modbus プログラミング在 H3U 系列上有独特之处。不同于其他ブランド提供专用 Modbus 指令的做法,H3U 采用自由口通信の形態,エンジニア需要手动构建 Modbus 报文フレーム并経由 RS 命令を送る。。这种方式虽然增加了开发难度,但给予了エンジニア对通信过程的完全控制权,在非標準プロトコル或特殊需求场景下非常有用。
H3U 自由口通信基本原理
インバーター H3U 的シリアル通信基于 RS 指令(データ送信指令)和 RC 指令(データ受信指令)。要実装 Modbus RTU Communication,需要按照 Modbus protocol specification手动构建报文フレーム,包括駅からの住所、function code、データ域和 CRC verification码。
CRC-16 チェック算法実装
Modbus RTU 的 CRC verification码是自由口プログラミング中最关键的部分。以下是在 H3U 上実装 CRC-16 チェック的ラダー図逻辑説明(チェック多項式:0xA001)。
// CRC-16 計算流程(Modbus RTU 標準算法)
// 入力:待チェックデータストア在 D100-D105(6 byte,不含 CRC),Bytesの数存于 D0
// 出力:CRC16 结果ハイバイト存于 D200,低バイト数存于 D201
//
// 算法伪代码:
// 1. 预置 16 位 CRC レジスタ为 0xFFFF
// 2. 将第一个 8 ビット·データ与 CRC レジスタ低バイト数异或,结果存入 CRC register
// 3. CRC レジスタ右移一位,最高位补 0
// 4. 移出位もし为 1,则 CRC レジスタ与 0xA001 XOR
// 5. 重复步骤 3-4 共 8 次
// 6. 処理下一バイト単位。,重复步骤 2-5
// 7. すべてのバイト処理完成后,CRC レジスタ的值即为 CRC16 checksum
// H3U ラダー図中的実装(使用循环指令)
// 注意:H3U 内置了 CRC verification指令(CRC),可将チェックコード追加到送信データ末尾
// CRC D100 D106 K6
// Function:对 D100 始まりました。 6 Bytesのデータ計算 CRC,结果存入 D106-D107
完全自由口 Modbus RTU マスターサンプル
// インバーター H3U 自由口通信実装 Modbus RTU master
// 目标:読み取り駅からの住所 1 保持レジスタです。 40001(2 个字)
// 网络 1:构建 Modbus リードホールドレジスタ报文
// メッセージ形式:[slave address][function code][開始アドレス高][開始アドレス低][字数高][字数低][CRC低][CRC高]
//
// 送信报文データ准备:
// D100 = H0103 // slave address 01 + function code 03
// D101 = H0000 // starting address 0000(对应 40001)
// D102 = H0002 // read 2 个字
// CRC verification放入 D103
// 网络 2:設定シリアルパラメータ(経由特殊レジスタ)
// D8120 = H0C81 // 8ビット·データ+even parity+1ストップ·ビット+9600bps
// M8161 = ON // 8位データの処理モード
// 网络 3:送信データ
┌──────────────────────────────┐
│ M0 [ RS ]│
│──┤├──────────────┤D100 │ // 送信起始レジスタ
│ │K8 │ // send 8 バイト単位。(含 CRC)
│ │D200 │ // 受信起始レジスタ
│ │K9 │ // receive 9 バイト単位。(含 CRC)
└──────────────────────────────┘
// 网络 4:受信データの処理
// D200 = slave address(应为 H01)
// D201 = function code(应为 H03)
// D202 = byte count(应为 04)
// D203 = 第一字ハイバイト
// D204 = 第一字低バイト数
// D205 = 第二字ハイバイト
// D206 = 第二字低バイト数
// D207 = CRC lowbyte
// D208 = CRC highbyte
インバーター AM600 系列(Codesys プラットフォーム)则提供了更现代化的 Modbus 通信の形態,経由专用機能ブロックの実装,与シーメンス方案更为接近。についてインバーター全系列 PLC 的 Modbus プログラミング对比,请参照 modbus.cn 上的インバーター Modbus プログラミング全系列指导。
ブランド別のブランドアドレスマッピング关系对照表
Modbus 通信中最容易出错的环节之一就是アドレスマッピング。不同ブランド的 PLC 对 Modbus アドレス的表示方式各不相同,而且在プログラミング时アドレス偏移ルール也有差异。下表整理了四大ブランド PLC 的 Modbus アドレスマッピング关系,カバー超过 2000 条アドレスマッピングルール的核心逻辑。
| Modbus アドレス区 | プロトコルアドレス | シーメンス | 三菱 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 |
| 入力レジスタ。 30001-39999 | 0-9998 | IW0-IWx | SD 特殊レジスタ | — | — |
| レジスタを保持する。 40001-49999 | 0-9998 | DBx.DBW0+ | D0-D7999 | D0-D9999 | D0-D7999 |
| レジスタを保持する。 400001-465535 | 0-65534 | 需扩展寻址 | D0-D7999 / R0+ | D0-D9999 / 扩展 | D0-D7999 / 扩展 |
アドレス偏移ルール详解
理解アドレス偏移是避免 Modbus 通信エラー的基石。Modbus protocol定义的アドレス从 0 开始编号,但アプリケーション層编号(如 40001)从 1 开始。不同ブランド的 PLC 在指令で使用する。的アドレス通常是プロトコルアドレス(0-based),这导致了一个常见的"difference 1"Error。
| Scenarios | ドキュメントのアドレス | プロトコルアドレス(指令中用) | オフセットの量 |
|---|---|---|---|
| read holding registers 40001 | 40001 | 0x0000(H0/K0) | -1 |
| read holding registers 40100 | 40100 | 0x0063(H63/K99) | -1 |
| リードコイルを読む 00001 | 00001 | 0x0000(H0/K0) | -1 |
| 単一レジスタの書き込み 40010 | 40010 | 0x0009(H9/K9) | -1 |
| read input registers 30050 | 30050 | 0x0031(H31/K49) | -1 |
よくある間違い与陷阱
在实际工程中,Modbus 通信的デバッグ往往占据了大量开发时间。以下是著者整理了数百个实际项目中最も一般的な的エラー和陷阱,帮助读者少走弯路。
1. アドレス偏移エラー
这是最も一般的な的エラーない之一。デバイス手册上写的レジスター·アドレス是"40001",エンジニア在 PLC 指令中将開始アドレス填写为"1"或"40001"都是エラー的。正确做法是填入"0"(プロトコルアドレス = アプリケーションのアドレス - 1)。シーメンス MB_MASTER 的 DATA_ADDR 参数填入 40001 是正确的(シーメンス做了封装),但三菱 ADPRW 的 S3 参数应填入 H0,台達 MODRW 的 S2 参数应填入 K0。
2. endianness(Endianness)問題
当 Modbus 传输 32 ビット·データ(如浮動小数点数、双字整数)时,バイトオーダー問題会导致データの解析エラー。常见的バイトオーダー组合有四种: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,跨ブランド通信时必须注意バイトオーダー変換。
3. タイムアウトの設定不当
Modbus RTU 的フレーム間の間隔標準为 3.5 个文字の時間(在 9600 bps 下约 3.6ms)。もしマスター的タイムアウトの設定过短,会因普通のためにフレーム間の間隔而误判タイムアウト;もし过长,则在デバイス掉线时会浪费大量扫描时间。建议将レスポンスタイムアウトの設定为「(最大レスポンス文字数 × 文字の時間)+ デバイス処理時間 + 余量」,例如 9600 bps 下読み取り 10 Registers,合理的タイムアウトの設定为 200-500ms。
4. 多マスター冲突
Modbus RTU 是单マスター协议,同一バス上不允许存在多个マスター。当 HMI タッチパネル和 PLC 同时作为マスターアクセス同一デバイス时,会产生バス冲突。ソリューション是让 HMI 経由 PLC 的透過的な伝送功能间接アクセスデバイス,或者使用 Modbus TCP ゲートウェイ进行プロトコル変換。
5. 通信パラメータ不一致
Baud rate、data bit、stop bit、チェックビット必须与スレーブ完全一致。注意:某些デバイス声称サポート"9600,8,N,1",但实际データ·ビット为 9 位(8 data bit + 1 check digit),通信时会因为バイト長さ不マッチング而失敗。建议使用 Modbus debugging tool機器の確認的实际通信パラメータ。
与 SCADA 系统的集成
PLC 経由 Modbus protocol与 SCADA(モニタリング与データの収集)システム統合是工业自動化中最も一般的な的架构之一。以下介绍几种典型的集成方式和ベストプラクティス。
典型集成架构
- 直连モード:SCADA 経由 Modbus RTU/TCP 驱动直接连接 PLC。適用される小型系统(1-5 台 PLC),优点是架构简单、延迟低;缺点是扩展性差、SCADA 负担重。
- OPC サーバー·サーバー中转モード:PLC → OPC Server(如 Kepware、Matrikon)→ SCADA。適用される中大型系统,优点是协议解耦、多クライアント側はサポート;缺点是增加了中间层和维护成本。
- データゲートウェイモード:PLC → Modbus データゲートウェイ → SCADA/MES/ERP。適用されるエンタープライズレベル系统,优点是统一データ出口、サポートデータ缓存和转发。
SCADA 组态要点
在 SCADA 中設定 Modbus 驱动时,最关键的是正确設定レジスター·アドレスマッピング。常见的 SCADA プラットフォーム(如 WinCC、キング·ビュー、力控、Intouch)对 Modbus アドレス的表示方式各不相同。例如,WinCC 使用 "4x0001" 表示レジスタを保持する。,而キング·ビュー使用 "4-1" 的格式。必须查阅各プラットフォーム的 Modbus 驱动ドキュメント,確認アドレス格式后再进行設定。
デバッグスキル与工具おすすめ
高效的デバッグ是 Modbus 通信开发成功的关键。以下是著者おすすめ的工具和方法论。
必备デバッグツール
| 工具名称 | Type | 適用可能なシーン | おすすめ理由 |
|---|---|---|---|
| Modbus Poll | 桌面软件 | マスター模拟 | 界面直观,サポートすべての機能コード,可定时ポーリング |
| Modbus Slave | 桌面软件 | ステーションからのシミュレーション | 可与 Poll 配对使用,仿真スレーブ行为 |
| QModMaster | 开源软件 | マスターデバッグ | 無料开源,サポート RTU/TCP,跨プラットフォーム |
| ModScan | 桌面软件 | マスター扫描 | 批量扫描スレーブレジスタ,快速建立アドレスマッピングテーブル |
| シリアルポートモニタリング工具 | 硬件/软件 | バス监听 | USB 转 485 的监听モード,记录元の报文 |
| Wireshark | 网络抓包 | Modbus TCP 分析 | サポート Modbus TCP 协议解析,Powerful Features |
デバッグ方法论
- 分层验证法:先用電気メーター確認物理層は(线缆、終端抵抗、バイアス抵抗体),再用 Modbus Poll 確認链路层(Baud rate、check),最后用 PLC 程序確認アプリケーション層(address、data format)。
- 最小化测试:先用最简单的機能コード(03 単一読み込みレジスタ)进行通信测试,確認基本链路正常后再测试复杂功能。
- 报文记录法:使用シリアルポートモニタリング工具记录完全报文,経由人工分析报文フレームポジショニング問題。Modbus 报文構造简单,通常一眼就能识别問題所在。
- タイムアウト递进法:从较长的タイムアウト(如 3000ms)开始デバッグ,確認通信は正常后逐步缩短タイムアウト,找到最佳值。
四大ブランド Modbus プログラミング包括的对比
| 对比维度 | シーメンス S7-1200/1500 | 三菱 FX5U | 台達 AS 系列 | インバーター H3U |
|---|---|---|---|---|
| 実装方式 | 专用指令(库) | 专用指令 | 专用指令 | 自由口プログラミング |
| 核心指令 | MB_COMM_LOAD/MB_MASTER/MB_SLAVE | ADPRW | MODRW/M_MODRW | RS+CRC |
| プログラミング难度 | ★★☆☆☆ | ★★☆☆☆ | ★★☆☆☆ | ★★★★☆ |
| 機能コードのサポート | 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(受スキャンサイクル限制) |
| 最大のシングル。データの量 | 125 字(读)/123 字(写) | 125 字(读)/123 字(写) | 127 字(读)/123 字(写) | 无限制(手动) |
| アドレス容错 | 自动処理偏移 | 需手动偏移(-1) | 需手动偏移(-1) | 需手动偏移(-1) |
| 多指令并行 | サポートなし。(需排队) | サポートなし。(需排队) | サポート(最多8条) | 手动管理 |
| エラー诊断 | STATUS 详细ステータス码 | SM/SD register | エラーフラグ位 | 手动判断 |
| TCP サポート | MB_CLIENT/MB_SERVER | 内置イーサネット(イーサネット)口 | 内置イーサネット(イーサネット)口 | 需扩展モジュール |
| 浮動小数点数サポート | 需バイトオーダー変換 | 需バイトオーダー変換 | 需バイトオーダー変換 | 需バイトオーダー変換 |
| 开发环境 | TIA Portal | GX Works3 | ISPSoft/DIAStudio | AutoShop |
| 学习リソース | 丰富 | 较丰富 | 中等 | 较少 |
| 典型通信速率 | 19200-115200 | 9600-115200 | 9600-115200 | 9600-19200 |
| 适合场景 | 大型系统/標準化项目 | 中小型デバイス/快速开发 | 国产替代/性价比优先 | 定制化需求/深度控制 |
FAQ common problems
Q1:シーメンス S7-1200 的 Modbus 通信需要额外的ハードウェアモジュール吗?
はい。S7-1200 CPU 本体通常只有イーサネット(イーサネット)口和普通的 RS-232/RS-485(部分型号),需要进行 Modbus RTU 通信时,Recommended for use CM1241 RS485 通信モジュール(硬件标识号 269)或 CB1241 信号板。对于 Modbus TCP Communication,CPU 自带的イーサネット(イーサネット)口即可サポート,无需额外硬件。S7-1500 类似,使用 CM PtP 通信モジュール。
Q2:三菱 FX5U 的 ADPRW 指令一次可以读複数書き込み少个デバイス?
ADPRW 指令每次只能与一个スレーブデバイス进行通信。もし需要ポーリング多个スレーブ,需要在程序で使用する。多组 ADPRW 指令,并确保同一时间只有一条指令在激活ステータス。可以経由上一个指令的完了フラグ来触发下一个指令,実装串行ポーリング。典型的多站ポーリング周期 = 站点数 × (リクエスト时间 + 応答時間 + フレーム間の間隔)。
Q3:台達 MODRW 指令通信失敗如何排错?
首先チェック通信パラメータ是否一致(Baud rate、check digit、data bit、stop bit)。然后確認 RS-485 的 A/B 线是否接反——这是最も一般的な的硬件問題。使用台達 PLC 内置的特殊レジスタ可以表示通信エラー·コード。最后,确保 MODRW 指令的目标アドレス与スレーブ实际アドレスマッチング。台達 PLC 的 COM2 ポートデフォルト是 Modbus 駅からのモデル,如需作为マスター使用,需要在程序中将 M1143 設定为 ON。
Q4:インバーター H3U 自由口プログラミング実装 Modbus 的可靠性如何?
インバーター H3U 的自由口 Modbus 通信在ボーレート不超过 19200 bps 时非常可靠。为了保证通信稳定性,建议在程序中加入以下机制:タイムアウト重试(建议 3 次)、CRC verification结果验证、受信データ長さチェック、レスポンスアドレスチェック(確認回复駅からの住所与リクエスト一致),以及通信失敗后的エラー计数和报警。もしそうなら大规模批量项目,建议使用インバーター AM600 系列(Codesys プラットフォーム),其 Modbus 機能ブロック更为成熟稳定。
Q5:如何解決 Modbus 通信中 32 ビット浮動小数点数的バイトオーダー問題?
32 ビット浮動小数点数在 Modbus で使用する。2つ连续的 16 位レジスタ传输,バイトオーダー由デバイス决定。シーメンス和シュナイダー通常使用 Big-Endian 字序(register N 存高 16 位,N+1 存低 16 位),而三菱、台達、インバーター通常使用 Little-Endian 字序(register N 存低 16 位,N+1 存高 16 位)。解決方法是在受信端进行バイトスワップ:シーメンス可使用 SWAP 指令,三菱可使用 SWAP 命令または直接进行言葉の交換,台達可使用 XCH 指令,インバーター可使用循环移位。
结语
Modbus PLC プログラミング是工业自動化エンジニア的核心竞争力之一。从シーメンス Modbus RTU 的 MB_MASTER 指令到三菱 Modbus Communication的 ADPRW 指令,从台達 PLC Modbus 的 MODRW 指令到インバーター Modbus プログラミング的自由口実装,不同ブランド各有其设计哲学和ベストプラクティス。掌握跨ブランド PLC 的 Modbus 通信能力,不仅能够应对各种项目需求,更能够深入理解工业通信プロトコル的本质。
本記事作为 modbus.cn Modbus 技术系列的重要篇章,与プラットフォーム上的其他文章形成了完全的技术体系。建议读者结合以下几件の記事深入学习:
- Modbus protocol基础与报文構造详解
- Modbus TCP 与 RTU 通信の形態包括的对比
- Modbus アドレスマッピング完全ガイド
- Modbus debugging tool与故障トラブルシューティング実践
- Modbus 通信セキュリティベストプラクティス
工控之路,道阻且长。愿本記事能成为你 Modbus プログラミング路上的可靠伴侣。
Leave a Reply