• 検索結果がありません。

実行手順(汎用DIO部)

ドキュメント内 GPC-4116 (ページ 31-35)

第 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

ドキュメント内 GPC-4116 (ページ 31-35)

関連したドキュメント