以前、シリアル通信を無手順で通すところまでをご紹介しました。
シーケンサでシリアル通信をしよう~前編~
引き続き QJ71C24N-R2 を使用して、固定長通信を念頭に通信時のデータの動きを一緒に見ていきましょう。
どうも! ずぶ です。今回は シーケンサでシリアル通信をしてみよう~中編~
通信の概要
プログラム と 概要図 から、大まかな流れを把握しておきましょう。
送信
受信
概要図
抽出なので、CH指定等の記述は他の箇所で行っています。
補足を入れると
<送信>
OUTPUT命令 で CPUのレジスタ から、C24のバッファメモリ に送信データを転送
①箇所
↓
C24がタイミング を見て、送信文字数分送り出す
②箇所
↓
送信完了でCPUに信号を送る。
③箇所
<受信>
C24のバッファメモリ に受信データを貯める
②箇所
↓
受信完了で、CPUに信号を送る。
④箇所
↓
INPUT命令 で C24のバッファメモリ から、CPUのレジスタ にデータを転送
⑤箇所
↓
受信完了でCPUに信号を送る
⑥箇所
こういう流れになります。
実行コードには 合否の接点 も上がってきますから、実際にはその際どうするか?のプログラムが必要ですね。
ここでは、伝文はC24のバッファに預けてからやりとりをする という事だけ、頭の片隅に入れておいて下さい。
送受信データを触ってみよう。
まずは、送受信終了データ数を変更します。
送信は ココ
受信は ココ で決定するのでしたね。
以前、~前編~で通した設定は、
セット文字 5ワード
送信 5ワード
受信 511ワード(デフォルト)
終了コード あり
今回は、こちらの設定を少しずつ変化させて、どうなるか確認して行きましょう。
まずは、決まったワード数でのやりとり を想定して、
送受信ワード数を同じ にしてみます。
設定は
セット文字 6ワード
送信 6ワード
受信 6ワード
終了コード あり
送受信6ワード ずつなので、何も問題は無さそうですね。
では、送信
ん?
5ワードしか到着してない
その状態から、もう一度送信 を掛けてみます。
>
んん?
受信は6ワード入りましたが、データが先程とは違っていますね。
なぜそうなったかを、順を追って考えてみましょう。
ここまでは良いですね。
どうやら初っ端の通信は、終了コード に引っかかったので、5ワードで終わったようです。
次に、再送後に現れた6ワードを追ってみましょう。
デバイス一括モニタと同じになりました。
これだと、次以降のデータは延々と同じパターンになりそうです。
こうなってしまった場合の復旧は、
再起動するか、単独で終了コードを送るか、バッファを消去するか、となってきますので
[ 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命令は必要な事。
あわせて読みたい
シリアル通信の基本
シーケンサでシリアル通信をしよう~前編~
シーケンサでシリアル通信をしてみよう~後編~
最近のコメント