シーケンサでシリアル通信をしよう~中編~

シーケンサ

以前、シリアル通信を無手順で通すところまでをご紹介しました。
シーケンサでシリアル通信をしよう~前編~

 

引き続き QJ71C24N-R2 を使用して、固定長通信を念頭に通信時のデータの動きを一緒に見ていきましょう。

 

どうも! ずぶ です。今回は  シーケンサでシリアル通信をしてみよう~中編~

通信の概要

プログラム と 概要図 から、大まかな流れを把握しておきましょう。

送信

受信

概要図

概要図では2台ですが、実際は CH1 から CH2 に送っています。
抽出なので、CH指定等の記述は他の箇所で行っています。

補足を入れると

<送信>

OUTPUT命令 で CPUのレジスタ から、C24のバッファメモリ に送信データを転送
①箇所

C24がタイミング を見て、送信文字数分送り出す
②箇所

送信完了でCPUに信号を送る。
③箇所

 

<受信>

C24のバッファメモリ に受信データを貯める
②箇所

受信完了で、CPUに信号を送る。
④箇所

INPUT命令 で C24のバッファメモリ から、CPUのレジスタ にデータを転送
⑤箇所

受信完了でCPUに信号を送る
⑥箇所

こういう流れになります。

実行コードには 合否の接点 も上がってきますから、実際にはその際どうするか?のプログラムが必要ですね。

 

ここでは、伝文はC24のバッファに預けてからやりとりをする という事だけ、頭の片隅に入れておいて下さい。

 

送受信データを触ってみよう。

まずは、送受信終了データ数を変更します。

 

送信は ココ

受信は ココ で決定するのでしたね。

 

以前、~前編~で通した設定は、

セット文字   5ワード
送信      5ワード
受信      511ワード(デフォルト)
終了コード    あり

今回は、こちらの設定を少しずつ変化させて、どうなるか確認して行きましょう。

 

まずは、決まったワード数でのやりとり を想定して、
送受信ワード数を同じ にしてみます。

 

設定は

セット文字   6ワード
送信      6ワード
受信      6ワード
終了コード    あり

 

送受信6ワード ずつなので、何も問題は無さそうですね。

 

では、送信

 

ん?

5ワードしか到着してない

 

その状態から、もう一度送信 を掛けてみます。

>

 

んん?

 

受信は6ワード入りましたが、データが先程とは違っていますね。

なぜそうなったかを、順を追って考えてみましょう。

 

 

ここまでは良いですね。

どうやら初っ端の通信は、終了コード に引っかかったので、5ワードで終わったようです。

 

次に、再送後に現れた6ワードを追ってみましょう。

 

 

デバイス一括モニタと同じになりました。

これだと、次以降のデータは延々と同じパターンになりそうです。

長いデータの場合はこれらを結合させるのですが、動作系の場合はそこまで長いデータはめったに扱わないので、20文字程度を想定して進めて行きます。

 

こうなってしまった場合の復旧は、

再起動するか、単独で終了コードを送るか、バッファを消去するか、となってきますので

 

[ ZP.CSET ] 命令で、C24の バッファを消去 しちゃいましょう。

 

 

では、受信の毎に [ ZP.CSET ] を走らせてみます。

 

いいですね、

先程とは違い、データのズレは無くなり毎回同じデータで通っています。
キチンとバッファは消去されているようです。

 

バッファ絡みのズレは解消できましたが、6ワード欲しいのに5ワードしか来ないのに変わりありません。

 

もちろん、終了コードを検知しているからですよね。

プログラムから、下記の部分を削除します。

[ MOV H0A0D D15 ]

 

設定は、

セット文字   6ワード
送信      6ワード
受信      6ワード
終了コード    なし

 

では、送信

 

いいですね~、キチンと6ワード入ってきています。

[ ZP.CSET ]を起動させなくても、毎回同じです。

もちろん、送信を連打しても、大丈夫ですよ。

 

同じように、

セット文字   6ワード
送信      6ワード
受信      5ワード
終了コード    なし

送信に対して、受信が少ない場合、あぶれた文字はバッファで待機するので、先程のようなバッファのズレが生じてしまいますよね。

先のケースと同じく [ ZP.CSET ]が必要 なパターンですね。

 

次に、送信が少ない場合をやってみましょう。

セット文字   6ワード
送信      2ワード
受信      6ワード
終了コード    なし

では、送信!

 

何も来ない・・

あきらめずに、送信を続けます。

 

 

きた!3回目 で来た~!

先程のようなノリで、受信終了データ数が来るまでは、先のデータはバッファで待機します。

 

今回は、2ワード づつ受信して、3回目 で 終了データ数6 に達したので、受信完了フラグを立てたのですね。

 

これらの動きから、組み込み時の想定を盛り込んで行きます。

例えば、少ない文字を2回送った時点で、違う伝文を送った場合はどうなる?とかですね。

 

 

通信は相手あってのものですから、通信落ち や テキストミス も十分ありえます。

その度にデータが化けてしまって、復旧には再起動が必要という悲しい事態を回避する為にC24のバッファを消去する [ ZP.CSET ] を実行する必要が有るのですね。

 

まとめ

今回は決まったデータ数でのやりとり、固定長通信 を念頭に設定とプログラムを一緒に見てきました。

 

最低でも注意すべきは3点

送信は、
送信ワード数を意識する事。

受信は、
C24に蓄えられるバッファを意識しながら、受信終了データ数、受信終了コードを指定する事。

不測の事態にそなえて、
CSET命令は必要な事。

 

あわせて読みたい
シリアル通信の基本
シーケンサでシリアル通信をしよう~前編~
シーケンサでシリアル通信をしてみよう~後編~