「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
Modbus通信に対応した機器は様々な物があり、異なるメーカーの機器間で通信を行う手段の一つとなっています。
今回は、三菱電機製PLC(Qシリーズ)と横河電機製ペーパーレスレコーダ「GX20」をModbus/TCPで接続し、GX20に取り込んでいる温度データなどをPLCで取得する事例をご紹介します。
開発当初はシリアル通信を用いていた「Modbus」のプロトコル仕様を踏襲し、Ethernet上でTCP/IPをベースとした通信を行えるようにしたのが「Modbus/TCP」です。
詳細については、以前のソフテックだよりでご紹介している内容等をご覧ください。
図1. システム構成
一般的なLANで使用するスイッチングHUB、LANケーブルを使用して接続することができます。
設置環境に応じた機器の選定は必要ですが、特定のメーカーの特殊な通信機器を使用する必要がありませんので、故障時の対応も行いやすいと思います。
また、同一ネットワーク上(同じHUB)に、Modbus/TCP機器ではない、PLCのEthernetユニットや監視システム等のパソコンも接続することが可能です。
QシリーズCPUと、Modbus/TCPユニット「QJ71MT91」を使用します。
「QJ71MT91」を使用することで、通信プログラムをラダー等で実装することなくデータの送受信を行うことができます。
なお、「QJ71MT91」を使用する以外に、Ethernetユニット「QJ71E71-100」と通信プロトコル支援機能を組み合わせてModbus/TCP通信を行う方法もあります。
以下、ご参考までにそれぞれの方法のメリット/デメリットについてまとめます。
使用機器/ソフト | メリット | デメリット |
---|---|---|
Modbus/TCPユニット | ・ラダープログラムの知識が無くてもパラメータ設定のみで通信が可能。 ・Modbus専用のため不要な設定が無くわかりやすい。 |
・ユニット追加が必要 (定価:\200,000.-) |
Ethernetユニット (通信プロトコル支援機能) |
・すでにEthernetユニットがあればハード追加不要。 ・Modbus以外の通信方式への変更も可能。 |
・Modbus以外にも対応するため、設定がやや煩雑。 ・ユニバーサルモデルQCPUでないと通信速度が低下する場合がある。 |
Ethernetユニット (ラダープログラム) |
・プロトコルに囚われない柔軟な対応ができる。 | ・処理の流れが見えづらく、改造時に手間がかかる。 ・エラー処理なども全て考慮したソフト対応が必要。 |
表1. 使用機器/ソフトの比較
Ethernetポートを備えたGXシリーズ(GX20/GX10)やGPシリーズ(GP20/GP10)を使用します。
GX/GPシリーズでは、拡張ユニット(最大6台)を数珠つなぎで接続することにより点数を増加させることができます。
図2. データの流れ
データの流れは、GX20〜Modbus/TCPユニット間とModbus/TCPユニット〜CPUユニット間に分かれており、それぞれの設定(またはラダー)が必要となります。
GX60からのデータはGX20に取り込まれますので、GX60との通信は意識する必要がありません。
なお、逆にPLCからレコーダへの書き込みを行うこともできますが、今回は読み出しに絞ってご紹介しています。
GX20内には様々なデータや設定値があり、その中に測定データが格納される「入出力チャネル」があります。
入出力チャネルは、同じ測定データを「符号付き32ビット整数型」「32ビット浮動小数点型」「符号付き16ビット整数型」の3種類の形式で表現し、外部からはそれぞれに対応した異なるアドレスのレジスタメモリを読み出すことで任意の形式のデータを取得できます。
今回は、最も一般的な「符号付き16ビット整数型」(データ範囲:-32768〜32767)を使用します。
例として、測定値が“12.3℃”のとき、実際のデータは“123”となります。
ユニット内部にあるメモリで、ユニットの設定や状態が格納されています。
バッファメモリは0h〜5FFFh(24576点)が存在し、その中の1000h〜1FFFh(4096点)に、Modbus/TCPで受信したデータを格納することができます。
ラダープログラムでの使用や、監視システムが参照するメモリです。
今回取り込むのは、温度等のワードデータですので、データレジスタ(D)やファイルレジスタ(ZR)、リンクレジスタ(W)などのワードデバイスを使用します。
「GX Works2」を使用したPLC側の設定例に絞って記載します。
GX20側の設定については、横河電機Webサイトにて公開されている下記資料などをご覧ください。
・GX20とMELSEC-QシリーズとのModbus/TCPを利用した通信(GX Developer)
・GX20とMELSEC-QシリーズとのModbus/TCPを利用した通信(GX Works2)
(1) 初めにユニットを追加します。「インテリジェント機能ユニット」上で右クリックし、「新規ユニット追加」を選択します。
(2) ユニットの種類やスロット位置などを設定し、OKを押します。
<補足>
サブネットマスクは、255.255.255.0 となります。
サブネットマスクを変更する場合は、「基本パラメータ(ルータ情報)」から下記の設定を行います。
本来は名前のとおりルータを経由して異なるネットワーク上の機器と通信する目的の設定ですので、トラブルを避けるためにもサブネットマスクはデフォルトでの使用をお勧めします。
GX20からModbus/TCPユニットにデータを取り込む設定を行います。
(1)「自動交信パラメータ」をダブルクリックします。
(2) GX20のIPアドレスと通信先のレジスタを必要に応じて設定します。(最大64種類設定可能)
・対象局IPアドレス
・対象MODBUSデバイス種別
・先頭バッファメモリアドレス
・対象MODBUSデバイス先頭番号/アクセス点数
「対象MODBUSデバイス先頭番号」と「アクセス点数」について補足します。
実際に設定してみて、理解に時間がかかったのがこの部分です。
(GX20の取扱説明書でもきちんと記載されていることではあるのですが…)
<GX20本体の入力データ>
GX20本体の符号付き16ビット整数型のデータは、レジスタアドレス302001から格納されています。
これをそのまま指定するのは間違いで、「302001−300001=2000」を指定します。
次に点数ですが、仮にGX20本体に20点の温度が取り込まれている場合、そのままアクセス点数を“20”とする…とこれも間違いです。
GX20ではモジュール(測温抵抗体入力や電流入力などの配線が行われる機器。三菱PLCの「入出力ユニット」に相当)単位でレジスタが決められており、1モジュールあたりの点数は「50点固定」となっています。
具体的には、1つ目のモジュールのデータは「302001〜302050」、2つ目のモジュールのデータは「302051〜302100」の範囲となっており、それぞれ先頭の10点にデータが格納されているため、以下のいずれかの指定をする必要があります。
(a) 先頭番号2000/アクセス点数60 … 302001〜302060の範囲を読み出す。
(モジュール1データ:10点 + 不要データ:40点 + モジュール2データ:10点)
(b) 先頭番号2000/アクセス点数10 と 先頭番号2050/アクセス点数10の2種類の設定を行う。
<拡張ユニットの入力データ>
拡張ユニットの符号付き16ビット整数型のデータは、312001から格納されています。
残念なことに、拡張ユニットについては「連続読み出し領域」が用意されていません。
そのため、前述したとおり無駄な部分を含めて連続で読み出すか、設定を分けるかの2択となります。
なお、連続で読み出す場合は、Modbusの仕様により入力レジスタは一度に125点しか読み出せませんのでご注意ください。
先頭番号12000/アクセス点数110とすることで、無駄は含みますがモジュール3つ分までは一度に読み出すことが可能です。
(ちなみに私が実際に設定した際には、無駄部分は省きたかったため10点ずつ複数の設定に分けました)
Modbus/TCPユニットからCPUユニットにデータを取り込む設定を行います。
(1) 「自動リフレッシュ」をダブルクリックします。
(2) 「自動交信機能バッファ入力エリア」の設定値欄をダブルクリックします。
(3) 各設定値を入力し、OKを押します。
・デバイス指定
・オフセット値
・転送ワード数
自動リフレッシュの設定に代えて、ラダープログラムでModbus/TCPユニット→CPUユニットの転送を行うこともできます。
自動リフレッシュでは一括の設定しかできませんので、転送先のCPUユニットデバイスを分けたいとき、Modbus/TCPユニットのバッファメモリに取り込んだ無駄部分を省きたい場合は、ラダープログラムでの転送が必要となります。
図3. ラダーによる転送例
転送元に指定している「U2\G4096」は「バッファメモリアクセスデバイス」です。
“U”の後の数字はユニットの先頭アドレスの下1桁を省略したものを指定します。
(Modbus/TCPユニットの先頭アドレスがX/Y20の場合は2となる)
“G”の後の数字はバッファメモリアドレスを10進表現したものです。
(バッファメモリ1000hのデータを読み出す場合は4096を指定する)
Modbus/TCPユニットを含むインテリジェント機能ユニット全般の機能です。
ユニットが持っている情報はXデバイス・Yデバイス・バッファメモリがあり、デバイス一括モニタでも内容を確認することができますが、種類が分かれていますのでモニタも別々に開く必要があります。
「インテリジェント機能ユニットモニタ」を使用することですべての情報を一括で見ることができます。
(1) モニタを行いたいユニットの名称のところで右クリックし「インテリジェント機能ユニットモニタへ登録」を選択します。
(2) モニタウィンドウが開きますので、ウィンドウ上で右クリックし「ウォッチ開始」を選択すると現在状態をモニタすることができます。
Modbus/TCPユニットのインテリジェント機能ユニットモニタから、PINGテストを簡単に行うことができます。
(1) モニタを一番下までスクロールし、「PINGテスト」の項目を表示します。
(2) 対象のIPアドレスを入力し、「PINGテスト実行要求」で“PINGテスト実行要求中”を選択します。
(3) 結果を確認します。
(4) 「PINGテスト実行要求」を“要求無し”に戻します。
通信を行おうとする場合、伝文の作成、受信データの変換や異常処理などを考慮したプログラムが必要となりますが、Modbus/TCPユニットを使うことでほぼプログラムレスで通信を行うことができることがおわかりいただけたと思います。
先にも述べたとおりレコーダから読み出すレジスタの理解には手間取ってしまいましたが、純粋なModbus/TCPの部分は特に難しく感じたところはありませんでした。
また、個人的には対応の過程で「インテリジェント機能ユニットモニタ」の存在を知ったことも収穫でした。
今回の知識を活かして、今後、お客様へのより良い対応・提案をしていきたいと考えております。
(S.T.)
関連ページへのリンク
関連するソフテックだより