NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

PCI-1428でのデータ収集について

お世話になっております。

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 が編集しています。

メッセージ11/15
1,955件の閲覧回数

回答どうも。

現在のフレームが BufNum を超えていれば、最新のフレーム番号を currBufNum に返す。

現在のフレームが BufNum に満たなければ、待ち、

BufNum に到達したら currBufNum = BufNum  ( = 最新のフレーム番号)
タイムアウトしたら currBufNum にやはり最新のフレーム番号を返す。

※.「現在のフレーム」= imgSessionExamineBuffer() 実行時のフレーム

という理解で良いでしょうか。

メッセージ12/15
1,948件の閲覧回数
お世話になっております。

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
現在のフレームが BufNum を超えていれば、最新のフレーム番号を currBufNum に返す。
ただしBufNumのバッファが上書きされず残っていれば、currBufNum = BufNum

現在のフレームが BufNum に満たなければ、待ち、

BufNum に到達したら currBufNum = BufNum  ( = 最新のフレーム番号)
タイムアウトしたら currBufNum にやはり最新のフレーム番号を返す

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

のようになると思います。

メッセージ13/15
1,943件の閲覧回数
なるほど、分かりました。
頂いた情報を元にテストしてみます。
ありがとうございました。

yoshi
0 件の賞賛
メッセージ14/15
1,934件の閲覧回数
ご連絡どうもありがとうございます。
今後ともよろしくお願いいたします。

日本NI技術
数馬

メッセージ15/15
1,926件の閲覧回数