ひさしぶりのFA記事。初挑戦でちょっとはまったのでメモしておきます。
三菱電機のシーケンサiQ-Rの構成にRJ71C24-R4を追加して、RS-485 MODBUS RTU経由で温度調節器のPV(現在値)を取得し、iQ-R CPU側で他の装置の状態を見ながら、SP(目標値)をいじってやろうという話です。
※iQ-Rに信号を集約しておけばこんなことにはならんかったんや……orz
<構成>
iQ-Rの構成は下記です。
・R35B (ベース)
・R63P (電源)
・R04CPU (CPUユニット)
・RJ71GF11-T2 (CC-Link IE Field ユニット)
・RJ71C24-R4 (RS-485 シリアルコミュニケーションユニット)
・(その他いろいろ)
また、今回使った 温度調節器の型番は以下です。
・E5DC-RX0ASM-015
温度調節器のほうは通信ができれば、E5xCシリーズもE5xDシリーズもだいたい一緒っぽいので、ぶっちゃけなんでもいいです。今回は検証用に、商社さんに在庫があるなかでいちばん安かったのを選びました。
<配線>
配線はマニュアルを見てそのとおりにします。はじめ、SDA(RDA)とSDB(RDB)をつけまちがえて、おっかしーなー、ってやってました。

図1.温度調節器 E5DC の 端子配列
(『OMRON デジタル調節計 ユーザーズマニュアル 形E5□C』P2-46およびP2-49から抜粋)

図2.温度調節器 E5DC の 配線指示
(『OMRON デジタル調節計 通信マニュアル 形E5□C』P1-4から抜粋)

図3.RJ71C24-R4 の 配線指示
(『MELSEC iQ-R シリアルコミュニケーションユニット ユーザーズマニュアル(スタートアップ編)』P22およびP47から抜粋)
あと、マニュアルだと終端抵抗は120Ωになってましたが、手持ちがないんで、100Ωでやりました。VSFの0.75[mm2]をねじねじしてつないでるからインピーダンスなんてちゃんと整合してるわけないですし、反射を低減できればいいかな、ぐらいで。9600bpsだから成立してる部分もありますが。

写真1.接続状態
ひどい繋ぎ方ですね。温度調節器側は金属皮膜抵抗100ΩをVSFと一緒に1.25sq用のY型圧着端子につっこんで圧着してます。iQ-R側はVSFをむきっぱなしで抵抗といっしょに端子台にいれました。これでも9600bpsなら動いてしまいます。検証用ならではの配線ですね。
<温度調節器側の設定>
『OMRON デジタル調節計 通信マニュアル 形E5□C』のP1-6に設定方法が書いてあるのでそのとおりに操作して、設定を以下のようにします。
・通信プロトコル「PSEL」 -> MODBUS「Mod」
・通信ユニットNo.「U-No」 -> 「1」(デフォルト)
・通信速度「bPS」 -> 「9.6」(デフォルト)
・通信パリティ「PRty」 -> 偶数「EVEN」(デフォルト)
・送信待ち時間「SdWt」 -> 「20」(デフォルト)
※MODBUSを選ぶと、データ長は8bit、ストップビットは1bitになります。
詳しくはP1-6を読みましょう。
<RJ71C24-R4側の設定(ユニットパラメータ)>
ここで設定を見落として3時間ぐらいあーだこーだと悩みました。つらい。
MELSOFT GX Works3 で構成を組んだらナビゲーションウィンドウの、
[パラメータ]-[ユニット情報]-[00x0:RJ71C24-R4]-[ユニットパラメータ]
を開きます。ここで [基本設定] だけをいじります。他は触らなくていいです。
まず、選択する交信プロトコルは「通信プロトコル」です。
これを選択することで、後述の「通信プロトコル支援機能」を使用できます。
※ここで「無手順プロトコル」を選択してもいいですが、
これを選ぶと自前でMODBUSパケット処理のラダーを
書かないといけません。
ただ、「通信プロトコル支援機能」は設定を反映する際に
CPUをSTOP状態にしないといけないので、CPUをRUNさせたまま
オンライン書込で細かな調整をしていきたいときは
こちらを選択することになります。大変そう。
次に「伝送設定」です。ここは温度調節器の設定とあわせるだけなので、以下になります。
・「動作設定」 -> 「独立」
・「データビット」 -> 「8」
・「パリティビット」 -> 「あり」
・「奇数/偶数パリティ」 -> 「偶数」
・「ストップビット」 -> 「1」
・「サムチェックコード」 -> 「なし」
・「RUN中書込み」 -> 「許可」
・「設定変更」 -> 「許可」
あと、ここを忘れてうまくいかず悩んだのが「通信制御設定」です。
・「エコーバック許可・禁止指定」 -> 「エコーバック禁止」
今回は半二重の配線なので、これを禁止にしておかないと、RJ71C24-R4がRS-485バスに送信(SD)したものをそのままRJ71C24-R4が受信(RD)してそちらを正規のレスポンスとして処理してしまい、温度調節器が送信待ち時間で設定した「20」(ミリ秒)後に返すレスポンスを無視してしまいます。
デフォルトでエコーバック禁止だと思いこんでたのですが、RJ71C24-R4は全二重の構成がとれることを思い出して、マニュアルでパラメータの説明をじっくり読み返したら見つけました。ぐぬぬ。
※詳細は『MELSEC iQ-R シリアルコミュニケーションユニット ユーザーズマニュアル(応用編)』のP430「25 RS-422/485インタフェースのエコーバック許可/禁止指定」を読んでください。
※MODBUS RTUのときはコマンド先頭2バイトとレスポンス先頭2バイトがだいたい同じになることが多いので、RS-485半二重でMODBUS RTUだと、この設定ないとけっこう辛いです。

