対象製品型式:
API-AIO(WDM)
関連情報:
変換データを無限に収集する仕組みは、次のようにして行われます。

変換回数を無限回の設定でサンプリングをスタートさせます。FIFOメモリに変換データが格納されて
いきます。

変換データがある一定量FIFOメモリに格納されたら、データを取得します。
FIFOメモリの古いデータから取得され、FIFOの空き容量が増えます。
このように、あるタイミングでデータ取得を繰り返し行うことにより、無限サンプリングを行うことが
できます。

変換速度が速すぎたり、データ取得が間に合わない場合にはFIFOメモリはオーバーフローし、サンプリ
ングが停止します。
データ取得を行うタイミングですが、主に以下の3通りの方法が考えられます。
【1】ポーリングによる監視
AioGetAiSamplingCount関数を実行することで、FIFOメモリに格納されたサンプリングデータ数が
取得可能です。
アプリケーションのループ処理にてAioGetAiSamplingCount関数を実行、FIFOのデータ数がある一定数
以上の値になったらデータ取得を行います。
3つの方法の中では最も単純な方法ですが、CPU占有率が高くなります。
【2】指定サンプリング数格納イベントの使用
API-AIOドライバのイベント通知機能を使用し、FIFO内の格納データがある一定数以上になった瞬間の
タイミングをアプリケーションに通知します。
アプリケーションのイベントルーチンでデータ取得を行うことにより、無限サンプリングを実現します。
CPUの占有率は低く、一般的によく使用される方法です。
イベントルーチンを抜ける直前に「1.ポーリングによる監視」のループ処理内ロジックを追加する
ことで、高速サンプリング時のオーバーフローをより確実に回避可能です。
【3】システムタイマの使用
システムタイマを使用し、タイマインターバルのタイミングでデータ取得を行うことにより無限サンプリ
ングを行います。
システムタイマの精度は悪いため、高速に無限サンプリングを行うような処理には向いていません。
参考:
「【2】指定サンプリング数格納イベントの使用」時において、
サンプリング速度や負荷状況によってはイベントが発生しなくなることがあります。
※例:1000データごとにデータを取得するサンプリングの場合
イベントが発生してデータを取得するタイミングで、すでに2000以上のデータが存在した場合、
データを取得後も1000以上のデータが残るため、それ以降イベントが発生しません。
本現象を回避するには、イベント中でデータ取得を行う際に固定数を取得するのではなく、
FIFO内のデータを全て取得するようにプログラムを変更してください。
具体的には、AioGetAiSamplingDataEx 等のデータ取得関数を実行する直前に
AioGetAiSamplingCount関数 を実行し、ここで確認したデータ数(AiSamplingCount)を
AioGetAiSamplingDataEx 等で取得するようにします。