三菱電機製のイーサネットユニットQJ71E71-100を使って、Modbus/TCP通信を実現するための記事です。
- パラメータ設定
- ラダーの作り方
- 動作テスト
まで一つひとつ細かく解説しているので、初めての人でも安心してチャレンジしてみてください。
準備するもの
今回のQJ71E71-100でModbus/TCP通信をおこなう際に必要な部品、ツールは下記のとおりです。
- Ethernetインタフェースユニット
- プログラム編集ツール
- Modbus通信テストツール
- LANケーブル
- ストレート結線
Ethernetインタフェースユニット QJ71E71-100
引用元:https://www.mitsubishielectric.co.jp/fa/products/faspec/point.do?kisyu=/plcq&formNm=700005310
今回の主役であるEthernetインタフェースユニットQJ71E71-100です。
FL-netユニットやEtherNet/IPユニットではModbus通信はできないため、注意してください。
プログラム編集ツール GX-Works2
引用元:https://www.mitsubishielectric.co.jp/fa/products/cnt/plceng/smerit/gx_works2/index.html
通信プロトコル支援機能を搭載した、シーケンスプログラム編集ソフトです。
今回の検証では、このGX-Works2を使用して解説を進めていきます。
Modbus通信テストツール ModRSsim2
出典元:https://sourceforge.net/projects/modrssim2/
パソコンにModbus用サーバーを設置できるシミュレーションソフトです。
ソフトウェアを起動するだけで、Modbusサーバーとしてクライアントからの接続待ちとなります。
すべて英語なのでわかりにくいかもしれませんが、使い方は難しくありません。
LANケーブル(ストレート)
ストレート結線のLANケーブルを準備してください。
クロスケーブルには対応していません。
ハードウェアの構成
QJ71E71-100でパソコンとModbus/TCP通信をおこなうにあたって、下記のハードウェア構成で進めます。
PLCの構成
PLCの構成として、QJ71E71-100は4番スロットに装着しています。
そのため、QJ71E71-100のバッファメモリを参照する際は『U4』を指定してください。
I/Oスロット0番に装着した場合、バッファメモリを参照する際は『U0』を指定します。
ネットワークの構成
ネットワークは、PLCとPCだけが存在するシンプルな構成で進めます。
機器名 | IPアドレス |
---|---|
PLC(QJ71E71-100) | 192.168.1.2 |
パソコン | 192.168.1.5 |
PLCとパソコンを直結しても問題なく動作します。
QJ71E71-100のパラメータ設定
GX-Works2を使って、QJ71E71-100のパラメータ設定をおこないます。
ネットワークパラメータの設定
プロジェクトから、ネットワークパラメータ内の『Ethernet/ CC IE /MELSECNET』を開きます。
ネットワークパラメータ設定のユニット1に、下記の通り割付をおこなってください。
ネットワーク種別 | Ethernet |
先頭I/O | 0040 ※I/Oユニットの構成に合わせて変更可 |
ネットワークNo. | 1 |
グループNo. | 0 |
局番 | 1 |
モード | オンライン |
動作設定
ユニット1の設定欄から『動作設定』をクリックし、下記の通り割り付けます。
交信データコード設定 | バイナリコード交信 |
イニシャルタイミング設定 | OPEN待ちにしない(STOP中交信不可) |
IPアドレス設定 | 10進数 |
192.168.1.2 | |
送信フレーム設定 | Ethernet(V2.0) |
TCP生存確認設定 | KeepAliveを使用 |
RUN中書込を許可する | チェック |
イニシャル設定
イニシャル設定では、データ交信用タイマ値を設定します。
ネットワーク断時のタイムアウト時間はここから設定可能です。
今回は5秒としました。
TCP ULPタイマ | 10(5秒) |
TCP ゼロウィンドウタイマ | 10(5秒) |
TCP 再送タイマ | 10(5秒) |
TCP 終了タイマ | 10(5秒) |
IP 組立タイマ | 5(2.5秒) |
レスポンス監視タイマ | 設定無し(初期値) |
相手先生存確認開始間隔タイマ | 設定無し(初期値) |
相手先生存確認間隔タイマ | 設定無し(初期値) |
相手先生存確認再送回数 | 設定無し(初期値) |
今回の構成ではDNSサーバーのIPアドレスは設定不要です。
オープン設定
接続先相手とのコネクション設定をおこないます。
Modbus/TCPサーバーのポート番号は『502』で固定です。
項目 | 1 | 2 |
---|---|---|
プロトコル | TCP | TCP |
オープン方式 | Active | Active |
固定バッファ | 受信 | 送信 |
固定バッファ交信手順 | 通信プロトコル | 通信プロトコル |
ペアリングオープン | ペアにする | ペアにする |
生存確認 | 確認する | 確認する |
自局ポート番号 | 8192 | 8192 |
交信相手IPアドレス | 192.168.1.5 | 192.168.1.5 |
交信相手ポート番号 | 502 | 502 |
複数のModbus/TCP対応機器と通信する際は、ここに接続相手のコネクション設定を追加してください。
通信プロトコル支援機能の設定
通信プロトコル支援機能は、通信プロトコルの電文処理を簡略化する機能です。
Modbus/TCP通信で必要な、要求電文や応答電文をラダーで処理することなくデバイスに割り付けられます。
通信プロトコル支援機能は、ツール内の通信プロトコル支援機能からEthernetユニットを選択することで利用できます。
通信プロトコルの割り付け
プロトコル番号の直下にある『追加』をクリックして、プロトコルを追加します。
プロトコル追加
下記の内容でプロトコルを追加します。
種別 | 通信プロトコルライブラリ |
プロトコル番号 | 1 |
メーカ | 汎用プロトコル |
型式 | MODBUS/TCP |
プロトコル名 | 23: RD/WR Multi Registers |
プロトコル23: RD/WR Multi Registersは、Holding Registersの内容を読出/書込するファンクションコードです。
上記と同じ表示になったら、プロトコルの追加は完了です。
次は、各パケット(電文)のデバイスを割り付けます。
パケット設定
ここでは、先程追加したプロトコル番号1のパケットにデバイスを割り付けます。
各パケットに対して、一つひとつデイバイスを割り付けることもできますがめんどうです。
デバイス一括設定を使えば、先頭デバイスを指定するだけで自動的にデバイスを割り付けてくれます。
デバイス一括設定で、プロトコル番号1にD1000を先頭としたデバイスを割り付けます。
設定プロトコル番号範囲設定 | 1 ー 1 |
先頭のデバイス番号 | D1000 |
一括でデバイスを割り付けた際の、各デバイスにおけるパケットの内容は下記のとおりです。
デバイス | 種別 | 内容 |
---|---|---|
D1000 | 要求電文 | トランザクションID |
D1001 | 接続先モジュールID | |
D1002 | Holding Register 読出し先頭アドレス番号 | |
D1003 | 読出し点数(最大125ワード) | |
D1004 | Holding Register 書込み先頭アドレス番号 | |
D1005 | 書込み点数(最大100ワード) | |
D1006 -D1106 | 書込みデバイスデータ | |
D1107 | 応答電文 | トランザクションID ※要求電文のトランザクションIDをそのまま返信 |
D1108 | 接続元モジュールID | |
D1109 – D1235 | 読出しデバイスデータ | |
D1236 | 応答電文 (要求電文エラー時) | トランザクションID ※要求電文のトランザクションIDをそのまま返信 |
D1237 | 接続元モジュールID | |
D1238 | Modbus/TCPエラーコード |
オンライン書込み
プロトコルの設定が終わったら、PLCにプロトコル情報を書き込みます。
オンラインからユニット書込みで書込み可能です。
通信方法はラダープログラム書込みと同じなので、難しくはありません。
シーケンスプログラムの作り方
設定したプロトコルを元に、シーケンスプログラムを作成します。
動作としては、
- コネクションオープン
- 要求電文送信
- 要求電文受信
- コネクションクローズ
コネクションクローズまで2~3を繰り返すことで、常時データのやり取りが可能です。
シーケンスプログラム(ラダー)
プログラムは下記の4つに分割しています。
- 1-コネクション
- 接続先とのコネクション、クローズ処理
- 2-プロトコル
- Modbus/TCP通信における要求電文の送信と応答電文の受信処理
- 3-アラーム
- コネクション、プロトコル、クローズ処理における異常処理
- 4-ヒョウジ
- 通信状態やアラームの表示処理
プログラムをご自身の回路に導入する際は、各プログラムをひとつにまとめても問題ありません。
ただし、処理順によっては正常に動作しない可能性があるため注意が必要です。
1ーコネクション
①E71ユニットからバッファメモリを読み出す
E71ユニットからコネクション1に関するオープン情報を読み出します。
オープン完了信号はアドレスM0、オープン要求中信号はアドレスM20です。
- アドレスM0~M15は、コネクションオープン完了信号が占有しています。
- アドレスM20~M35は、コネクションオープン要求中信号が専有しています。
②相手機器とのコネクション処理
デバイスB0「通信開始入力」で相手機器とのコネクションを開始します。
今回の仕様では、アドレスD1239に『0x0000』を代入してください。
- 0x0000:GX-Works2で設定したパラメータ設定を利用する
- 0x8000:コントロールデータD1242~D1249の設定値を利用する
アドレスD0『コネクション番号』には1を指定します。
アドレスD1『連続実行プロトコル数』には1を設定してください。※通信プロトコル支援機能で1つしか設定していないため
各パラメータを定義したら、ZP.OPEN命令でコネクションを開始します。
設定データ | 内容 | セット側 | データ型 |
---|---|---|---|
“Un”/Un | E71 の先頭入出力番号(00 ~ FEH:入出力番号を 3 桁表現した場合の上位 2 桁) | ユーザ | 文字列 /BIN16 ビット |
(S1) | コネクション No.(1 ~ 16) * 1 | BIN16 ビット | |
(S2) | コントロールデータを格納するデバイスの先頭番号 | ユーザ,システム | デバイス名 |
(D1) | 命令完了にて 1 スキャン ON させる自局のビットデバイスの先頭番号。異常完了時には,(D1)+1 も ON する。 | システム | ビット |
③オープン処理の結果
ZP.OPEN命令の実行結果を取得します。
アドレスM1000はオープン実行完了パルス信号、アドレスM1001はオープン異常完了パルス信号です。
オープン命令が正常に完了したらプロトコル処理へ移ります。
オープン命令が異常終了した場合はアラームとし、オープン処理を中断してください。
④相手機器とのコネクションクローズ処理
アドレスB1「コネクションクローズ入力」、またはアドレスM121「コネクションクローズ異常総合」でコネクションを切断します。
コネクションをクローズする際は、ZP.CLOSE命令を使用してください。
設定データ | 内容 | セット側 | データ型 |
---|---|---|---|
“Un”/Un | E71 の先頭入出力番号(00 ~ FEH:入出力番号を 3 桁表現した場合の上位 2 桁) | ユーザ | 文字列 /BIN16 ビット |
(S1) | コネクション No.(1 ~ 16) * 1 | BIN16 ビット | |
(S2) | コントロールデータを格納するデバイスの先頭番号 | システム | デバイス名 |
(D1) | 命令完了にて 1 スキャン ON させる自局のビットデバイスの先頭番号。異常完了時には,(D1)+1 も ON する。 | ビット |
クローズ対象のコネクションNoは1です。
クローズ処理実行後、アドレスM1004には『クローズ命令正常完了パルス信号』、アドレスM1005には『クローズ命令異常完了パルス信号』が割り当てられます。
両信号を使って、アドレスM115『コネクションクローズ処理完了記憶』でクローズ処理終了状態を記憶してください。
アドレスM1005『クローズ命令異常完了パルス信号』がオンした場合、アラームとします。
アドレスM117『コネクションクローズ完了』には、コネクションが切断されている状態を割り当ててください。
クローズ処理を伴わない異常が発生した場合、コネクション1のオープン状態とオープン要求中からクローズ状態を判断します。
⑤クローズ処理後データリセット
コネクションのクローズが確認できたら、通信処理関係のデバイスをリセットします。
- 通信関係の確認記憶であるアドレスM111~M116
- Modbus/TCPのパケットに割り付けたアドレスD1000~D1236
以上の2点を、コネクションクローズ確認と同時にリセットします。
2-プロトコル
⑥要求電文の設定
サーバー(パソコン)へ送信するのに必要な要求電文のフォーマットを作成します。
各デバイスの意味と注意点は下記のとおりです。
デバイス | 意味 | 設定値 | 備考 |
---|---|---|---|
D1001 | サーバー側モジュールID | 1 | |
D1002 | 読出先頭レジスタNo. | 0 | Holding Register 400001 |
D1003 | 読出点数 | 125 | Holding Register 400001~400126 |
D1004 | 書込先頭レジスタNo. | 130 | Holding Register 400131 |
D1005 | 書込点数 | 100 | Holding Register 400131~400230 |
D1006 | 書込データバイト数 | 200 | D1005×2の値を代入※書込点数1点あたり2バイト |
⑦要求電文を送信
相手機器へ要求電文を送信します。
要求電文の送信頻度は約100ミリ秒に1回です。
実際の送信頻度は、プロトコル実行時間+スキャンタイムが加算されます。
かならず、アドレスT0に設定した頻度で送信されるわけではありません。
送信間隔を短くするほどスキャンタイムは伸びます。
相手機器との通信環境に合わせて、できるかぎり長めの時間を取ってください。
アドレスD1000『トランザクションID』へは、プロトコル実行ごとに1ずつ加算します。
実行した要求電文にIDをつけ、送信データと受信データの整合性を確認することが目的です。
送受信のトランザクションIDに相違があるとき、アラームとします。
要求電文の設定が終わったら、GP.ECPRTCL命令で要求電文を送信しましょう。
設定データ | 内容 | セット側 | データ型 |
---|---|---|---|
Un | E71 の先頭入出力番号(00 ~ FEH:入出力番号を 3 桁表現した場合の上位 2 桁) | ユーザ | BIN16 ビット |
n1 | コネクション No.(1 ~ 16) | BIN16 ビット デバイス名 | |
n2 | 連続実行するプロトコルの数 (1 ~ 8) | BIN16 ビット デバイス名 | |
(S) | コントロールデータを格納するデバイスの先頭番号 | ユーザ/システム | デバイス名 |
(D) | 命令完了にて 1 スキャン ON させる自局のビットデバイスの先頭番号。異常完了時には,(D)+1 も ON する。 | システム | ビット |
- コネクションNo.はZP.OPENで指定した値にあわせて、1を指定します。
- 『通信プロトコル支援機能』で作成したプロトコルが1つなので、連続実行するプロトコル数は1を指定します。
⑧プロトコルの実行結果
GP.ECPRTCL命令実行後、下記のアドレスに結果が格納されます。
- アドレスM1002:プロトコル命令送信完了パルス信号
- アドレスM1003:プロトコル実行異常終了パルス信号
アドレスM113『プロトコル実行正常終了記憶』は、次回のプロトコル命令およびクローズ処理で利用します。
アドレスM114『プロトコル実行異常終了記憶』がオンした場合は、アラームとしてください。
3-アラーム
⑨アラーム一括リセット
アナンシェータF0~F4を、アドレスB2『異常解除入力』で一括オフします。
アラーム取得にアナンシェータを使わない場合、この回路は不要です。
⑩アラーム発生処理
F0:QJ71E71-100ユニット異常
QJ71E71-100ユニットの内部エラーを取得しアラームとします。
F1:コネクションオープン処理異常
オープン処理に失敗したときアラームとします。
F2:プロトコル実行処理異常
プロトコル実行命令中の異常を取得し、アラームとします。
送信と受信のトランザクションIDが一致することを利用し、不一致状態が続くと異常であると判断します。
F3:コネクションクローズ処理異常
コネクションクローズ時の実行異常を取得し、アラームとします。
F4:要求電文異常
接続先の機器から要求電文に誤りがあると応答があった場合に、アラームにします。
要求電文が正しい場合、アドレスD1238『Mod受信応答側エラーコード(Err)』の値は0です。
受信したエラーコードの詳細内容はModbusエラーコードを参照してください。
アラームまとめ
設定したアラームをまとめます。
- M121『コネクションクローズ異常総合』
- この異常が発生したときコネクションを強制的にクローズします。
- M122『Modbus異常総合』
- QJ71E71-100でのModbus/TCP通信におけるすべての異常。
QJ71E71-100ユニット内部異常リセット
ZP.ERRCLR命令にて、QJ71E71-100ユニットの内部エラーをリセットします。
リセット完了でユニット付属のCOM.ERRランプが消灯します。
設定データ | 内容 | セット側 | データ型 |
---|---|---|---|
“Un”/Un | E71 の先頭入出力番号(00 ~ FEH:入出力番号を 3 桁表現した場合の上位 2 桁) | ユーザ | 文字列 /BIN16ビット |
(S1) | コントロールデータを格納するデバイスの先頭番号 | ユーザ,システム | デバイス名 |
(D1) | 命令完了にて 1 スキャン ON させる自局のビットデバイスの先頭番号。異常完了時には,(D1)+1 も ON する。 | システム | ビット |
4-ヒョウジ
⑫表示関係
コネクション状態や異常状態の表示をおこないます。
この回路は設計者の好みで変更してください。
動作テスト
ここからは、QJ71E71-100ユニットとパソコン間でModbus/TCP通信の動作テストをおこないます。
パソコンのIPアドレスを変更する
パソコン側のIPアドレスとサブネットマスクを変更します。
- IPアドレス
- 『192.168.1.5』
- サブネットマスク
- 『255.255.255.0』
IPアドレスクイックチェンジャーを使えば、簡単にIPアドレスを変更できるので利用してみてください。
ModRSsim2の立ち上げ
Modbus通信テストツール『ModRSsim2』をダウンロードし、実行ファイルを開きます。
ソフトウェアが開いたら、赤枠部分の
- I/O:Holding Regs(400000)
- Prot:MODBUS TCP/IP
を選択して、ソフトウェアを実行したままにしておきます。
これでパソコン側の設定は終わりです。
コネクション開始
シーケンスプログラム上のアドレスB0『通信開始入力』をオンし、コネクションを開始します。
コネクションが正常に完了すると、アドレスM111『オープン命令正常完了記憶』がオンとなります。
ModRSsim2でも、左上のメッセージ欄が『Connected』となっていればコネクション成功です。
コネクションの状態はトランザクションIDの変化でもチェックできます。
PLC側(クライアント)
パソコン側(サーバー)
PLCによる Holding Register 読出し
今回はHolding Registerの値をPLCで読み出してみます。
ModRSsim2側でHolding Register 400001~400010の値を『1~10』に変更してください。
ModRSsim2アドレス | PLCアドレス | 設定値 |
---|---|---|
400001 | D1110 | 1 |
400002 | D1111 | 2 |
400003 | D1112 | 3 |
400004 | D1113 | 4 |
400005 | D1114 | 5 |
400006 | D1115 | 6 |
400007 | D1116 | 7 |
400008 | D1117 | 8 |
400009 | D1118 | 9 |
400010 | D1119 | 10 |
ModRSsim2でのデータ変更操作は以下の手順でおこないます。
- 変更したいアドレスをダブルクリック
- ポップアップウィンドウのValueに値をセットしOKをクリック
PLC側の読出しデータを確認して、D1110~D1119にModRSsim2で設定した値が反映されていれば読出し成功です。
PLCから Holding Register 書き込み
PLCからHolding Registerへ書き込みをおこないます。
書き込み可能な領域はHolding Register 400131~400230です。
今回は400131~400140にデータを書き込んでみましょう。
ModRSsim2アドレス | PLCアドレス | 設定値 |
---|---|---|
400131 | D1007 | 11 |
400132 | D1008 | 22 |
400133 | D1009 | 33 |
400134 | D1010 | 44 |
400135 | D1011 | 55 |
400136 | D1012 | 66 |
400137 | D1013 | 77 |
400138 | D1014 | 88 |
400139 | D1015 | 99 |
400140 | D1016 | 1100 |
アドレスD1007~D1016にデータをセットしたら、ModRSsim2のHolding Registerを確認しましょう。
Holding Register 400131~400230の値が、PLCで設定したデバイスの値と同じになっていれば書き込み完了です。
コネクションクローズ
シーケンスプログラムのアドレスB1『コネクションクローズ入力』をオンにしてください。
QJ71E71-100とパソコン間の通信が終了します。
通信を再開する場合は、コネクション処理からやり直してください。
参考資料&使用ツール
今回の記事執筆にあたって参考にした資料とツールです。
参考資料
- ソフテックだより 第383号(2021年8月4日発行)技術レポート「Modbus/TCP通信 ~「通信プロトコル支援機能」の使用~」
- 三菱電機 Q対応Ethernetインタフェースユニットユーザーズマニュアル(基本編)
- SH(名)-080004-AE
使用ツール
- ModRSsim2
- IPアドレスクイックチェンジャー
コメント
コメント一覧 (2件)
現在三菱製PLC Q06UDVCPUの内蔵Ethernet通信機能で、通信プロトコル支援機能を使用し、modbusTCP通信を構築しようとしております。
PLC側がクライアント、サーバ側が(M-duino58+※arduino Mega2560を
搭載した簡易PLCのようなもの)を使用しております。
PLC側はFANUCやJAKAなど産業用ロボットとの通信をModbusTCP通信を確立しており、M-duino58+側ではPCをクライアントとしては通信を確立しております。
(M-duino58+はEthernet Sheildを搭載しており、ethernetに対応しております)
しかし、PLCとの通信がいまだ確立できておりません。
基本的なパラメータ設定はできていると思うのですが、オープン処理が確立できず、通信できない状況となっております。
そこでmodbusTCP通信において、パラメータ設定のモジュールIDを
三菱PLC側で設定しておりますが、必須なのでしょうか。
また何か知っていることがあればご教授いただきたいです。
よろしくお願い致します。
阿部 吾郎さま、コメントありがとうございます。
modbusTCPはスレーブ側が要求電文を送る際に、自身のモジュールIDをマスタへ伝えることで、通信先の装置や機器が複数ある場合でも同じプロトコルを使用することができます。
そのため他の機器とモジュールIDが重複しないよう、設定しないといけません。
今回はマスタがM-duino58+で、すでにPCがスレーブにいるため、もしかするとPCと三菱PLCのモジュールID重複がオープン処理できない理由かもしれません。
現物を知らないため断定はできませんが、三菱PLC側のモジュールIDを変更して試してみることをおすすめします。