ModbusとはアメリカのModicon Inc. AEG Schneider Automation International S.A.S.)により開発されたPLC用のネットワークです。通信仕様は一般に公開されており、FA制御では、主にRS232、RS422、485通信で使われることがおおいです。
簡単にいうとModbusで定義した通信電文ルールに沿って、シリアル通信をするということです。
シリアル通信で行う場合、Modbus RTUといい、イーサネット通信で行う場合はModbus TCPといいますので、今回はシリアル通信 RTUについて通信をしてみましょう
Modbus RTU通信の概要
通信電文内容は、局番号、データ、CRC(誤りチェック)で構成されます。
・局番号とはマスター(送信元局)からスレーブ(受信応答する子機)で構成されるときの子機の局番号となります。
・データは、ファンクションコード(読出や書込指示)とどのデータを読み出すか書き込みするかの番号やその範囲を指定します
・CRCはこれらの伝送伝文の誤りチェックの演算です。CRC演算は何種類かありますが、ここで使うのはCRC-16となります。以下、WEBより引用
【CRCチェックサム】 アドレス~データ間の16ビットCRC・・・・・X16+X12+X5+1 RTUモードのメッセージにはCRC方式に基づいたエラーチェックが含まれます。 CRCチェックの場合、メッセージ全体の内容をチェックします。 CRC計算はまず、全て1の16ビットのレジスタをプレロードします。 次に、メッセージの中の連続した8ビットのバイトを、現在のレジスタの中身に適用していきます。 CRCを生成するときには、各キャラクタのうち8ビットだけを使用します。スタート・ストップ・パリティビットは CRCには適用されません。 CRCを生成する途中、各8ビットキャラクタはレジスタの中身とエクスクルーシブORされます。 さらにその結果を最下位の方向にシフトし、最上位桁には0を入れます。最下位桁を取り出して検査します。 もし、最下位が1の場合はさらに、レジスタは既設の固定値(0xA001)でエクスクルーシブORされます。 もし、最下位が0の場合、エクスクルーシブORは起こりません。 この過程を8回シフトするまで繰り返します。最後(8回目)のシフトの後、次の8ビットのバイトについて、 レジスタの現在値でエクスクルーシブORします。そして前述のように、この過程をさらに8回繰り返します。 メッセージ全てのバイトについて適用した後、レジスタの最後の中身がCRC値となります。 メッセージにCRCを付加するときには、下位バイトが先に付加され、その後に上位バイトが続きます
ということですが、これを演算するのかと思いましたが、三菱やキーエンスでは通信支援する機能があるので簡単に通信できるようです
三菱シリアル通信ユニットでModbus通信する場合
テスト用で作成してみます。
シリアル通信の設定は通信プロトコル支援機能を使うと簡単に設定できます。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-4.png)
テストなので、1文字とCRC演算だけで設定します。
今回は相手先がいないので送信のみ設定してPLCに書き込みします
![](https://gorism1010.com/wp-content/uploads/2022/08/image-5.png)
通信ユニットのコメントもサンプルコメント流用すれば簡単にできます。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-6.png)
送信プログラムに必要なプログラムを書いて実行した結果をモニタします。通信内容は回線トレース機能を使うとログが残せるので便利ですね
![](https://gorism1010.com/wp-content/uploads/2022/08/image-7.png)
今回は、CRCの値を判断したかったので、1Wordだけデータを送って確認しました。
CRCの値は7E94です。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-8.png)
キーエンスでModbus通信する場合
ユニットエディオンでシリアル通信ユニットを追加します。
エディタでProtcolStudioを使うと設定します。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-9.png)
ユニットを設定したら、ツールから拡張ユニット設定でProtcolStudioを起動します。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-10.png)
外部機器の設定で汎用のタブを選択するとModbusがあります。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-11.png)
ここでコマンドを設定します。
サイクリックで設定すれば、常時監視するようになります。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-12.png)
ProtcolStudioの関連のデバイスはデバイス一覧で確認できます。
これを参照してプログラムを書けばすぐに通信できます。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-13.png)
GOTでModbus通信
接続方法とデバイスの設定
三菱のタッチパネルGOTや他メーカーでも標準でModbus通信ができます。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-14.png)
通信設定をしたら、局番号・・とアドレスを設定します。
デバイスの設定は下記ののようにします
![](https://gorism1010.com/wp-content/uploads/2022/08/image-15.png)
例40002のデバイスの場合、先頭の4はデバイスの読出ファンクションコードで0002がその読出しするデータのある場所になります
デバイス転送機能でPLCにデータ転送する場合
下記の場合は0002(PV値)を局番号5の子機から、4(読出)して、PLCにデバイス転送しています。単純にタッチパネルで通信を意識せずにデバイスの読出しをすることができたり、PLCにデバイス転送することでPLCプログラミングの負担を減らすこともできます。
(こういうやり方はお勧めしませんが・・TP系イーサネットのトラブルで装置停止となるのはおすすめできないです)
![](https://gorism1010.com/wp-content/uploads/2022/08/image-16.png)
CRC演算処理をプログラムで行う場合
CRCの誤りチェックは、自分で計算する必要があります。WEB検索すると難しそうなのでPLCプログラムでCRC演算してみます。
CRC演算を検証するために・・EXCELで演算を確認します。
www.simplymodbus.caのWEBサイトで、CRC-16をEXCELで計算できるのがダウンロードできました。
でもダウンロードできます
![](https://gorism1010.com/wp-content/uploads/2022/08/image-17.png)
PLCでプログラムしてみました
EXCEL演算と【CRCチェックサム】を参考にプログラムを作成して、3時間・・
こんなのできました。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-18.png)
EXCELとPLC通信結果から、計算があっていることを確認して満足!
まとめ
Modbus RTUは,特に難しく演算プログラムを作成しなくても十分に使えます。
ただし、Modbusの仕様を理解しておかないといけません。(当たり前ですが・・)
今回はCRC-16を自作プログラムで演算してみることに時間がかかってしまいましたが、あまり必要ないでしょうね。
参考ですが、Modbus TCPもキーエンスだとKV-XLE02使うと設定だけで簡単に使えます。
![](https://gorism1010.com/wp-content/uploads/2022/08/image-19.png)
iQーRとかでも簡単に設定できそうです。汎用Ethernet通信ってどんどん簡単接続になりますね