1. 概要
S7-200 SMART PLC が Modbus RTU のマスターまたはスレーブとして動作する場合、内部記憶領域(I、Q、AIW、V)と標準 Modbus アドレスの間には固定のマッピング関係があります。本記事はシーメンス公式技術文書に基づき、S7-200 SMART の Modbus アドレスマッピングルールを、完全なアドレス対照表、設定手順、通信例、トラブルシューティングガイドとともに詳しく説明します。
S7-200 SMART は2つの Modbus 動作モードをサポートします。
- Modbus RTU マスター(Master):通信要求を能動的に発行し、スレーブ機器の読み取りや制御を行う
- Modbus RTU スレーブ(Slave):マスターの読み書き要求に受動的に応答する
2. Modbus アドレスタイプの説明
Modbus プロトコルは4つのデータ領域を定義しており、それぞれに固定のアドレス範囲と機能コードがあります。
| Modbus アドレス領域 | 機能コード | 読み書き属性 | データ型 | 対応する S7-200 SMART 記憶領域 |
|---|---|---|---|---|
| 0xxxx(コイル) | 01(コイル読み出し)/ 05(単一コイル書き込み)/ 15(複数コイル書き込み) | 読み/書き | ビット(1 bit) | Q領域 デジタル出力 |
| 1xxxx(離散入力) | 02(離散入力読み出し) | 読み取り専用 | ビット(1 bit) | I領域 デジタル入力 |
| 3xxxx(入力レジスタ) | 04(入力レジスタ読み出し) | 読み取り専用 | ワード(16 bit) | AIW アナログ入力 |
| 4xxxx(保持レジスタ) | 03(保持レジスタ読み出し)/ 06(単一レジスタ書き込み)/ 16(複数レジスタ書き込み) | 読み/書き | ワード(16 bit) | V記憶領域(設定可能) |
重要な注意:Modbus アドレスは1始まり(1-based)の番号付けで、1から数えます。一方、PLC 内部アドレスは通常0始まり(0-based)で、0から始まります。
3. S7-200 SMART Modbus アドレスマッピング表
3.1 デジタル出力領域(Q領域)→ 0xxxx コイル
デジタル出力 Q 領域は Modbus の 0xxxx コイル領域にマッピングされ、読み書き操作をサポートします。
| Modbus アドレス | S7-200 SMART アドレス | 説明 |
|---|---|---|
| 00001 | Q0.0 | 0チャネル 0ビット |
| 00002 | Q0.1 | 0チャネル 1ビット |
| 00003 | Q0.2 | 0チャネル 2ビット |
| 00004 | Q0.3 | 0チャネル 3ビット |
| 00005 | Q0.4 | 0チャネル 4ビット |
| 00006 | Q0.5 | 0チャネル 5ビット |
| 00007 | Q0.6 | 0チャネル 6ビット |
| 00008 | Q0.7 | 0チャネル 7ビット |
| 00009 | Q1.0 | 1チャネル 0ビット |
| 00010 | Q1.1 | 1チャネル 1ビット |
| 00011 | Q1.2 | 1チャネル 2ビット |
| 00012 | Q1.3 | 1チャネル 3ビット |
| 00013 | Q1.4 | 1チャネル 4ビット |
| 00014 | Q1.5 | 1チャネル 5ビット |
| 00015 | Q1.6 | 1チャネル 6ビット |
| 00016 | Q1.7 | 1チャネル 7ビット |
| 00017 | Q2.0 | 2チャネル 0ビット |
| 00018 | Q2.1 | 2チャネル 1ビット |
| ... | ... | 以下同様。8アドレスごとに1バイトに対応 |
| 00256 | Q31.7 | 最大アドレス(最大32バイトの出力) |
計算式:Modbus アドレス = チャネル番号 × 8 + ビット番号 + 1
例:Q2.3 にアクセスする場合、Modbus アドレス = 2×8 + 3 + 1 = 00020
機能コード:
- コイル状態の読み出し:機能コード01
- 単一コイルの書き込み:機能コード05
- 複数コイルの書き込み:機能コード15(0x0F)
注意事項:
- Q領域のアドレスマッピングは固定で、追加設定は不要
- 実際に使用できる Q 点の数は CPU モデルと拡張モジュールに依存する
- 対応する Q 点がハードウェアに存在しない場合、読み出し値は常に0
3.2 デジタル入力領域(I領域)→ 1xxxx 離散入力
デジタル入力 I 領域は Modbus の 1xxxx 離散入力領域にマッピングされ、読み取り専用です。
| Modbus アドレス | S7-200 SMART アドレス | 説明 |
|---|---|---|
| 10001 | I0.0 | 0チャネル 0ビット |
| 10002 | I0.1 | 0チャネル 1ビット |
| 10003 | I0.2 | 0チャネル 2ビット |
| 10004 | I0.3 | 0チャネル 3ビット |
| 10005 | I0.4 | 0チャネル 4ビット |
| 10006 | I0.5 | 0チャネル 5ビット |
| 10007 | I0.6 | 0チャネル 6ビット |
| 10008 | I0.7 | 0チャネル 7ビット |
| 10009 | I1.0 | 1チャネル 0ビット |
| 10010 | I1.1 | 1チャネル 1ビット |
| 10011 | I1.2 | 1チャネル 2ビット |
| 10012 | I1.3 | 1チャネル 3ビット |
| 10013 | I1.4 | 1チャネル 4ビット |
| 10014 | I1.5 | 1チャネル 5ビット |
| 10015 | I1.6 | 1チャネル 6ビット |
| 10016 | I1.7 | 1チャネル 7ビット |
| 10017 | I2.0 | 2チャネル 0ビット |
| 10018 | I2.1 | 2チャネル 1ビット |
| ... | ... | 以下同様。8アドレスごとに1バイトに対応 |
| 10256 | I31.7 | 最大アドレス(最大32バイトの入力) |
計算式:Modbus アドレス = 10000 + チャネル番号 × 8 + ビット番号 + 1
例:I3.5 にアクセスする場合、Modbus アドレス = 10000 + 3×8 + 5 + 1 = 10030
機能コード:離散入力の読み出しには機能コード02を使用
注意事項:
- I領域のアドレスマッピングは固定で、追加設定は不要
- 離散入力は読み取り専用で、マスターは書き込めない
- 実際に使用できる I 点の数は CPU モデルと拡張モジュールに依存する
3.3 アナログ入力領域(AIW領域)→ 3xxxx 入力レジスタ
アナログ入力 AIW 領域は Modbus の 3xxxx 入力レジスタ領域にマッピングされ、読み取り専用です。
| Modbus アドレス | S7-200 SMART アドレス | 説明 |
|---|---|---|
| 30001 | AIW0 | 1番目のアナログ入力チャネル |
| 30002 | AIW2 | 2番目のアナログ入力チャネル |
| 30003 | AIW4 | 3番目のアナログ入力チャネル |
| 30004 | AIW6 | 4番目のアナログ入力チャネル |
| 30005 | AIW8 | 5番目のアナログ入力チャネル |
| 30006 | AIW10 | 6番目のアナログ入力チャネル |
| 30007 | AIW12 | 7番目のアナログ入力チャネル |
| 30008 | AIW14 | 8番目のアナログ入力チャネル |
| 30009 | AIW16 | 9番目のアナログ入力チャネル |
| 30010 | AIW18 | 10番目のアナログ入力チャネル |
| ... | ... | 以下同様。ステップは2 |
| 30056 | AIW110 | 56番目のアナログ入力チャネル(最大) |
計算式:Modbus アドレス = 30000 + AIW番号 / 2 + 1
例:AIW20 を読み取る場合、Modbus アドレス = 30000 + 20/2 + 1 = 30011
機能コード:入力レジスタの読み出しには機能コード04を使用
注意事項:
- AIW はワードアドレス指定で、各 AIW は2バイトを占有するため、アドレスのステップ1が AIW のステップ2に対応する
- 入力レジスタは読み取り専用で、マスターは書き込めない
- アナログ入力値の範囲は通常 0-32767(単極性)または -32768〜32767(両極性)
- 実際に使用できる AIW の数はアナログモジュールのチャネル数に依存する
3.4 V記憶領域 → 4xxxx 保持レジスタ
V記憶領域のマッピングは設定可能で、Modbus スレーブ命令 MBUS_INIT の2つのパラメータで定義します。
- HoldStart:保持レジスタ領域の開始 V アドレス(例:&VB1000)
- MaxHold:保持レジスタ領域のワード数(単位:ワード、つまり VW の数)
マッピングルール:
| Modbus アドレス | S7-200 SMART アドレス | 説明 |
|---|---|---|
| 40001 | VW[HoldStart] | 1番目の保持レジスタ |
| 40002 | VW[HoldStart + 2] | 2番目の保持レジスタ |
| 40003 | VW[HoldStart + 4] | 3番目の保持レジスタ |
| 40004 | VW[HoldStart + 6] | 4番目の保持レジスタ |
| ... | ... | 以下同様。ステップは2バイト |
| 400XX | VW[HoldStart + 2 × (XX - 1)] | XX番目の保持レジスタ |
完全な例:HoldStart = &VB1000、MaxHold = 100 の場合
| Modbus アドレス | V記憶領域アドレス | バイト範囲 | 説明 |
|---|---|---|---|
| 40001 | VW1000 | VB1000-VB1001 | 1番目の保持レジスタ |
| 40002 | VW1002 | VB1002-VB1003 | 2番目の保持レジスタ |
| 40003 | VW1004 | VB1004-VB1005 | 3番目の保持レジスタ |
| 40004 | VW1006 | VB1006-VB1007 | 4番目の保持レジスタ |
| 40005 | VW1008 | VB1008-VB1009 | 5番目の保持レジスタ |
| ... | ... | ... | ... |
| 40100 | VW1198 | VB1198-VB1199 | 100番目の保持レジスタ(最後) |
機能コード:
- 保持レジスタの読み出し:機能コード03
- 単一レジスタの書き込み:機能コード06
- 複数レジスタの書き込み:機能コード16(0x10)
注意事項:
- V記憶領域のマッピングは設定可能で、MBUS_INIT 命令の HoldStart と MaxHold パラメータで設定する
- HoldStart は &VB1000 のように VB アドレスを指す必要がある
- MaxHold の単位はバイト(VB)ではなくワード(VW)
- 保持レジスタ領域は PLC プログラムで使用中の V 記憶領域と競合してはならない
- MaxHold を100に設定した場合、VB1000-VB1199 の計200バイトを占有する
4. PLC スレーブの設定手順
4.1 Modbus スレーブ命令ライブラリのインストール
- STEP 7-Micro/WIN SMART プログラミングソフトを開く
- 命令ツリーで「ライブラリ」フォルダを探す
- Modbus Slave ライブラリがない場合は先にインポートする:「ライブラリ」を右クリック →「ライブラリのインポート」→ Modbus Slave ライブラリファイルを選択
- ライブラリファイルは通常シーメンス公式サイトからダウンロードし、名称は「Modbus Slave」
4.2 MBUS_INIT 命令を呼び出してスレーブを初期化
最初のスキャン周期(SM0.1)で MBUS_INIT 命令を呼び出します。パラメータは以下のとおりです。
| パラメータ名 | 値の範囲 | 説明 |
|---|---|---|
| Mode | 0 / 1 | 0=Modbus スレーブを無効化し通常のフリーポートに戻す、1=Modbus スレーブを有効化 |
| Baud | 1200-115200 | ボーレート。よく使う値:9600、19200、38400、115200 |
| Parity | 0 / 1 / 2 | パリティ:0=なし、1=奇数、2=偶数 |
| Port | 0 / 1 | 通信ポート:0=オンボード RS485 ポート、1=シグナルボード SB CM01 の RS485 ポート |
| SlaveAddr | 1-247 | Modbus スレーブアドレス。同一バスで重複不可 |
| HoldStart | &VBxxx | 保持レジスタ領域の開始 V アドレスへのポインタ(例:&VB1000) |
| MaxHold | 0-10000 | 保持レジスタ領域のワード数(単位:ワード)。100なら100個の VW |
| Done | BOOL | 初期化完了フラグビット |
| Error | BYTE | エラーコード |
4.3 MBUS_SLAVE 命令のメインポーリング
メインプログラムループで、毎スキャン周期 MBUS_SLAVE 命令を呼び出す必要があります。
- この命令は Modbus マスターから送られた要求を処理する
- 呼び出さないとスレーブはマスターに応答できない
- パラメータ:Done(完了フラグ)、Error(エラーコード)
4.4 V記憶領域データの設定
HoldStart で指定した V アドレス領域に読み書きするデータを格納します。
- マスターから書き込まれたデータはこの領域に保存される
- PLC プログラムはこの領域からデータを読み取って処理する
- プログラムで使用中の他の V アドレスと競合しないよう注意する
5. PLC マスターの設定と読み取り例
5.1 MBUS_CTRL 命令を呼び出してマスターを初期化
最初のスキャン周期(SM0.1)で MBUS_CTRL 命令を呼び出し、Modbus マスターを初期化します。
| パラメータ名 | 値の範囲 | 説明 |
|---|---|---|
| Mode | 0 / 1 | 0=Modbus マスターを無効化、1=Modbus マスターを有効化 |
| Baud | 1200-115200 | ボーレート。スレーブと一致させる必要がある |
| Parity | 0 / 1 / 2 | パリティ。スレーブと一致させる必要がある |
| Port | 0 / 1 | 通信ポート:0=オンボード RS485、1=シグナルボード |
| Timeout | 1-32767 ms | スレーブ応答を待つタイムアウト時間。1000ms を推奨 |
| Done | BOOL | 初期化完了フラグビット |
| Error | BYTE | エラーコード |
5.2 MBUS_MSG 命令を呼び出して読み書き要求を発行
MBUS_MSG 命令は1回の Modbus 読み書き要求を発行するために使用します。
| パラメータ名 | 値の範囲 | 説明 |
|---|---|---|
| First | BOOL | 初回実行パルス。立ち上がりエッジを検出すると要求を発行 |
| Slave | 1-247 | スレーブアドレス |
| RW | 0 / 1 | 0=読み取り要求、1=書き込み要求 |
| Addr | Modbus アドレス | アクセスする Modbus アドレス。40001なら1番目の保持レジスタ |
| Count | 1-120 | 読み書きするレジスタ/コイルの数 |
| DataPtr | &VBxxx | データバッファへのポインタ(例:&VB2000) |
| Done | BOOL | 今回の要求の完了フラグビット |
| Error | BYTE | エラーコード |
5.3 保持レジスタ読み取り例
アドレス1のスレーブ機器から10個の保持レジスタ(40001-40010)を読み取る場合:
- First:パルス信号でトリガー
- Slave:1
- RW:0(読み取り)
- Addr:40001
- Count:10
- DataPtr:&VB2000
読み取り成功後、VB2000 から始まる20バイトに10個のレジスタのデータが格納されます。
6. よくある問題とトラブルシューティングガイド
6.1 通信が無応答、スレーブが返答しない
- 配線確認:RS485 の A+ と B- が逆接続されていないか。これが最も多いミス
- パラメータ一致性の確認:マスターとスレーブのボーレート、データビット、ストップビット、パリティは完全に一致する必要がある
- スレーブアドレス確認:SlaveAddr が正しいか。バス上に重複アドレスがあってはならない
- バス電圧の測定:A線(D+)は B線(D-)より約200mV 以上高い必要がある
- 終端抵抗の確認:バス両端に120Ωの終端抵抗があるか(長距離で必要)
- Port パラメータ確認:正しい通信ポート(0または1)を選んでいるか
6.2 データを読み取れない、またはデータが正しくない
- アドレス形式の確認:Modbus アドレスには1始まりと0始まりの2種類の書き方があり、区別に注意
- HoldStart の確認:保持レジスタの開始アドレス設定が正しいか確認
- MaxHold の確認:保持レジスタ数が十分か確認
- アドレス範囲の確認:読み取るアドレスが MaxHold で定義した範囲内か
- バイトオーダーの確認:32ビットデータの上位/下位ワード順がマスターと合っているか
6.3 データが文字化けする、または数値が正しくない
- データ形式の確認:16ビット整数、32ビット整数、浮動小数点数のいずれか確認
- バイトオーダーの確認:ビッグエンディアンとリトルエンディアンが一致しているか
- ワード順の確認:32ビットデータの上位/下位ワード順が正しいか
- スケーリングの確認:倍率が必要か(例:0.1℃単位の値は10で割る)
- 負数処理の確認:負数は2の補数で表現される。符号付きと符号なしの違いに注意
6.4 偶発的な通信失敗
- シールド線の確認:RS485 線にシールド付きツイストペアケーブルを使い、シールドを片側接地しているか
- バス長の確認:9600bps で最大1200m、115200bps で最大約100m
- スレーブ数の確認:1本の RS485 バスに接続できるスレーブは最大32台(リピータなし)
- 電磁干渉の確認:通信線が動力線と平行に配線されていないか、干渉源がないか
- タイムアウト設定の確認:Timeout パラメータが小さすぎないか。適切に大きくして試す
6.5 Error エラーコードの説明
| エラーコード | 説明 | 解決方法 |
|---|---|---|
| 0 | エラーなし | - |
| 1 | パリティエラー | パリティ設定を確認 |
| 2 | ボーレート非対応 | ボーレートパラメータを確認 |
| 3 | タイムアウトエラー | 配線、スレーブ電源、タイムアウト設定を確認 |
| 4 | スレーブアドレスエラー | SlaveAddr パラメータを確認 |
| 5 | 確認応答未受信 | スレーブが無応答。配線とパラメータを確認 |
| 10 | ゲートウェイエラー | ゲートウェイ設定を確認 |
7. まとめ
S7-200 SMART の Modbus アドレスマッピングルールは明確で分かりやすいものです。
- 0xxxx コイル領域 → Q領域のデジタル出力に対応、読み書き
- 1xxxx 離散入力領域 → I領域のデジタル入力に対応、読み取り専用
- 3xxxx 入力レジスタ領域 → AIW アナログ入力に対応、読み取り専用
- 4xxxx 保持レジスタ領域 → V記憶領域に対応、設定可能、読み書き
このマッピング関係を理解すれば、S7-200 SMART とサードパーティ機器の Modbus RTU 通信をすばやく実現できます。実際の運用では、まず Modbus Poll などのデバッグソフトで通信をテストし、アドレスマッピングが正しいことを確認してから PLC プログラムを作成することをおすすめします。
8. 関連リンク
- Modbus RTU 通信基礎チュートリアル
- Modbus 機能コードの詳細解説
- シーメンス S7-200 SMART Modbus マスター設定実例
- RS485 バス配線規格
发表回复