第4章 リファレンス
データ 0 → OFF データ 1 → ON
38. DioInputHandShake
© 2000, 2014 Interface Corporation. All rights reserved.
【パラメータ】
DeviceHandle
DioOpen関数で取得したデバイスハンドルを指定します。
Buffer
デバイスから入力したデータを受け取るバッファを指すポインタ(参照渡し)を指定しま す。
NumOfBytesToRead
デバイスから入力するバイト数を指定します。
NumOfBytesRead
入力されたバイト数を指すポインタ(参照渡し)を指定します。
(非同期コールの場合、この値は意味を持ちません。非同期コールで、実際に入力された バイト数を取得するには、DioGetOverlappedResult関数をご使用下さい。)
Overlapped
OVERLAPPED構造体へのポインタ(参照渡し)を指定します。
【戻り値】
正常終了した場合は、FBIDIO_ERROR_SUCCESSが返されます。
FBIDIO_ERROR_SUCCESS以外の値が返された場合については、『4.5 戻り値一覧』をご参照くださ い。
【備考】
DioInputHandShake関数はパラメータOverlappedに有効な OVERLAPPED構造体のアドレスを指定 することで、非同期(処理の完了前に制御が戻ります)に動作します。OverlappedにNULLを指 定すると、処理が完了するまで制御が戻りません。
・同期入出力
アプリケーションはデータ入出力が完了するまで待ちます。
ユーザアプリケーション DLL
ドライバ
/デバイス
アプリケーション → DioInputHandShake → データ入力開始
: :
:[データ転送中] :[データ転送中]
: :
アプリケーションへリターン ← DioInputHandShake 処理終了 ← データ入力終了
© 2000, 2014 Interface Corporation. All rights reserved.
・非同期入出力
アプリケーションはデータ入出力の完了まで待たず、即制御が API から戻ります。
データ入出力の完了はイベントで通知されます。
ユーザアプリケーション DLL
ドライバ
/デバイス
アプリケーション → DioInputHandShake → データ入力開始
アプリケーションへリターン ← DioInputHandShake 処理終了 :
:[データ転送中]
:
(イベント待ち) ← (イベント通知) ← データ入力終了
・データフォーマット
取得したデータは下記のように接点と対応しています。
オフセット データ
bit7 bit6 ・・・ bit0 入力回数
+ 0 IN8 IN7 ・・・ IN1 1 回目
+ 1 IN16 IN15 ・・・ IN9 1 回目
: : :
ポート数 - 1 : :
ポート数 IN8 IN7 ・・・ IN1 2 回目
ポート数 + 1 IN16 IN15 ・・・ IN9 2 回目
: : :
入力バイト数 INxx INxx ・・・ INxx :
上記のようにバッファの先頭から 1 回目の入力データが格納され、次に 2 回目の入力データが 格納されます。
ひとつのバイトデータの中に 8 点分のデータが下位のビットから昇順で格納されます。
接点数が 32 点のインタフェースモジュールの場合は以下のようになります。
オフセット データ
bit7 bit6 ・・・ bit0 入力回数
+ 0 IN8 IN7 ・・・ IN1
+ 1 IN16 IN15 ・・・ IN9
+ 2 IN24 IN23 ・・・ IN17
+ 3 IN32 IN31 ・・・ IN25
1 回目
+ 4 IN8 IN7 ・・・ IN1
+ 5 IN16 IN15 ・・・ IN9
+ 6 IN24 IN23 ・・・ IN17
+ 7 IN32 IN31 ・・・ IN25
2 回目
データ 0 ← 外部回路 OFF 状態 データ 1 ← 外部回路 ON 状態
【使用例】
●C 言語 INT Ret;
HANDLE DeviceHandle;
BYTE Buffer[16];
INT NumOfBytesToRead;
INT NumOfBytesRead;
OVERLAPPED Overlapped;
DeviceHandle = DioOpen("FBIDIO1", FBIDIO_FLAG_NORMAL);
: :
NumOfBytesToRead = 16;
Overlapped.Offset = 0;
Overlapped.OffsetHigh = 0;
Overlapped.hEvent = CreateEvent(0, FALSE, FALSE, NULL);
Ret = DioInputHandShake( DeviceHandle, &Buffer[0], NumOfBytesToRead, &NumOfBytesRead, &Overlapped );
●Visual Basic Dim Ret As Long Dim Name As String Dim DeviceHandle As Long Dim Buffer(16) As Byte Dim NumOfBytesToRead As Long Dim NumOfBytesRead As Long Dim Overlapped As OVERLAPPED Name = "FBIDIO1" & Chr( 0 )
DeviceHandle = DioOpen(Name, FBIDIO_FLAG_NORMAL) :
:
NumOfBytesToRead = 16 Overlapped.Offset = 0 Overlapped.OffsetHigh = 0
Overlapped.hEvent = CreateEvent(0, False, False, 0)
Ret = DioInputHandShake( DeviceHandle, Buffer(0), NumOfBytesToRead, _ NumOfBytesRead, Overlapped )
© 2000, 2014 Interface Corporation. All rights reserved.
●Delphi var
Ret: Integer;
Name: String;
DeviceHandle: THandle;
Buffer: Array[0..15] of Byte;
NumOfBytesToRead: Integer;
NumOfBytesRead: Integer;
Overlapped: TOVERLAPPED;
begin
Name := 'FBIDIO1';
DeviceHandle := DioOpen(Name, FBIDIO_FLAG_NORMAL);
: :
NumOfBytesToRead := 16;
Overlapped.Offset := 0;
Overlapped.OffsetHigh := 0;
Overlapped.hEvent := CreateEvent(nil, False, False, nil);
Ret := DioInputHandShake( DeviceHandle, @Buffer[0], NumOfBytesToRead, @NumOfBytesRead, @Overlapped );
end;
デバイス名「FBIDIO1」のデバイスでハンドシェーク入力します。