■29457 / ) |
Re[2]: ポーリング処理 |
□投稿者/ 初心者 (200回)-(2008/12/10(Wed) 00:27:14)
|
■No29454 (chobi さん) に返信 > GPIBの動作の流れとしては > (1) SRQがLOWに下がる(定期的にスキャンするのかな、WM(ウインドウメッセージ)でも掴まえるのかな・・ボードの仕様が全く分からない) > (2) コントローラはシステム内のどのトーカがSRQを発したのかステータスバイトを送らせて調べる。(ポーリング処理) > (3) 発見したら必要な処理を施す。(多分SRQを発信したトーカをリセットするのかな?専用のAPIがあるんじゃないですか?) >
(1) その流れは読んでみたのですがわかりませんでした。 他に詳しく書いてあるかもしれませんが、また探して見つかり次第、載せます。 情報が少なくて申し訳ありません。
******************************************************** ここで、サービス要求をしている機器を探す方法として、シリアル・ポーリングとパラレル・ ポーリングがあります。 シリアル・ポーリングは、コントローラがサービス要求元と思われる機器を1台ずつ順番に呼び 出して、その時の機器の状態を示すステータス・バイトと呼ばれる1バイトの情報を送らせ、こ の内容を調べることで、サービス要求元とその要因を取得します。 規格上、ポーリング機能と SR機能は別の機能なので、SR機能のない機器でもポーリングは可能です。そうすればコント ローラは好きな時にステータス・バイトを読むことで、現在の機器の状態を知ることができ、 それに応じた処理を行うことができます。
********************************************************
> >まずここで疑問が…何を基準に任意のビットデータを指定すればよいのかわかりません。 > > 多分、コールバック関数に渡したいデータがないのならばダミーデータでも入れといて使わなければ良いだけでしょう >
ダミーデータですか!何か仮に数値を入れてみればよいのですかね… ありがとうございます。 コールバック関数には特に必要な数がないので、どうすればいいのか困っていました。
調べていたら、コールバック関数からの一連の流れをC#で説明してくれている資料がありました。 手際が悪くてすみません。
ここではデリゲートを利用しているのですが、順序は、
List 4-28 コールバック用デリゲート宣言 public delegate void PLPSRQCALLBACK(int nBoardNo, uint dwUser);
List 4-29 GpibSetSrqEvent関数宣言 public static extern int GpibSetSrqEvent(uint ulBoardNo, PLPSRQCALLBACK lpOnSrqProc, uint dwUser);
・Step2:コールバック関数の作成 lpSrqProcというコールバック関数を宣言します。 引数パラメータの数、型を、デリゲートPLPSRQCALLBACKと合わせます。 List 4-30 コールバック関数 void lpOnSrqProc(int dwBoardNo , uint dwUser) { ・ ・ }
・Step3:DLL関数呼び出し デリゲートPLPSRQCALLBACKのオブジェクト保存先を定義します。 コールバック関数の呼び出しが繰り返される期間中に解放されないクラスの変 数などにします。
List 4-31 デリゲートオブジェクト保存先変数定義 IFCGPIB.PLPSRQCALLBACK osp; 関数lpOnSrqProcをコールバック関数として、PLPSRQCALLBACKデリゲートオブジ ェクトを生成します。デリゲートオブジェクトを、GpibSetSrqEvent関数の第2パラメ ータに指定して呼び出します。
List 4-32 GpibSetSrqEvent関数呼び出し osp = new IFCGPIB.PLPSRQCALLBACK (lpOnSrqProc); nRet = IFCGPIB.GpibSetSrqEvent(1, osp, 0x55); 以上でコールバック関数の登録は完了です。
これを読んでも色々とわからないところが出てくるのですが、
通常デリゲートは宣言してあげた後に、メソッド(今回はlpOnSrqProcを使用?)を宣言してその間に作業を書くと思うのですが、作業に 「ボード番号」と「ユーザーパラメータ」を設定すればいいんですかね。。。 なぜこんな作業をするのでしょうか…
|
|