お世話になっております。
imgSessionExamineBuffer (Sid, BufNum, &currBufNum, &bufAddr) 部分について解説いたします。
簡単に説明すると、
BufNum = リクエストされた画像番号
&currBufNum = 実際に返された画像番号
となります。
これらの番号は必ずしも一致しないことに注意してください。リングバッファ集録は、連続的に画像集録を実現するために
必要なのですが、これを有限個のバッファによって実現させています。
例えば、バッファの数を10とすると、集録を開始したときに0個目、1個目、2個目…9個目とデータがたまっていきます。バッファ用の
メモリはあらかじめIMAQドライバによって確保されていますので、高速な集録が可能です。ただし10個目のバッファがたちまち
いっぱいになってしまうと、0個目のデータを上書きし、続いて1個目、2個目のデータを上書きして行きます。これにより、連続
集録が可能になります。上で示しました
画像番号は何回目に集録された画像データかを示します。つまり、0個目のバッファを
一度上書きすると画像番号は11ということになります。ユーザは全ての集録画像を必要とする場合は、上書きが発生する前に
バッファ内のデータを取得する必要があります。imgSessionExamineBuffer() はBufNumで指定した画像番号のデータを持つ
バッファをロックしてこのバッファだけ上書きが発生しないようにします。例えばBufNum=
10でこの関数をコールした場合、
IMAQは
11番目(指標が0から始まるため)に取得された画像データをさがし、それを保持しているバッファをロックします。
ロックした後はデータが途中で消えることなく自由にその領域にアクセスできます。BufNumで要求した画像番号のデータが
残っていれば&currBufNumの値はBufNumと同じになります。しかしBufNumで指定した画像番号のデータが
いつもあるとは限りません。例えば100番目の画像集録を行っている時にはすでに12番目の画像データは消えています。
このような場合、関数の仕様として自動的にもっとも最新の画像番号を&currBufNumを使って返します。
(help:If the requested image has already been overwritten, the function returns the
most current image.)
その逆でBufNumで指定した画像番号のデータがまだ取得されていない場合、関数はその画像番号までデータが収録されるのを待って
(あるいはタイムアウト時はエラー)画像データ集録後に&CurrBufNumで実際に取得した画像番号を返します。
(help:If the requested image has not yet been acquired, the function does not return
until the image has been acquired or the timeout period has expired.)
最後にロックしたバッファはimgSessionReleaseBuffer でリリースを行います。これにより、上書きが可能になります。
※上記はNI-IMAQ Function Reference Helpを参照しました。
RIng集録についてはこちらからも解説をごらんいただけます。(英語)
http://zone.ni.com/devzone/cda/tut/p/id/4001
以上よろしくお願いいたします。
このメッセージは 01-14-2007 10:52 PMに S.Kazuma が編集しています。