PICマイコンを使って測定ツールを作ってみよう(4) ―― ネットワークでセンサ・データを集めて省電力生活を目指す
実際の送受信の順序関係を図6に示します.
図6 ホストとマスタとスレーブの送受信ハンドシェーク
また,電源を入れたときのマスタとスレーブの液晶ディスプレイの表示を写真1に示します.
写真1 電源を入れたときのマスタとスレーブの液晶ディスプレイ
ホストとマスタとスレーブの間のコマンドと応答のやりとりは,単一のスレーブに送るコマンドと全スレーブに送るコマンドで異なります.
単一のスレーブへのコマンド送信では,まず,ホストがマスタにコマンドを送信します.これを受けてマスタのPICマイコンは,ホストのパソコンに受信したことを示すACKを返します.何らかの理由でコマンドを実行できないときはNAKを返します.現在は,まだそのまま受けとったパケットを返しています.これは,VBの画面では各スレーブ・フレーム内の応答メッセージのテキストボックス(Text7,8,9)に表示されます(図7).
図7 電源を入れたときのVB6の表示画面
これに対して,最初にこのVB6のプログラムを実行したときは,すでにframe_Load()関数の中で,全スレーブIDに対するリセット・コマンドを発行しています.マスタへの応答メッセージとして,マスタ・フレーム内のテキストボックス(text11)に「C0 FE 4 A 1 2 3」が表示されます.コマンドはRS-485ネットワークのものと区別するため,リセットは0xC0,PINGは0xC1,READは0xC2,WRITEは0xC3と,それぞれ0xC0を足した値を使っています.0xFEはブロード・キャスト用のIDで,全スレーブIDに送りたいときに使います.通常,全スレーブから同時に返信を返すとぶつかってしまうので,応答は行いません.
ここで,例えばスレーブ#1にリセット・コマンドを発行しましょう.するとスレーブ#1の液晶ディスプレイには「RST #1」の文字が現れ,スレーブ#2とスレーブ#3には,「8//q1311」とスレーブ#1が返信したパケットが表示されます(写真2,図8).見やすくするためにすべて0x30を足して表示しています.
写真2 スレーブ#1に対してリセット・コマンドを発行したときの液晶ディスプレイ
図8 スレーブ#1に対してリセットコマンドを発行したときのVB6の表示画面
最初の数字は受信したバイト数です.次の「/」はスタート・フラグの0xFFに0x30を足した結果の0x2Fというコードを表示したものです.デバッグ・モードでないときは,関係ないスレーブにはいっさいメッセージは表示されません.しかしこのように,実際には自分に向けられたメッセージかどうかを判別するために受信しています.
先のUSBの送受信と同じように,タスク同士の衝突を避けるために,巧妙にフラグを利用しています.マスタでは,通信ステージ(COM_stage)という状態変数を利用しています.通信ステージは,マスタからスレーブへの送信では0,逆にスレーブからマスタへの送信では1になります.例えば通信ステージが1のときは,決して新たなコマンド送信が行えないことになります.こうやって,まだ応答の受信が終了していないのに新たなコマンドを発行する,といった状態を防ぎます.
また,応答の受信は割り込みで受けるため,rcv_completeという受信完了フラグを利用しています.パケットを受信して,その中のパケットの長さからどこまでパケットを受信すればいいかを決定します.全部受信してから,この受信完了フラグを1にします.それから実際のメイン・ループで,それを応答メッセージとしてホストに返信します.これでホスト,マスタ,スレーブの間の送受信プロセスが終了します.
今回は,まだリセット・コマンドとPINGコマンドの差はありません.受け取ったスレーブはほとんど何もしません.しかし次回以降は,ネットワークを利用したA-D変換測定などが加わり,大きく差が出てきます.つまりPINGは,内部状態を何も変えないで応答のみを返すのに対し,リセットではA-D変換の諸設定やI/Oバッファ内容など,すべてをクリアしてしまいます.
なかにし・しろう
(有)NSL