HDLC(PCI/C-PCI) GPC-4116 HDLC 通信インタフェースモジュール用 Windows ドライバ Help for Windows www.interface.co.jp
目次 第 1 章はじめに 3 1.1 概要... 3 1.2 特長... 3 第 2 章製品仕様 4 2.1 基本仕様... 4 2.2 製品構成... 6 第 3 章導入方法 8 3.1 インストール手順... 8 3.2 実行手順 (HDLC 通信部 )... 8 3.3 実行手順 ( 汎用 DIO 部 )... 31 第 4 章リファレンス (HDLC 通信部 ) 35 4.1 関数一覧... 35 4.2 関数個別説明... 36 4.3 構造体... 95 4.4 戻り値一覧... 103 第 5 章リファレンス ( 汎用 DIO 部 ) 105 5.1 関数一覧... 105 5.2 関数個別説明... 106 5.3 戻り値一覧... 154 第 6 章サンプルプログラム 155 6.1 Send... 155 6.2 Receive... 155 6.3 Event... 156 6.4 SendMessage... 156 6.5 ReceiveMessage... 157 6.6 InPoint... 157 6.7 OutPoint... 158 第 7 章ユーティリティ 159 7.1 通信ユーティリティプログラム... 159 7.2 自己診断プログラム... 159 7.3 RS-485 終端設定ユーティリティプログラム... 161 7.4 CardBus ID 設定ユーティリティ... 162 7.5 DI 入力ユーティリティ... 163 7.6 DO 出力ユーティリティ... 163 第 8 章重要な情報 164 2
第 1 章はじめに 1.1 概要 GPC-4116 は Windows 上のアプリケーションから 弊社 HDLC 通信製品を制御する為のソフトウェアです 自由な HDLC フォーマットで使用できるため 上位のプロトコルを自作することにより HDLC フォーマットで動作する様々な機器と接続することが可能です 本ドキュメントは Windows 上で GPC-4116 を使用するための情報を掲載しています 1.2 特長 自由なフォーマットで HDLC フレームの送受信が行えます FCS 付加 チェックを自動的に行います 一つのフレームで最大 16384 バイトのデータ送受信を行えます インタフェースモジュール上に送信バッファを用意してあるため 連続してデータ送信が行えます インタフェースモジュール上に受信バッファを用意してあるため アプリケーションプログラムが他の処理を実行していても データ取りこぼしが発生しません インタフェースモジュールからのイベント発生時にて ユ - ザアプリケーションにイベントを通知できます インタフェースモジュールからのイベント発生時にて ユーザが登録した処理 ( コールバックルーチン ) を実行することができます インタフェースモジュールからのイベント発生時にて 指定されたウィンドウへメッセージを送ることができます HDLC モジュール製品に対応しています 下記のような特長があります CPU を搭載しており 通信の際のパソコンや CPU ボード負荷を軽減することが出来ます 最大 8 チャンネルの通信を制御することが可能です PCI/CTP/CPZ-423108Q,PCI/CTP/CPZ-423208Q のみ最大 8 チャンネル可能です 最大 48 点のデジタル入出力を制御することが可能です PCI/CTP/CPZ-423108Q,PCI/CTP/CPZ-423208Q のみ最大 48 点可能です 3
第 2 章製品仕様 2.1 基本仕様 最大デバイス数最大転送速度送信バッファサイズ受信バッファサイズ 208 デバイスただし 以下のグループごとに最大 16 枚まで CSI-467201, CSI-467301, CSI-467401, PCI-4116, PCI-4171, PCI-4171S, LPC-467101, PEX-467101, CBI-4171, CBI-4171A, CBI-4171B, CBI-467101, CBI-467101WA, CBI-467101WB, PCI-4171FM, CSI-467201FM, CSI-467301FM, CSI-467401FM, LPC-467101FM, PCI-467101FM CPZ-467120, CSI-467120, PCI-467120, CTP-4158, PCI-4158, LPC-467120, PEX-467120, PCI-467120P, CTP-467120P, CPZ-467120P, PEX-H467120, PEX-H467120P CSI-467202, CSI-467302, CSI-467402, PCI-4159, CTP-4159, PCI-4172, PCI-4172FM, CTP-4172, CPZ-4172, LPC-467102, PEX-467102, PCI-467102P, CTP-467102P, CPZ-467102P, CPZ-4172FM, PEX-467102FM, PCI-467102FM, PEX-H467102, PEX-H467102P CPZ-423104Q, CPZ-423108Q, CPZ-423204Q, CPZ-423208Q PCI-423104Q, PCI-423108Q, PCI-423204Q, PCI-423208Q CTP-423104Q, CTP-423108Q, CTP-423204Q, CTP-423208Q 下記デバイスのみ 1 枚まで PCI-4172FMU PCI-4172, PCI-4172FM, PCI-4172FMU, CBI-4171, 4Mbps 1 CBI-4171A, CBI-4171B, CBI-467101, CBI-467101WA, CBI-467101WB, CTP/CPZ-4172, PCI-4171S, CSI-467201, CSI-467301, CSI-467401, CSI-467202, CSI-467302, CSI-467402, LPC-467101, LPC-467102,PEX-467101, PEX-467102, PCI/CTP/CPZ-467102P PCI/CTP/CPZ-423204Q, PCI/CTP/CPZ-423208Q CPZ-4172FM, PEX-467102FM, PCI-4171FM, CSI-467201FM, CSI-467301FM, CSI-467401FM, LPC-467101FM, PCI-467101FM, PCI-467102FM, PEX-H467102, PEX-H467102P PCI/CTP-4159 2Mbps PCI/CPZ/CSI-467120, PCI/CTP-4158, LPC-467120, 1Mbps PEX-467120, PCI/CTP/CPZ-423104Q, PCI/CTP/CPZ-423108Q PCI/CTP/CPZ-467120P, PEX-H467120, PEX-H467120P PCI-4116 RS-232C 1Mbps RS-485 2Mbps PCI-4171 RS-232C 1Mbps RS-485 4Mbps 1 2kB 128 本 ( 合計 256kB) 4kB 128 本 ( 合計 512kB) 4
イベント機能各イベントが発生した場合に アプリケーションにイベント通知することができます フレーム送信完了は 各フレームごとにイベントを設定することができます 1. HDLC フレーム受信時 2. 制御信号の変化時 3. HDLC フレームの送信完了時 4. アイドル検出時 ( ) 5. エラーフレーム受信時 ( ) 6. オーバーフローエラー発生時 ( 1) 7. オーバーランエラー発生時 ( 1) 8. HDLC モジュール異常発生時 ( 2) 1 PCI-4116, PCI/CTP-4158, PCI/CTP-4159 では使用できません また 対応型式でも製品のバージョンにより使用できません 2 HDLC モジュール製品のみ使用できます イベントマスク機能イベント要因ごとにマスク設定 / マスク解除することができます 1 FM0 FM1 符号化フォーマットの場合 内部クロックを使用する場合は 2Mbps まで 5
2.2 製品構成 製品構成 ファイル名 説明 弊社管理用ファイル GPC4116.VER 弊社ソフト管理用ファイル 最新情報ドキュメント README.HTM 最新ドキュメント掲載ファイル インストールプログラム SETUP.EXE インストール用ファイル 自己診断プログラム DIAGHDLC.EXE 自己診断プログラム HDLCUTIL.EXE 通信ユーティリティ サンプルプログラム Visual C#.NET Send データ送信サンプルプログラム Receive データ受信サンプルプログラム InPoint 汎用 DIO 入力サンプルプログラム OutPoint 汎用 DIO 出力サンプルプログラム Visual C++ Send データ送信サンプルプログラム Receive データ受信サンプルプログラム Event イベントサンプルプログラム SendMessage データ送信サンプルプログラム ReceiveMessage データ受信サンプルプログラム InPoint 汎用 DIO 入力サンプルプログラム InputByte 汎用 DIO Byte 入力サンプルプログラム OutPoint 汎用 DIO 出力サンプルプログラム OutputByte 汎用 DIO Byte 出力サンプルプログラム Visual Basic.NET Send データ送信サンプルプログラム Receive データ受信サンプルプログラム InPoint 汎用 DIO 入力サンプルプログラム OutPoint 汎用 DIO 出力サンプルプログラム Visual Basic Send データ送信サンプルプログラム Receive データ受信サンプルプログラム Event イベントサンプルプログラム SendMessage データ送信サンプルプログラム ReceiveMessage データ受信サンプルプログラム InPoint 汎用 DIO 入力サンプルプログラム InputByte 汎用 DIO Byte 入力サンプルプログラム OutPoint 汎用 DIO 出力サンプルプログラム OutputByte 汎用 DIO Byte 出力サンプルプログラム Delphi Send データ送信サンプルプログラム Receive データ受信サンプルプログラム Event イベントサンプルプログラム SendMessage データ送信サンプルプログラム ReceiveMessage データ受信サンプルプログラム InPoint 汎用 DIO 入力サンプルプログラム OutPoint 汎用 DIO 出力サンプルプログラム DLL FBIHDLC.DLL ダイナミックリンクライブラリファイル IFSDIO.DLL AMTLAN.DLL FBIHDLC.LIB インポートライブラリファイル IFSDIO.LIB MSVCRT.DLL C ランタイム共有 DLL 6
デバイスドライバ ヘッダファイル CP4116.SYS CP4170.SYS CP4230Q.SYS CP4231Q.SYS GPC41XX.INF GPC4230X.INF GPC4xxx.SLD CP4116.SYS GPC41XX.INF CP4116.VXD CP4170.VXD GPC41XX.INF FBIHDLC.H IFSDIO.H FBIHDLC.BAS IFSDIO.BAS FBIHDLC.PAS IFSDIO.PAS Windows 2000 以降の OS 用ドライバ GPC-4116 Help for Windows Windows 2000 以降の OS 用ドライバインストールファイル Windows Embedded 用ドライバ SLD ファイル Windows NT 4.0 用ドライバ Windows NT 4.0 用ドライバインストールファイル Windows Me/98/95 用ドライバ Windows Me/98/95 用ドライバインストールファイル Visual C++ 用ヘッダファイル Visual Basic 用ヘッダファイル Delphi 用ヘッダファイル ヘルプ HELP.PDF ヘルプ (PDF 形式 ) Visual C#.NET,Visual Basic.NET 用サンプルプログラムは それぞれ Viausl C#.NET 2003,Visual Basic.NET 2003 を使用して作成しています 7
第 3 章導入方法 3.1 インストール手順 README.HTM のインストール方法を参照してください 3.2 実行手順 (HDLC 通信部 ) 3.2.1 初期化インタフェースモジュール初期化情報構造体の各メンバに適切な値を設定し HdlcOpen 関数にて HDLC インタフェースモジュールを初期化します 第 1 引数には 型式 チャンネル RSW1 設定値により一意に定まるデバイス名を指定します デバイス名は RSW1 で決定されます 新たにインタフェースモジュールを追加しても RSW1 の設定を変更しない限り変わることはありません 同一デバイス名となるインタフェースモジュールを使用することはできません RSW1 の値を設定し それぞれが一意なデバイス名となるように設定してください タフコン / マザコン Classembly Devices に搭載されている PCI-467102FM の RSW1 の設定値は 0 で固定となっています デバイス名としては FBIHDLC49 FBIHDLC50 となります インタフェースモジュールを拡張される場合は デバイス名が重複しないように注意してください 型式 チャンネル RSW1 設定とデバイス名の対応は以下のとおりになります RSW1 型式チャンネル設定値 PCI-4116, PCI-4171, PCI-4171S, CBI-4171, CBI-4171A, CBI-4171B, CBI-467101, CBI-467101WA, CBI-467101WB, CSI-467201, CSI-467301, CSI-467401, LPC-467101, PEX-467101,LPC-467101FM, PCI-4171FM, PCI-467101FM PCI-4158, PCI-467120, CTP-4158, CPZ-467120, CSI-467120, LPC-467120, PEX-467120 PCI-467120P, CTP-467120P, CPZ-467120P PCI-4159, PCI-4172, PCI-4172FM, CTP-4159, CTP-4172, CPZ-4172, CPZ-4172FM, CSI-467202, CSI-467302, CSI-467402, CSI-467202FM, CSI-467302FM, CSI-467402FM, LPC-467102, PEX-467102, PEX-467102FM, PCI-467102P, CTP-467102P, CPZ-467102P, PCI-467102FM, PEX-H467102, PEX-H467102P PCI-4172FMU 0 デバイス名 0 1 FBIHDLC1 1 1 FBIHDLC2 F 1 FBIHDLC16 1 FBIHDLC17 0 2 FBIHDLC18 1 FBIHDLC19 1 2 FBIHDLC20 1 FBIHDLC47 F 2 FBIHDLC48 1 FBIHDLC49 0 2 FBIHDLC50 1 FBIHDLC51 1 2 FBIHDLC52 1 FBIHDLC79 F 2 FBIHDLC80 1 FBIHDLC49 2 FBIHDLC50 8
CPZ-423104Q, CPZ-423108Q, CPZ-423204Q, CPZ-423208Q, PCI-423104Q, PCI-423108Q, PCI-423204Q, PCI-423208Q CTP-423104Q, CTP-423108Q, CTP-423204Q, CTP-423208Q, CPZ-423104Q, CPZ-423204Q, PCI-423104Q,PCI-423204Q, CTP-423104Q, CTP-423204Q には チャンネル 5~8 は存在しません 1 FBIHDLC81 2 FBIHDLC82 0 8 FBIHDLC88 1 FBIHDLC89 2 FBIHDLC90 1 8 FBIHDLC96 1 FBIHDLC201 2 FBIHDLC202 F 8 FBIHDLC208 Windows NT 4.0 以外の OS では デバイスマネージャに FbiHdlc が追加され認識された通信ポートが一覧表示されます 一覧の製品型式の横にインタフェースモジュール上のロータリスイッチの値とデバイス名が表示されます 診断プログラム (DIAGHDLC.EXE) でも確認できます Windows NT 4.0 では 診断プログラム (DIAGHDLC.EXE) にて割り当てられたデバイス名をご確認ください 初期化が正常終了すると 戻り値としてデバイスハンドルが返されます 複数のポートを使用する場合は 各ポートに対して HdlcOpen 関数をコールし 初期化します 初期化したポートはアプリケーション終了の際には必ず終了処理 (HdlcClose 関数 ) をコールしてください 初期化パラメータについて補足 半二重ディレイ時間について (PCI-4116, PCI/CTP-4158, PCI/CTP-4159 は除く ) 半二重ディレイ時間 ( インタフェースモジュール初期化情報構造体の usendtiming, uclosetiming メンバ ) は 1 ビット時間の整数倍 (1~255) にしか設定できません そのため 所望の時間と異なるディレイ時間が設定される場合があります 例 ) ビットレート 1Mbps の場合 1 ビット時間 = 1 / 1000000 = 1 us ( 半二重ディレイ時間 ) = 1 us (1 ~ 255) 実際に設定されたディレイ時間は HdlcOpen 関数呼出し後 インタフェースモジュール初期化情報構造体の usendtiming もしくは uclosetiming を参照することで確認できます アドレスの扱いについて uaddressmode メンバにより受信フレームのフィルタリングを行うことができます uaddressmode メンバにより 受信フレームのどの部分をアドレスとして処理するかを指定し uaddress メンバにより 扱うアドレスの個数 および扱うアドレスを指定します (uaddress[0] に扱うアドレスの個数を指定し uaddress[1] から扱うアドレスを指定します ) 設定例 ) アドレス 01h アドレス 02h アドレス FFh を受信する場合 HDLCNPORTINITDATA PortInit; PortInit.uAddressMode = HDLC_ADDRESS_AUTO1; PortInit.uAddress[0] = 3; /* 扱うアドレスの個数は 3 */ PortInit.uAddress[1] = 0x01; /* アドレス 01h アドレス 02h アドレス FFh を受信する */ PortInit.uAddress[2] = 0x02; 9
PortInit.uAddress[3] = 0xFF; Dim PortInit As HDLCNPORTINITDATA PortInit.uAddressMode = HDLC_ADDRESS_AUTO1 PortInit.uAddress(0) = 3 扱うアドレスの個数は 3 PortInit.uAddress(1) = &H01 アドレス 01h アドレス 02h アドレス FFh を受信する PortInit.uAddress(2) = &H02 PortInit.uAddress(3) = &HFF var PortInit: HDLCNPORTINITDATA; PortInit.uAddressMode := HDLC_ADDRESS_AUTO1; PortInit.uAddress[0] := 3; // 扱うアドレスの個数は 3 PortInit.uAddress[1] := $01; // アドレス 01h アドレス 02h アドレス FFh を受信する PortInit.uAddress[2] := $02; PortInit.uAddress[3] := $FF; 構造体に値を設定した後に HdlcOpen 関数を呼び HDLC インタフェースモジュールの初期化を行います 初期化に成功したときデバイスハンドルが返されます 指定のデバイスが見つからない または初期化パラメータに誤りがあるとき 関数戻り値として INVALID_HANDLE_VALUE が返されます 受信について受信クロックを DPLL に設定している場合 同期ずれで正常に受信できない場合があります その場合 送信データのフレームの先頭に 2 つ以上フラグを挿入するようにしてください 3.2.2 送信 HDLC フレームを送信する際には HdlcSendFrame 関数を使用します HdlcSendFrame 関数では FCS 自動付加以外のデータ編集は行われず アプリケーションプログラムから渡されたデータ以外の送信は一切行いません アプリケーションはフレーム送信の完了まで待たず 関数から即制御が戻ります フレーム送信の完了は HdlcGetStatus 関数や イベントで確認することが出来ます HdlcGetStatus 関数でフレーム送信状況を確認する場合 HdlcGetStatus 関数をコールすることにより ポートステータス構造体 (HDLCNPORTSTATUS 構造体 ) に 現在の送受信状況が示されます ポートステータス構造体の usendframe メンバが 0 の場合 または usendfreeblock メンバが 128 の場合は 全てのフレームを送信したことになります 下記のようにすれば 全てのフレーム送信が完了するまで待つことができます 10
HDLCNPORTSTATUS PortStatus; LONG Ret; /* フレームを送信します */ Ret = HdlcSendFrame(hDevice, 1234567890, 10, 1, NULL); do { /* 送受信ステータスを取得します */ Ret = HdlcGetStatus(hDevice, &PortStatus); } while(portstatus.usendframe); Dim PortStatus As HDLCNPORTSTATUS Dim Ret As LONG フレームを送信します Ret = HdlcSendFrameString(hDevice, 1234567890, 10, 1, ByVal 0) do 送受信ステータスを取得します Ret = HdlcGetStatus(hDevice, PortStatus) Loop While PortStatus.uSendFrame > 0 var PortStatus:HDLCNPORTSTATUS; Ret: ULONG; Buffer: array[0..16] of byte; // フレームを送信します StrCopy(@Buffer[0], 1234567890 ); Ret := HdlcSendFrame(hDevice, @Buffer[0], 10, 1, nil); repeat // 送受信ステータスを取得します Ret := HdlcGetStatus(hDevice, PortStatus); until (PortStatus.uSendFrame = 0); 11
イベントでフレーム送信完了を検出する場合 HdlcSendFrame 関数呼び出し時 OVERLAPPED 構造体を指定することにより 送信完了時イベントがシグナル状態になります long Ret; DWORD dwret; OVERLAPPED soverlapped; ZeroMemory(&sOverlapped, sizeof(overlapped)); soverlapped.hevent = CreateEvent(NULL, TRUE, FALSE, NULL); /* フレームを送信します */ Ret = HdlcSendFrame(hDevice, 1234567890, 10, 1, &soverlapped); if(ret == FBIHDLC_ERROR_IO_PENDING) { dwret = WaitForSingleObject(sOverlapped.hEvent, 10000); if(dwret == WAIT_TIMEOUT) { printf( 送信完了のイベント待ちがタイムアウトしました ); } else if(dwret == WAIT_OBJECT_0) { printf( 送信完了イベントが発生しました ); } } CloseHandle(sOverlapped.hEvent); Dim Ret As Long Dim soverlapped As OVERLAPPED soverlapped.internal = 0 soverlapped.internalhigh = 0 soverlapped.offset = 0 soverlapped.offsethigh = 0 soverlapped.hevent = CreateEvent(0, TRUE, FALSE, 0) フレームを送信します Ret = HdlcSendFrameString(hDevice, 1234567890, 10, 1, soverlapped) If Ret = FBIHDLC_ERROR_IO_PENDING Then Ret = WaitForSingleObject(sOverlapped.hEvent, 10000) If Ret = WAIT_TIMEOUT Then MsgBox 送信完了のイベント待ちがタイムアウトしました ElseIf dwret = WAIT_OBJECT_0 Then MsgBox 送信完了イベントが発生しました End If End If CloseHandle soverlapped.hevent 12
var Ret: ULONG; soverlapped: Toverlapped; Buffer: array[0..16] of byte; ZeroMemory(@sOverlapped, SizeOf(Toverlapped)); soverlapped.hevent := CreateEvent(nil, TRUE, FALSE, nil); // フレームを送信します StrCopy(@Buffer[0], 1234567890 ); Ret := HdlcSendFrame(hDevice, 1234567890, 10, 1, @soverlapped); if Ret = FBIHDLC_ERROR_IO_PENDING then begin Ret := WaitForSingleObject(sOverlapped.hEvent, 10000); if Ret = WAIT_TIMEOUT then MessageDlg( 送信完了のイベント待ちがタイムアウトしました, mtinformation, [mbok], 0) else if Ret = WAIT_OBJECT_0 then MessageDlg( 送信完了イベントが発生しました, mtinformation, [mbok], 0); end; CloseHandle(sOverlapped.hEvent); フラグ数指定送信前に HdlcSetFlag 関数を実行することで フレームに任意の数だけリーディングフラグ / トレーリングフラグを付加して送信することができます 初期設定ではリーディングフラグ / トレーリングフラグは付加しません (0 個 ) リーディングフラグ n 個 n:0~255 フラグデータ FCS フラグ トレーリングフラグ n 個 フラグ数の設定は送信バッファが空の状態で行ってください また フレーム間にはマーク送信を指定 (HDLCNPORTINTIDATA 構造体の ulinemode に HDLC_TFIL_MARK を OR) してください フラグ送信を指定した場合 フレーム間にフラグが挿入されるため 必ずしも指定のフラグ数とはなりません 設定変更後 リーディングフラグ / トレーリングフラグを付加しない状態に戻すには 再度 HdlcSetFlag 関数でフラグ数を 0 に設定します フラグ数指定機能は FM 符号化対応製品でのみ使用できます PCI-4172FM, PCI-4172FMU, CPZ-4172FM, PEX-467102FM, PCI-4171FM, CSI-467202FM, CSI-467302FM, CSI-467402FM, LPC-467101FM, PCI-467101FM, PCI-467102FM 13
3.2.3 受信受信バッファ内に格納されているフレーム数を取得するには HdlcGetFrameCount 関数を使用し 受信バッファの先頭に格納されているフレームの長さを知るには HdlcGetFrameLength 関数を使用します 受信できる 1 フレームの最大サイズは 16384 バイトですので HdlcGetFrameLength 関数の第 2 引数に格納される値は 0~16384 となります ULONG ulframecount; ULONG ulframelength; LONG Ret; /* 受信フレーム数を取得します */ Ret = HdlcGetFrameCount(hDevice, &ulframecount); /* 受信フレーム長を取得します */ Ret = HdlcGetFrameLength(hDevice, &ulframelength); Dim ulframecount As Long Dim ulframelength As Long Dim Ret As Long 受信フレーム数を取得します Ret = HdlcGetFrameCount(hDevice, ulframecount) 受信フレーム長を取得します Ret = HdlcGetFrameLength(hDevice, ulframelength) var ulframecount: Integer; ulframelength: Integer; Ret: ULONG; // 受信フレーム数を取得します Ret := HdlcGetFrameCount(hDevice, ulframecount); // 受信フレーム長を取得します Ret := HdlcGetFrameLength(hDevice, ulframelength); HdlcReceiveFrame 関数を使用して受信バッファのデータを取り出します 受信データを格納する変数は HdlcGetFrameLength 関数で得られたサイズ以上のバッファを用意してください 取り出されたデータは受信バッファから削除されます FCS の自動検査によるデータの編集およびエラー等によるデータ削除を除き 受信された全てのフレームが受信バッファへ保持されます 14
エラーフレームの受信ポート初期化情報構造体 (HDLCNPORTINITDATA 構造体 ) の ulinemode で HDLC_ACCEPT_ERRORFRAME を指定することで エラーフレームを受信することができます (PCI-4116, PCI/CTP-4158, PCI/CTP-4159 はエラーフレームは全て破棄されます ) エラーフレームは以下のフレームが該当します エラーフレーム 内容 FCS エラーフレーム FCS が不正なフレーム ショートフレーム 1 バイトのフレーム ( フラグ,FCS 除く ) ロングフレーム 16385 バイト以上のフレーム ( フラグ,FCS 除く ) アボートフレーム 7 ビット以上 1 が連続したフレーム アドレス不一致フレーム 指定したアドレスが検出されなかったフレーム HdlcReceiveFrame 関数で取り出したフレームがエラーフレームの場合 戻り値として以下の値が返 されます エラーフレーム 戻り値 FCS エラーフレーム FBIHDLC_ERROR_FCSERRORFRAME ショートフレーム FBIHDLC_ERROR_SHORTFRAME ロングフレーム FBIHDLC_ERROR_LONGFRAME アボートフレーム FBIHDLC_ERROR_ABORTFRAME アドレス不一致フレーム FBIHDLC_ERROR_NOADDRESSFRAME BYTE Buffer[16384]; ULONG ulframecount, ulframelength; LONG Ret; /* 受信フレーム数を取得します */ Ret = HdlcGetFrameCount(hDevice, &ulframecount); if(ulframecount > 0) { /* 受信フレームを取り出します */ Ret = HdlcReceiveFrame(hDevice, Buffer, &ulframelength); switch(ret) { case FBIHDLC_ERROR_FCSERRORFRAME: printf( FCS error frame:\n ); break; case FBIHDLC_ERROR_SHORTFRAME: printf( short frame:\n ); break; case FBIHDLC_ERROR_LONGFRAME: printf( long frame:\n ); break; case FBIHDLC_ERROR_ABORTFRAME: printf( abort frame:\n ); break; case FBIHDLC_ERROR_NOADDRESSFRAME: printf( no address frame:\n ); break; case FBIHDLC_ERROR_SUCCESS: printf( normal frame:\n ); break; } } 15
Dim Buffer(16384) As Byte Dim ulframecount, ulframelength As Long Dim Ret As Long 受信フレーム数を取得し 受信フレームを取り出します Ret = HdlcGetFrameCount(hDevice, ulframecount) If ulframecount > 0 Then Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulframelength) Select Case Ret Case FBIHDLC_ERROR_FCSERRORFRAME MsgBox FCS error frame Case FBIHDLC_ERROR_SHORTFRAME MsgBox short frame Case FBIHDLC_ERROR_LONGFRAME MsgBox long frame Case FBIHDLC_ERROR_ABORTFRAME MsgBox abort frame Case FBIHDLC_ERROR_NOADDRESSFRAME MsgBox no address frame Case FBIHDLC_ERROR_SUCCESS MsgBox normal frame End Select End If var Buffer: array[0..16384] of Byte; ulframecount, ulframelength: Integer; Ret: ULONG; // 受信フレーム数を取得し 受信フレームを取り出します Ret := HdlcGetFrameCount(hDevice, ulframecount); if ulframecount > 0 then begin Ret := HdlcReceiveFrame(hDevice, @Buffer[0], ulframelength); case Ret of FBIHDLC_ERROR_FCSERRORFRAME: MessageDlg( FCS error frame, mtinformation, [mbok], 0); FBIHDLC_ERROR_SHORTFRAME: MessageDlg( short frame, mtinformation, [mbok], 0); FBIHDLC_ERROR_LONGFRAME: MessageDlg( long frame, mtinformation, [mbok], 0); FBIHDLC_ERROR_ABORTFRAME: MessageDlg( abort frame, mtinformation, [mbok], 0); FBIHDLC_ERROR_NOADDRESSFRAME: MessageDlg( no address frame, mtinformation, [mbok], 0); FBIHDLC_ERROR_SUCCESS: MessageDlg( normal frame, mtinformation, [mbok], 0); end; end; 16
3.2.4 制御信号出力状態の設定と取得 HdlcSetControlLine 関数を使用して制御信号の ON/OFF HdlcGetControlLine 関数を使用して制御信号の入力状態を取得することができます 0 が OFF 1 が ON となっています RS-232C での制御信号操作の例を示します インクルードファイル fbihdlc.h で各信号の値が定義されているので それを使用すると便利です 識別子 値 内容 HDLC_SSIG_ER 00000001h ER 信号 HDLC_SSIG_RS 00000002h RS 信号 /C 信号 HDLC_SSIG_DR 00000010h DR 信号 HDLC_SSIG_CD 00000020h CD 信号 HDLC_SSIG_CS 00000040h CS 信号 /I 信号 HDLC_SSIG_CI 00000080h CI 信号 ULONG ulcontrolline, uldeltaline; LONG Ret; /* RS-232C の場合 RS 信号と ER 信号を ON にします */ Ret = HdlcSetControlLine(hDevice, HDLC_SSIG_RS HDLC_SSIG_ER); /* 制御信号情報を取得します */ Ret = HdlcGetControlLine(hDevice, &ulcontrolline, &uldeltaline); Dim ulcontrolline As Long Dim uldeltaline As Long Dim Ret As Long RS-232C の場合 RS 信号と ER 信号を ON にします Ret = HdlcSetControlLine(hDevice, HDLC_SSIG_RS Or HDLC_SSIG_ER) 制御信号情報を取得します Ret = HdlcGetControlLine(hDevice, ulcontrolline, uldeltaline) var ulcontrolline: Integer; uldeltaline: Integer; Ret: ULONG; // RS-232C の場合 RS 信号と ER 信号を ON にします Ret := HdlcSetControlLine(hDevice, HDLC_SSIG_RS or HDLC_SSIG_ER); // 制御信号情報を取得します Ret := HdlcGetControlLine(hDevice, ulcontrolline, uldeltaline); 17
3.2.5 半二重制御半二重の設定は ポート初期化情報構造体 (HDLCNPORTINITDATA 構造体 ) の ulinemode メンバにより行います 半二重通信時は半二重ディレイ時間 ( インタフェースモジュール初期化情報構造体の usendtiming, uclosetiming メンバ ) を設定する必要があります RS-232C RS-485 送信前切り替え時間 (usendtiming) RS 信号を ON にしてからフレーム送信開始までの時間 ラインを送信に切り替えてからフレーム送信開始までの時間 ( ) 送信後切り替え時間 (uclosetiming) フレーム送信終了後 RS 信号を OFF にするまでの時間 フレーム送信終了後ラインを受信に切り替えるまでの時間 ( ) HDLC_LINE_HALF2 の場合はラインの切り替えと同時に C 信号の制御も行います RS-232C の半二重制御 ulinemode メンバに HDLC_LINE_HALF2 を指定します フレーム送信時に RS 信号を ON にし フレーム送信後に RS 信号を OFF にします 但し PCI-4171 ではリビジョン ID が 3 以上 PCI-467120 CPZ-467120 ではリビジョン ID が 2 以上の製品で RS 信号が自動的に制御されます リビジョン ID は HdlcCommonGetPciDeviceInfo 関数で取得できます RS-485 の半二重制御 (PCI-4116, PCI/CTP-4158, PCI/CTP-4159) RS-485 では 2 種類の半二重処理があります それぞれ ulinemode メンバに HDLC_LINE_HALF HDLC_LINE_HALF2 を指定します HDLC_LINE_HALF を指定した場合 アイドル検出と送受信ラインの切り替えを自動的に行います ただし C 信号の制御は行いません 送信クロックラインは utxcmode メンバにて設定します HDLC_LINE_HALF2 を指定した場合も アイドル検出と送受信ラインの切り替えを自動的に行います また フレーム送信前に C 信号を ON にし フレーム送信後に C 信号を OFF にします 送信クロックラインは utxcmode メンバにて設定します 設定例 ) 半二重通信 (C 信号の制御あり ) に設定 HDLCNPORTINITDATA PortInit; PortInit.uLineMode = HDLC_LINE_HALF2; PortInit.uTxcMode = HDLC_STOUT_NONE; /* 送信クロック : 出力しない */ PortInit.uSendTiming = 2; /* 送信前切り替え時間 :20ms */ PortInit.uCloseTiming = 10; /* 送信後切り替え時間 :100ms */ Dim PortInit As HDLCNPORTINITDATA PortInit.uLineMode = HDLC_LINE_HALF2 PortInit.uTxcMode = HDLC_STOUT_NONE 送信クロック : 出力しない PortInit.uSendTiming = 2 送信前切り替え時間 :20ms PortInit.uCloseTiming = 10 送信後切り替え時間 :100ms 18
var PortInit: HDLCNPORTINITDATA; PortInit.uLineMode := HDLC_LINE_HALF2; PortInit.uTxcMode := HDLC_STOUT_NONE; // 送信クロック : 出力しない PortInit.uSendTiming := 2; // 送信前切り替え時間 :20ms PortInit.uCloseTiming := 10; // 送信後切り替え時間 :100ms 半二重通信時の注意点として 受信クロックを外部で 半二重通信する時 ( 相手の送信クロックを使い受信する時 ) には 常に受信クロックが供給されるよう システムを設計してください 受信クロックが停止すると アイドル検出が出来ないため 送信が行えなくなります 受信クロックを DPLL にしたときには問題ありません RS-485 の半二重制御 (PCI-4116, PCI/CTP-4158, PCI/CTP-4159 以外 ) RS-485 では 2 種類の半二重処理があります それぞれ ulinemode メンバに HDLC_LINE_HALF HDLC_LINE_HALF2 を指定します HDLC_LINE_HALF を指定した場合 送受信ラインの切り替えを自動的に行います ただし C 信号の制御は行いません 送信クロックラインは utxcmode メンバにて設定します HDLC_LINE_HALF2 を指定した場合も 送受信ラインの切り替えを自動的に行います また フレーム送信前に C 信号を ON にし フレーム送信後に C 信号を OFF にします 送信クロックラインは utxcmode メンバにて設定します 設定例 ) 半二重通信 (C 信号の制御あり ) に設定 HDLCNPORTINITDATA PortInit; PortInit.uLineMode = HDLC_LINE_HALF2; PortInit.uTxcMode = HDLC_STOUT_NONE; /* 送信クロック : 出力しない */ PortInit.uSendTiming = 100 HDLC_TIME_MICRO_SEC; /* 送信前切り替え時間 :100us */ PortInit.uCloseTiming = 200 HDLC_TIME_MICRO_SEC; /* 送信後切り替え時間 :200us */ Dim PortInit As HDLCNPORTINITDATA PortInit.uLineMode = HDLC_LINE_HALF2 PortInit.uTxcMode = HDLC_STOUT_NONE 送信クロック : 出力しない PortInit.uSendTiming = 100 Or HDLC_TIME_MICRO_SEC 送信前切り替え時間 :100us PortInit.uCloseTiming = 200 Or HDLC_TIME_MICRO_SEC 送信後切り替え時間 :200us var PortInit: HDLCNPORTINITDATA; PortInit.uLineMode := HDLC_LINE_HALF2; PortInit.uTxcMode := HDLC_STOUT_NONE; // 送信クロック : 出力しない PortInit.uSendTiming := 100 or HDLC_TIME_MICRO_SEC; // 送信前切り替え時間 :100us PortInit.uCloseTiming := 200 or HDLC_TIME_MICRO_SEC; // 送信後切り替え時間 :200us 19
3.2.6 イベント処理以下のイベント要因が発生したとき アプリケーションに通知することができます HDLC フレームを受信したとき 制御信号が変化したとき HDLC フレームが送信完了したとき アイドルを検出したとき ( 1) エラーフレームを受信したとき ( 1) オーバーフロー オーバーランエラーが発生したとき ( 1) HDLC モジュールに異常が発生したとき ( 2) 1 PCI-4116, PCI/CTP-4158, PCI/CTP-4159 は使用できません 2 HDLC モジュール製品でのみ使用できます 要因により使用できるイベント処理が異なります シグナルイベント コールバック メッセージ フレーム受信 制御信号変化 フレーム送信完了 アイドル検出 エラーフレーム受信 オーバーフロー オーバーラン HDLC モジュール異常 シグナルイベント (HdlcEventRequestPending 関数を使用 ) での処理シグナルイベントを使用する場合 以下のように処理を行います ポートオープン (HdlcOpen) 割り込みマスクの設定 (HdlcSetEventMask) イベント待ちの開始 (HdlcEventRequestPending) 割り込みマスクの解除 (HdlcSetEventMask) ポートクローズ (HdlcClose) 20
処理例 ) フレーム受信イベントを待ちます int main(void) { HANDLE hdevice; LONG Ret; DWORD EventBuffer, dwret; OVERLAPPED soverlapped; HDLCNPORTINITDATA PortInit; /* ポート初期化構造体メンバへの代入処理省略 */ hdevice = HdlcOpen( FBIHDLC1, &PortInit); /* 割り込みマスク設定 */ Ret = HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0); } /* イベント待ち開始 */ ZeroMemory(&sOverlapped, sizeof(overlapped)); soverlapped.hevent = CreateEvent(NULL, TRUE, FALSE, NULL); Ret = HdlcEventRequestPending(hDevice, HDLC_RECEIVED_FRAME, &EventBuffer, &soverlapped); if(ret == FBIHDLC_ERROR_IO_PENDING) { dwret = WaitForSingleObject(sOverlapped.hEvent, 10000); if(dwret == WAIT_OBJECT_0) { /* フレーム受信処理 */ } } /* 割り込みマスク解除 */ Ret = HdlcSetEventMask(hDevice, 0, 0); Ret = HdlcClose(hDevice); CloseHandle(sOverlapped.hEvent); 21
Dim hdevice As Long Dim Ret As Long Dim EventBuffer As Long Dim soverlapped As OVERLAPPED Dim PortInit As HDLCNPORTINITDATA ポート初期化構造体メンバへの代入処理省略 hdevice = HdlcOpen( FBIHDLC1, PortInit) 割り込みマスク設定 Ret = HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0) イベント待ち開始 soverlapped.internal = 0 soverlapped.internalhigh = 0 soverlapped.offset = 0 soverlapped.offsethigh = 0 soverlapped.hevent = CreateEvent(0, TRUE, FALSE, 0) Ret = HdlcEventRequestPending(hDevice, HDLC_RECEIVED_FRAME, EventBuffer, soverlapped) If Ret = FBIHDLC_ERROR_IO_PENDING Then Ret = WaitForSingleObject(sOverlapped.hEvent, 10000) If Ret = WAIT_OBJECT_0 Then フレーム受信処理 End If End If 割り込みマスク解除 Ret = HdlcSetEventMask(hDevice, 0, 0) Ret = HdlcClose(hDevice) CloseHandle soverlapped.hevent 22
var hdevice: Thandle; Ret: ULONG; EventBuffer: Integer; PortInit: HDLCNPORTINITDATA; soverlapped: Toverlapped; // ポート初期化構造体メンバへの代入処理省略 hdevice := HdlcOpen( FBIHDLC1, PortInit); // 割り込みマスク設定 Ret := HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0); // イベント待ち開始 ZeroMemory(@sOverlapped, SizeOf(Toverlapped)); soverlapped.hevent := CreateEvent(nil, TRUE, FALSE, nil); Ret := HdlcEventRequestPending(hDevice, HDLC_RECEIVED_FRAME, EventBuffer, @soverlapped); if Ret = FBIHDLC_ERROR_IO_PENDING then begin Ret := WaitForSingleObject(sOverlapped.hEvent, 10000); if Ret = WAIT_OBJECT_0 then begin // フレーム受信処理 end; end; // 割り込みマスク解除 Ret := HdlcSetEventMask(hDevice, 0, 0); Ret := HdlcClose(hDevice); CloseHandle(sOverlapped.hEvent); 23
Window メッセージでの処理 Window メッセージを使用する場合 以下のように処理を行います ポートオープン (HdlcOpen) 割り込みマスクの設定 (HdlcSetEventMask) イベント待ち ( イベントが発生するとメッセージハンドラが呼び出されます ) 割り込みマスクの解除 (HdlcSetEventMask) ポートクローズ (HdlcClose) 処理例 ) フレーム受信イベントを待ちます (MFC での処理例 ) // メッセージハンドラの定義 BEGIN_MESSAGE_MAP(ChdlcPort, ClistView) ON_MESSAGE(WM_USER, OnMessage) END_MESSAGE_MAP() LRESULT ChdlcPort::OnMessage(WPARAM wparam, LPARAM lparam) { if(wparam == HDLC_RECEIVED_FRAME) { /* フレーム受信処理 */ } return 0; } void ChdlcPort::PortOpen(void) { HDLCNPORTINITDATA PortInit; LONG Ret; /* ポート初期化構造体メンバへの代入処理一部省略 */ PortInit.hWindowHandle = this->m_hwnd; /* ウィンドウハンドル */ PortInit.uWindowMessage = WM_USER; /* ウィンドウメッセージ */ hdevice = HdlcOpen( FBIHDLC1, &PortInit); } /* 割り込みマスク設定 */ Ret = HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0); void ChdlcPort::PortClose(void) { LONG Ret; /* 割り込みマスク解除 */ Ret = HdlcSetEventMask(hDevice, 0, 0); Ret = HdlcClose(hDevice); } 24
Win32 API declare Declare Function CallWindowProc Lib user32 Alias CallWindowProcA (ByVal lpprevwndfunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long Declare Function SetWindowLong Lib user32 Alias SetWindowLongA (ByVal hwnd As Long, ByVal nindex As Long, ByVal dwnewlong As Long) As Long constant declare Public Const GWL_WNDPROC = (-4) Public Const WM_USER = &H400 Public lpprevwndproc As Long Public ghw As Long Public hdevice As Long Address of revious window procedure Window handle Device handle Function WindowProc(ByVal hw As Long, ByVal umsg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long Dim nsize As Long Dim szdata As String * 16384 Dim nret As Long If umsg = WM_USER Then Select Case wparam Case HDLC_RECEIVED_FRAME Receive data nreceivedframe = 0 nsize = 0 nret = HdlcReceiveFrameString(hHdlcPort, szdata, nsize) : : : End If WindowProc = CallWindowProc(lpPrevWndProc, hw, umsg, wparam, lparam) End Function Private Sub Form_Load() ghw = Me.hwnd Hook window procedure lpprevwndproc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc) End Sub Private Sub Form_Unload(Cancel As Integer) Unhook window procedure nret = SetWindowLong(gHW, GWL_WNDPROC, lpprevwndproc) End Sub Private Sub PortOpen() Dim Ret As Long Dim EventBuffer As Long Dim soverlapped As OVERLAPPED 25
Dim PortInit As HDLCNPORTINITDATA PortInit.hWindowHandle = ghw PortInit.uWindowMessage = WM_USER ポート初期化構造体メンバへの代入処理省略 hdevice = HdlcOpen( FBIHDLC1, PortInit) 割り込みマスク設定 Ret = HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0) End Sub Private Sub PortClose() Dim Ret As Long 割り込みマスク解除 Ret = HdlcSetEventMask(hDevice, 0, 0) Ret = HdlcClose(hDevice) End Sub 26
// フォームの定義 type TMDIChild = class(tform) private procedure ReceiveMsg(var Message: Tmessage); message WM_USER; end; implementation procedure TMDIChild.ReceiveMsg(var Message: Tmessage); begin if Message.Wparam = HDLC_RECEIVED_FRAME then begin // フレーム受信処理 end; inherited; end; procedure TMDIChild.PortOpen(Sender: Tobject); var Ret: ULONG; PortInit: HDLCNPORTINITDATA; begin // ポート初期化 // 構造体メンバへの代入処理一部省略 PortInit.hWindowHandle := Handle; // ウィンドウハンドル PortInit.uWindowMessage := WM_USER; // ウィンドウメッセージ hdevice := HdlcOpen( FBIHDLC1, PortInit); // 割り込みマスク設定 Ret := HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0); end; procedure TMDIChild.PortClose(Sender: Tobject); var Ret: ULONG; begin // 割り込みマスク解除 Ret := HdlcSetEventMask(hDevice, 0, 0); Ret := HdlcClose(hDevice); end; 27
コールバックでの処理コールバックを使用する場合 以下のように処理を行います ポートオープン (HdlcOpen) 割り込みマスクの設定 (HdlcSetEventMask) イベント待ち ( イベントが発生するとコールバックルーチンが呼び出されます ) 割り込みマスクの解除 (HdlcSetEventMask) ポートクローズ (HdlcClose) 処理例 ) フレーム受信イベントを待ちます HANDLE hdevice; /* デバイスハンドル */ /* コールバックルーチン */ void EventHandler(ULONG EventFactor, ULONG Device) { if(eventfactor == HDLC_RECEIVED_FRAME) { /* フレーム受信処理 */ } } int main(void) { HDLCNPORTINITDATA PortInit; LONG Ret; /* ポート初期化構造体メンバへの代入処理一部省略 */ PortInit.lpCallBackProc = (LPHDLCCALLBACK)EventHandler; /* コールバックルーチン */ hdevice = HdlcOpen( FBIHDLC1, &PortInit); /* 割り込みマスク設定 */ Ret = HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0); /* 割り込みマスク解除 */ Ret = HdlcSetEventMask(hDevice, 0, 0); Ret = HdlcClose(hDevice); } return 0; 28
コールバックルーチン ( 標準モジュールで定義します ) Public Sub EventHandler(ByVal EventFactor As Long, ByVal Device As Long) If EventFactor = HDLC_RECEIVED_FRAME Then フレーム受信処理 End If End Sub Function ChangeAddressOf(ByVal Address As Long) As Long ChangeAddressOf = Address End Function Sub MainRoutine() Dim PortInit As HDLCNPORTINITDATA Dim Ret As Long ポート初期化 構造体メンバへの代入処理一部省略 PortInit.lpCallBackProc = ChangeAddressOf(AddressOf EventHandler) hdevice = HdlcOpen( FBIHDLC1, PortInit) 割り込みマスク設定 Ret = HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0) 割り込みマスク解除 Ret = HdlcSetEventMask(hDevice, 0, 0) Ret = HdlcClose(hDevice) End Sub 29
// コールバックルーチン procedure EventHandler(EventFactor: Integer; Device: Integer); begin if EventFactor = HDLC_RECEIVED_FRAME then begin // フレーム受信処理 end; end; var PortInit: HDLCNPORTINITDATA; Ret: ULONG; begin // ポート初期化 // 構造体メンバへの代入処理一部省略 PortInit.lpCallBackProc := Addr(EventHandler); // コールバックルーチン hdevice := HdlcOpen( FBIHDLC1, PortInit); // 割り込みマスク設定 Ret := HdlcSetEventMask(hDevice, HDLC_RECEIVED_FRAME, 0); // 割り込みマスク解除 Ret := HdlcSetEventMask(hDevice, 0, 0); Ret := HdlcClose(hDevice); end; 3.2.7 終了処理 HdlcClose 関数でポートの終了処理を行います ポートの使用を終了する際は必ず HdlcClose 関数を実行してください 30
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 デバイスであるかを確認することが出来ます 31
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 へ出力させる値がセットされていなければなりません 32
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 つ以上の要素が用意されていなければなりません 33
3.3.5 終了方法 1) STB 入力割り込み処理を登録している場合 割り込みを無効にしてから 登録している処理を解除します // STB 入力割り込みを解除 nret = SdioSetEventLogic( hdevicehandle, 0); // STB 入力割り込み時の処理を解除 nret = SdioSetEvent( hdevicehandle, NULL, 0, NULL, NULL, 0); 2) SdioOpen 関数で得たデバイスハンドルを用いてデバイスをクローズします nret = SdioClose( hdevicehandle ); 34
第 4 章リファレンス (HDLC 通信部 ) 4.1 関数一覧 No 関数名 機能 1 HdlcOpen ポートのオープンを行い 以後ポートへのアクセスを行えるようにします 2 HdlcClose ポートのクローズを行い ポートアクセスのために使用されていた各種リソースの解放を行い 以後ポートへのアクセスを禁止します 3 HdlcSendFrame フレームの送信を行います 4 HdlcGetFrameCount 受信しているフレームの数を取得します 5 HdlcGetFrameLength 受信バッファの先頭のフレームの長さを取得します 6 HdlcReceiveFrame 受信バッファの先頭のフレームを取得します 7 HdlcGetStatus 受信フレームの有無 送信中フレームの有無等を取得します 8 HdlcSetControlLine 制御信号の状態を変更します 9 HdlcGetControlLine 制御信号の状態を取得します 10 HdlcClearBuffer 送信バッファ 受信バッファをクリアします 11 HdlcSetEventMask イベントマスクの設定を行います 12 HdlcGetEventMask イベントマスクの取得を行います 13 HdlcEventRequestPending HDLC インタフェースモジュールからのイベントを待ちます 14 HdlcCheckIdle アイドル状態であるかチェックします 15 HdlcSetIdleTimer アイドル検出の検出時間を設定します 16 HdlcGetIdleTimer アイドル検出の検出時間を取得します 17 HdlcSetCableTermination 終端抵抗の設定します 18 HdlcGetCableTermination 終端抵抗設定を取得します 19 HdlcGetTmoduleStatus HDLC モジュールの接続状態を取得します 20 HdlcSetTmodulePower HDLC モジュールの電源を制御します 21 HdlcSetFlag リーディングフラグ / トレーリングフラグの数を設定します 22 HdlcGetFlag リーディングフラグ / トレーリングフラグの数を取得します 23 HdlcCommonGetPciDeviceInfo HDLC インタフェースモジュールのリソース情報を取得します 24 CallBackProc イベント発生によってコールされるコールバック関数のプレー スホルダです 35
4.2 関数個別説明 1. HdlcOpen 機能 HDLC インタフェースモジュールのオープンを行い 以後のインタフェースモジュールへのアクセスを行えるようにします 書式 (x86 専用 ) HANDLE HdlcOpen( LPCTSTR PHDLCNPORTINITDATA ); (x64 専用 ) HANDLE HdlcOpen( LPCSTR PHDLCNPORTINITDATA ); lpszname, pinitdata lpszname, pinitdata Declare Function HdlcOpen Lib "FbiHdlc.DLL"( _ ByVal lpszname As String, _ ByRef pinitdata As HDLCNPORTINITDATA _ ) As Long function HdlcOpen( lpszname: String; var pinitdata: HDLCNPORTINITDATA ):THandle; stdcall; external 'FbiHdlc.DLL'; パラメータ lpszname オープンするデバイス名を指定します pinitdata ポート初期化情報構造体 (HDLCNPORTINTIDATA 構造体 ) へのポインタを指定します 戻り値 関数が正常に終了した場合には 有効なハンドルが返されます 他の関数は 本関数により取得したハンドルを使用してデバイスの制御を行います オープンに失敗した場合には INVALID_HANDLE_VALUE(-1) が返されます 36
備考 UNICODE 文字列について C 言語 (x86 専用 ) で HdlcOpen の引数 lpszname に指定する文字列は LPCTSTR 型として定義していますが UNICODE 文字列には対応しておりません x86 環境でご使用になる場合 使用例に沿って記述してください 37
使用例 (x86 専用 ) HDLCNPORTINITDATA PortInit; HANDLE hdevice; /* ポート初期化 */ ZeroMemory(&PortInit, sizeof(hdlcnportinitdata)); PortInit.uLineMode = HDLC_LINE_HALF; /* 半二重 */ PortInit.uTxc = HDLC_SCLK_PTC; /* 送信内部クロック */ PortInit.uRxc = HDLC_RCLK_DPLL; /* 受信 DPLL */ PortInit.uSourceClock = HDLC_CLOCK_32000000; /* 内部クロック 32MHz */ PortInit.uBaudRate = 250000; /* 250kbps */ PortInit.uInterface = HDLC_INTERFACE_485; /* RS-485 */ PortInit.uFormat = HDLC_FORMAT_NRZI; /* 符号化フォーマット NRZI */ PortInit.uFcs = HDLC_FCS_16; /* FCS 生成多項式 ITUT FCS16 */ PortInit.uAddressMode = HDLC_ADDRESS_NONE; /* アドレス検出を行わない */ PortInit.uTxcMode = HDLC_STOUT_NONE; /* クロックを出力しない */ PortInit.uSendTiming = 100 HDLC_TIME_MICRO_SEC; /* 送信前切り替え時間 100us */ PortInit.uCloseTiming = 100 HDLC_TIME_MICRO_SEC; /* 送信後切り替え時間 100us */ hdevice = HdlcOpen((LPCTSTR)"FBIHDLC1", &PortInit); if(hdevice == INVALID_HANDLE_VALUE){ /* オープンに失敗 */ printf("fail to open the port\n"); } else { /* 実際に設定された送信前切り替え時間を表示 */ if(portinit.usendtiming & HDLC_TIME_MICRO_SEC) { printf("sendtiming = %ld us", (PortInit.uSendTiming & ~HDLC_TIME_MICRO_SEC)); } else { printf("sendtiming = %ld ms", PortInit.uSendTiming * 10); } } 38
(x64 専用 ) HDLCNPORTINITDATA PortInit; HANDLE hdevice; /* ポート初期化 */ ZeroMemory(&PortInit, sizeof(hdlcnportinitdata)); PortInit.uLineMode = HDLC_LINE_HALF; /* 半二重 */ PortInit.uTxc = HDLC_SCLK_PTC; /* 送信内部クロック */ PortInit.uRxc = HDLC_RCLK_DPLL; /* 受信 DPLL */ PortInit.uSourceClock = HDLC_CLOCK_32000000; /* 内部クロック 32MHz */ PortInit.uBaudRate = 250000; /* 250kbps */ PortInit.uInterface = HDLC_INTERFACE_485; /* RS-485 */ PortInit.uFormat = HDLC_FORMAT_NRZI; /* 符号化フォーマット NRZI */ PortInit.uFcs = HDLC_FCS_16; /* FCS 生成多項式 ITUT FCS16 */ PortInit.uAddressMode = HDLC_ADDRESS_NONE; /* アドレス検出を行わない */ PortInit.uTxcMode = HDLC_STOUT_NONE; /* クロックを出力しない */ PortInit.uSendTiming = 100 HDLC_TIME_MICRO_SEC; /* 送信前切り替え時間 100us */ PortInit.uCloseTiming = 100 HDLC_TIME_MICRO_SEC; /* 送信後切り替え時間 100us */ hdevice = HdlcOpen("FBIHDLC1", &PortInit); if(hdevice == INVALID_HANDLE_VALUE){ /* オープンに失敗 */ printf("fail to open the port\n"); } else { /* 実際に設定された送信前切り替え時間を表示 */ if(portinit.usendtiming & HDLC_TIME_MICRO_SEC) { printf("sendtiming = %ld us", (PortInit.uSendTiming & ~HDLC_TIME_MICRO_SEC)); } else { printf("sendtiming = %ld ms", PortInit.uSendTiming * 10); } } 39
Dim hdevice As Long Dim szmessage As String Dim PortInit As HDLCNPORTINITDATA ' ポート初期化 ' 構造体メンバへの代入処理省略 hdevice = HdlcOpen("FBIHDLC1", PortInit) If hdevice = -1 Then ' オープンに失敗 MsgBox("Fail to open the port") Else ' 実際に設定された送信前切り替え時間を表示 If (PortInit.uSendTiming AND HDLC_TIME_MICRO_SEC) <> 0 Then szmessage = "SendTiming = " & Str(PortInit.uSendTiming AND 65536) szmessage = szmessage & " us" Else szmessage = "SendTiming = " & Str(PortInit.uSendTiming * 10) & " ms" End If MsgBox(szMessage) End If 40
var hdevice: THandle; szmessage: String; S: String; PortInit: HDLCNPORTINITDATA; begin // ポート初期化 // 構造体メンバへの代入処理省略 hdevice := HdlcOpen('FBIHDLC2', PortInit); if hdevice = INVALID_HANDLE_VALUE then begin // オープンに失敗 MessageDlg('Fail to open the port', mtinformation, [mbok], 0); end else begin // 実際に設定された送信前切り替え時間を表示 if (PortInit.uSendTiming and HDLC_TIME_MICRO_SEC) <> 0 then begin Str(PortInit.uSendTiming and $FFFF,S); szmessage := 'SendTiming = ' + S; szmessage := szmessage + ' us'; end else begin Str(PortInit.uSendTiming * 10,S); szmessage := 'SendTiming = ' + S + ' us'; end; MessageDlg(szMessage, mtinformation, [mbok], 0); end; end; 41
2. HdlcClose 機能 ポートのクローズを行い ポートアクセスのために使用されていた各種リソースの解放を行い 以後のポートへのアクセスを禁止します 書式 LONG HdlcClose( HANDLE HDevice ); Declare Function HdlcClose Lib "FbiHdlc.DLL" ( _ ByVal HDevice As Long _ ) As Long function HdlcClose( hdevice: THandle ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice クローズするデバイスハンドルを指定します 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevice; HDLCNPORTINITDATA PortInit; LONG Ret; hdevice = HdlcOpen( FBIHDLC1, &PortInit); : : Ret = HdlcClose(hDevice); Dim hdevice As Long Dim PortInit As HDLCNPORTINITDATA Dim Ret As Long hdevice = HdlcOpen("FBIHDLC1", PortInit) : : Ret = HdlcClose(hDevice) 42
var hdevice: THandle; PortInit: HDLCNPORTINITDATA; Ret: Integer; hdevice := HdlcOpen('FBIHDLC1', PortInit); : : Ret := HdlcClose(hDevice); 43
3. HdlcSendFrame 機能 HDLC フレームの送信を行います 書式 LONG HdlcSendFrame( HANDLE hdevice, void *lpbuffer, ULONG ullength, ULONG ulendflag, LPOVERLAPPED lpoverlapped ); バイト型変数によるデータ送信を行う場合 Declare Function HdlcSendFrame Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef lpbuffer As Byte, _ ByVal ullength As Long, _ ByVal ulendflag As Long, _ ByRef lpoverlapped As OVERLAPPED _ ) As Long 文字列型変数によるデータ送信を行う場合 Declare Function HdlcSendFrameString Lib "FbiHdlc.DLL" Alias "HdlcSendFrame" ( ByVal hdevice As Long, ByVal lpbuffer As String, ByVal ullength As Long, ByVal ulendflag As Long, ByRef lpoverlapped As OVERLAPPED ) As Long function HdlcSendFrame( hdevice: THandle; lpbuffer: pointer; ullength: Integer; ulendflag: Integer; lpoverlapped: Poverlapped ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice データを送信するデバイスハンドルを指定してください lpbuffer 送信データ格納変数へのポインタを指定します (C 言語 Delphi) 送信データ格納変数を指定します (Visual Basic) ullength 送信データのサイズをバイト単位で指定します 44
ulendflag 続けて送信するフレームがあるかどうかを指定します 本パラメータは PCI-4116, PCI/CTP-4159 半二重通信時のみ有効です 値内容 0 続きのフレームがあるので データ送信が完了しても受信状態に移行しない 1 このフレームを送信し終わったら受信状態に移行する lpoverlapped フレーム送信後 イベントを発生させる場合は指定してください 使用しない場合は NULL または 0 を指定してください 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます 非同期で動作させる場合は FBIHDLC_ERROR_IO_PENDING を返します それ以外の値が返された場合については 戻り値一覧 をご参照ください 備考 にて文字列の送信を行う場合には HdlcSendFrameString 関数をご使用ください 文字列以外のデータを送信する場合には HdlcSendFrame 関数をご使用ください HdlcSendFrame 関数による送信が完了する以前に次の HdlcSendFrame 関数による送信を実行しても 終結フラグと次に送信するフレームの先頭フラグが共有されることはありません 終結フラグと先頭フラグは連続せずに間が出来ます フラグフィルに設定している場合 フラグは最低 3 つ ( 終結フラグと先頭フラグを含む ) 挿入されます 使用例 HANDLE hdevice; OVERLAPPED soverlapped; LONG Ret; ZeroMemory(&sOverlapped, sizeof(overlapped)); soverlapped.hevent = CreateEvent(NULL, TRUE, FALSE, NULL); Ret = HdlcSendFrame(hDevice, "1234567890", 10, 1, &soverlapped); if(ret == FBIHDLC_ERROR_IO_PENDING) { WaitForSingleObject(sOverlapped.hEvent, INFINITE); } CloseHandle(sOverlapped.hEvent); Dim hdevice As Long Dim soverlapped As OVERLAPPED Dim Ret As Long soverlapped.internal = 0 soverlapped.internalhigh = 0 soverlapped.offset = 0 soverlapped.offsethigh = 0 soverlapped.hevent = CreateEvent(0, True, False, 0) Ret = HdlcSendFrameString(hDevice, "1234567890", 10, 1, soverlapped) If Ret = FBIHDLC_ERROR_IO_PENDING Then WaitForSingleObject soverlapped.hevent, -1 45
End If CloseHandle soverlapped.hevent Var HDevice: THandle; soverlapped: OVERLAPPED; Ret: Integer; ZeroMemory(@sOverlapped, SizeOf(TOverLapped)); Soverlapped.hEvent := CreateEvent(nil, True, False, nil); Ret := HdlcSendFrame(hDevice, '1234567890', 10, 1, @soverlapped); if Ret = FBIHDLC_ERROR_IO_PENDING then begin WaitForSingleObject(sOverlapped.hEvent, -1); end; CloseHandle(Overlapped.hEvent); 10 バイトのフレームを送信します 46
4. HdlcGetFrameCount 機能 受信バッファ内に格納されているフレームの数を取得します 書式 LONG HdlcGetFrameCount( HANDLE hdevice, PULONG pulframecount ); Declare Function HdlcGetFrameCount Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pulframecount As Long _ ) As Long function HdlcGetFrameCount( hdevice: THandle; var pulframecount: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice 受信フレーム数を取得するデバイスハンドルを指定します pulframecount 受信フレーム数を返す変数へのポインタを指定します (C 言語 ) 受信フレーム数を返す変数を指定します (Visual Basic Delphi) 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevice; ULONG ulframecount, ulframelength; ULONG n; LONG Ret; BYTE Buffer[16384]; Ret = HdlcGetFrameCount(hDevice, &ulframecount); for(n = 0; n < ulframecount; n++) { Ret = HdlcReceiveFrame(hDevice, Buffer, &ulframelength); } 47
Dim hdevice As Long Dim ulframecount, ulframelength As Long Dim n As Long Dim Ret As Long Dim Buffer(16384) As Byte Ret = HdlcGetFrameCount(hDevice, ulframecount) For n = 0 To ulframecount - 1 Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulframelength) Next var hdevice: THandle; ulframecount: Integer; ulframelength: Integer; n: Integer; Ret: Integer; Buffer: array[0..16383] of Byte Ret := HdlcGetFrameCount(hDevice, ulframecount); for n := 0 to ulframecount - 1 do begin Ret := HdlcReceiveFrame(hDevice, @Buffer[0], ulframelength); end; 受信フレーム数を取得し 取得したフレーム分だけデータを取り出します 48
5. HdlcGetFrameLength 機能 受信フレームの先頭に格納されているフレームの長さを取得します (FCS は含まれません ) 書式 LONG HdlcGetFrameLength( HANDLE hdevice, PULONG pulframelength ); Declare Function HdlcGetFrameLength Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pulframelength As Long _ ) As Long function HdlcGetFrameLength( hdevice: THandle; var pulframelength: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice 受信フレーム数を取得するデバイスハンドルを指定します pulframelength 受信フレーム長を返す変数へのポインタを指定します (C 言語 ) 受信フレーム長を返す変数を指定します (Visual Basic Delphi) 単位はバイトで 0~16384 の値が返されます 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevice; ULONG ulframelength; LONG Ret; BYTE Buffer[16384]; Ret = HdlcGetFrameLength(hDevice, &ulframelength); if(ulframelength > 0) { Ret = HdlcReceiveFrame(hDevice, Buffer, &ulframelength); } 49
Dim hdevice As Long Dim ulframelength As Long Dim Ret As Long Dim Buffer(16384) As Byte Ret = HdlcGetFrameLength(hDevice, ulframelength) If ulframelength > 0 Then Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulframelength) End If var hdevice: THandle; ulframelength: Integer; Ret: Integer; Buffer: array[0..16383] of Byte Ret := HdlcGetFrameLength(hDevice, ulframelength); if ulframelength > 0 then begin Ret := HdlcReceiveFrame(hDevice, @Buffer[0], ulframelength); end; 受信バッファ内に残っている受信データサイズを取得し 受信フレームが 0 でなければ ( データが残っていれば ) 受信フレームを取り出します 50
6. HdlcReceiveFrame 機能 受信バッファに蓄えられた HDLC フレームを取り出します 書式 LONG HdlcReceiveFrame( HANDLE hdevice, void *lpbuffer, PULONG pullength ); バイト型変数によるデータ送信を行う場合 Declare Function HdlcReceiveFrame Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef lpbuffer As Byte, _ ByRef pullength As Long _ ) As Long 文字列型変数によるデータ送信を行う場合 Declare Function HdlcReceiveFrameString Lib "FbiHdlc.DLL" Alias "HdlcReceiveFrame" ( ByVal hdevice As Long, ByVal lpbuffer As String, ByRef pullength As Long ) As Long function HdlcReceiveFrame( hdevice: THandle; lpbuffer: pointer; var pullength: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice 受信データを取り出すデバイスハンドルを指定します lpbuffer 受信データを返す変数へのポインタを指定してください (C 言語 Delphi) 受信データを返す変数を指定してください (Visual Basic) HdlcGetFrameLength 関数で得られたサイズ以上のバッファを用意してください pullength lpbuffer へコピーされたバイト数が返されます 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 51
備考 Visual Basic にて文字列の受信を行う場合には HdlcReceiveFrameString 関数をご使用ください 文字列以外のデータを受信する場合には HdlcReceiveFrame 関数をご使用ください 文字列以外のデータを HdlcReceiveFrameString 関数で受信すると データ化けが起こります 受信するデータ型にあわせて関数をご使用ください 使用例 HANDLE hdevice; ULONG ulframecount, ulframelength; ULONG n; LONG Ret; BYTE Buffer[16384]; Ret = HdlcGetFrameCount(hDevice, &ulframecount); for(n = 0; n < ulframecount; n++) { Ret = HdlcReceiveFrame(hDevice, Buffer, &ulframelength); } Dim hdevice As Long Dim ulframecount, ulframelength As Long Dim n As Long Dim Ret As Long Dim Buffer(16384) As Byte Ret = HdlcGetFrameCount(hDevice, ulframecount) For n = 0 To ulframecount - 1 Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulframelength) Next var hdevice: THandle; ulframecount: Integer; ulframelength: Integer; n: Integer; Ret: Integer; Buffer: array[0..16383] of Byte Ret = HdlcGetFrameCount(hDevice, ulframecount); for n := 0 to ulframecount - 1 do begin Ret = HdlcReceiveFrame(hDevice, @Buffer[0], ulframelength); end; 受信フレーム数を取得し 取得したフレーム分だけデータを取り出します 52
7. HdlcGetStatus 機能 HDLC インタフェースモジュールの各種ステータスを取得します 取得できるステータスは フレーム受信の有無 受信バッファの残り容量 送信フレームの有無 送信バッファの残り容量になります 書式 LONG HdlcGetStatus( HANDLE PHDLCNPORTSTATUS ); hdevice, pportstatus Declare Function HdlcGetStatus Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pportstatus As HDLCNPORTSTATUS _ ) As Long function HdlcGetStatus( hdevice: THandle; var pportstatus: HDLCNPORTSTATUS ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice ステータスを取得するデバイスハンドルを指定します pportstatus ポートステータス構造体 (HDLCNPORTSTATUS 構造体 ) へのポインタを指定します (C 言語 ) ポートステータス構造体 (HDLCNPORTSTATUS 構造体 ) を指定します (Visual Basic Delphi) 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevice; HDLCNPORTSTATUS PortStatus; LONG Ret; BYTE Buffer[16384]; Buffer[0] = 0x02; Buffer[1] = 0x53; Ret = HdlcGetStatus(hDevice, &PortStatus); if(portstatus.usendfreeblock >= 1) { Ret = HdlcSendFrame(hDevice, Buffer, 2, 1, NULL); } 53
Dim hdevice As Long Dim PortStatus As HDLCNPORTSTATUS Dim Ret As Long Dim Buffer(16384) As Byte Buffer(0) = &H02 Buffer(1) = &H53 Ret = HdlcGetStatus(hDevice, PortStatus) If PortStatus.uSendFreeBlock >= 1 Then Ret = HdlcSendFrame(hDevice, Buffer(0), 2, 1, ByVal 0) End If var hdevice: THandle; PortStatus: HDLCNPORTSTATUS; Ret: Integer; Buffer: array[0..16383] of Byte; Buffer[0] := $02; Buffer[1] := $53; Ret := HdlcGetStatus(hDevice, PortStatus); if PortStatus.uSendFreeBlock >= 1 then begin Ret := HdlcSendFrame(hDevice, @Buffer[0], 2, 1, nil); end; 送信バッファが空であることを確認し フレーム送信を行います 54
8. HdlcSetControlLine 機能 HDLC インタフェースモジュールの制御信号の出力状態を変更します 書式 LONG HdlcSetControlLine( HANDLE hdevice, DWORD dwcontrolline ); Declare Function HdlcSetControlLine Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal dwcontrolline As Long _ ) As Long function HdlcSetControlLine( hdevice: THandle; dwcontrolline: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice 制御信号出力状態を変更するデバイスハンドルを指定します dwcontrolline 制御信号情報を指定します bit31 bit1 bit0 ~bit2 RS-232C 無効 RS ER RS-485 無効 C 無効 0 = OFF 1 = ON 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevice; LONG Ret; Ret = HdlcSetControlLine(hDevice, 0x02); 55
Dim hdevice As Long Dim Ret As Long Ret = HdlcSetControlLine(hDevice, &H2) var hdevice: THandle; Ret: Integer; Ret := HdlcSetControlLine(hDevice, $02); RS 信号 (C 信号 ) を ON にします 56
9. HdlcGetControlLine 機能 HDLC インタフェースモジュールの制御信号の入力状態 出力状態を取得します 書式 LONG HdlcGetControlLine( HANDLE hdevice, PDWORD pdwcontrolline, PDWORD pdwchangeofcontrolline ); Declare Function HdlcGetControlLine Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pdwcontrolline As Long, _ ByRef pdwchangeofcontrolline As Long _ ) As Long function HdlcGetControlLine( hdevice: THandle; var pdwcontrolline: Integer; var pdwchangeofcontrolline: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice 制御信号情報を取得するデバイスハンドルを指定します pdwcontrolline 制御信号情報を返す変数へのポインタを指定します (C 言語 ) 制御信号情報を返す変数を指定します (Visual Basic Delphi) bit31 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 ~bit8 RS-232C 無効 CI CS CD DR 予約 予約 RS ER RS-485 無効 予約 I 予約 予約 予約 予約 C 予約 0 = OFF 1 = ON pdwchangeofcontrolline 制御信号の変化情報を返す変数へのポインタを指定します (C 言語 ) 制御信号の変化情報を返す変数へのポインタを指定します (Visual Basic Delphi) bit31 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 ~bit8 RS-232C 無効 CI CS CD DR 予約 予約 予約 予約 RS-485 無効 予約 I 予約 予約 予約 予約 予約 予約 0 = 変化なし 1 = 変化あり 57
戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 pdwchangeofcontrolline に状態の変化を返すためには HdlcSetEventMask 関数で制御信号の状態変化によるイベントのマスクを解除 ( アンマスク ) しておく必要があります pdwchangeofcontrolline の状態の変化とは HdlcSetEventMask 関数の制御信号による割り込みイベント発生の論理です 使用例 HANDLE hdevice; DWORD dwcontrolline, dwdeltaline; LONG Ret; Ret = HdlcGetControlLine(hDevice, &dwcontrolline, &dwdeltaline); Dim hdevice As Long Dim dwcontrolline As Long Dim dwdeltaline As Long Dim Ret As Long Ret = HdlcGetControlLine(hDevice, dwcontrolline, dwdeltaline) var hdevice: THandle; dwcontrolline: Integer; dwdeltaline: Integer; Ret: Integer; Ret := HdlcGetControlLine(hDevice, dwcontrolline, dwdeltaline); 制御信号情報を取得します 58
10. HdlcClearBuffer 機能 HDLC インタフェースモジュールの送受信バッファのクリアを行います 書式 LONG HdlcClearBuffer( HANDLE hdevice, ULONG ulclearbuffer ); Declare Function HdlcClearBuffer Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal ulclearbuffer As Long _ ) As Long function HdlcClearBuffer( hdevice: THandle; ulclearbuffer: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice バッファのクリアを行うデバイスハンドルを指定します ulclearbuffer クリアするバッファを指定します 識別子 値 内容 HDLC_CLEAR_SEND_BUFFER 1 送信バッファをクリアします HDLC_CLEAR_RECEIVE_BUFFER 2 受信バッファをクリアします 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 送信バッファのクリアは 送信データが通信コントローラに書き込まれる前でのみ行うことができます 通信コントローラに送信データが書き込まれた後ではクリアすることはできません ご注意ください 59
使用例 HANDLE hdevice; LONG Ret; Ret = HdlcClearBuffer(hDevice, HDLC_CLEAR_RECEIVE_BUFFER); Dim hdevice As Long Dim Ret As Long Ret = HdlcClearBuffer(hDevice, HDLC_CLEAR_RECEIVE_BUFFER) Var hdevice: Thandle; Ret: Integer; Ret := HdlcClearBuffer(hDevice, HDLC_CLEAR_RECEIVE_BUFFER); 受信バッファをクリアします 60
11. HdlcSetEventMask 機能 割り込みイベントマスクを設定します 書式 LONG HdlcSetEventMask( HANDLE hdevice, BYTE beventmask, BYTE beventconfig ); Declare Function HdlcSetEventMask Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal beventmask As Byte, _ ByVal beventconfig As Byte _ ) As Long function HdlcSetEventMask( hdevice: THandle; beventmask: byte; beventconfig: byte ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice イベントマスクを設定するデバイスハンドルを指定します beventmask イベント発生要因のマスク / アンマスクを設定するデータを指定します bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CI CS CD DR IDLE ERROR BOV RD RS-485 予約 I 予約 予約 IDLE ERROR BOV RD 0 = マスク ( イベントは発生しません ) 1 = アンマスク ( イベントが発生します ) CI CD DR CS I IDLE ERROR RD BOV = CI 信号の入力状態に変化があったとき = CD 信号の入力状態に変化があったとき = DR 信号の入力状態に変化があったとき = CS 信号の入力状態に変化があったとき = I 信号の入力状態に変化があったとき = アイドルを検出したとき = エラーフレームを受信したとき または HDLC モジュールに異常が発生したとき = データを受信し 受信バッファに格納し終わったとき = オーバーフローエラー オーバーランエラーが発生したとき 61
beventconfig イベント発生要因を指定します bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CI CS CD DR 予約予約予約予約 RS-485 予約 I 予約予約予約予約予約予約 0 制御信号の状態が OFF(0) から ON(1) でイベント発生 1 制御信号の状態が ON(1) から OFF(0) でイベント発生 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 1. エラーフレーム受信イベントは ポート初期化情報構造体 ulinemode メンバでエラーフレーム受信ビットを有効にした場合にのみ使用できます 2. アイドル検出イベントを使用するには予め HdlcSetIdleTimer 関数でアイドル検出時間を設定している必要があります 以下のインタフェースモジュールではアイドル検出イベントは使用できません PCI-4116 PCI/CTP-4158 PCI/CTP-4159 3. オーバーフローエラー オーバーランエラー発生イベントは PCI-4171 PCI-4171S PCI-4172 PCI-4172FMU PCI/CPZ/CSI-467120 CBI-4171 CBI-4171A CBI-4171B CBI-467101 CBI-467101WA CBI-467101WB CTP/CPZ-4172 CSI-467201 CSI-467301 CSI-467401 CSI-467202 CSI-467302 CSI-467402 LPC/PEX-467101 LPC/PEX-467102 LPC/PEX-467120 PCI/CTP/CPZ-467120P PCI/CTP/CPZ-467102P PEX-H467102 PEX-H467102P PEX-H467120 PEX-H467120P で使用できます 但し PCI-4171 PCI-4171S PCI-4172 ではリビジョン ID が 2 以上 CBI-4171 CBI-4171A CBI-4171B ではリビジョン ID が 3 以上の製品で使用できます リビジョン ID は HdlcCommonGetPciDeviceInfo 関数で取得できます 4. HDLC モジュールの異常発生イベントは HDLC モジュール製品 (PCI-423104Q PCI-423108Q PCI-423204Q PCI-423208Q CPZ-423104Q CPZ-423108Q CPZ-423204Q CPZ-423208Q CTP-423104Q CTP-423108Q CTP-423204Q CTP-423208Q) でのみ使用できます 使用例 HANDLE hdevice; LONG Ret; Ret = HdlcSetEventMask(hDevice, 0x40, 0x40); Dim hdevice As Long Dim Ret As Long Ret = HdlcSetEventMask(hDevice, &H40, &H40) var hdevice: THandle; Ret: Integer; Ret := HdlcSetEventMask(hDevice, $40, $40); CS 信号 (I 信号 ) の入力状態が ON から OFF になったときにイベントが発生するように設定します 62
12. HdlcGetEventMask 機能 割り込みイベントマスクを取得します 書式 LONG HdlcGetEventMask( HANDLE hdevice, PBYTE pbeventmask, PBYTE pbeventconfig ); Declare Function HdlcGetEventMask Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pbeventmask As Byte, _ ByRef pbeventconfig As Byte _ ) As Long function HdlcGetEventMask( hdevice: THandle; var pbeventmask: byte; var pbeventconfig: byte ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice イベントマスクを取得するデバイスハンドルを指定します pbeventmask イベント発生要因のマスク / アンマスクを格納する変数へのポインタを指定します (C 言語 ) イベント発生要因のマスク / アンマスクを格納する変数を指定します (Visual Basic Delphi) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CI CS CD DR IDLE ERROR BOV RD RS-485 予約 I 予約 予約 IDLE ERROR BOV RD 0 = マスク状態 ( イベントは発生しません ) 1 = アンマスク状態 ( イベントが発生します ) CI CD DR CS I IDLE ERROR RD BOV = CI 信号の入力状態に変化があったとき = CD 信号の入力状態に変化があったとき = DR 信号の入力状態に変化があったとき = CS 信号の入力状態に変化があったとき = I 信号の入力状態に変化があったとき = アイドルを検出したとき = エラーフレームを受信したとき または HDLC モジュールに異常が発生したとき = データを受信し 受信バッファに格納し終わったとき = オーバーフローエラー オーバーランエラーが発生したとき 63
pbeventconfig イベント発生要因の設定値を格納する変数へのポインタを指定します (C 言語 ) イベント発生要因の設定値を格納する変数を指定します (Visual Basic Delphi) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CI CS CD DR 予約 予約 予約 予約 RS-485 予約 I 予約 予約 予約 予約 予約 予約 0 制御信号の状態が OFF(0) から ON(1) でイベント発生 1 制御信号の状態が ON(1) から OFF(0) でイベント発生 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevice; BYTE beventmask, beventconfig; LONG Ret; Ret = HdlcGetEventMask(hDevice, &beventmask, &beventconfig); Dim hdevice As Long Dim beventmask As Byte Dim beventconfig As Byte Dim Ret As Long Ret = HdlcGetEventMask(hDevice, beventmask, beventconfig) var hdevice: THandle; beventmask: byte; beventconfig: byte; Ret: Integer; Ret := HdlcSetEventMask(hDevice, beventmask, beventconfig); イベントマスク情報を取得します 64
13. HdlcEventRequestPending 機能 HDLC インタフェースモジュールのイベント要求を待ちます 書式 LONG HdlcEventRequestPending( HANDLE hdevice, DWORD dweventmask, PDWORD pdweventbuffer, LPOVERLAPPED lpoverlapped ); Declare Function HdlcEventRequestPending Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal dweventmask As Long, _ ByRef pdweventbuffer As Long, _ ByRef lpoverlapped As OVERLAPPED _ ) As Long function HdlcEventRequestPending ( hdevice: THandle; dweventmask: Integer; var pdweventbuffer: Integer; lpoverlapped: Poverlapped ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice イベント要求を待つデバイスハンドルを指定してください dweventmask 待機するイベントの種類を指定します bit31~bit12 bit11 bit10 bit9 bit8 RS-232C 予約 PWR SAF OVR OVF RS-485 予約 PWR SAF OVR OVF bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CI CS CD DR IDLE ERROR 予約 RD RS-485 予約 I 予約 予約 IDLE ERROR 予約 RD 0 = 無効 1 = 有効 CI = CI 信号の入力状態に変化があったとき CD = CD 信号の入力状態に変化があったとき DR = DR 信号の入力状態に変化があったとき CS = CS 信号の入力状態に変化があったとき I = I 信号の入力状態に変化があったとき IDLE = アイドルを検出したとき ERROR = エラーフレームを受信したとき RD = データを受信し 受信バッファに格納し終わったとき 65
OVF OVR SAF PWR = オーバーフローエラーが発生したとき = オーバーランエラーが発生したとき = HDLC モジュールとのケーブル切断が発生したとき = HDLC モジュールの電源電圧に異常が発生したとき pdweventbuffer 発生したイベントを格納する変数へのポインタを指定します (C 言語 ) 発生したイベントを格納する変数を指定します (Visual Basic Delphi) ビットアサインは dweventmask と同じです lpoverlapped OVERLAPPED 構造体を指定します NULL を指定すると同期呼び出しとなり イベントが発生するまで関数から戻ってきません OVERLAPPED 構造体を指定すると非同期呼び出しとなり イベントが発生する前に戻り値 HDLC_ERROR_IO_PENDING で関数から戻ってきます WIN32API の WaitForSingleObject 等を使用し イベントの発生を待ってください 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます 非同期で動作させる場合は FBIHDLC_ERROR_IO_PENDING を返します それ以外の値が返された場合については 戻り値一覧 をご参照ください 備考 1. HdlcSetEventMask 関数でイベントマスクを有効にしないとイベントが発生しません この関数を使用する前に HdlcSetEventMask 関数でイベントマスクを設定してください 2. オーバーフローエラー オーバーランエラー発生イベントは PCI-4171 PCI-4171S PCI-4172 PCI-4172FMU PCI/CPZ/CSI-467120 CBI-4171 CBI-4171A CBI-4171B CBI-467101 CBI-467101WA CBI-467101WB CTP/CPZ-4172 CSI-467201 CSI-467301 CSI-467401 CSI-467202 CSI-467302 CSI-467402 LPC/PEX-467101 LPC/PEX-467102 LPC/PEX-467120 PCI/CTP/CPZ-467120P PCI/CTP/CPZ-467102P PEX-H467102 PEX-H467102P PEX-H467120 PEX-H467120P で使用できます 但し PCI-4171 PCI-4171S PCI-4172 ではリビジョン ID が 2 以上 CBI-4171 CBI-4171A CBI-4171B ではリビジョン ID が 3 以上の製品で使用できます リビジョン ID は HdlcCommonGetPciDeviceInfo 関数で取得できます 3. HDLC モジュールの異常発生イベントは HDLC モジュール製品 (PCI-423104Q PCI-423108Q PCI-423204Q PCI-423208Q CPZ-423104Q CPZ-423108Q CPZ-423204Q CPZ-423208Q CTP-423104Q CTP-423108Q CTP-423204Q CTP-423208Q) でのみ使用できます 4. WaitForSingleObject 関数の待ち時間を設定し タイムアウトが発生しても イベント要求は残っていますので HdlcEventRequestPending 関数を再実行する必要はありません < 正しい処理 > 1. HdlcEventRequestPending 関数でイベント要求を行う 2. WaitForSingleObject でイベントが発生するまで待つ 3. WaitForSingleObject がタイムアウトした場合 2. へ戻る 4. イベントに応じた処理を行う < 誤った処理 > 1. HdlcEventRequestPending 関数でイベント要求を行う 2. WaitForSingleObject でイベントが発生するまで待つ 3. WaitForSingleObject がタイムアウトした場合 1. へ戻る 4. イベントに応じた処理を行う 66
使用例 HANDLE hdevice; OVERLAPPED soverlapped; DWORD dweventbuffer, dwret; ULONG ulframelength; BYTE Buffer[16384]; LONG Ret; Ret = HdlcSetEventMask(hDevice, 0x01, 0x00); ZeroMemory(&sOverlapped, sizeof(overlapped)); soverlapped.hevent = CreateEvent(NULL, TRUE, FALSE, NULL); Ret = HdlcEventRequestPending(hDevice, 0x01, &dweventbuffer, &soverlapped); if(ret == FBIHDLC_ERROR_IO_PENDING) { dwret = WaitForSingleObject(sOverlapped.hEvent, INFINITE); Ret = HdlcReceiveFrame(hDevice, Buffer, &ulframelength); } CloseHandle(sOverlapped.hEvent); Dim hdevice As Long Dim soverlapped As OVERLAPPED Dim dweventbuffer As Long Dim ulframelength As Long Dim Buffer(16384) As Byte Dim Ret As Long Ret = HdlcSetEventMask(hDevice, &H1, &H0) soverlapped.internal = 0 soverlapped.internalhigh = 0 soverlapped.offset = 0 soverlapped.offsethigh = 0 soverlapped.hevent = CreateEvent(0, True, False, 0) Ret = HdlcEventRequestPending(hDevice, 1, dweventbuffer, soverlapped) If Ret = FBIHDLC_ERROR_IO_PENDING Then Ret = WaitForSingleObject(sOverlapped.hEvent, -1) Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulframelength) End If CloseHandle soverlapped.hevent 67
var hdevice: THandle; soverlapped: TOverlapped; dweventbuffer: Integer; ulframelength: Integer; Buffer: array[0..16383] of Byte; Ret: Integer; Ret := HdlcSetEventMask(hDevice, $01, $00); ZeroMemory(@sOverlapped, SizeOf(TOverLapped)); soverlapped.hevent := CreateEvent(nil, True, False, nil); Ret := HdlcEventRequestPending(hDevice, 1, dweventbuffer, @soverlapped); if Ret = FBIHDLC_ERROR_IO_PENDING then begin Ret := WaitForSingleObject(sOverlapped.hEvent, -1); Ret := HdlcReceiveFrame(hDevice, Buffer, ulframelength) end; CloseHandle(sOverlapped.hEvent); データ受信のイベント要求を待ちます 68
14. HdlcCheckIdle 機能 アイドル状態を取得します 書式 LONG HdlcCheckIdle( HANDLE hdevice, PULONG pulidlestatus ); Declare Function HdlcCheckIdle Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pulidlestatus As Long _ ) As Long function HdlcCheckIdle( hdevice: THandle; pulidlestatus: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice アイドル状態を取得するデバイスハンドルを指定します pulidlestatus アイドル状態を格納する変数へのポインタを指定します (C 言語 ) アイドル状態を格納する変数を指定します (Visual Basic Delphi) 識別子 値 内容 HDLC_IDLESTATE_INACTIVE 0 アイドル状態でない HDLC_IDLESTATE_ACTIVE 1 アイドル状態 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 本関数は以下のインタフェースモジュールでは使用できません PCI-4116 PCI/CTP-4158 PCI/CTP-4159 69
使用例 HANDLE hdevice; ULONG ulidlestatus; LONG Ret; Ret = HdlcCheckIdle(hDevice, &ulidlestatus); if(ulidlestatus == HDLC_IDLESTATE_ACTIVE) { Ret = HdlcSendFrame(hDevice, "1234567890", 10, 1, NULL); } Dim hdevice As Long Dim ulidlestatus As Long Dim Ret As Long Ret = HdlcCheckIdle(hDevice, ulidlestatus) If ulidlestatus = HDLC_IDLESTATE_ACTIVE Then Ret = HdlcSendFrameString(hDevice, "1234567890", 10, 1, ByVal 0) End If var hdevice: THandle; ulidlestatus: Integer; Ret: Integer; Ret := HdlcCheckIdle(hDevice, ulidlestatus); if ulidlestatus = HDLC_IDLESTATE_ACTIVE then begin Ret := HdlcSendFrame(hDevice, '1234567890', 10, 1, nil); end; アイドル状態か確認して フレーム送信を行います 70
15. HdlcSetIdleTimer 機能 アイドル検出の検出時間を設定します 書式 LONG HdlcSetIdleTimer( HANDLE hdevice, ULONG ulidletimer ); Declare Function HdlcSetIdleTimer Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal ulidletimer As Long _ ) As Long function HdlcSetIdleTimer( hdevice: THandle; ulidletimer: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice アイドル検出時間を設定するデバイスハンドルを指定します ulidletimer アイドル検出時間を us 単位で設定します 範囲は 0~16777215 です 0 に設定した場合 アイドル検出が無効になります 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 1. 本関数で指定した時間 マーク状態 ( 無通信状態 ) を検出するとアイドルとなりイベントを発生させることができます 2. 本関数は以下のインタフェースモジュールでは使用できません PCI-4116 PCI/CTP-4158 PCI/CTP-4159 71
使用例 HANDLE hdevice; LONG Ret; Ret = HdlcSetIdleTimer(hDevice, 1000000); Dim hdevice As Long Dim Ret As Long Ret = HdlcSetIdleTimer(hDevice, 1000000) var hdevice: THandle; Ret: Integer; Ret := HdlcSetIdleTimer(hDevice, 1000000); 1 秒間マーク状態が続くとアイドル検出イベントを発生させます 72
16. HdlcGetIdleTimer 機能 アイドル検出の検出時間を取得します 書式 LONG HdlcGetIdleTimer( HANDLE hdevice, PULONG pulidletimer ); Declare Function HdlcGetIdleTimer Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pulidletimer As Long _ ) As Long function HdlcGetIdleTimer( hdevice: THandle; var pulidletimer: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice アイドル検出時間を取得するデバイスハンドルを指定します pulidletimer アイドル検出時間を格納する変数へのポインタを指定します (C 言語 ) アイドル検出時間を格納する変数を指定します (Visual Basic Delphi) 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 本関数は以下のインタフェースモジュールでは使用できません PCI-4116 PCI/CTP-4158 PCI/CTP-4159 73
使用例 HANDLE hdevice; ULONG ulidletimer; LONG Ret; Ret = HdlcGetIdleTimer(hDevice, &ulidletimer); Dim hdevice As Long Dim ulidletimer As Long Dim Ret As Long Ret = HdlcGetIdleTimer(hDevice, ulidletimer) var hdevice: THandle; ulidletimer: Integer; Ret: Integer; Ret := HdlcGetIdleTimer(hDevice, ulidletimer); アイドル検出時間を取得します 74
17. HdlcSetCableTermination 機能 RS-485 終端設定します 書式 LONG HdlcSetCableTermination( HANDLE hdevice, BYTE btermination ); Declare Function HdlcSetCableTermination Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal btermination As Byte _ ) As Long function HdlcSetCableTermination( hdevice: THandle; btermination: byte ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice RS-485 終端設定を行うデバイスハンドルを指定します btermination RS-485 終端設定を指定します bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 予約 予約 RT ST I C R T 0 = 終端抵抗を挿入しません 1 = 終端抵抗を挿入します 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 75
備考 1. 本関数は以下の CardBus 製品のみ使用できます CBI-4171 CBI-4171A CBI-4171B CBI-467101 CBI-467101WA CBI-467101WB 2. CardBus 製品のリビジョン ID によっては 本関数で設定された終端設定値は電源を OFF するとクリアされます 下表の型式 リビジョン ID の製品では 電源を ON するごとに 本関数で終端設定する必要があります リビジョン ID は HdlcCommonGetPciDeviceInfo 関数で取得します 型式リビジョン ID CBI-4171 1 CBI-4171A 1 CBI-4171B 1 使用例 HANDLE hdevice; LONG Ret; Ret = HdlcSetCableTermination(hDevice, 0x2A); Dim hdevice As Long Dim Ret As Long Ret = HdlcSetCableTermination(hDevice, &H2A) var hdevice: THandle; Ret: Integer; Ret := HdlcSetCableTermination(hDevice, $2A); R, I, RT 端子に終端抵抗を挿入します 76
18. HdlcGetCableTermination 機能 RS-485 終端設定を取得します 書式 LONG HdlcGetCableTermination( HANDLE hdevice, PBYTE pbtermination ); Declare Function HdlcGetCableTermination Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pbtermination As Byte _ ) As Long function HdlcGetCableTermination( hdevice: THandle; var pbtermination: byte ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice RS-485 終端設定を取得するデバイスハンドルを指定します pbtermination RS-485 終端設定を格納する変数へのポインタを指定します (C 言語 ) RS-485 終端設定を格納する変数を指定します (Visual Basic Delphi) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 予約予約 RT ST I C R T 0 = 終端抵抗が挿入されていません 1 = 終端抵抗が挿入されています 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 本関数は以下の CardBus 製品のみ使用できます CBI-4171 CBI-4171A CBI-4171B CBI-467101 CBI-467101WA CBI-467101WB 77
使用例 HANDLE hdevice; BYTE btermination; LONG Ret; Ret = HdlcGetCableTermination(hDevice, &btermination); Dim hdevice As Long Dim btermination As Byte Dim Ret As Long Ret = HdlcGetCableTermination(hDevice, btermination) var hdevice: THandle; btermination: byte; Ret: Integer; Ret := HdlcGetCableTermination(hDevice, btermination); 終端抵抗設定を取得します 78
19. HdlcGetTmoduleStatus 機能 HDLC モジュールの接続状態を取得します 書式 LONG HdlcGetTmoduleStatus( HANDLE hdevice, PBYTE pbtmodulestatus ); Declare Function HdlcGetTmoduleStatus Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef pbtmodulestatus As Byte _ ) As Long function HdlcGetTmoduleStatus ( hdevice: THandle; var pbtmodulestatus: byte ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice HDLC モジュールの接続状態を取得するデバイスハンドルを指定します pbtmodulestatus HDLC モジュールの接続状態を格納する変数へのポインタを指定します (C 言語 ) HDLC モジュールの接続状態を格納する変数を指定します (Visual Basic Delphi) bit7 bit6 Bit5 bit4 bit3 bit2 bit1 bit0 予約 予約 PWRNG SAFNG 予約 予約 PWROK SAFOK SAFOK 1 現在 HDLC モジュールと接続されています 0 現在 HDLC モジュールと接続されていません PWROK 1 現在 HDLC モジュールの電源電圧は正常です 0 現在 HDLC モジュールの電源電圧が異常です SAFNG 1 前回の本関数実行時から今回の実行までに HDLC モジュールとの切断がありました 0 前回の本関数実行時から今回の実行までに HDLC モジュールとの切断はありませんでした PWRNG 1 前回の本関数実行時から今回の実行までに HDLC モジュールの電源電圧の異常がありました 0 前回の本関数実行時から今回の実行までに HDLC モジュールの電源電圧の異常はありませんでした 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 79
備考 本関数は HDLC モジュールでのみ使用できます PCI-423104Q PCI-423108Q PCI-423204Q PCI-423208Q CPZ-423104Q CPZ-423108Q CPZ-423204Q CPZ-423208Q CTP-423104Q CTP-423108Q CTP-423204Q CTP-423208Q 使用例 HANDLE hdevice; BYTE pbtmodulestatus; LONG Ret; Ret = HdlcGetTmoduleStatus(hDevice, & pbtmodulestatus); Dim hdevice As Long Dim pbtmodulestatus As Byte Dim Ret As Long Ret = HdlcGetTmoduleStatus(hDevice, pbtmodulestatus) Var hdevice: THandle; pbtmodulestatus: byte; Ret: Integer; Ret := HdlcGetTmoduleStatus(hDevice, pbtmodulestatus); HDLC モジュールの接続状態を取得します 80
20. HdlcSetTmodulePower 機能 HDLC モジュールの電源を制御します 書式 LONG HdlcSetTmodulePower( HANDLE hdevice, BYTE bsetpower ); Declare Function HdlcSetTmodulePower Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByVal bsetpower As Byte _ ) As Long function HdlcSetTmodulePower ( hdevice: THandle; bsetpower: Byte ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice HDLC モジュールの電源制御を行うデバイスハンドルを指定します bsetpower 電源状態を指定します 識別子 値 内容 HDLC_POWER_ON 1 HDLC モジュールの電源を ON にします HDLC_POWER_OFF 0 HDLC モジュールの電源を OFF にします 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 備考 本関数は HDLC モジュールでのみ使用できます PCI-423104Q PCI-423108Q PCI-423204Q PCI-423208Q CPZ-423104Q CPZ-423108Q CPZ-423204Q CPZ-423208Q CTP-423104Q CTP-423108Q CTP-423204Q CTP-423208Q 81
使用例 HANDLE hdevice; LONG Ret; Ret = HdlcSetTmodulePower(hDevice, HDLC_POWER_OFF); Dim hdevice As Long Dim Ret As Long Ret = HdlcSetTmodulePower (hdevice, HDLC_POWER_OFF) Var hdevice: Thandle; Ret: Integer; Ret := HdlcSetTmodulePower (hdevice, HDLC_POWER_OFF); HDLC モジュールの電源を OFF にします 82
21. HdlcSetFlag 機能 リーディングフラグ / トレーリングフラグの数を設定します 書式 LONG HdlcSetFlag( HANDLE hdevice, BYTE bleading, BYTE btrailing ); Declare Function HdlcSetFlag Lib FbiHdlc.DLL ( _ ByVal hdevice As Long, _ ByVal bleading As Byte, _ ByVal btrailing As Byte _ ) As Long function HdlcSetFlag( hdevice: THandle; bleading: Byte; btrailing: Byte ):Integer; stdcall; external FbiHdlc.DLL ; パラメータ hdevice フラグの数を設定するデバイスハンドルを指定します bleading リーディングフラグの数を指定します デフォルトでは 0( リーディングフラグ無し ) です btrailing トレーリングフラグの数を指定します デフォルトでは 0( トレーリングフラグ無し ) です 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます それ以外の値が返された場合については 戻り値一覧 をご参照ください 備考 フラグ数の設定は送信バッファが空の状態で行ってください また フレーム間にはマーク送信を指定 (HDLCNPORTINTIDATA 構造体の ulinemode に HDLC_TFIL_MARK を OR) してください フラグ送信を指定した場合 フレーム間にフラグが挿入されるため 必ずしも指定のフラグ数とはなりません 本関数は FM 符号化対応製品でのみ使用できます PCI-4172FM, PCI-4172FMU, CPZ-4172FM, PEX-467102FM, PCI-4171FM, CSI-467202FM, CSI-467302FM, CSI-467402FM, LPC-467101FM, PCI-467101FM, PCI-467102FM 83
使用例 HANDLE hdevice; HDLCNPORTINITDATA PortInit; LONG Ret; hdevice = HdlcOpen( FBIHDLC1, &PortInit); : : Ret = HdlcSetFlag(hDevice, 2, 2); Dim hdevice As Long Dim PortInit As HDLCNPORTINITDATA Dim Ret As Long hdevice = HdlcOpen( FBIHDLC1, PortInit) : : Ret = HdlcSetFlag(hDevice, 2, 2) var hdevice: THandle; PortInit: HDLCNPORTINITDATA; Ret: Integer; hdevice := HdlcOpen( FBIHDLC1, PortInit); : : Ret := HdlcSetFlag(hDevice, 2, 2); リーディングフラグ / トレーリングフラグをそれぞれ 2 つずつ付加します 84
22. HdlcGetFlag 機能 リーディングフラグ / トレーリングフラグの数を取得します 書式 LONG HdlcGetFlag( HANDLE hdevice, PBYTE pbleading, PBYTE pbtrailing ); Declare Function HdlcGetFlag Lib FbiHdlc.DLL ( _ ByVal hdevice As Long, _ ByRef pbleading As Byte, _ ByRef pbtrailing As Byte _ ) As Long function HdlcGetFlag( hdevice: THandle; var pbleading: Byte; var pbtrailing: Byte ):Integer; stdcall; external FbiHdlc.DLL ; パラメータ hdevice フラグの数を取得するデバイスハンドルを指定します pbleading リーディングフラグの数を格納する変数へのポインタを指定します (C 言語 ) リーディングフラグの数を格納する変数を指定します (Visual Basic Delphi) pbtrailing トレーリングフラグの数を格納する変数へのポインタを指定します (C 言語 ) トレーリングフラグの数を格納する変数を指定します (Visual Basic Delphi) 備考 本関数は FM 符号化対応製品でのみ使用できます PCI-4172FM, PCI-4172FMU, CPZ-4172FM, PEX-467102FM, PCI-4171FM, CSI-467202FM, CSI-467302FM, CSI-467402FM, LPC-467101FM, PCI-467101FM, PCI-467102FM 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます それ以外の値が返された場合については 戻り値一覧 をご参照ください 85
使用例 HANDLE hdevice; HDLCNPORTINITDATA PortInit; LONG Ret; PBYTE Leading; PBYTE Trailing; hdevice = HdlcOpen( FBIHDLC1, &PortInit); : : Ret = HdlcGetFlag(hDevice, &Leading, &Trailing); Dim hdevice As Long Dim PortInit As HDLCNPORTINITDATA Dim Ret As Long Dim Leading As Byte Dim Trailing As Byte hdevice = HdlcOpen( FBIHDLC1, PortInit) : : Ret = HdlcGetFlag(hDevice, Leading, Trailing) var hdevice: THandle; PortInit: HDLCNPORTINITDATA; Ret: Integer; Leading: Byte; Trailing: Byte; hdevice := HdlcOpen( FBIHDLC1, PortInit); : : Ret := HdlcGetFlag(hDevice, Leading, Trailing); リーディングフラグ / トレーリングフラグの数を取得します 86
23. HdlcCommonGetPciDeviceInfo 機能 HDLC インタフェースモジュールのリソース ( デバイス ID リソース情報 リビジョン ID 等 ) 情報を取得します 書式 LONG HdlcCommonGetPciDeviceInfo ( HANDLE hdevice, DWORD *dwdeviceid, DWORD *dwvendorid, DWORD *dwclasscode, DWORD *dwrevisionid, DWORD *dwbaseaddress0, DWORD *dwbaseaddress1, DWORD *dwbaseaddress2, DWORD *dwbaseaddress3, DWORD *dwbaseaddress4, DWORD *dwbaseaddress5, DWORD *dwsubsystemid, DWORD *dwsubsystemvendorid, DWORD *dwinterruptline, DWORD *dwboardid ); Declare Function HdlcCommonGetPciDeviceInfo Lib "FbiHdlc.DLL" ( _ ByVal hdevice As Long, _ ByRef dwdeviceid As Long, _ ByRef dwvendorid As Long, _ ByRef dwclasscode As Long, _ ByRef dwrevisionid As Long, _ ByRef dwbaseaddress0 As Long, _ ByRef dwbaseaddress1 As Long, _ ByRef dwbaseaddress2 As Long, _ ByRef dwbaseaddress3 As Long, _ ByRef dwbaseaddress4 As Long, _ ByRef dwbaseaddress5 As Long, _ ByRef dwsubsystemid As Long, _ ByRef dwsubsystemvendorid As Long, _ ByRef dwinterruptline As Long, _ ByRef dwboardid As Long _ ) As Long 87
function HdlcCommonGetStatisticalInformation ( hdevice: Thandle; var dwdeviceid: Integer; var dwvendorid: Integer; var dwclasscode: Integer; var dwrevisionid: Integer; var dwbaseaddress0: Integer; var dwbaseaddress1: Integer; var dwbaseaddress2: Integer; var dwbaseaddress3: Integer; var dwbaseaddress4: Integer; var dwbaseaddress5: Integer; var dwsubsystemid: Integer; var dwsubsystemvendorid: Integer; var dwinterruptline: Integer; var dwboardid: Integer ):Integer; stdcall; external 'FbiHdlc.DLL'; パラメータ hdevice リソース情報を取得するデバイスハンドルを指定します dwdeviceid デバイス ID データを格納する変数へのポインタを指定します (C 言語 ) デバイス ID データを格納する変数を指定します (Visual Basic Delphi) デバイスを区別するための ID です 弊社 PCI CompactPCI バス及び CardBus 用 HDLC 製品は 製品型式の数字部分 4 桁が適用されます PCI-4116 ならば 4116(16 進数では 1014h) CBI-467101 ならば 4671(16 進数では 123Fh) です PCI 製品 CompactPCI 製品や CardBus 製品を判別する必要がある場合 dwsubsystemid を参照して下さい デバイス ID から 下記割込みラインまでのデータは PCI Rev2.1 で規定される PCI バス用デバイスが持つデータです ボード ID は弊社のインタフェースモジュール上に実装される RSW1 の値であり PCI バス用デバイスが標準で実装するデータではありません dwvendorid ベンダ ID データを格納する変数へのポインタを指定します (C 言語 ) ベンダ ID データを格納する変数を指定します (Visual Basic Delphi) 弊社のベンダ ID は 1147h(16 進数 ) です dwclasscode クラスコードデータを格納する変数へのポインタを指定します (C 言語 ) クラスコードデータを格納する変数を指定します (Visual Basic Delphi) デバイスのクラスコードが格納されます PCI Rev2.1 で規定されている値が格納されます dwrevisionid リビジョン ID データを格納する変数へのポインタを指定します (C 言語 ) リビジョン ID データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールのリビジョン ID が格納されます 88
dwbaseaddress0 リソース 0 データを格納する変数へのポインタを指定します (C 言語 ) リソース 0 データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが占有する I/O または メモリ領域が格納されます dwbaseaddress1 リソース 1 データを格納する変数へのポインタを指定します (C 言語 ) リソース 1 データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが占有する I/O または メモリ領域が格納されます dwbaseaddress2 リソース 2 データを格納する変数へのポインタを指定します (C 言語 ) リソース 2 データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが占有する I/O または メモリ領域が格納されます dwbaseaddress3 リソース 3 データを格納する変数へのポインタを指定します (C 言語 ) リソース 3 データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが占有する I/O または メモリ領域が格納されます dwbaseaddress4 リソース 4 データを格納する変数へのポインタを指定します (C 言語 ) リソース 4 データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが占有する I/O または メモリ領域が格納されます dwbaseaddress5 リソース 5 データを格納する変数へのポインタを指定します (C 言語 ) リソース 5 データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが占有する I/O または メモリ領域が格納されます dwsubsystemid サブシステム ID データを格納する変数へのポインタを指定します (C 言語 ) サブシステム ID データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールのサブシステム ID が格納されます 4 桁製品 (PCI-4116 等 ) と 6 桁製品 (CBI-467101 等 ) ではサブシステム ID の bit 毎の意味が変わります 4 桁製品と 6 桁製品の区別方法 0h 4 桁製品 bit15~bit13 1h 6 桁製品 4 桁製品での PCI 製品 CompactPCI 製品 CardBus 製品か PCI Express 製品の判別方法 0h PCI 製品 1h CompactPCI 製品 bit11~bit8 2h CardBus 製品 3h PCI Express 製品 6 桁製品での PCI 製品 CompactPCI 製品 CardBus 製品か PCI Express 製品の判別方法 0h PCI 製品 1h CompactPCI 製品 bit12~bit10 2h CardBus 製品 3h PCI Express 製品 89
dwsubsystemvendorid サブシステムベンダ ID データを格納する変数へのポインタを指定します (C 言語 ) サブシステムベンダ ID データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールのサブシステム ID が格納されます dwinterruptline 割込みラインデータを格納する変数へのポインタを指定します (C 言語 ) 割込みラインデータを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュールが使用する割込みレベルが格納されます dwboardid ボード ID データを格納する変数へのポインタを指定します (C 言語 ) ボード ID データを格納する変数を指定します (Visual Basic Delphi) インタフェースモジュール上に実装されている RSW1 の値が格納されます CardBus カードでは CardBus ID 設定ユーティリティで設定した値が格納されます 備考 PCI-4172FMU で本関数を実行した場合 dwdeviceid dwvenderid dwsybsystemid dwboardid 以外は不定値が取得出来ます 戻り値 正常終了した場合は FBIHDLC_ERROR_SUCCESS が返されます FBIHDLC_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 90
使用例 HANDLE hdevice; LONG Ret; DWORD dwdeviceid; DWORD dwvendorid; DWORD dwclasscode; DWORD dwrevisionid; DWORD dwbaseaddress0; DWORD dwbaseaddress1; DWORD dwbaseaddress2; DWORD dwbaseaddress3; DWORD dwbaseaddress4; DWORD dwbaseaddress5; DWORD dwsubsystemid; DWORD dwsubsystemvendorid; DWORD dwinterruptline; DWORD dwboardid; Ret = HdlcCommonGetPciDeviceInfo( hdevice, &dwdeviceid, &dwvendorid, &dwclasscode, &dwrevisionid, &dwbaseaddress0, &dwbaseaddress1, &dwbaseaddress2, &dwbaseaddress3, &dwbaseaddress4, &dwbaseaddress5, &dwsubsystemid, &dwsubsystemvendorid, &dwinterruptline, &dwboardid ); 91
Dim hdevice As Long Dim Ret As Long Dim dwdeviceid As Long Dim dwvendorid As Long Dim dwclasscode As Long Dim dwrevisionid As Long Dim dwbaseaddress0 As Long Dim dwbaseaddress1 As Long Dim dwbaseaddress2 As Long Dim dwbaseaddress3 As Long Dim dwbaseaddress4 As Long Dim dwbaseaddress5 As Long Dim dwsubsystemid As Long Dim dwsubsystemvendorid As Long Dim dwinterruptline As Long Dim dwboardid As Long Ret = HdlcCommonGetPciDeviceInfo( hdevicehandle, dwdeviceid, dwvendorid, dwclasscode, dwrevisionid, dwbaseaddress0, dwbaseaddress1, dwbaseaddress2, _ dwbaseaddress3, dwbaseaddress4, dwbaseaddress5, _ dwsubsystemid, dwsubsystemvendorid, dwinterruptline, dwboardid _ ) var hdevice: THandle; Ret: Integer; dwdeviceid : Integer; dwvendorid : Integer; dwclasscode : Integer; dwrevisionid : Integer; dwbaseaddress0 : Integer; dwbaseaddress1 : Integer; dwbaseaddress2 : Integer; dwbaseaddress3 : Integer; dwbaseaddress4 : Integer; dwbaseaddress5 : Integer; dwsubsystemid : Integer; dwsubsystemvendorid : Integer; dwinterruptline : Integer; dwboardid : Integer; Ret := HdlcCommonGetPciDeviceInfo( hdevice, dwdeviceid, dwvendorid, dwclasscode, dwrevisionid, dwbaseaddress0, dwbaseaddress1, dwbaseaddress2, dwbaseaddress3, dwbaseaddress4, dwbaseaddress5, dwsubsystemid, dwsubsystemvendorid, dwinterruptline, dwboardid ); リソース情報を取得します 92
24. CallBackProc 機能 イベント発生によってコールされるコールバック関数のプレースホルダです 関数名はポート初期化情報構造体 (HDLCNPORTINITDATA 構造体 ) の lpcallbackproc メンバに渡した関数名となります 書式 (x86) void CallBackProc( DWORD uleventfactor, DWORD hdevicehandle ); (x64) void CallBackProc( DWORD uleventfactor, HANDLE hdevicehandle ); Declare Sub CallBackProc ( _ ByVal uleventfactor As Long, _ ByVal hdevicehandle As Long _ ) procedure CallBackProc( uleventfactor: hdevicehandle: ); stdcall; Integer; Integer 93
パラメータ uleventfactor コールバック関数を呼び出した割り込みイベント要因です bit31~bit12 bit11 bit10 bit9 bit8 RS-232C 予約 PWR SAF OVR OVF RS-485 予約 PWR SAF OVR OVF bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CI CS CD DR IDLE ERROR 予約 RD RS-485 予約 I 予約 予約 IDLE ERROR 予約 RD 0 = イベントは発生していません 1 = イベントが発生しました CI = CI 信号の入力状態に変化があったとき CD = CD 信号の入力状態に変化があったとき DR = DR 信号の入力状態に変化があったとき CS = CS 信号の入力状態に変化があったとき I = I 信号の入力状態に変化があったとき IDLE = アイドルを検出したとき ERROR = エラーフレームを受信したとき RD = データを受信し 受信バッファに格納し終わったとき OVF = オーバーフローエラーが発生したとき OVR = オーバーランエラーが発生したとき SAF = HDLC モジュールとのケーブル切断が発生したとき PWR = HDLC モジュールの電源電圧に異常が発生したとき hdevicehandle イベントが発生したデバイスハンドルです 戻り値 なし 94
4.3 構造体 1. HDLCNPORTINTIDATA 構造体ポートの初期化情報を設定する構造体です typedef struct { ULONG uformat; ULONG ufcs; ULONG uaddressmode; ULONG uaddress[13]; ULONG ulinemode; ULONG utxc; ULONG urxc; ULONG usourceclock; ULONG ubaudrate; ULONG uinterface; ULONG utxcmode; ULONG usendtiming; ULONG ucsignal; ULONG uclosetiming; HANDLE hwindowhandle; ULONG uwindowsmessage; LPHDLCCALLBACK lpcallbackproc; } HDLCNPORTINITDATA, *PHDLCNPORTINITDATA; Type HDLCNPORTINITDATA uformat ufcs uaddressmode uaddress(12) ulinemode utxc urxc usourceclock ubaudrate uinterface utxcmode usendtiming ucsignal uclosetiming hwindowhandle uwindowsmessage lpcallbackproc End Type As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long As Long 1999, 2009 Interface Corporation. All rights reserved. 95
type HDLCNPORTINITDATA = record uformat: Integer; ufcs: Integer; uaddressmode: Integer; uaddress: array[0..12] of Integer; ulinemode: Integer; utxc: Integer; urxc: Integer; usourceclock: Integer; ubaudrate: Integer; uinterface: Integer; utxcmode: Integer; usendtiming: Integer; ucsignal: Integer; uclosetiming: Integer; hwindowhandle: THandle; uwindowsmessage: Integer; lpcallbackproc: pointer; End Type メンバ uformat 説明 符号化フォーマットの種類を選択します 識別子 値 内容 HDLC_FORMAT_NRZI 0 NRZI HDLC_FORMAT_NRZ 1 NRZ HDLC_FORMAT_FM0 2 FM0 *1) HDLC_FORMAT_FM1 3 FM1 *1) FM0 FM1 を設定した際は 自動で送信クロックは内部クロック 受信クロッ クは外部クロック (RT から入力したクロック ) が設定されます *1) FM 符号化対応製品でのみ指定できます PCI-4172FM, PCI-4172FMU, CPZ-4172FM, PEX-467102FM, PCI-4171FM, CSI-467202FM, CSI-467302FM, CSI-467402FM, LPC-467101FM, PCI-467101FM, PCI-467102FM 96
ufcs uaddressmode uaddress FCS 生成多項式の種類を選択します 識別子 値 内容 HDLC_FCS_16 0 ITU-T( 旧 CCITT)16bit X 16 +X 12 +X 5 +1 HDLC_FCS_32 1 ITU-T( 旧 CCITT)32bit X 32 +X 26 +X 23 +X 22 +X 16 +X 12 +X 11 +X 10 +X 8 +X 7 +X 5 +X 4 +X 2 +X 1 +1) HDLC_FCS_ANSI16 2 ANSI 16bit X 16 +X 15 +X 2 +1 HDLC_FCS_16, HDLC_FCS_32 の CRC 演算器初期値はオール "1" です HDLC_FCS_ANSI16 の CRC 演算器初期値はオール "0" です HDLC_FCS_ANSI16 は PCI-4116, PCI/CTP-4158, PCI/CTP-4159 では使用できません アドレスの扱いを選択します 識別子 値 内容 HDLC_ADDRESS_NONE 0 アドレス検出は行わない ( 全てのフレームを受信する ) HDLC_ADDRESS_AUTO1 1 受信フレームの先頭のデータをアドレスとして処理する HDLC_ADDRESS_AUTO2 2 受信フレームの 2 バイト目をアドレスとして処理する HDLC_ADDRESS_AUTO3 3 受信フレームの先頭から 2 バイトをアドレスとして処理する HDLC_ADDRESS_AUTO2 は PCI-4116, PCI/CTP-4158, PCI/CTP-4159 のみ有効 検出するアドレスを指定します uladdress[0] に使用するアドレスの個数を代入し uladdress[1]~ にアドレスを代入してください uaddressmode が 0 の時は無効です 97
ulinemode 以下の3つの設定を行います 全二重/ 半二重の選択を行います 識別子 値 内容 HDLC_LINE_FULL 0 全二重 HDLC_LINE_HALF HDLC_LINE_HALF2 1 2 半二重モード RS 信号 (C 信号 ) は送信と同期させません 半二重モード RS 信号 (C 信号 ) と送信を同期させます RS-232C RS 信号を送信データと同期させます フレーム送信前に RS 信号を ON にし フレ ーム送信後 RS 信号を OFF にします RS-485 C 信号を送信データと同期させます フレーム送信前に C 信号を ON にし フレ ーム送信後 C 信号を OFF にします PCI-4171(RS-232C 使用時 ) ではリビジョン ID が 3 以上 PCI-467120 CPZ-467120 ではリビジョン ID が 2 以上の製品で HDLC_LINE_HALF2 を指定 して RS 信号の自動制御ができます リビジョン ID がこれら未満の製品では HDLC_LINE_HALF2 を指定しても RS 信号は自動的に制御されません RS 信号を制御する必要がある場合には HDLC_LINE_HALF に設定し HdlcSetControlLine 関数にて制御してください リビジョン ID は HdlcCommonGetPciDeviceInfo 関数で取得できます フラグ送信/ マーク送信の選択を行います 識別子 値 内容 HDLC_TFIL_FLAG 0 送信フレーム間のギャップ期間中 ( 終結フラグと次のフレームの先頭フラグの間 ) にフラグが挿入されます HDLC_TFIL_MARK 10000h 送信フレーム間のギャップ期間中 ( 終結フラグと次のフレームの先頭フラグの間 ) にマークが挿入されます エラーフレームを受信するかどうか選択します PCI-4116, PCI/CTP-4158, PCI/CTP-4159 は本パラメータは無効です 識別子 値 内容 HDLC_REJECT_ERRORFRAME 0 エラーフレームを破棄します HDLC_ACCEPT_ERRORFRAME 100000h エラーフレームを受信します 98
utxc urxc usourceclock ubaudrate uinterface 送信クロックの種類を選択します (uformat が HDLC_FORMAT_NRZI HDLC_FORMAT_NRZ のみ有効 ) 識別子 値 内容 HDLC_SCLK_PTC 1 内部クロック HDLC_SCLK_ST 2 外部クロック (ST から入力したクロック ) HDLC_SCLK_RT 4 外部クロック (RT から入力したクロック ) 符号化フォーマットを FM0,FM1 に設定した際は 自動で内部クロックに設定 されます 受信クロックの種類を選択します (uformat が HDLC_FORMAT_NRZI HDLC_FORMAT_NRZ のみ有効 ) 識別子 値 内容 HDLC_RCLK_RT 1 外部クロック (RT から入力したクロック ) HDLC_RCLK_DPLL 2 DPLL 符号化フォーマットを FM0,FM1 に設定した際は 自動で外部クロック (RT から 入力したクロック ) に設定されます ビットレート生成用クロックの種類を選択します 識別子 値 内容 HDLC_CLOCK_19660800 0 19.6608MHz HDLC_CLOCK_14745600 1 14.7456MHz HDLC_CLOCK_8192000 2 8.192MHz HDLC_CLOCK_32000000 3 32MHz HDLC_CLOCK_12288000 4 12.288MHz HDLC_CLOCK_36864000 5 36.864MHz HDLC_CLOCK_58982400 6 58.9824MHz HDLC_CLOCK_49152000 7 49.152MHz インタフェースモジュールにより サポートされているクロックが異なります ハードウェアマニュアルの ハードウェア仕様 基準クロック をご確認 下さい 通信速度を設定します RS-232C 128bps~1000000bps(1Mbps) RS-485 128bps~4000000bps(4Mbps) 符号化フォーマットを FM0,FM1 に設定する場合 内部クロック使 用する場合 128bps~2000000bps(2Mbps) です インタフェースモジュールにより 設定可能範囲が異なります 送信クロック 受信クロックとも外部クロックに設定された場合この設定値 は無視されます 物理インタフェースの種類を選択します 識別子 値 内容 HDLC_INTERFACE_232C 0 RS-232C HDLC_INTERFACE_485 1 RS-485 99
utxcmode usendtiming 送信クロック出力モードを指定します (RS-485 時のみ有効 ) 識別子 値 内容 HDLC_STOUT_NONE 0 常に出力しない HDLC_STOUT_ALWAYS 1 常に出力する HDLC_STOUT_SYNC 2 送信に同期させる ( 全二重時無効 ) 送信前切り替え時間を指定します (ulinemode が HDLC_LINE_HALF HDLC_LINE_HALF2 のみ有効 ) 製品型式 設定範囲 説明 PCI-4116, PCI/CTP-4158, PCI/CTP-4159 0~65535 10ms 単位で設定が可能です (0~655350ms) それ以外 0~199 10ms 単位で設定が可能です (0~1990ms) 設定できる最大時間は通信速度によって 以下のように変化します 設定できる最大時間 [s] = 255/ 通信速度 [bps] 設定したい時間が 1ms 未満の場合は 識別子 HDLC_TIME_MICRO_SEC をつかって 1μs 単位で設定することもできます 設定時間の例説明 30 30ms に設定 HDLC_TIME_MICRO_SEC 100 100μs に設定 時間の最小単位は 1/ 通信速度 [bps] になります 時間は最小単位で切り上げられます 設定時間に設定できる最大時間を超えた時間を設定すると 設定できる最大時間に変更されます 1μs 単位に設定した際の設定範囲は 0~999μs です ucsignal uclosetiming hwindowshandle uwindowsmessage lpcallbackproc RS 信号 (C 信号 ) の初期化時の状態を指定します 識別子 値 内容 HDLC_CSIG_OFF 0 OFF にします HDLC_CSIG_ON 1 ON にします 送信後切り替え時間を指定します (ulinemode が HDLC_LINE_HALF HDLC_LINE_HALF2 のみ有効 ) 設定可能範囲は usendtiming と同じです イベント発生時メッセージを送るウィンドウハンドルを指定します メッセージを使用しないときは NULL または 0 を指定します イベント発生時に送られるメッセージを指定します メッセージを使用しないときは 0 を指定します イベント発生時に呼び出されるコールバックルーチンへのポインタを指定します コールバックルーチンを使用しないときは NULL または 0 を指定します 100
2. HDLCNPORTSTATUS 構造体送受信の現在の状況を示す構造体です typedef struct { ULONG usendframe; ULONG usendfreeblock; ULONG ureceiveframe; ULONG ureceivefreeblock; } HDLCNPORTSTATUS, *PHDLCNPORTSTATUS; Type HDLCNPORTSTATUS usendframe usendfreeblock ureceiveframe ureceivefreeblock End Type As Long As Long As Long As Long type HDLCNPORTSTATUS = record usendframe: Integer; usendfreeblock: Integer; ureceiveframe: Integer; ureceivefreeblock: Integer; end; メンバ 説明 usendframe 送信待ちのフレーム数 (0~128 の値 ) usendfreeblock 空き送信ブロック数 (0~128 の値 ) ureceiveframe 受信しているフレーム数 (0~128 の値 ) ureceivefreeblock 空き受信ブロック (0~128 の値 ) 備考 HDLC インタフェースモジュールは最大 16384 バイトまでのフレームを受信することができますが 受信フレームのサイズに応じて使用されるブロック数が変化します 8 バイト以下のフレームは受信バッファを消費しません ( ドライバの内部では保持していますが インタフェースモジュール上の受信バッファは使用しません ) それ以上のフレームは 9 バイト目からが受信バッファに格納されます 101
受信バッファの容量は 524288 バイトですが 内部で各 4096 バイトのブロックで管理されています ひとつのブロックは 4096 バイトなので 4096 バイト以下のフレームを受信しても 4096 バイトのブロックをひとつ消費します また 10K バイトのフレームを受信した場合は 4096 バイト +4096 バイト +2048 バイト =10240 バイトとなり 3 ブロックを消費します 4096 バイト以下のフレームだけを連続で受信した場合 128 フレームを蓄えることができます 例 ) 順番に 4096 バイト 10240 バイト 7168 バイト 4096 バイトのフレームを受信したとき 受信バッファ内では以下のように格納されています 4096 バイト (10240-8) バイト (7168-8) バイト (4096-8) バイト (2048-8) バイト この場合 使用されている受信バッファは 7 ブロック (4096 7 = 28672 バイト ) 残りは 121 ブロック (4096 121 = 495616 バイト ) となります HdlcGetFrameCount で得られるフレーム数は 4 となり HdlcGetFrameLength で得られる先頭フレームのサイズは 2048 となります 102
4.4 戻り値一覧 エラー識別子値意味対処方法 FBIHDLC_ERROR_SUCCESS 0 正常終了 FBIHDLC_ERROR_NOT_DEVICE C0000001h ドライバが呼び出せま せん FBIHDLC_ERROR_INVALID_HANDLE C0000003h デバイスハンドルが正 しくありません FBIHDLC_ERROR_IO_PENDING C0000008h 非同期 I/O 操作が進行 中です FBIHDLC_ERROR_NOT_SUPPORTED C0000009h サポートしていない機能です FBIHDLC_ERROR_PARAMETER C0001001h 引数パラメータの値が不正です FBIHDLC_ERROR_NULL_POINTER C0001004h 引数に NULL ポインタが指定されています FBIHDLC_ERROR_USB_TIMEOUT C0001006h USB デバイスとの通信がタイムアウトしました FBIHDLC_ERROR_USBIO_FAILED C0001007h USB デバイスの実行に失 敗しました FBIHDLC_ERROR_FRAME_SIZE C0002000h 送 受信のサイズが異常です FBIHDLC_ERROR_BUFFER_FULL C0002001h 送信バッファに空きが ありません FBIHDLC_ERROR_NO_RESPONSE C0002002h 通信コントローラから の応答がありません FBIHDLC_ERROR_FCSERRORFRAME C0004000h FCS エラーフレームを受信しました FBIHDLC_ERROR_SHORTFRAME C0004001h SHORT フレームを受信し ました 指定されたデバイスが見つかりませんでした 指定しているデバイス名が存在するかどうかを確認してください 不正なデバイスハンドルで呼び出しを行おうとしました HdlcOpen 関数で返されたデバイスハンドルを使用してください Win32API の WaitForSingleObject() 等でイベントの完了を待つことができます API 関数に指定する値が不正もしくは範囲外です 再起動を行なうか DPC-0401 の IfUsbDevicePowerCtl 関数を使用し USB デバイスの電源を OFF ON して下さい IfUsbDevicePowerCtl 関数の使用方法は DPC-0401 の Help を参照してください 再起動を行なうか DPC-0401 の IfUsbDevicePowerCtl 関数を使用し USB デバイスの電源を OFF ON して下さい IfUsbDevicePowerCtl 関数の使用方法は DPC-0401 の Help を参照してください API 関数に指定する値が不正もしくは範囲外です 現在送信中のフレームの送信がおわり バッファに空きが出るまで待ってください HdlcClearBuffer 関数でバッファをクリアしてください インタフェースモジュールの故障が考えられます 弊社技術支援課までお問い合わせください 103
FBIHDLC_ERROR_LONGFRAME C0004002h LONG フレームを受信しました FBIHDLC_ERROR_ABORTFRAME C0004003h ABORT フレームを受信しました FBIHDLC_ERROR_NOADDRESSFRAME C0004004h 指定したアドレスが検出できないフレームを受信しました FBIHDLC_ERROR_TERMINAL C0006000h 端子台に異常があります 端子台の電源電圧に異常があるか 端子台が接続されていません または正しくない組み合わせの端子台が接続されています 正しい組み合わせの端子台を接続してください 104
第 5 章リファレンス ( 汎用 DIO 部 ) 5.1 関数一覧 No 関数名 機能 1 SdioOpen HDLC モジュールのデジタル入出力デバイスのオープンを行い 以後のアクセスを行えるようにします 2 SdioClose HDLC モジュールのデジタル入出力デバイスのクローズを行い アクセスのために使用されていた各種リソースの解放を行い 以後のアクセスを禁止します 3 SdioInputPoint 任意の点数の入力接点の状態を読み込みます 4 SdioOutputPoint 任意の点数の出力接点の出力を制御します 5 SdioInputByte 指定した 8 点の入力接点の状態を読み込みます (BYTE アクセス ) 6 SdioInputWord 指定した 16 点の入力接点の状態を読み込みます (WORD アクセス ) 7 SdioInputDword 指定した 32 点の入力接点の状態を読み込みます (DWORD アクセス ) 8 SdioOutputByte 指定した 8 点の出力接点の出力を制御します (BYTE アクセス ) 9 SdioOutputWord 指定した 16 点の出力接点の出力を制御します (WORD アクセス ) 10 SdioOutputDword 指定した 32 点の出力接点の出力を制御します (DWORD アクセス ) 11 SdioSetLatchLogic 入力信号をラッチする STB 信号の論理を指定します 12 SdioGetLatchLogic 入力信号をラッチする STB 信号の論理を取得します 13 SdioInputLatchPoint 任意の点数のラッチされた入力接点の状態を読み込みます 14 SdioInputLatchByte ラッチされた 8 点の入力接点の状態を読み込みます (BYTE アクセス ) 15 SdioInputLatchWord ラッチされた 16 点の入力接点の状態を読み込みます (WORD アクセス ) 16 SdioInputLatchDword ラッチされた 32 点の入力接点の状態を読み込みます (DWORD アクセス ) 17 SdioSetEvent STB 信号の変化による割り込みが発生したときに実行するイベントを指定します 18 SdioSetEventLogic STB 信号の割り込み発生論理を設定します 19 SdioGetEventLogic STB 信号の割り込み発生論理の設定を取得します 20 SdioGetTmoduleStatus HDLC モジュールの接続状態を取得します 21 SdioSetTmodulePower HDLC モジュールの電源を制御します 22 SdioCommonGetDeviceInfo デバイスのリソース情報を取得します 23 CallBackProc STB 信号の割り込み発生によってコールされるコールバック関 数のプレースホルダです 105
5.2 関数個別説明 1. SdioOpen 機能 HDLC モジュールのデジタル入出力デバイスのオープンを行い 以後のデバイスへのアクセスを行えるようにします Windows NT 以外の OS では デバイスマネージャ に IfSDio が追加され認識された弊社 HDLC モジュールのデジタル入出力デバイスが一覧表示されます 一覧の製品型式の横にインタフェースモジュール上の RSW1 の値とデバイス名が表示されます DI 入力ユーティリティ DO 出力ユーティリティでも確認できます デバイス名は使用するボード枚数やスロット位置の変更等でシステム構成が変化すると割り当てられる名前が変化する場合があります システム構成が変化する環境でご使用になる場合は デバイス名の指定が変更できるようにアプリケーションを作成ください 書式 HANDLE SdioOpen ( LPCTSTR ); lpszname Declare Function SdioOpen Lib "IfSdio.DLL"( ByVal lpszname As String )As Long function SdioOpen( lpszname: String ):THandle; stdcall; external 'IfSdio.DLL'; パラメータ lpszname オープンするデバイス名を指定します 戻り値 関数が正常に終了した場合には 有効なハンドルが返されます 他の関数は 本関数により取得したハンドルを使用してデバイスの制御を行います オープンに失敗した場合には INVALID_HANDLE_VALUE(-1) が返されます 106
使用例 HANDLE hdevicehandle; hdevicehandle = SdioOpen("IFSDIO1"); if(hdevicehandle == INVALID_HANDLE_VALUE){ /* オープンに失敗 */ printf("fail to open the port\n"); } Dim hdevicehandle As Long hdevicehandle = SdioOpen("IFSDIO1") If hdevicehandle = -1 Then ' オープンに失敗 MsgBox("Fail to open the port") End If var hdevicehandle: THandle; begin // ポート初期化 hdevicehandle := SdioOpen('IFSDIO1'); if hdevicehandle = INVALID_HANDLE_VALUE then begin // オープンに失敗 MessageDlg('Fail to open the port', mtinformation, [mbok], 0); end; end; デバイス名 "IFSDIO1" の HDLC モジュールのデジタル入出力デバイスをオープンし 変数 hdevicehandle にデバイスハンドルを返します 107
2. SdioClose 機能 HDLC モジュールのデジタル入出力デバイスのクローズを行い HDLC モジュールのデジタル入出力デバイスへアクセスのために使用されていた各種リソースの解放を行い 以後の HDLC モジュールのデジタル入出力デバイスへのアクセスを禁止します 書式 INT SdioClose( HANDLE ); hdevicehandle Declare Function SdioClose Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long ) As Long function SdioClose( hdevicehandle: Thandle ) : DWORD; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください 戻り値 SdioClose 関数は処理が正常終了した場合は IFSDIO_ERROR_SUCCESS が返されます 正常に処理が終了しなかった場合 IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 備考 再度 HDLC モジュールのデジタル入出力デバイスへのアクセスを行う場合にはオープン処理 (SdioOpen 関数 ) を呼び出してください 108
使用例 nret = SdioClose( hdevicehandle ); nret = SdioClose( hdevicehandle ) nret := SdioClose( hdevicehandle ); デバイスハンドル hdevicehandle の HDLC モジュールのデジタル入出力デバイスのクローズ処理を行います 109
3. SdioInputPoint 機能 任意の点数の入力接点の状態を読み込みます 指定した開始接点番号から 1 接点ずつ変数に格納されます 書式 LONG SdioInputPoint ( HANDLE PBYTE DWORD DWORD ); hdevicehandle, PbBuffer, DwStartNum, dwninputnum Declare Function SdioInputPoint Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef PbBuffer As Byte, ByVal DwStartNum As Long, ByVal dwninputnum As Long ) As Long function SdioInputPoint( HDeviceHandle: THandle; PbBuffer: pointer; DwStartNum: Integer; DwnInputNum: Integer ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください pbuffer デバイスから読み取ったデータを受け取るバッファを指すポインタです dwstartnum 入力開始接点番号 1~24 を指定してください 入力接点の指定と 信号は下記のように対応しています 接点番号 1 2 3 23 24 入力信号 IN1 IN2 IN3 IN23 IN24 1: Low レベル 0:High レベル 110
dwinputnum 入力接点数を指定してください 戻り値 SdioInputPoint 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 使用例 HANDLE hdevicehandle; LONG nret; BYTE bbuffer[8]; nret = SdioInputPoint( hdevicehandle, &bbuffer[0], 16, 8 ); Dim hdevicehandle As Long Dim nret As Long Dim bbuffer(8) As Byte nret = SdioInputPoint( hdevicehandle, bbuffer(0), 16, 8 ) Var hdevicehandle: THandle; nret: Integer; bbuffer: Array[0..7] of Byte; begin nret := SdioInputPoint( hdevicehandle, @bbuffer[0], 16, 8 ); end; デバイスハンドル hdevicehandle が示すデバイスの IN16~IN23 の状態を bbuffer[0...7] に入力します 111
4. SdioOutputPoint 機能 任意の点数の出力接点の出力を制御します 指定した開始接点番号から 1 接点づつ変数に格納されたデータで接点を制御します 書式 LONG SdioOutputPoint( HANDLE PBYTE DWORD DWORD ); hdevicehandle, pbbuffer, dwstartnum, dwoutputnum Declare Function SdioOutputPoint Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef pbbuffer As Byte, ByVal dwstartnum As Long, ByVal dwoutputnum As Long ) As Long function SdioOutputPoint ( hdevicehandle Thandle; pbbuffer pointer; dwstartnum DWORD; dwoutputnum DWORD ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください pbbuffer デバイスから出力させるデータを収めている変数へのポインタです dwstartnum 出力開始接点番号 1~24 を指定してください 出力接点の指定と 信号は下記のように対応しています 接点番号 1 2 3 23 24 出力信号 OUT1 OUT2 OUT3 OUT23 OUT24 1: Low レベル 0:High レベル 112
dwoutputnum 出力接点数を指定してください 戻り値 SdioOutputPoint 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 使用例 HANDLE hdevicehandle; LONG hret; BYTE bbuffer[8]; bbuffer[0] = 1; bbuffer[1] = 0; bbuffer[2] = 0; bbuffer[3] = 1; bbuffer[4] = 0; bbuffer[5] = 1; bbuffer[6] = 1; bbuffer[7] = 0; nret = SdioOutputPoint( hdevicehandle, &bbuffer[0], 16, 8 ); Dim hdevicehandle As Long Dim nret As Long Dim bbuffer(8) As Byte bbuffer(0) = 1 bbuffer(1) = 0 bbuffer(2) = 0 bbuffer(3) = 1 bbuffer(4) = 0 bbuffer(5) = 1 bbuffer(6) = 1 bbuffer(7) = 0 nret = SdioOutputPoint( hdevicehandle, bbuffer(0), 16, 8 ) 113
Var hdevicehandle: THandle; nret: Integer; bbuffer: array[0..7] of Byte begin bbuffer[0] := 1; bbuffer[1] := 0; bbuffer[2] := 0; bbuffer[3] := 1; bbuffer[4] := 0; bbuffer[5] := 1; bbuffer[6] := 1; bbuffer[7] := 0; nret := SdioOutputPoint( hdevicehandle, @bbuffer[0], 16, 8 ); end; デバイスハンドル hdevicehandle が示すデバイスの OUT16~OUT23 に bbuffer[0...7] の値を出力します 114
5. SdioInputByte 機能 接点 8 点分のデータを読み込み 1 バイト (8 ビット ) の変数に格納します 書式 LONG SdioInputByte ( HANDLE DWORD PBYTE ); hdevicehandle, dwinputno, pbvalue Declare Function SdioInputByte Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwinputno As Long, ByRef pbvalue As Byte ) As Long function SdioInputByte( hdevicehandle: Thandle; dwinputno: DWORD; var pbvalue: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno 読み込む接点を下記の識別子で指定します 定数 意味 IFSDIO_IN1_8 IN1~IN8 の 8 点分のデータを読み込みます IFSDIO_IN9_16 IN9~IN16 の 8 点分のデータを読み込みます IFSDIO_IN17_24 IN17~IN24 の 8 点分のデータを読み込みます pbvalue 読み込まれたデータを格納する変数へのポインタを指定してください 戻り値 SdioInputByte 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 115
備考 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IFSDIO_IN1_8 IN8 IN7 IN6 IN5 IN4 IN3 IN2 IN1 IFSDIO_IN9_16 IN16 IN15 IN14 IN13 IN12 IN11 IN10 IN9 IFSDIO_IN17_24 IN24 IN23 IN22 IN21 IN20 IN19 IN18 IN17 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; BYTE bvalue; nret = SdioInputByte( hdevicehandle, IFSDIO_IN1_8, &bvalue ); Dim hdevicehandle As Long Dim nret As Long Dim bvalue As Byte nret = SdioInputByte( hdevicehandle, IFSDIO_IN1_8, bvalue ) var hdevicehandle: THandle; nret: Integer; bvalue: Byte; begin nret := SdioInputByte( hdevicehandle, IFSDIO_IN1_8, bvalue ); end; デバイスハンドル hdevicehandle が示すデバイスの IN1~IN8 の状態を bvalue に入力します 116
6. SdioInputWord 機能 接点 16 点分のデータを読み込み 1 ワード (16 ビット ) の変数に格納します 書式 LONG SdioInputWord ( HANDLE DWORD PWORD ); hdevicehandle, dwinputno, pwvalue Declare Function SdioInputWord Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwinputno As Long, ByRef pwvalue As Integer ) As Long function SdioInputWord ( hdevicehandle: Thandle; dwinputno: DWORD; var pwvalue: Word ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno 読み込む接点を下記の識別子で指定します 定数意味 IFSDIO_IN1_16 IN1~IN16 の 16 点分のデータを読み込みます IFSDIO_IN17_32 IN17~IN32 の 16 点分のデータを読み込みます 24 点入力の端子台では IN25~IN32 のデータは取得できません またここのデータは全て 0 になります pwvalue 読み込まれたデータを格納する変数へのポインタを指定してください 戻り値 SdioInputWord 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 117
備考 データフォーマット 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit15 Bit14 Bit13 Bit2 Bit1 Bit0 IFSDIO_IN1_16 IN16 IN15 IN14 IN3 IN2 IN1 IFSDIO_IN17_32 IN32 IN31 IN30 IN19 IN18 IN17 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; WORD wvalue; nret = SdioInputWord( hdevicehandle, IFSDIO_IN1_16, &wvalue ); Dim hdevicehandle As Long Dim nret As Long Dim wvalue As Integer nret = SdioInputWord( hdevicehandle, IFSDIO_IN1_16, wvalue ) Var hdevicehandle: THandle; nret: Integer; wvalue: Word; Begin nret := SdioInputWord( hdevicehandle, IFSDIO_IN1_16, wvalue ); end; デバイスハンドル hdevicehandle が示すデバイスの IN1~IN16 の状態を wvalue に入力します 118
7. SdioInputDword 機能 接点 32 点分のデータを読み込み 1 ダブルワード (32 ビット ) の変数に格納します 書式 LONG SdioInputDword ( HANDLE DWORD PDWORD ); hdevicehandle, dwinputno, pdwvalue Declare Function SdioInputDword Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwinputno As Long, ByRef pdwvalue As Long ) As Long function SdioInputDword ( hdevicehandle: Thandle; dwinputno: DWORD; var pdwvalue: DWORD ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno 読み込む接点を下記の識別子で指定します 定数意味 IFSDIO_IN1_32 IN1~IN32 の 32 点分のデータを読み込みます 24 点入力の端子台では IN25~IN32 のデータは取得できません またここのデータは全て 0 になります pdwvalue 読み込まれたデータを格納する変数へのポインタを指定してください 戻り値 SdioInputDword 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 119
備考 データフォーマット 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit31 Bit30 Bit29 Bit2 Bit1 Bit0 IFSDIO_IN1_32 IN32 IN31 IN30 IN3 IN2 IN1 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; DWORD dwvalue; nret = SdioInputDword( hdevicehandle, IFSDIO_IN1_32, &dwvalue ); Dim hdevicehandle As Long Dim nret As Long Dim dwvalue As Long nret = SdioInputDword( hdevicehandle, IFSDIO_IN1_32, dwvalue ) Var hdevicehandle: THandle; nret: Integer; dwvalue: DWord; Begin nret := SdioInputDword( hdevicehandle, IFSDIO_IN1_32, dwvalue ); end; デバイスハンドル hdevicehandle が示すデバイスの IN1~IN32 の状態を dwvalue に入力します 120
8. SdioOutputByte 機能 接点 8 点分の出力を制御します 書式 LONG SdioOutputByte ( HANDLE DWORD BYTE ); hdevicehandle, dwoutputno, bvalue Declare Function SdioOutputByte Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwoutputno As Long, ByVal bvalue As Byte ) As Long function SdioOutputByte ( hdevicehandle: Thandle; dwoutputno: DWORD; bvalue: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwoutputno データを出力する接点を下記の識別子で指定します 定数 意味 IFSDIO_OUT1_8 OUT1~OUT8 の 8 点分のデータを出力します IFSDIO_OUT9_16 OUT9~OUT16 の 8 点分のデータを出力します IFSDIO_OUT17_24 OUT17~OUT24 の 8 点分のデータを出力します bvalue 指定した接点へ出力するデータを指定してください 戻り値 SdioOutputByte 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 121
備考 データフォーマット 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IFSDIO_OUT1_8 OUT8 OUT7 OUT6 OUT5 OUT4 OUT3 OUT2 OUT1 IFSDIO_OUT9_16 OUT16 OUT15 OUT14 OUT13 OUT12 OUT11 OUT10 OUT9 IFSDIO_OUT17_24 OUT24 OUT23 OUT22 OUT21 OUT20 OUT19 OUT18 OUT17 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; nret = SdioOutputByte( hdevicehandle, IFSDIO_OUT1_8, 0x12); Dim hdevicehandle As Long Dim nret As Long nret = SdioOutputByte( hdevicehandle, IFSDIO_OUT1_8, &h12 ) var ndevicehandle: THandle; hret: Integer; begin hret := SdioOutputByte( ndevicehandle, IFSDIO_OUT1_8, $12 ); end; デバイスハンドル hdevicehandle が示すデバイスの OUT1~OUT8 へ 12h を出力します 122
9. SdioOutputWord 機能 接点 16 点分の出力を制御します 書式 LONG SdioOutputWord ( HANDLE DWORD WORD ); hdevicehandle, dwoutputno, pwvalue Declare Function SdioOutputWord Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwoutputno As Long, ByVal pwvalue As Integer ) As Long function SdioOutputWord ( hdevicehandle: Thandle; dwoutputno: DWORD; pwvalue: Word ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno データを出力する接点を下記の識別子で指定します 定数意味 IFSDIO_OUT1_16 OUT1~OUT16 の 16 点分のデータを出力します IFSDIO_OUT17_32 OUT17~OUT32 の 16 点分のデータを出力します 24 点出力の端子台では OUT25~OUT32 から出力できません pwvalue 指定した接点へ出力するデータを指定してください 戻り値 SdioOutputWord 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 123
備考 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit15 Bit14 Bit13 Bit2 Bit1 Bit0 IFSDIO_OUT1_16 OUT16 OUT15 OUT14 OUT3 OUT2 OUT1 IFSDIO_OUT17_32 OUT32 OUT31 OUT30 OUT19 OUT18 OUT17 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; nret = SdioOutputWord( hdevicehandle, IFSDIO_OUT1_16, 0x1234 ); Dim hdevicehandle As Long Dim nret As Long nret = SdioOutputWord( hdevicehandle, IFSDIO_OUT1_16, &h1234 ) Var hdevicehandle: THandle; nret: Integer; Begin nret := SdioOutputWord( hdevicehandle, IFSDIO_OUT1_16, $1234 ); end; デバイスハンドル hdevicehandle が示すデバイスの OUT1~OUT16 へ 1234h を出力します 124
10. SdioOutputDword 機能 接点 32 点分の出力を制御します 書式 LONG SdioOutputDword ( HANDLE DWORD DWORD ); hdevicehandle, dwoutputno, dwvalue Declare Function SdioOutputDword Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwoutputno As Long, ByVal dwvalue As Long ) As Long function SdioOutputDword ( hdevicehandle: Thandle; dwoutputno: DWORD; dwvalue: DWORD ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwoutputno データを出力する接点を下記の識別子で指定します 定数意味 IFSDIO_OUT1_32 OUT1~OUT32 の 32 点分のデータを出力します 24 点出力の端子台では OUT25~OUT32 から出力できません dwvalue 指定した接点へ出力するデータを指定してください 戻り値 SdioOutputDword 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 125
備考 データフォーマット 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit31 Bit30 Bit29 Bit2 Bit1 Bit0 IFSDIO_OUT1_32 OUT32 OUT31 OUT30 OUT3 OUT2 OUT1 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; nret = SdioOutputDword( hdevicehandle, IFSDIO_OUT1_32, 0x123456); Dim hdevicehandle As Long Dim nret As Long nret = SdioOutputDword( hdevicehandle, IFSDIO_OUT1_32, &h123456 ) Var hdevicehandle: THandle; nret: Integer; Begin nret := SdioOutputDword( hdevicehandle, IFSDIO_OUT1_32, $123456 ); end; デバイスハンドル hdevicehandle が示すデバイスの OUT1~OUT32 へ 00123456h を出力します 126
11. SdioSetLatchLogic 機能 入力信号をラッチする STB 信号の論理を指定します 書式 LONG SdioSetLatchLogic ( HANDLE hdevicehandle, BYTE blatchlogic ); Declare Function SdioSetLatchLogic Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal blatchlogic As Byte ) As Long function SdioSetLatchLogic ( hdevicehandle: Thandle; blatchlogic: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください blatchlogic 入力信号をラッチする STB 信号の論理を以下の識別子で指定します 定数意味 IFSDIO_RISE_EDGE STB 信号の立ち上がりでラッチします IFSDIO_FALL_EDGE STB 信号の立ち下がりでラッチします 戻り値 SdioSetLatchLogic 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 備考 ラッチするエッジは立ち上がりと立ち下がりを両方同時に指定することもできます STB 信号の変化により割り込みを発生させることができますが この割り込みの設定とラッチの設定は独立して指定できます 127
使用例 HANDLE hdevicehandle; LONG nret; nret = SdioSetLatchLogic( hdevicehandle, IFSDIO_RISE_EDGE ); Dim hdevicehandle As Long Dim nret As Long nret = SdioSetLatchLogic( hdevicehandle, IFSDIO_RISE_EDGE ) Var hdevicehandle: THandle; nret: Integer; begin nret := SdioSetLatchLogic( hdevicehandle, IFSDIO_RISE_EDGE ); end; STB 信号の立ち上がりで入力信号をラッチするように設定します 128
12. SdioGetLatchLogic 機能 入力信号をラッチする STB 信号の論理を取得します 書式 LONG SdioGetLatchLogic ( HANDLE hdevicehandle, PBYTE pblatchlogic ); Declare Function SdioGetLatchLogic Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef pblatchlogic As Byte ) As Long function SdioGetLatchLogic ( hdevicehandle: Thandle; var pblatchlogic: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください pblatchlogic STB 信号の論理を格納する変数へのポインタを指定してください STB 信号の論理を以下の識別子で格納されます 定数意味 IFSDIO_RISE_EDGE STB 信号の立ち上がりでラッチします IFSDIO_FALL_EDGE STB 信号の立ち下がりでラッチします 戻り値 SdioGetLatchLogic 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 129
使用例 HANDLE hdevicehandle; BYTE blatchlogic; LONG nret; nret = SdioGetLatchLogic( hdevicehandle, &blatchlogic ); Dim hdevicehandle As Long Dim blatchlogic As Byte Dim nret As Long nret = SdioGetLatchLogic (hdevicehandle,blatchlogic) Var hdevicehandle: THandle; blatchlogic: byte; nret: Integer; begin nret := SdioGetLatchLogic (hdevicehandle, blatchlogic); end; STB 信号をラッチする論理を取得します 130
13. SdioInputLatchPoint 機能 任意の点数のラッチされた入力接点の状態を読み込みます 指定した開始接点番号から 1 接点ずつ変数に格納されます 書式 LONG SdioInputLatchPoint ( HANDLE hdevicehandle, PBYTE pbbuffer, DWORD dwstartnum, DWORD dwinputnum ); Declare Function SdioInputLatchPoint Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef pbbuffer As Byte, ByVal dwstartnum As Long, ByVal dwinputnum As Long ) As Long function SdioInputLatchPoint ( hdevicehandle: Thandle; pbbuffer: pointer; dwstartnum: Integer; dwinputnum: Integer ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください pbbuffer デバイスから読み取ったデータを受け取るバッファを指すポインタです dwstartnum 入力開始接点番号 1~24 を指定してください ピン IN/OUT1 が 1 に対応します dwinputnum 入力接点数を指定してください 入力接点の指定と 信号は下記のように対応しています 接点番号 1 2 3 23 24 入力信号 IN1 IN2 IN3 IN23 IN24 1: Low レベル 0:High レベル 131
戻り値 SdioInputLatchPoint 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 使用例 HANDLE hdevicehandle; LONG nret; BYTE bbuffer[8]; nret = SdioInputLatchPoint( hdevicehandle, &bbuffer[0], 16, 8 ); Dim hdevicehandle As Long Dim nret As Long Dim bbuffer(8) As Byte nret = SdioInputLatchPoint( hdevicehandle, bbuffer(0), 16, 8 ) Var hdevicehandle: THandle; nret: Integer; bbuffer: Array[0..7] of Byte; begin nret := SdioInputLatchPoint( hdevicehandle, @bbuffer[0], 16, 8 ); end; デバイスハンドル hdevicehandle が示すデバイスの IN16~IN23 の入力接点状態を bbuffer[0...7] へ返します 132
14. SdioInputLatchByte 機能 ラッチされた接点 8 点分のデータを読み込み 1 バイト (8 ビット ) の変数に格納します 書式 LONG SdioInputLatchByte ( HANDLE hdevicehandle, DWORD dwinputno, PBYTE pbvalue ); Declare Function SdioInputLatchByte Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwinputno As Long, ByRef pbvalue As Byte ) As Long function SdioInputLatchByte ( hdevicehandle: Thandle; dwinputno: DWORD; var pbvalue: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno 読み込む接点を下記の識別子で指定します 定数 意味 IFSDIO_IN1_8 IN1~IN8 の 8 点分のデータを読み込みます IFSDIO_IN9_16 IN9~IN16 の 8 点分のデータを読み込みます IFSDIO_IN17_24 IN17~IN24 の 8 点分のデータを読み込みます pbvalue 入力した接点状態を返す変数へのポインタ 戻り値 SdioInputLatchByte 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 133
備考 データフォーマット 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IFSDIO_IN1_8 IN8 IN7 IN6 IN5 IN4 IN3 IN2 IN1 IFSDIO_IN9_16 IN 6 IN15 IN14 IN13 IN12 IN11 IN10 IN9 IFSDIO_IN17_24 IN24 IN23 IN22 IN21 IN20 IN19 IN18 IN17 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; BYTE bvalue; nret = SdioInputLatchByte( hdevicehandle, IFSDIO_IN1_8, &bvalue ); Dim hdevicehandle As Long Dim nret As Long Dim bvalue As Byte nret = SdioInputLatchByte( hdevicehandle, IFSDIO_IN1_8, bvalue ) Var hdevicehandle: Thandle; nret: Integer; bvalue: Byte; begin nret := SdioInputLatchByte( hdevicehandle, IFSDIO_IN1_8, bvalue ); end; デバイスハンドル hdevicehandle が示すデバイスで STB 信号によってラッチされた IN1~IN8 の状態を bvalue に入力します 134
15. SdioInputLatchWord 機能 ラッチされた接点 16 点分のデータを読み込み 1 ワード (16 ビット ) の変数に格納します 書式 LONG SdioInputLatchWord ( HANDLE hdevicehandle, DWORD dwinputno, PWORD pwvalue ); Declare Function SdioInputLatchWord Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwinputno As Long, ByRef pwvalue As Integer ) As Long function SdioInputLatchWord ( hdevicehandle: Thandle; dwinputno: DWORD; var pwvalue: Word ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno 読み込む接点を下記の識別子で指定します 定数意味 IFSDIO_IN1_16 IN1~IN16 の 16 点分のデータを読み込みます IFSDIO_IN17_32 IN17~IN32 の 16 点分のデータを読み込みます 24 点入力の端子台では IN25~IN32 のデータは取得できません またここのデータは全て 0 になります pwvalue 読み込まれたデータを格納する変数へのポインタを指定してください 戻り値 SdioInputLatchWord 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合に 135
ついては 戻り値一覧 を参照してください 備考 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit15 Bit14 Bit13 Bit2 Bit1 Bit0 IFSDIO_IN1_16 IN16 IN15 IN14 IN3 IN2 IN1 IFSDIO_IN17_32 IN32 IN31 IN30 IN19 IN18 IN17 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; WORD wvalue; nret = SdioInputLatchWord( hdevicehandle, IFSDIO_IN1_16, &wvalue ); Dim hdevicehandle As Long Dim nret As Long Dim wvalue As Integer nret = SdioInputLatchWord( hdevicehandle, IFSDIO_IN1_16, wvalue ) Var hdevicehandle: THandle; nret: Integer; wvalue: Word; begin nret := SdioInputLatchWord( hdevicehandle, IFSDIO_IN1_16, wvalue ); end; デバイスハンドル hdevicehandle が示すデバイスで STB 信号によってラッチされた IN1~IN16 の状態を wvalue に入力します 136
16. SdioInputLatchDword 機能 ラッチされた接点 32 点分のデータを読み込み 1 ダブルワード (32 ビット ) の変数に格納します 書式 LONG SdioInputLatchDword ( HANDLE hdevicehandle, DWORD dwinputno, PDWORD pdwvalue ); Declare Function SdioInputLatchDword Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal dwinputno As Long, ByRef pdwvalue As Long ) As Long function SdioInputLatchDword ( hdevicehandle: Thandle; dwinputno: DWORD; var pdwvalue: DWORD ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください dwinputno 読み込む接点を下記の識別子で指定します 定数意味 IFSDIO_IN1_32 IN1~IN32 の 32 点分のデータを読み込みます 24 点入力の端子台では IN25~IN32 のデータは取得できません またここのデータは全て 0 になります pdwvalue 読み込まれたデータを格納する変数へのポインタを指定してください 戻り値 SdioInputLatchDword 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 137
備考 取得したデータは下記のようにビット毎に接点と対応しています ビット Bit31 Bit30 Bit29 Bit2 Bit1 Bit0 IFSDIO_IN1_32 IN32 IN31 IN30 IN3 IN2 IN1 1:Low レベル 0:High レベル 使用例 HANDLE hdevicehandle; LONG nret; DWORD dwvalue; nret = SdioInputLatchDword( hdevicehandle, IFSDIO_IN1_32, &dwvalue ); Dim hdevicehandle As Long Dim nret As Long Dim dwvalue As Long nret = SdioInputLatchDword( hdevicehandle, IFSDIO_IN1_32, dwvalue ) Var hdevicehandle: Thandle; nret: Integer; dwvalue: DWORD; begin nret := SdioInputLatchDword( hdevicehandle, IFSDIO_IN1_32, dwvalue ); end; デバイスハンドル hdevicehandle が示すデバイスで STB 信号によってラッチされた IN1~IN32 の状態を dwvalue に入力します 138
17. SdioSetEvent 機能 STB 信号の変化による割り込みが発生したときに実行するイベントを指定します 書式 (x86) LONG SdioSetEvent ( HANDLE HANDLE ULONG HANDLE LPSDIOCALLBACK DWORD ); (x64) LONG SdioSetEvent ( HANDLE HANDLE ULONG HANDLE LPSDIOCALLBACK PVOID ); hdevicehandle, hwindowhandle, ulwindowsmessage, heventhandle, pcallbackproc, dwuserdata hdevicehandle, hwindowhandle, ulwindowsmessage, heventhandle, pcallbackproc, dwuserdata Declare Function SdioSetEvent Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal hwindowhandle As Long, ByVal ulwindowsmessage As Long, ByVal heventhandle As Long, ByVal pcallbackproc As Long, ByVal dwuserdata As Long ) As Long function SdioSetEvent ( hdevicehandle: Thandle; hwindowhandle: THandle; ulwindowsmessage: Integer; heventhandle: THandle; pcallbackproc: Pointer; dwuserdata: Integer ):Integer; stdcall; external 'IfSdio.DLL'; 139
パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください hwindowhandle 割り込み発生時にメッセージを送るウィンドウハンドルを指定します ulwindowsmessage 割り込み発生時に送られるメッセージを指定します heventhandle 割り込み発生時にシグナル状態になるイベントハンドルを指定します pcallbackproc 割り込み発生時に呼び出されるコールバック関数へのポインタを指定します dwuserdata コールバック関数およびメッセージハンドラへ引き渡すユーザ データを指定してください 戻り値 SdioSetEvent 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 使用例 (x86) HANDLE hdevicehandle; HANDLE heventhandle; LONG nret; heventhandle = CreateEvent(NULL, FALSE, FALSE, NULL); nret = SdioSetEvent(hDeviceHandle, NULL, 0, heventhandle, NULL, 0); (x64) HANDLE hdevicehandle; HANDLE heventhandle; LONG nret; heventhandle = CreateEvent(NULL, FALSE, FALSE, NULL); nret = SdioSetEvent(hDeviceHandle, NULL, 0, heventhandle, NULL, NULL); Dim hdevicehandle As Long Dim heventhandle As Long Dim nret As Long heventhandle = CreateEvent(0, False, False, 0) nret = SdioSetEvent(hDeviceHandle, 0, 0, heventhandle, 0, 0) 140
var hdevicehandle: THandle; heventhandle: Thandle; nret: Integer; begin heventhandle = CreateEvent(nil, False, False, nil); nret := SdioSetEvent(hDeviceHandle, nil, 0, heventhandle, nil, 0); end; STB 割り込み発生時にシグナル状態にするイベントのハンドルを登録します 141
18. SdioSetEventLogic 機能 STB 信号の割り込み発生論理と HDLC モジュールの異常発生割り込みを設定します 書式 LONG SdioSetEventLogic ( HANDLE hdevicehandle, BYTE beventlogic ); Declare Function SdioSetEventLogic Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal beventlogic As Byte ) As Long function SdioSetEventLogic ( hdevicehandle: Thandle; beventlogic: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください beventlogic STB 信号の割り込み論理 HDLC モジュール異常の割り込み発生条件を指定します 割り込み論理 条件は以下の定数で指定します 定数 意味 IFSDIO_RISE_EDGE STB 信号の立ち上がりで割り込みが発生します IFSDIO_FALL_EDGE STB 信号の立ち下がりで割り込みが発生します IFSDIO_CONNECT_EVENT HDLC モジュールとの切断で割り込みが発生します IFSDIO_POWER_EVENT HDLC モジュールの電源電圧異常で割り込みが発生します 戻り値 SdioSetEventLogic 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 備考 割り込みを発生する論理は立ち上がりと立ち下がりを両方同時に指定することもできます STB 信号の変化により入力信号の状態をラッチできますが このラッチの設定と割り込みの設定は独立して指定できます 142
使用例 HANDLE hdevicehandle; LONG nret; nret = SdioSetEventLogic(hDeviceHandle, IFSDIO_FALL_EDGE); Dim hdevicehandle As Long Dim nret As Long nret = SdioSetEventLogic(hDeviceHandle, IFSDIO_FALL_EDGE) Var hdevicehandle: THandle; nret: Integer; begin nret := SdioSetEventLogic(hDeviceHandle, IFSDIO_FALL_EDGE); end; STB 信号の割り込み発生論理を立ち下がりに設定します 143
19. SdioGetEventLogic 機能 STB 信号の割り込み発生論理の設定を取得します 書式 LONG SdioGetEventLogic ( HANDLE hdevicehandle, PBYTE pbeventlogic ); Declare Function SdioGetEventLogic Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef pbeventlogic As Byte ) As Long function SdioGetEventLogic ( hdevicehandle: Thandle; var pbeventlogic: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle SdioOpen 関数で取得したデバイスハンドルを指定してください pbeventlogic STB 信号の割り込み論理 HDLC モジュール異常の割り込み発生条件を格納する変数への参照渡しを指定します 割り込み論理 条件は以下の定数で格納されます 定数意味 IFSDIO_RISE_EDGE STB 信号の立ち上がりで割り込みが発生します IFSDIO_FALL_EDGE STB 信号の立ち下がりで割り込みが発生します IFSDIO_CONNECT_EVENT HDLC モジュールとの切断で割り込みが発生します IFSDIO_POWER_EVENT HDLC モジュールの電源電圧異常で割り込みが発生します 戻り値 SdioGetEventLogic 関数は正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 144
使用例 HANDLE hdevicehandle; LONG nret; BYTE beventlogic; nret = SdioGetEventLogic(hDeviceHandle, &beventlogic); Dim hdevicehandle As Long Dim nret As Long Dim beventlogic As Byte nret = SdioGetEventLogic(hDeviceHandle, beventlogic) var hdevicehandle: THandle; nret: Integer; beventlogic : BYTE; begin nret := SdioGetEventLogic (hdevicehandle, beventlogic); end; STB 信号の割り込み発生論理を取得します 145
20. SdioGetTmoduleStatus 機能 HDLC モジュールの接続状態を取得します 書式 LONG SdioGetTmoduleStatus( HANDLE hdevicehandle, PBYTE pbtmodulestatus ); Declare Function SdioGetTmoduleStatus Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef pbtmodulestatus As Byte ) As Long function SdioGetTmoduleStatus ( hdevicehandle: THandle; var pbtmodulestatus: byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle HDLC モジュールの接続状態を取得するデバイスハンドルを指定します pbtmodulestatus HDLC モジュールの接続状態を格納する変数へのポインタを指定します (C 言語 ) HDLC モジュールの接続状態を格納する変数を指定します (Visual Basic Delphi) bit7 bit6 Bit5 bit4 bit3 bit2 bit1 bit0 予約 予約 PWRNG SAFNG 予約 予約 PWROK SAFOK SAFOK 1 現在 HDLC モジュールと接続されています 0 現在 HDLC モジュールと接続されていません PWROK 1 現在 HDLC モジュールの電源電圧は正常です 0 現在 HDLC モジュールの電源電圧が異常です SAFNG 1 前回の本関数実行時から 今回の実行までに HDLC モジュールとの切断がありました 0 前回の本関数実行時から 今回の実行までに HDLC モジュールとの切断はありませんでした PWRNG 1 前回の本関数実行時から 今回の実行までに HDLC モジュールの電源電圧の異常がありました 0 前回の本関数実行時から 今回の実行までに HDLC モジュールの電 源電圧の異常はありませんでした 146
戻り値 正常終了した場合は IFSDIO_ERROR_SUCCESS が返されます IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 使用例 HANDLE hdevicehandle; BYTE btmodulestatus; LONG nret; nret = SdioGetTmoduleStatus(hDeviceHandle, &btmodulestatus); Dim hdevicehandle As Long Dim btmodulestatus As Byte Dim nret As Long nret = SdioGetTmoduleStatus(hDeviceHandle, btmodulestatus) Var hdevicehandle: THandle; btmodulestatus: byte; nret: Integer; nret := SdioGetTmoduleStatus(hDeviceHandle, btmodulestatus); HDLC モジュールの接続状態を取得します 147
21. SdioSetTmodulePower 機能 HDLC モジュールの電源を制御します 書式 LONG SdioSetTmodulePower( HANDLE hdevicehandle, BYTE bsetpower ); Declare Function SdioSetTmodulePower Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByVal bsetpower As Byte ) As Long function SdioSetTmodulePower ( hdevicehandle: Thandle; bsetpower: Byte ):Integer; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle HDLC モジュールの電源制御を行うデバイスハンドルを指定します bsetpower 電源状態を指定します 識別子 値 内容 IFSDIO_POWER_ON 1 HDLC モジュールの電源を ON にします IFSDIO_POWER_OFF 0 HDLC モジュールの電源を OFF にします 戻り値 正常終了した場合は IFSDIO_ERROR_SUCCESS が返されます IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 をご参照ください 148
使用例 HANDLE hdevicehandle; LONG nret; nret = SdioSetTmodulePower(hDeviceHandle, HDLC_POWER_OFF); Dim hdevicehandle As Long Dim nret As Long nret = SdioSetTmodulePower (hdevicehandle, HDLC_POWER_OFF) Var hdevicehandle: Thandle; nret: Integer; nret := SdioSetTmodulePower (hdevicehandle, HDLC_POWER_OFF); HDLC モジュールの電源を OFF にします 149
22. SdioCommonGetDeviceInfo 機能 デバイスのリソース情報を取得します SdioCommonGetDeviceInfo 関数で得られる情報は 以下のとおりです デバイス ID ベンダ ID リビジョン ID サブシステム ID サブシステムベンダ ID ボード ID (RSW1 設定値 ) 端子台番号 書式 LONG SdioCommonGetDeviceInfo ( HANDLE hdevicehandle, PDWORD pdwdeviceid, PDWORD pdwvendorid, PDWORD pdwrevisionid, PDWORD pdwsubsystemid, PDWORD pdwsubsystemvendorid, PDWORD pdwboardid, PDWORD pdwterminalno ); Declare Function SdioCommonGetDeviceInfo Lib "IfSdio.DLL" ( ByVal hdevicehandle As Long, ByRef pdwdeviceid As Long, ByRef pdwvendorid As Long, ByRef pdwrevisionid As Long, ByRef pdwsubsystemid As Long, ByRef pdwsubsystemvendorid As Long, ByRef pdwboardid As Long, ByRef pdwterminalno As Long ) As Long 150
function SdioCommonGetDeviceInfo ( hdevicehandle: Thandle; var pdwdeviceid: DWORD; var pdwvendorid: DWORD; var pdwrevisionid: DWORD; var pdwsubsystemid: DWORD; var pdwsubsystemvendorid: DWORD; var pdwboardid: DWORD; var pdwterminalno: DWORD ): DWORD; stdcall; external 'IfSdio.DLL'; パラメータ hdevicehandle リソース情報を取得したいデバイスの SdioOpen 関数によって得られたハンドル pdwdeviceid デバイス ID を返す変数へのポインタ pdwvendorid ベンダ ID を返す変数へのポインタ 弊社のベンダ ID は 1147h です pdwrevisionid リビジョン ID を返す変数へのポインタ pdwsubsystemid サブシステム ID を返す変数へのポインタ pdwsubsystemvendorid サブシステムベンダ ID を返す変数へのポインタ pdwboardid ボード ID (RSW1 設定値 ) を返す変数へのポインタ pdwterminalno 端子台番号を返す変数へのポインタ 戻り値 処理が正常に終了すると IFSDIO_ERROR_SUCCESS を返します それ以外の場合は IFSDIO_ERROR_SUCCESS 以外の値を返します IFSDIO_ERROR_SUCCESS 以外の値が返された場合については 戻り値一覧 を参照してください 151
使用例 HANDLE hdevicehandle; DWORD dwdeviceid; DWORD dwvendorid; DWORD dwrevisionid; DWORD dwsubsystemid; DWORD dwsubsystemvendorid; DWORD dwboardid; DWORD dwterminalno; LONG nret; nret = SdioCommonGetDeviceInfo(hDeviceHandle, &dwdeviceid, &dwvendorid, &dwrevisionid, &dwsubsystemid,&dwsubsystemvendorid,&dwboardid,&dwterminalno ); Dim hdevicehandle As Long Dim dwdeviceid As Long Dim dwvendorid As Long Dim dwrevisionid As Long Dim dwsubsystemid As Long Dim dwsubsystemvendorid As Long Dim dwboardid As Long Dim dwterminalno As Long Dim nret As Long nret = SdioCommonGetDeviceInfo(hDeviceHandle, dwdeviceid, dwvendorid, RevisionID, dwsubsystemid, dwsubsystemvendorid, dwboardid, dwterminalno ) var hdevicehandle: THandle; dwdeviceid: DWord; dwvendorid: DWord; dwrevisionid: DWord; dwsubsystemid: DWord; dwsubsystemvendorid: DWord; dwboardid: DWord; dwterminalno: DWord; nret: DWord; begin nret := SdioCommonGetDeviceInfo(hDeviceHandle, dwdeviceid, dwvendorid, dwrevisionid, dwsubsystemid, dwsubsystemvendorid, dwboardid, dwterminalno ); end; hdevicehandle が示しているデバイスのリソース情報を取得します 152
23. CallBackProc 機能 STB 信号の割り込み発生 HDLC モジュール異常時の割り込み発生によってコールされるコールバック関数のプレースホルダです 呼び出される関数は SdioSetEvent 関数に渡した関数となります 書式 (x86) void CallBackProc ( DWORD dweventlogic, DWORD dwuserdata ); (x64) void CallBackProc ( DWORD dweventlogic, PVOID dwuserdata ); Declare Sub CallBackProc ( ByVal dweventlogic As Long, ByVal dwuserdata As Long ) procedure CallBackProc( DwEventLogic: Integer; DwUserData: Integer ): stdcall; パラメータ dweventlogic コールバック関数を呼び出した割り込み発生論理です 割り込み論理は以下の定数で格納されます 定数意味 IFSDIO_RISE_EDGE STB 信号の立ち上がりで割り込みが発生しました IFSDIO_FALL_EDGE STB 信号の立ち下がりで割り込みが発生しました IFSDIO_CONNECT_EVENT HDLC モジュールとの切断で割り込みが発生しました IFSDIO_POWER_EVENT HDLC モジュールの電源電圧異常で割り込みが発生しました dwuserdata SdioSetEvent 関数で指定したユーザデータです 戻り値 なし 153
5.3 戻り値一覧 エラー識別子値意味対処方法 IFSDIO_ERROR_SUCCESS 0 正常終了 IFSDIO_ERROR_INVALID_PARAMETER 0xC0001001 引数パラメータの値が 不正です IFSDIO_ERROR_TERMINAL 0xC0003001 端子台に異常がありま す IFSDIO_ERROR_INVALID_HANDLE 0xC0000003 デバイスハンドルが正 しくありません API 関数に指定する値が不正もしくは範囲外です または 引数に NULL ポインタが指定されています 端子台の電源電圧に異常があるか 端子台が接続されていません または正しくない組み合わせの端子台が接続されています 正しい組み合わせの端子台を接続してください 不正なデバイスハンドルで呼び出しを行おうとしました オープン関数で返されたデバイスハンドルを使用してください 154
第 6 章サンプルプログラム 以下 各サンプルプログラムの概要を説明します 6.1 Send 概要 データ送信を行うサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル Send.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル Send.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル Send.dpr を開き ビルドしてください 作成後 Send を起動してください 6.2 Receive 概要 データ受信を行うサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル Receive.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル Receive.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル Receive.dpr を開き ビルドしてください 作成後 Receive を起動してください 155
6.3 Event 概要 受信イベントを発生させ処理するサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル Event.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル Event.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル Event.dpr を開き ビルドしてください 作成後 Event を起動してください 6.4 SendMessage 概要 データ送信を行うコンソールアプリケーションのサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル SendMessage.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル SendMessage.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル SendMessage.dpr を開き ビルドしてください 作成後 SendMessage を起動してください 156
6.5 ReceiveMessage 概要 データ受信を行うコンソールアプリケーションのサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル ReceiveMessage.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル ReceiveMessage.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル ReceiveMessage.dpr を開き ビルドしてください 作成後 ReceiveMessage を起動してください 6.6 InPoint 概要 汎用 DIO 入力を行うサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル InPoint.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル InPoint.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル InPoint.dpr を開き ビルドしてください 作成後 InPoint を起動してください 157
6.7 OutPoint 概要 汎用 DIO 出力を行うサンプルプログラムです 実行手順 サンプルプログラムには実行形式のファイルが付属していません ソースコードをコンパイルして実行ファイルを生成してから 動作させてください Visual C++ の場合 Visual C++(Visual Studio) を起動し ファイル メニューから ワークスペースを開く を選び メイクファイル OutPoint.mak を開き ビルドしてください の場合 Visual Basic を起動し プロジェクトファイル OutPoint.vbp を開き ビルドしてください の場合 Delphi を起動し プロジェクトファイル OutPoint.dpr を開き ビルドしてください 作成後 OutPoint を起動してください 158
第 7 章ユーティリティ 以下 各ユーティリティの概要を説明します 7.1 通信ユーティリティプログラム HDLC フレームの送受信を行うユーティリティプログラムです PCI-4172FMU では複数プロセスでの使用 (2 つ同時に起動 ) は出来ません 起動方法 1. スタート メニュー - Interface GPC-4116 - HDLC ユーティリティプログラム を選択してユーティリティプログラムを起動させます 2. ファイル - 開く で 使用可能なポートが表示されますので通信設定を行ったあと 使用するポートを選択してください 3. 受信したフレームを画面が表示されます 4. 編集 - 送信 で 送信ダイアログが表示されます データを入力し Ok ボタンをクリックすると フレームを送信します 7.2 自己診断プログラム本製品には 動作不具合時の原因がハードウェア的なものか ソフトウェア的なものかを容易に判断するための自己診断機能を搭載しています 診断プログラムを用いて動作確認を行ってください 自己診断プログラムにより 以下のことを確認できます PCI-4172FMU では使用することが出来ません I/O ポートアクセス メモリアクセス 割り込み データ送受信 制御信号診断 159
必要な機材 HDLC インタフェースモジュール 診断プログラム ループバックコネクタ ( ピン接続の組み合わせ (1)RS-232C:SD-RD RS-CS (2)RS-485:T-R C-I) 起動方法 1. 診断を行うインタフェースモジュールのチャンネル 1 チャンネル 2 にループバックコネクタを差し込んでください 2. スタート メニュー - Interface GPC-4116 - DiagHdlc を選択して自己診断プログラムを起動させます 3. 起動画面のメニューの ファイル - ボードの選択 で 使用可能インタフェースモジュール一覧が表示されますので診断を行うインタフェースモジュールを選択してください 選択したインタフェースモジュールのリソースが表示されます 4. メニューの 診断 - 診断開始 より診断を開始します 診断が終了すると診断結果が表示されます メニューの ファイル - 結果の保存 でその診断結果をファイル形式で保存できます 診断 - 診断結果クリア で診断結果をクリアします 160
7.3 RS-485 終端設定ユーティリティプログラム CardBus 製品の RS-485 終端設定用のユーティリティプログラムです 本ユーティリティで設定された終端設定は 電源を切っても消えることはありません 一度設定するだけで 電源再投入後再設定を行う必要はありません RS-485 終端設定する方法は 本ユーティリティおよび HdlcSetCableTermination 関数によって行えます 本ユーティリティで終端設定を行えるカードは以下の製品です 型式 Revision 番号 CBI-4171A 2 以上 CBI-4171B 2 以上 CBI-467101WA 1 以上 CBI-467101WB 1 以上 起動方法 1. スタート メニュー - Interface GPC-4116 - RS-485 終端抵抗設定ユーティリティ を選択してユーティリティプログラムを起動させます 2. 起動画面のメニューの ファイル - ボードの選択 で 設定可能なカードの一覧が表示されますので設定を行うカードを選択してください 3. 終端抵抗を挿入する端子にチェックを入れ 設定 ボタンをクリックします 4. ファイル - 終了 で プログラムを終了します 161
7.4 CardBus ID 設定ユーティリティこのユーティリティは複数枚の同一型式 CardBus 製品を使用するためのものです 製品ごとに異なる ID 番号を設定します この ID 番号は PCI インタフェースモジュールで言えば RSW 番号と同等の意味を持ち デバイスマネージャ 自己診断プログラムでも RSW1 として表示されます 起動方法 1. ドライバソフトウェアのインストール完了後 コントロールパネル の Interface CardBus ID Utility を開きます 2. 現在挿入されている弊社 CardBus 製品の情報が表示されます 左から バス番号 デバイス番号 ファンクション番号 型式 ID 番号 を示します ID 番号の設定を行いたい製品をダブルクリックして下さい 3. ID 番号を設定するダイアログが開きますので コンボボックス内で設定したい ID 番号を選択し OK ボタンをクリックします 4. これで ID 番号の設定は完了です 設定できる ID 番号は 0h~Fh までです 変更した ID 番号をドライバに認識させるには 一度 CardBus 製品を抜き差しするか システムを再起動して下さい 設定した ID 番号が分かるように番号を記したシールを CardBus 製品に貼ることをお勧めします 162
7.5 DI 入力ユーティリティ 起動方法 スタート メニューから DI 入力ユーティリティ を立ち上げてください ここで 検索 ボタンを押すと 使用可能な DIO デバイスの一覧が表示されます 使用したいデバイスを選択し OK ボタンを押してください 画面上に 現在の全入力信号の状態が表示されます ( このプログラムは常にインタフェースモジュールを監視しています ) 7.6 DO 出力ユーティリティ 起動方法 スタート メニューから DO 出力ユーティリティ を立ち上げてください ここで 検索 ボタンを押すと 使用可能な DIO デバイスの一覧が表示されます 使用したいデバイスを選択し OK ボタンを押してください 画面上に表示されているボタンをクリックすると 出力信号の ON/OFF を切り替えることができます メニューには 全点 ON および全点 OFF の機能が用意されています 163
第 8 章重要な情報 保証の内容と制限弊社は本ドキュメントに含まれるソースプログラムの実行が中断しないこと またはその実行に誤りが無いことを保証していません 本製品の品質や使用に起因する 性能に起因するいかなるリスクも使用者が負うものとします 弊社はドキュメント内の情報の正確さに万全を期しています 万一 誤記または誤植などがあった場合 弊社は予告無く改訂する場合があります ドキュメントまたはドキュメント内の情報に起因するいかなる損害に対しても弊社は責任を負いません ドキュメント内の図や表は説明のためであり ユーザ個別の応用事例により変化する場合があります 著作権 知的所有権弊社は本製品に含まれるおよび本製品に対する権利や知的所有権を保持しています 本製品はコンピュータソフトウェア 映像 / 音声 ( 例えば図 文章 写真など ) を含んでいます 医療機器 / 器具への適用における注意弊社の製品は人命に関わるような状況下で使用される機器に用いられる事を目的として設計 製造された物では有りません 弊社の製品は人体の検査などに使用するに適する信頼性を確保する事を意図された部品や検査機器と共に設計された物では有りません 医療機器 治療器具などの本製品の適用により 製品の故障 ユーザ 設計者の過失などにより 損傷 / 損害を引き起こす場合が有ります 複製の禁止弊社の許可なく 本ドキュメントの全て または一部に関わらず 複製 改変などを行うことはできません 責任の制限弊社は 弊社または再販売者の予見の有無にかかわらず発生したいかなる特別損害 偶発的損害 間接的な損害 重大な損害について 責任を負いません 本製品 ( ハードウェア, ソフトウェア ) のシステム組み込み 使用 ならびに本製品から得られる結果に関する一切のリスクについては 本製品の使用者に帰属するものとします 本製品に含まれるバグ あるいは本製品の供給 ( 納期遅延 ) 性能もしくは使用に起因する付帯的損害もしくは間接的損害に対して 弊社に全面的に責がある場合でも 弊社はその製品に対する改良 ( 正常に動作する ) 代品交換までとし 金銭面での賠償の責任は負わないものとしますので 予めご了承ください 本製品 ( ソフトウェアを含む ) は 日本国内仕様です 本製品を日本国外で使用された場合 弊社は一切責任を負いかねます また 弊社は本製品に関し 海外での保守サービスおよび技術サポート等は行っておりません 164
商標 / 登録商標本書に掲載されている会社名 製品名は それぞれ各社の商標または登録商標です 165