図4.MELSOFT GX Works3 の RJ71C24-R4 ユニットパラメータ設定画面
ユニットパラメータ設定は以上です。他のパラメータといっしょにシーケンサ側に書き込んでしまいましょう。
念のため、ユニットパラメータを書き込んだ後は、電源を切ってから入れ直すことにしています。(Q-CPU時代に、通信系のユニットパラメータがCPUを電源から再起動しないと反映されないことを知らずに半日ぐらい悩んだ後遺症です。)
<RJ71C24-R4側の設定(通信プロトコル支援機能)>
シーケンサ側にパラメータを書き込んだら、次は「通信プロトコル支援機能」の設定をします。MELSOFT GX Works3 のメニューバーから、
[ツール]-[通信プロトコル支援機能]
を開きます。ユニットタイプの選択ポップアップが表示されるので、「シリアルコミュニケーションユニット」を選択し、OKします。

図5.MELSOFT 通信プロトコル支援機能 の画面
で、この「通信プロトコル支援機能」の設定については
『MELSEC iQ-R シリアルコミュニケーションユニット ユーザーズマニュアル(応用編)』の
P26~51「2 通信プロトコルによるデータ交信」に書いてありますが、あんまりMODBUS RTUのことを意識した記述ではないので、ざっくり手順を書いておきます。
1.ファイルの新規作成
メニューバーで [ファイル]-[新規作成] します。
※昔に似たようなものをつくったのがあれば、
そのファイルをコピペしていじったほうがはやいので、
[ファイル]-[開く] のほうがいいです。
2.プロトコルの追加
メニューバーの [編集]-[プロトコル追加] を開きます。
ポップアップが出るので、「種別」を「新規追加」に変更してOKします。
こんな画面になります。

図5.MELSOFT 通信プロトコル支援機能 新規プロトコル追加後
3.プロトコルの詳細設定
メニューバーの [編集]-[プロトコルの詳細設定] を開きます。
「接続機器情報」のところは自分がわかりやすいようにしておけばなんでもいいです。
ぶっちゃけ空白でも問題ないです。
「プロトコル設定情報」のところは「プロトコル名」にわかりやすい名前を入れ、
「通信タイプ」は「送信&受信」にします。
「受信設定」ですが、「クリア」を「する」にします。
「受信待ち時間」は通信頻度によるので、それにあわせてください。
今回は1秒毎に1台の温度調節器とやりとりするので、待ちは500ミリ秒としました。
これを超えるとユニットエラーになるので、異常系の処理ができます。
※ここで無限待ちすると後述のラダーで通信命令して、
受信がなかったときに無限待ちになって、
同じ通信命令を発効するためにすごく面倒なことをしなきゃいけないので、
さっさとエラーになってもらうのが吉です。
※ずっと待ってるわけではないので、後述のラダー通信命令で応答があったら
次の通信を発効しちゃってもいいです。ここは、
どれだけレスポンスがなかったらエラーにしちゃう?
という設定です。
「送信設定」ですが、「送信監視時間」だけ待ちを500ミリ秒にします。
これも「受信待ち時間」と同じ話になります。
とりあえずこんな感じにしておきます。

図6.MELSOFT 通信プロトコル支援機能 プロトコル詳細設定画面
4.パケットの設定(PV読出)
続いてパケットの設定ですが、ここはメニューバーからいけないので、
下の画面の青丸の部分をクリックして、パケット設定画面を開きます。

