INtimeドキュメンタリトップへ

データのインターフェース

10月24日・・・オブジェクトハンドルの見直し

オブジェクト型メールボックスにより、NT側グラフ表示プロセスと、INtime®側アナログデータ変換値取得プロセスが通信を行いますが、現段階でひとつ問題が発生します。


RT(INtime®側のプロセス)とWindows NT(Windows側プロセス)間の通信図
RT(INtime側のプロセス)とWindows NT(Windows側プロセス)間の通信図

①ではアナログ変換値を取得後、その内容をメモリオブジェクトに書き込み、オブジェクトハンドルを
 メールボックスNtMboxに送信します。

②はオブジェクトを確認後、そのオブジェクトをマップし、データを取得、その内容をグラフに反映さ  せます。
通信インターフェース概略
上記のようにRT側はWindows側の処理に関係なく、100ms周期でデータを取得し、オブジェクトハンドルをマップ、データを格納し、データを送信しています。

送信するオブジェクトハンドルは一つで、お互い唯一のオブジェクトハンドルをマップ、データの読み書きを行う状況において、もし、Windows側の処理に時間のかかる処理が発生し、次のRT側のデータ書き込み周期までに表示処理が終わらない場合、RT側データ取得スレッドにより上書きされたデータがNT側で更新されてしまうことになります。

NT側の処理がイリーガルに遅れた場合、以下のような状況が発生する可能性があります。

これは受信側と、送信側のスレッドがそれぞれ同時にマッピング、読み書きを行ってしまうケースです。

これを 極力解消するために、メモリオブジェクトのトークンを複数用意する方法があります:

まず、現在までメモリオブジェクトを一つのみ生成していた部分を複数生成するようにします。
複数生成されたメモリオブジェクトはすべてRT側メモリオブジェクト受信用メールボックスにまず送信されます。
ルールとしてRT側スレッドは、「RT側メモリオブジェクト取得用メールボックスからオブジェクトを受信した後にマップし、データを書き込む」ことにします。
データの書き込みが終わると、NT側プロセス用メールボックスに送信します。NT側プロセスはメールボックスに届いたオブジェクトをマップし、データを取得します。
このとき、例え処理が極端に遅くなった場合においても、メモリオブジェクトが複数存在するため、RT側スレッドがNTに送信した最初のメモリを書き換えてしまうことはありません。
メールボックスはキューをもつことが可能で(FIFO_QUEING)受信したメモリオブジェクトを順番に参照することが可能です。
また参照の終了したメモリトークンはRT側のメモリオブジェクト受信用のメールボックスに送信することによって、サイクリックにメモリオブジェクトを使用することができます。

オブジェクトメールボックスの性格上、この処理はメールボックス一つで実現可能ですが、今回は分かりやすく作るためにメールボックスを二つ用意しました。

①RT側スレッドメールトークン取得用メールボックスと②NT側プロセスアナログデータ受信用メールボックス。

① RT側スレッドは取得したデータを格納するために、RtQueMboxからメモリトークンを取得します。
   オブジェクトハンドルをマップし、取得データを書き込み後、NtRecvMboxにデータを送信します。
② NT側グラフ表示プロセスはメールボックスにオブジェクトハンドルが着信後、そのハンドルをマップし、 取得データを読み取ります。 たとえば、この処理にかなり時間がかかったとしても、RT側は違うメモリトークンにデータを格納して 送信するため、このメールボックスにキューとして貯蓄されることになります。
③ メモリオブジェクトの参照終了後、NT側グラフ表示プロセスはハンドルをRtQueMboxに返信します。


※TenAsys®, INtime®, eVM® and iRMX® are registered trademarks in USA of the TenAsys Corporation.