ModbusTCPについて
ModbusTCPて、FA業界のいろんな産業用ロボットと通信をするために使用される代表的な通信方法の一つですよね。だけど、あまりその中身を認知している人は少なくて、すこし残念なところがあります。そんな難しくないことと、割りと結構使うので、まとめることにしました。
ModbusTCPは、TCP/IP上でModbus通信を行うためのプロトコルです。送信者側(マスタと言ったりもします)がSocketで言うクライアント、受信者側(スレーブと言ったりもします)が、サーバという立ち位置で通信を行います。ModbusTCPには、専用のデータフォーマットがあり、適したスキーマでデータを作成し、送信してあげないと、レジスタの読み書きができません。
ModbusTCPの電文のデータスキーマ ヘッダ部
ModbusTCPのデータスキーマ ヘッダ部を下記に示します。ファンクションコードやデータスキーマ部以外のところは一回作れば、おおよそ同じで行けると思います。また、複数の送信者(マスタ)がいる場合でも、ユニットIDを用いることで、識別をすることができます。
個人的には、このフォーマットの中で意外と重要だなて思うのが…。トランザクションIDです。
ModbusTCPの通信て、実際はスレーブの参照テーブルが複数ある場合が多いんですけど、それを一気にみたいな!と思い…ブロックを超えたアドレス範囲でデータ操作を要求。しかし、これをやっても実は上手く行かないんですよね。ここが少しModbusTCPのめんどくさいところ。何を言っているかというと・・・
例:
ロボット状態(1000-1010): 状態文字列、状態詳細、エラーコード…
ロボット座標(1020-1030): X,Y,Z,θ…
空き (1030-1039)
ロボットI/F (1040-1045) : DI0,DI1,…
例のように、ロボット状態〜ロボットI/Fの状態を一気に取りたいな!て思うのが人情ですが、実はそれはできない産ロボたちが多いです(エラーやデータが返ってこないなど)。よって、ロボット状態(1000-1010)で一つの電文。ロボット座標(1020-1030)で一つの電文。…と、トランザクションを分けて送受信をしないと行けないことが多いです。
そんなときに、役に立つのがトランザクションコード、返ってくる電文のトランザクションコードを識別子として持っとけば、なんのブロックコードが返ってきたか一目瞭然です!送信時の順番の前後入れ替えなどは、TCPでは起こりえませんが、受信者側(スレーブ)が受信してから、内部処理を通して、送信されるため、送信者(マスタ)側が覚えている順番とは、全然違う順番で来ることが多いので、このトランザクションコードを使用することをオススメします。
ファンクションコード
よく使うファンクションコードを載せます!
他のもあるけど、あまり使いません。一回で複数書き込み[10]とか、指定した範囲のビットを指定した範囲に書き込む[0F]とか、対応していない産ロボとかありますし、前述しましたブロック問題もあり、個人的にはあまり使わないです。
データスキーム
その他 気をつけること
産ロボの場合、だいたいModbusTCPの有効無効設定とか、参照テーブルの設定とかコンフィグ画面でやる下準備があります。メーカの取説等を読んでいただき適切な方法で初期設定をしていただくのが良いです。
ModbusTCPはかんたんなプロトコルで、一度電文のヘッダを作ってしまえばいろんなModbusTCP対応機器との通信ができるようになります!
あと、データスキマに書き込むデータのエンディアンには気をつけてくださいね。
ビックエンディアン、リトルエンディアンありますからね!
お試しあれ!