図7.MELSOFT 通信プロトコル支援機能 パケット設定画面を開くには
で、E5DC の MODBUS RTU 通信手順 のデータフォーマットにあわせて、送信側と受信側のパケットをそれぞれ設定します。
パケットの構成要素についてのリファレンスは
『MELSEC iQ-R シリアルコミュニケーションユニット ユーザーズマニュアル(応用編)』の
P35~47「2.3 パケット」に書いてあるので、
それと E5DC の通信マニュアルの以下のあたりをいったりきたりして設定していきます。

図8.温度調節器 E5DC の MODBUS-RTU データフォーマット の一部
(『OMRON デジタル調節計 通信マニュアル 形E5□C』P4-1~P4-16から抜粋)
PV読出用の送受信パケット設定は以下のような形になります。

図9.E5DC の MODBUS RTU 通信手順 データフォーマットにあわせた、PV読出のための、送信と受信のパケット設定
今回は対象の温度調節器が1台だけなので、SlaveAddressを
固定で「1」にしちゃってますが、複数台ある場合は
ここを変数にしておかなきゃいけませんね。
各構成要素は扱いやすいように1バイトで細切れにしてます。
で、iQ-Rのデータレジスタに1つずつ割り当てるという脳筋仕草です。
シンプルでわかりやすいですね!ね!
データレジスタは2バイトなんで、もったいない気持ちもありますが、
1バイトだと GX Works3 のデバイスモニタでデバッグしやすいんですよね。
CRC-16は「構成要素種別」を「誤りチェックコード」にすると、
「16bitCRC(MODBUS仕様)」という選択項目が出てくるので、それを選ぶだけです。
※CRC-16手実装がめんどいから無手順プロトコル+ラダーじゃなくて
通信プロトコル支援機能を選んでる部分が大きいです。
5.パケットの設定(SP書込)
PV読出と同じようにSP書込のプロトコルを2.~4.の手順でやるだけです。

図10.MELSOFT 通信プロトコル支援機能 PV読出とSP書込の設定を終えた状態
6.シリアルコミュニケーションユニットへの設定の書き込み
設定の作成ができたら、シリアルコミュニケーションユニットへ
設定を書き込みます。CPUがSTOP状態になっていないと書き込みできません。
あと、書き込み経路は MELSOFT GX Works3 の接続先設定が
支援機能の起動時にコピーされてそのまま使われます。
CPUをSTOP状態にして、
メニューバーで [オンライン]-[ユニット書込] します。
書き込みが完了したら、CPUをRUNにします。
これで設定したプロトコルをラダーから使用できるようになりました。
<ラダーで設定したプロトコルを指定して通信させる>
ラダーから設定したプロトコルを指定して通信させるには、G.CPRTCL命令を使うだけです。
G.CPTRCL命令の詳細は
『MELSEC iQ-R プログラミングマニュアル(ユニット専用命令編)』の
「9.2 通信プロトコル支援機能の登録プロトコル実行」の項にあります。
※別マニュアルかよ、そういうとこだぞ、MELSEC。
手抜きラダーだとこういう感じです。1秒毎にG.CPRTCL命令が実行されるようになってるだけです。

図11.手抜きラダー
G.CPRTCL命令の引数ですが、
・1番目:ユニット先頭番号、今回のRJ71C24-R4は「0020」なので「K2」
・2番目:使用チャンネル、今回はRJ71C24-R4のch1の端子台に配線してるので「K1」
・3番目:使用プロトコルの数、今回はPV読出とSP書込の2つなので「K2」
・4番目:コントロールデータ、指定データレジスタ+2~9のアドレスに実行するプロトコル番号(「通信プロトコル支援機能」で追加したプロトコルの番号)を入れておく。D3000を指定したので、D3002に「K1」、D3003に「K3」をMOVして、PV読出(プロトコル番号1)とSP書込(プロトコル番号2)を実行するようにしておく。
・5番目:実行結果、今回は使わないので、適当にM3000に放り込む。
という感じになってます。
このラダーをCPUに書き込んで、RUNさせてM1000をONにすると、通信プロトコル支援機能のパケット設定で指定したデータレジスタにMODBUS RTUでおしゃべりした温度調節器のPVが入ってきたり、SPが設定されたりします。
まとめ
普段は4-20mAばっかり相手にしてるんで、通信ものは本当に苦手で、話を聞いたときに「げぇっ!RS-485 MODBUS RTU!(ジャーンジャーン)」ってなりましたけど、まあ、こうしてやり方がわかったので、何かあっても多少お金はかかるけど対応できるようになりました。
でも、使わないで済むなら使わずに済ませたいですね、メーカー非依存通信。CC-Link IE Field Network が楽すぎていかんです。。。