シーケンサでMODBUS通信をしよう

FA

MODBUS_RTU の動きと使い方を一緒に見て行きましょう。

どうも!ズブです。今回は シーケンサでMODBUS通信をしよう

FX5U と Works3 を参考として行きますが、MODBUSの動きが記事のメインです。

構成

手始めに、オムロンさん の E5C□ をターゲットにして通信を通してみましょう。

2本 線を繋いで
号機ボーレート を合わせて
終端抵抗 を入れるだけ。


あっという間に接続完了です。

基本知識はこちらを参照↓
MODBUS RTU通信の基礎知識

設定

内蔵機能なので、超簡単

↓ここで繋ぎたい機器との通信設定を合わせるだけ

データ長は 8bit決め打ち です。

応用命令

FX でのMODBUSは、〔 ADPRW 〕命令を使えば楽ちんでしたね。

MODBUSを使うよ!って宣言して、局番R/W をコントロールするだけです。

プログラム

構成が終わったところで、プログラムを考えて行きましょう。

読込み

3号機H2000 アドレスから、1個読み出すよ!って意味ですね。

無事、赤囲みの部分で数値が取れました。

見難いようなら、三菱電機さんのサンプル通りに作ってみて下さい。

書込み

ファンクションコードを書き込みの『 H6 』に変えるのですね。

これで、3号機 H2103 アドレスに、1個書き込むよ!って意味になります。

〔 ADPRW 〕以外の所は、読み込みと同じす。

データ形式

通信する機器によって、引っ張ってくるデータが違います。

そんな時は、データを捻ってあげましょう。

引っ張ったデータがまちまちなのは、機器によりデータ格納の仕様が違う為なのですね。

例えば、『 H12345678 』のデータは、機器により下のどれかの形式で格納されています。

左側の英語は、そのデータ格納形式の呼び名です。

ちなみに Even というのは、偶数アドレス のことですから、
『 偶数アドレスが上位で、バイトが順並び 』とかそういう種類分けとなっています。
※コンピュータの基底アドレスは、偶数アドレスとしている為

これは、機器の販売対象がパソコン系だったり、シーケンサ系だったりで色々変わってくるもので、通信でやり取りを考える場合、必ず遭遇してくる問題です。

ちなみにシーケンサの場合は、

このように格納されていますから、

偶数アドレスは下位側
バイト内の並びは上位が上の桁ですから、

Even-Low & BigEndian である事が分かります。

ADPRWの動き

通信が出来るようになったところで ADPRWのフラグ 命令処理タイムチャート を重ねてみましょう。

ADPRW の動きを文字で書くと、

M100の駆動信号が入った時点で、ADPRWの実行が 順番待ち になり、
ADPRW の実行が始まると、M0 ON
成功、失敗を受けて M1 なり M2 なりが立って、ルーチン全てを落として終了。

MODBUSプロトコル を文字で書くと、

〔 号機、ファンクション、データ、CRC 〕 をパッケージにして 伝文を送り
暫く待って正しい返事がなければ、もう一度伝文を送る
何回か繰り返して それでもダメなら、次に行く

ADPRW命令ってのは、この 一連のフローを処理 してくれる命令なのですね。
この間 M0 はずっと ON ですよ。

次項からは、そのフローの動きを注意して見て行きましょう。

使ってみよう

いくつかのケースを確認していきましょう。

2台接続

プログラムを少し変更して、2台目をぶら下げてみます。

1号機としてぶら下げました。

設定や打ち損じが無ければ通信は通ります。

複数台接続

さらに複数台ある時はどうなるのでしょうね?

同じように、4台ぶら下げて動作を確認してみます。

ADPRW命令パラメータの 通信中フラグ を監視してみましょう。

ボーレート 57600bps で4台ぶら下げて、1ワードずつ取り込んでいます。
ざっと見たところ、1周期 70~80ms くらいでしょうか?

ちなみにM10だけは、種類の違う機器です。
内部処理が早いのか、実行時間が短いですね。

処理速度に違いがあっても、綺麗に 順番待ちしながら実行 されて行ってるのが分かります。
順番を飛ばしたりという事はありませんね。

1台解列

運転中に機器との通信が止まった場合はどうなるのでしょうね?

M10の機器を解列してみます。

グラフに現れなくなったので、視認し易いよう 表示時間を伸ばして います。
1周期、17~18秒くらいでしょうか?

M10がずっとONなのは、相手スレーブからの応答を待っている為なのですね。

これだと面白くないので、

失敗フラグを使って2回目のADPRW命令に入らないようにする か、
タイムアウト時間を短く設定 します。

失敗フラグを使うなら命令を切れば良いだけなので、タイムアウトを使う場合 を見てみましょう。

設定箇所はココ

スレーブ対応タイムアウトリトライ回数 を掛けると、

3000ms × 5回 = 15000ms

先程のグラフ周期と似通った数値になっていますね。

では、タイムアウトとリトライ回数を変更してみます。

時間軸は先ほどと同じなので、周期が早くなっている事が分かります。

アラームタイムアウト は、用途に応じて合わせたり使い分けたりすると良いですね。

割り込み

順番に入っていない命令はどうなるのでしょうね?

駆動信号やデータ書き換えを想定して、1秒に1ショット割り込みを入れてみます。

赤枠M40の欄が割り込み箇所です。
常時通信している所に割り込んでも取りこぼしはありませんね。

タイムスタンプから、大体1秒置きに順番待ちで割り込んでいる事が分かります。

連続データの読出し

複数データを抜いたらどうなるのでしょうね?

M0からデータを100個抜いてみます。

通信時間が太っちょになってしまいましたが、我慢出来ない程ではありません。

欲しいデータが近所にあるのなら、個別に幾つも抜くよりもガバッと抜いてしまった方が効率的なのですね。

運転中フラグは要るの?

M0、M10と分けていたのは、データを視覚的にみてもらう為です。
これらはADPRW命令が実行された時の内部フラグです。

なので、今回のようにデータフローを監視したいのでなければ、M0使いまわしで十分なのですね。

赤枠の箇所だけチョコっと変えれば、使いまわせるのですね。

リアルタイムモニタ機能

記事の途中に出てきたリアルタイムモニタ機能ですが、GX Log Viewer です。

ここで使ってる分は本当に簡単なので、特に説明はしません。

本格的な使用は取説一冊分ありますから、そちらをご参考にして下さい。

まとめ


プロトコルとかレスポンスとかCRCとか一生懸命調べたけど、

結局〔 ADPRW 〕が全部やってくれる のです。

色々ぶら下げてMODBUS通信したくなってきたでしょ(笑)

合わせて読みたい

GOTタッチパネルでMODBUS通信をしてみよう
シーケンサでシリアル通信をしよう

シーケンサでロギングをしてみよう

参考
Orientalmotor