第4章 リファレンス
データ 0 → OFF データ 1 → ON
40. DioOutputHandShake
© 2000, 2014 Interface Corporation. All rights reserved.
【パラメータ】
DeviceHandle
DioOpen関数で取得したデバイスハンドルを指定します。
Buffer
デバイスに出力するデータのバッファを指すポインタ(参照渡し)を指定します。
NumOfBytesToWrite
デバイスに出力するバイト数を指定します。
NumOfBytesWritten
出力されたバイト数を格納するポインタ(参照渡し)を指定します。
(非同期コールの場合、この値は意味を持ちません。非同期コールで、実際に出力された バイト数を取得するには、DioGetOverlappedResult関数をご使用下さい。)
Overlapped
OVERLAPPED構造体へのポインタ(参照渡し)を指定します。
【戻り値】
正常終了した場合は、FBIDIO_ERROR_SUCCESSが返されます。
FBIDIO_ERROR_SUCCESS以外の値が返された場合については、『4.5 戻り値一覧』をご参照くださ い。
【備考】
DioOutputHandShake関数はパラメータOverlappedに有効な OVERLAPPED構造体のアドレスを指 定することで、非同期(処理の完了前に制御が戻ります)に動作します。OverlappedにNULLを 指定すると、処理が完了するまで制御が戻りません。
・同期入出力
アプリケーションはデータ入出力が完了するまで待ちます。
ユーザアプリケーション DLL
ドライバ
/デバイス アプリケーション → DioOutputHandShake → データ出力開始
: :
:[データ転送中] :[データ転送中]
: :
アプリケーションへリターン ← DioOutputHandShake 処理終了 ← データ出力終了
© 2000, 2014 Interface Corporation. All rights reserved.
・非同期入出力
アプリケーションはデータ入出力の完了まで待たず、即制御が API から戻ります。
データ入出力の完了はイベントで通知されます。
ユーザアプリケーション DLL
ドライバ
/デバイス アプリケーション → DioOutputHandShake → データ出力開始 アプリケーションへリターン ← DioOutputHandShake 処理終了 :
:[データ転送中]
:
(イベント待ち) ← (イベント通知) ← データ出力終了
・データフォーマット
出力データは下記のように接点と対応しています。
オフセット データ
bit7 bit6 ・・・ bit0 出力回数
+ 0 OUT8 OUT7 ・・・ OUT1 1 回目
+ 1 OUT16 OUT15 ・・・ OUT9 1 回目
: : :
ポート数 - 1 : :
ポート数 OUT8 OUT7 ・・・ OUT1 2 回目
ポート数 + 1 OUT16 OUT15 ・・・ OUT9 2 回目
: : :
入力バイト数 OUTxx OUTxx ・・・ OUTxx :
上記のようにバッファの先頭から 1 回目の出力データを格納し、次に 2 回目の出力データを格 納しておく必要があります。
ひとつのバイトデータの中に 8 点分の出力データを下位のビットから昇順で格納します。
接点数が 32 点のインタフェースモジュールの場合は以下のようになります。
オフセット データ
bit7 bit6 ・・・ bit0 出力回数
+ 0 OUT8 OUT7 ・・・ OUT1
+ 1 OUT16 OUT15 ・・・ OUT9 + 2 OUT24 OUT23 ・・・ OUT17 + 3 OUT32 OUT31 ・・・ OUT25
1 回目
+ 4 OUT8 OUT7 ・・・ OUT1
+ 5 OUT16 OUT15 ・・・ OUT9 + 6 OUT24 OUT23 ・・・ OUT17 + 7 OUT32 OUT31 ・・・ OUT25
2 回目
データ 0 → OFF データ 1 → ON
【使用例】
●C 言語 INT Ret;
HANDLE DeviceHandle;
BYTE Buffer[8];
INT NumOfBytesToWrite;
INT NumOfBytesWritten;
OVERLAPPED Overlapped;
DeviceHandle = DioOpen("FBIDIO1", FBIDIO_FLAG_NORMAL);
: :
NumOfBytesToWrite = 8;
Buffer[0] = 0x01;
Buffer[1] = 0x02;
Buffer[2] = 0x04;
Buffer[3] = 0x08;
Buffer[4] = 0x10;
Buffer[5] = 0x20;
Buffer[6] = 0x40;
Buffer[7] = 0x80;
Overlapped.Offset = 0;
Overlapped.OffsetHigh = 0;
Overlapped.hEvent = CreateEvent(0, FALSE, FALSE, NULL);
Ret = DioOutputHandShake( DeviceHandle, &Buffer[0], NumOfBytesToWrite, &NumOfBytesWritten, &Overlapped );
© 2000, 2014 Interface Corporation. All rights reserved.
●Visual Basic Dim Ret As Long Dim Name As String Dim DeviceHandle As Long Dim Buffer(8) As Byte
Dim NumOfBytesToWrite As Long Dim NumOfBytesWritten As Long Dim Overlapped As OVERLAPPED Name = "FBIDIO1" & Chr( 0 )
DeviceHandle = DioOpen(Name, FBIDIO_FLAG_NORMAL) :
:
NumOfBytesToWrite = 8 Buffer(0) = &H1 Buffer(1) = &H2 Buffer(2) = &H4 Buffer(3) = &H8 Buffer(4) = &H10 Buffer(5) = &H20 Buffer(6) = &H40 Buffer(7) = &H80 Overlapped.Offset = 0 Overlapped.OffsetHigh = 0
Overlapped.hEvent = CreateEvent(0, False, False, 0)
Ret = DioOutputHandShake( DeviceHandle, Buffer(0), NumOfBytesToWrite, _ NumOfBytesWritten, Overlapped )
●Delphi var
Ret: Integer;
Name: String;
DeviceHandle: THandle;
Buffer: Array[0..7] of Byte;
NumOfBytesToWrite: Integer;
NumOfBytesWritten: Integer;
Overlapped: TOVERLAPPED;
begin
Name := 'FBIDIO1';
DeviceHandle := DioOpen(Name, FBIDIO_FLAG_NORMAL);
: :
NumOfBytesToWrite := 8;
Buffer[0] := $01;
Buffer[1] := $02;
Buffer[2] := $04;
Buffer[3] := $08;
Buffer[4] := $10;
Buffer[5] := $20;
Buffer[6] := $40;
Buffer[7] := $80;
Overlapped.Offset := 0;
Overlapped.OffsetHigh := 0;
Overlapped.hEvent := CreateEvent(nil, False, False, nil);
Ret := DioOutputHandShake( DeviceHandle, @Buffer[0], NumOfBytesToWrite, @NumOfBytesWritten, @Overlapped );
end;
デバイス名「FBIDIO1」のデバイスでハンドシェーク出力します。
© 2000, 2014 Interface Corporation. All rights reserved.