スパイス  組み込み制御装置の受注製作

自社標準仕様の製作
平成27年 8月 5日

 汎用の高速シリアル通信機能(3)  通信の基本的手続き(2)

RS-485による半二重通信の高速化について検討していました。半二重通信では通信方向の切り替え時に信号の衝突を避けるためのデッドタイムが必要になるため、通信方向の切り替えを減らす工夫を行いました。この方式でデメリットになる点を考えてみます。

  ・通信エラーに対するペナルティが大きくなる
 マスタとスレーブで一対一の通信を行う場合に比べると、一度に送受信するデータ量が大きくなるのでその分だけ通信エラーに対して弱くなります。
これは避けようがない問題です。しかし、そもそも通信エラーが頻発する環境では使うべきではないと割り切れば諦めることも出来ます。RS-485通信自体がノイズに対して高い耐性を持っているので、そちらで対処してもらいます。

  ・スレーブから見ると上手く通信できたにもかかわらずリトライが行われることがある。これは相対的なデータの受け渡しは出来ないことを意味する。
 複数のスレーブに対して要求コマンドを一度に送信するので、これらの内のどれか一つでも通信に失敗すると全体としての通信は失敗したと判断します。プログラムの工夫をすれば、失敗したスレーブ以降に対してのみリトライすることも出来ますが、プログラムが複雑になることを考えるとやらない方が有利です。いずれにしても通信エラーの可能性がある以上、データの連続性が必要な情報(例えばインクリメンタルエンコーダの相対値のように、一度でも途中のデータが失われると、積算データが信頼できなくなる)を通信で送ることは出来ません。この場合は通信基板側でデータを積算した結果を送るなど、データの連続性が不要な状態にした後で返信します。この制約は今回の工夫によるものではなく、通信エラーが起きるかもしれないことから来ています。

   ・スレーブ側のプログラムがやや面倒になる
 通常のマスタスレーブ方式との比較では、スレーブ側は自身へのコマンドを検出して応答を返すタイミングを知るために、他のスレーブからの応答も正しく受信する必要があります。(自身のアドレス -1)番目のスレーブが返信を終わらせたことを確認後、通信切り替え時間だけ待って自身の応答を返します。
 先の説明のときの図を再度示します。スレーブ2はスレーブ1の返信を待って送信を開始しています。


 主なデメリットは以上と考えています。致命的なものは無いので、もう少し詳細な仕様を検討していきます。

 (2)エラーの検出
 通信である以上、どのタイミングで偶発的な通信異常を受けても、その状態から復帰できることが必要です。復帰動作のためには、通信で起きるエラーを正しく検出できることが条件になります。エラーを検出さえ出来れば、復帰動作を行うことで正常な状態に戻すことが出来ます。
そのために、通信の各タイミングでエラーが起きたときの検出方法を順に検討していきます。
   ・スレーブ側が受信エラーを検出した場合
 マスタからスレーブに送信したデータに異常を検出したした場合、スレーブ側で出来ることは限られます。基本的には受信データを無視することでマスタ側でタイムアウトエラーを起こします。これで問題ないかをもう少し細かく検討します。スレーブ側の仮にスレーブ2のみが受信エラーを検出した場合を考えます。このケースではスレーブ1からの応答はマスタに返されます。ここでスレーブ2は受信データを無視していますので返信を行わない。これをタイムアウトとして検出する方法を考えます。
 タイムアウトの検出では、ある指定時間までに返信が一文字も返ってこなければエラーとする方法と、指定時間以内に返信が終わっていないときにエラーとする方法が考えられます。最初の方法ではタイムアウト検出までの時間を短く設定できるので有利ですが、今回の仕様ではこれだけでは不十分です。スレーブ1は返信していますので、これだけでは検出できません。次の方法はタイムアウトまでの待ち時間を長くする必要があり、あまり取りたくありません。
そこで、中間的な方法でエラー検出を行います。タイムアウトの検出は返信が行われない時間がある指定時間継続すればタイムアウトと判断します。つまり、返信文字が送られない時間が続かなければエラーにはならず、一度返信が開始した後でも、その時点から返信が停止した時間が指定時間を越えればエラーと判断します。この方法なら複数あるスレーブの返信開始が行われないケースでもタイムアウトを検出できます。
 PIC32への実装では返信が起きたかどうかはDMA関連のレジスタから現在の転送文字数を確認できますので、この値が変化しない時間を計測することでタイムアウトを検出することが出来ます。それ以外のスレーブ側でのエラーについても検証してみましたが、上記のタイムアウト検出で対応できます。

   ・マスタ側で受信エラーを検出した場合
 こちらは特に問題なく、エラー検出できます。

 次にはエラーからの復帰動作について考えますが、日を改めます。


目次へ  前へ  次へ