お問い合わせ

 

技術担当:服部

 

製品及び開発品に関わるお問い合わせはお問い合わせフォームか次のメールアドレスにご連絡ください。

rfedge.sam@gmail.com

 

新着情報

(平成30年3月28日時点)

PDAT2型最新版ソフトウエア

 最新版V1.4のインストーラと概要説明書をアップしました。

 

PDATシリーズ情報を更新

 製造データ自動転送無線ネットワークシステムPDAT1型の詳細をアップデートしました。

 

PDMSシリーズ情報の更新

 マイコン搭載型測定子機の試作品情報を掲載致しました。

 

製品販売に付いて

販売方法と製品セットを見る

 

 最新のソフトウエア

 最新版をダウンロードする

 

最新の技術資料

最新版をダウンロードする

 

品質保証と製造物責任

内容を確認する

子機のソフトウエア

 子機の特性に係わるソフトウエア作成方法に付いてご紹介致します。ここでは星型無線ネットワークに於いてコンピュータから親機を経由して子機を制御する方法を示します。親機とコンピュータとの間は有線通信ですが、親機と子機との間は無線通信になりますので、通信が成立しない場合はタイムアウトとなります。

子機制御に使用する命令

 子機を制御する命令には2つの方法があります。コンピュータから親機を経由して子機に命令を伝達する方法と、事前に子機が返信するタイミングを指定しておいて、指定された条件が揃った時に子機が自発的に返信を行う方式です。後者の方式を割込み返信と呼び、前者の返信とは通信番号領域が異なるので区別できます。

 親機から送られた命令への返信は通信番号が0X00~0X7Fが適用されます。この場合、ネットワークアドレスで指定された子機が一定期間(タイムアウト設定時間)内に返信しない場合は親機が代わりにタイムアウトメッセージをコンピュータに返します。割込み返信の場合、通信番号は0X80~0XFFが適用されます。通信番号の選択は自動的に行われます。子機が割り込み返信を送った場合、親機はその割込み受信を受信した場合に受信した旨を伝える返信を子機に対して行います。もし、親機が何らかの理由で返信をしなかった場合は子機が最大4回まで同じメッセージを間隔を空けて送ります。それでも親機が返信をしなかった場合、その子機は以後の通信を行いません。

①親機経由の命令に関するコード

0X0A GetRemoteRegister 子機のレジスター値を読み取る命令

0X0B SetRemoteRegister 子機のレジスター値を設定する命令

0X05 TxData 文字列を子機のUARTに送る命令

0X1A GetRemoteRegisterReply 子機のレジスター値を読み取り命令に対する返信

0X1B SetRemoteRegisterReply 子機のレジスター値設定命令に対する返信

0X15 TxDataReply 文字列を子機のUARTに送る命令に対する返信

②割り込み返信に対するコード

0X26 RxData 子機がUART経由で受信した文字列の割込み返信

0X27 Announce ネットワーク全体にメッセージを送る場合の割込み返信

0X28 RxEvent UART以外の割り込みが発生した場合の割込み返信

この他に

0X2C JoinRequest 子機が親機のネットワークへ入る為の許可申請

0X1C JoinReply ネットワークに入れるか否かの返信

子機へ命令を送る場合のルチーン

 通信はリアルタイム作業なので送信と受信のタイミングが重要です。送信した後に返信をコンピュータ上を走るアプリケーションが如何に速く認知するかが鍵になります。

先ずは簡単な上記「親機経由の命令に関するコード」に係わる処理を解説致します。

Windows機能のTimerの使用

 ここで言うTimerとは定期的に設定した間隔で何が起こっているかを確認する機能です。USB回路から受信した文字列は親機のソフトウエアで紹介した割込み処理を使えば親機から返信があったかが判ります。しかし、ドライバーソフトウエア(以後、ミドルウエアと呼ぶ)を.dllにした場合、上位のアプリケーションが返信の到着を知るにはミドルウエアで到着のフラッグを立てて、それをアプリケーションが定期的に確認に行くという方法が確実です。アプリケーションはフラッグが立っていた場合、受信バッファーの中身を確認し、適切な処理を行った後で到着フラッグを下ろします。当社のLPR2430.Dllではreceivedと言うフラッグを立てています。

