第 3 章 導入方法 8
3.3 実行手順(汎用DIO部)
基本的な制御の手順は以下の通りです。(記述例は C 言語です。)
3.3.1 初期化
デバイスをオープンし、デバイスハンドルを得ます。
hDeviceHandle = SdioOpen("IFSDIO1");
デバイス名 "IFSDIO1" は、IFSDIO1、IFSDIO2... と、システムが PCI バス上にデバイスが発見さ れた順番に割り付けられます。
インタフェースモジュールが挿入されているスロット位置やパソコン本体が変わると、検出順序が変 わるため、デバイス名が変わることがあります。
Windows NT 以外の OS では、「デバイス マネージャ」 に 「FbiSDio」 が追加され認識された弊社 HDLC モジュールのデジタル入出力デバイスが一覧表示されます。一覧の製品型式の横にインタフェースモ ジュール上のロータリスイッチの値とデバイス名が表示されますので、ドライバインストール後、デ バイス名を確認してからご使用ください。
(付属の、DI 入力ユーティリティ(SdiUtil.exe)、DO 出力ユーティリティ(SdoUtil.exe) でも確認す ることができます。)
プログラム中では、SdioCommonGetDeviceInfo 関数を用いて、デバイス名と ボード ID(RSW1 設定)
を確認することが出来ます。
hDeviceHandle = SdioOpen("IFSDIO1");
nRet = SdioCommonGetDeviceInfo(
hDeviceHandle, &DeviceID, &VendorID, &RevisionID, &SubsystemID, &SubsystemVendorID, &BoardID,
&TerminalNo );
DeviceID、BoardID、TermilanNo に返される デバイス ID、ボード ID、端子台番号を確認することで、
"IFSDIO1" がどの HDLC モジュール上の汎用 DIO デバイスであるかを確認することが出来ます。
3.3.2 入力方法
SdioOpen 関数で得たデバイスハンドルを用いて、指定した接点の状態を読み出します。
// IN1~IN8 の 8 点の接点状態を入力します。
nRet = SdioInputByte( hDeviceHandle, IFSDIO_IN1_8, &Value );
// IN1~IN16 の 16 点の接点状態を入力します。
Ret = SdioInputWord( hDeviceHandle, IFSDIO_IN1_16, &Value );
// IN1~IN32 の 32 点の接点状態を入力します。
nRet = SdioInputDword( hDeviceHandle, IFSDIO_IN1_32, &Value );
上記方法では、8 / 16 / 32 点ごとに、区切られた範囲の接点状態を入力しますが、以下のように、
入力する接点の範囲を指定して入力することも出来ます。
// IN5~IN7 の 3 点の接点状態を入力します。
nRet = SdioInputPoint( hDeviceHandle, &nBuffer[0], 5, 3 );
配列 nBuffer は、3 つ以上の要素が用意されていなければなりません。
3.3.3 出力方法
SdioOpen 関数で得たデバイスハンドルを用いて、出力を変化させます。
// OUT1~OUT8 の 8 点の出力を変化させします。
nRet = SdioOutputByte( hDeviceHandle, IFSDIO_OUT1_8, Value );
// OUT1~OUT16 の 16 点の出力を変化させます。
nRet = SdioOutputWord( hDeviceHandle, IFSDIO_OUT1_16, Value );
// OUT1~OUT32 の 32 点の出力を変化させします。
nRet = SdioOutputDword( hDeviceHandle, IFSDIO_OUT1_32, Value );
上記方法では、8 / 16 / 32 点ごとに、区切られた範囲の出力状態を変化させますが、以下のように、
出力する範囲を指定することも出来ます。
// OUT5~OUT7 の 3 点の出力を変化させます。
nRet = SdioOutputPoint( hDeviceHandle, &nBuffer[0], 5, 3 );
配列 nBuffer は、3 つ以上の要素が用意され、予め nBuffer[0]~[2]へ、 OUT3~5 へ出力させる 値がセットされていなければなりません。
© 1999, 2016 Interface Corporation. All rights reserved.
33
3.3.4 STB入力時のデータを取り込む
1) STB 入力によるラッチ機能を有効にします。
// STB の立下りエッジでデータをラッチする。
nRet = SdioSetLatchLogic( hDeviceHandle, IFSDIO_FALL_EDGE );
2) STB 入力割り込み時の動作を登録します。
// コールバック関数 CallBackProc を登録
nRet = SdioSetEvent( hDeviceHandle, NULL, 0, NULL, CallBackProc, 0);
上記はコールバックを用いた例です。
SdioSetEvent 関数では、以下の 3 種類の同期処理を登録させることが出来ます。
・コールバック
GPC-4116 が持つコールバック機能を用いて同期させる方法です。
STB 入力時に、SdioSetEvent 関数で指定したコールバック関数が呼び出されます。
コールバック関数の仕様は、CallBackProc を参照してください。
・イベント
Windows のイベントを用いて同期させる方法です。
Windows のイベント機能については、Windows の技術資料等を参照してください。
・メッセージ
Windows のメッセージ 機能を用いて同期させる方法です。
Windows のメッセージ機能については、Windows の技術資料等を参照してください。
3) STB 入力時の割り込みを有効にします。
// STB の立下りエッジで割り込みを発生させる
nRet = SdioSetEventLogic( hDeviceHandle, IFSDIO_FALL_EDGE );
4) CallBackProc 関数の中で、STB 入力によってラッチされた接点状態を読み出します。
// IN1~IN8 の 8 点の接点状態を入力します。
nRet = SdioInputLatchByte( hDeviceHandle, IFSDIO_IN1_8, &Value );
// IN1~IN16 の 16 点の接点状態を入力します。
nRet = SdioInputLatchWord( hDeviceHandle, IFSDIO_IN1_16, &Value );
// IN1~IN32 の 32 点の接点状態を入力します。
nRet = SdioInputLatchDword( hDeviceHandle, IFSDIO_IN1_32, &Value );
上記方法では、8 / 16 / 32 点ごとに、区切られた範囲の接点状態を入力しますが、以下のように、
入力する接点の範囲を指定して入力することも出来ます。
// IN5~IN7 の 3 点の接点状態を入力します。
nRet = SdioInputLatchPoint( hDeviceHandle, &nBuffer[0], 5, 3 );
配列 nBuffer は、3 つ以上の要素が用意されていなければなりません。
3.3.5 終了方法
1) STB 入力割り込み処理を登録している場合、割り込みを無効にしてから、登録している処理を解除 します。
// STB 入力割り込みを解除
nRet = SdioSetEventLogic( hDeviceHandle, 0);
// STB 入力割り込み時の処理を解除
nRet = SdioSetEvent( hDeviceHandle, NULL, 0, NULL, NULL, 0);
2) SdioOpen 関数で得たデバイスハンドルを用いてデバイスをクローズします。
nRet = SdioClose( hDeviceHandle );
© 1999, 2016 Interface Corporation. All rights reserved.
35