コンピュータでのシリアル処理

 星型無線ネットワークで子機の数が多い場合、親機が子機からの返信を処理しきれない場合があります。特に割込み返信はいつ来るか判らないので2つの子機からの返信が重なる場合があります。本来IEEE802.15.4規格の無線モジュールはキャリアセンスを行ってから送信を開始しますので、2つの無線モジュールからの同時通信は起こらないはずです。しかし、無線モジュールもリアルタイムで動いていますので、若干のタイミングのずれで同時通信が起こる可能性は否定できません。同時にTimerが見に行くタイムラグでアプリケーションの処理が遅れる場合もあります。そうなるとWindowsの並行処理を使いたくなるものですが、シリアル処理に徹した方が安全です。実際、2スレッドや3スレッドを試してみましたが、Windowsがハングアップするケースがしばしば見られました。ではどうしたら良いのでしょうか?

 受信処理はシングルスレッド処理とし、送信したにも係わらず返信されていないものを通信番号で割り出し、親機が再送し、返信を得る方法と、割込み返信の場合は子機が最大4回まで同じメッセージを時間を空けて繰り返すので、次の割込み返信を待つという方法です。

③2種類の入力信号のハンドリング

 2種類の内、最初の1種類は親機から送った命令に対しての子機の返信です。子機が何らかの理由で返信しなくても親機がタイムアウト返信をしますので、USB通信回路が正常に機能していればコンピュータは何らかの返信を得ることができます。従って、ソフトウエアは命令を送った後に受信フラッグが立つのを確認して、受信内容を見に行けば良い事になります。しかし、もうひとつは子機からの割込み返信です。これはいつ来るか判りません。しかし、割込み返信があった場合でも親機のソフトウエアでご紹介したUSBイベントルチーンが受診し、受信フラッグを立ててくれますので、直ぐに受信内容を見に行くことが必要です。従って、WindowsのTimer機能を用いて定期的に受信を見に行く場合は次の順番で行います。

 ・受信フラッグが立っている場合は受信内容を見に行き、必要な処理を行う。行った後に受信フラッグをクリアする。

 ・送信内容がある場合には送信を行い、返信を待つ。受信フラッグが立ったら、必要な処理を行って、最後に受信フラッグをクリアする。

 通常、WinodwsのTimer設定は50mSとしていますが、一階の送受信サイクルは100mS以上掛かりますので、送受信処理が終らない場合に次の送受信処理に入らないようにフラッグを立てておくと安心です。

自動ワンホップ転送

 子機(Remote)設定されたRFEM2400/LPR2430ERAは親機と直接通信ができない子機がある場合自動的にワンホップ転送を行います。ワンホップ転送された場合は返信メッセージ内のLQI値が0XFFになっています。中継子機がワンホップ転送を行う場合、中継時間はパケットの長さに比例しますが、通常の命令では0.5秒以内で1送受信サイクルが完結します。ワンホップ転送は親機と直接通信できない子機があった場合、子機が自発的に行うので通信経路をユーザ側で設定することは出来ません。

WindowsのTimerを使ったコーディングの例

 ここではコンピュータに実装されているリアルタイムクロック(RTC)を用いて命令を送信する方法の説明を致します。構築した無線ネットワークでデータを定期的に集める場合はこの方法が適しています。コンピュータのRTCは1000分の1秒管理なので時間設定は1000分の1秒単位で行うことができますが、ソフトウエアが命令を送ってから返信を受け取るまで概ね105ミリ秒掛かりますので最短で200ミリ秒に1回のデータ収集になります。しかし、この無線ネットワークに複数の測定子機がリンクしている場合は1命令を送る度に105ミリ秒必要になりますので測定するセンサー数を考慮に入れて最短測定時間を決定するようにお勧めします。

Windowsには並行処理機能がありますので、スレッドを何本か走らせて処理する方法が考えられますが、最初の段階では命令毎にシリアル処理をすることをお勧めします。

DateTimeの使い方

 DateTimeは日付や時間を表す構造体です。DateTimeの変数を用いて測定時間が来たかどうかを知ることができます。方法はDateTimeの変数に次の測定時間をセットしておき、次の測定時間と現在の時間を比較することで測定時間が来たこと知ることができます。次の例は測定子機が1台、測定センサー1本に単純化した時の例です。測定回数は5回です。

int MinuteInt = 5; // 5分を測定間隔とします。

int RepeatTime = 0;  // 測定回数のカウンター

DateTime Measure = DateTime.Now;  // 現時間を設定します

Measure = Measure.AddMunutes(MinuteInt);

do {

if (measure.Compare(DateTime.Now) >= 0)  // 測定時間が来た

{

 <<時間が来たときの処理>>

   Measure = Measure.AddMinutes(MinuteInt);  // 次の測定時間を設定

   RepeatTime++;

}

while (RepeatTime < 5);

となります。しかし、この方法では5回測定を行う間に測定を中止することが難しいので次に示すコンピュータのリアルタイムクロックを使った割込み方法を奨励しますが、測定時間が来たか否かを知るにはDateTime構造体を用いた方法が簡単です。

 

コンピュータのリアルタイムクロック割込み

 工事中