Comments
Description
Transcript
Visual BasicによるPPI入門書
チュートリアル Visual BasicによるPPI入門書 www.interface.co.jp 商標/登録商標 本ドキュメントに掲載されている会社名,製品名は、それぞれ各社の商標または登録商標です。 保障の内容と制限 弊社はドキュメント内の情報の正確さに万全を期しています。万一、誤記または誤植等があった 場合、弊社は予告なく改訂する場合があります。ドキュメントまたはドキュメント内の情報に起 因するいかなる損害に対しても弊社は責任を負いません。 製品に含まれるバグ、あるいは製品の供給(納期遅延),性能、もしくは使用に起因する付帯的損害 もしくは間接的損害に対して、弊社に全面的に責がある場合でも、弊社はその製品に対する改良 (正常に動作する)、代品交換までとし、金銭面での賠償の責任は一切負わないものとしますので、 予めご了承ください。 ドキュメント内の図や表は説明のためであり、ユーザ個別の応用事例により変化する場合があり ます。 著作権,知的所有権 弊社は本製品に含まれるおよび本製品に対する権利や知的所有権を保持しています。 本製品はコンピュータ ソフトウェア(プログラム),図,文章,写真等を含んでいます。 複製の禁止 弊社の許可なく、本製品(ドキュメント含む)の全て、または一部に関わらず、複製,改変等を行う ことはできません。 責任の制限 弊社は、弊社または再販売者の予見の有無に関わらず、発生したいかなる特別損害,偶発的損害, 間接的な損害,重大な損害について、責任を負いません。 補償の内容 本ドキュメントで使用している弊社製品の補償については、各製品のマニュアルを参照してくだ さい。 本書の内容の一部または全部を、無断で転載することを禁止します。 本書の内容は、将来予告なく変更することがありますので、あらかじめご了承ください。 © 2000, 2006 Interface Corporation. All rights reserved. www.interface.co.jp TUT-0016 改訂履歴 年 月 Ver. 1.6 2006年10月 1.5 2005年10月 1.4 2004年9月 1.3 1.2 1.1 2003年9月 2002年7月 2001年12月 1.0 2000年4月 改 訂 内 容 ●製品紹介削除。 ●フォーマット変更 ●CPZ-2746を追加 ●技術資料一覧更新 ●インストール説明 Windows XP/2000へ変更 ●技術資料一覧更新 ●CTP-2746の紹介を追加 ●文章フォーマットの変更 ●製品紹介ページ 価格変更 PCI-2746C ¥33,000→¥29,000 PCI-2747A ¥29,800→¥21,000 ・Windows XPに対応 ・図4-24,4-28,4-29ピン名,番号変更 PC5(OBF)28→PC7(OBF)30 PC4(ACK)27→PC6(ACK)29 新規作成 本チュートリアルをご使用の際は、必ず各製品型式の最新のドキュメント(ユーザーズマニュアル, ヘルプ)をあわせて参照してください。また、最新のドライバソフトウェアをご使用ください。 ユーザーズマニュアル,ドライバソフトウェアは弊社Web site(www.interface.co.jp)からダウンロー ドできます。(ヘルプはドライバソフトウェアに含まれています) -1- Interface Corporation TUT-0016 目 次 第1章 1.1 1.2 1.3 第2章 PPI概要 6 ポート ............................................................................................................................................. 6 グループ制御................................................................................................................................. 7 動作モード ..................................................................................................................................... 7 PPI製品のインストール 8 コンピュータへの設置方法......................................................................................................... 8 2.1.1 デバイスドライバのインストール................................................................................ 9 ■Windows XP Embedded,Windows XP,Windows Server 2003 をご使用の場合.............. 9 ■Windows 2000 をご使用の場合....................................................................................... 11 2.2 サンプルプログラム,ヘルプ,ヘッダファイル,インポートライブラリ,最新情報ドキュメ ントファイルのインストール............................................................................................................ 13 2.1 第3章 3.1 3.2 3.3 第4章 Visual BasicによるPPI制御 14 ピンアサインメント................................................................................................................... 15 DLLプロシージャ呼び出しによるプログラミング(概要).................................................... 17 PPI製品制御概略 ......................................................................................................................... 18 チュートリアル 19 モード0入力/出力...................................................................................................................... 21 Step1.基本フォーム作成 .............................................................................................................. 22 Step2.DLLプロシージャ宣言 ...................................................................................................... 23 Step3.初期化処理と終了処理...................................................................................................... 25 Step4.モード 0 入出力 .................................................................................................................. 27 4.2 モード1入力............................................................................................................................... 32 Step1.基本フォーム作成(入力側) ............................................................................................... 35 Step2.モード 1 入力 ...................................................................................................................... 35 Step3. 基本フォーム作成(出力側) ............................................................................................. 36 Step4.モード 0 出力 ...................................................................................................................... 37 4.3 モード1出力............................................................................................................................... 39 Step1.基本フォーム作成(出力側) ............................................................................................... 42 Step2.モード1出力 ...................................................................................................................... 43 Step3.基本フォーム作成(入力側) ............................................................................................... 44 Step4.モード 0 入力 ...................................................................................................................... 45 4.4 モード 2 入力............................................................................................................................... 47 Step1.基本フォーム作成(入力側) ............................................................................................... 48 Step2.モード 2 入力 ...................................................................................................................... 49 Step3.基本フォーム作成(出力側) ............................................................................................... 50 Step4.モード 0 出力 ...................................................................................................................... 50 4.1 Interface Corporation -2- TUT-0016 モード 2 出力............................................................................................................................... 52 Step1.基本フォーム作成(出力側) ............................................................................................... 52 Step2.モード1出力 ...................................................................................................................... 53 Step3.基本フォーム作成(入力側) ............................................................................................... 54 Step4.モード 0 入力 ...................................................................................................................... 55 4.6 割り込み処理............................................................................................................................... 57 Step1.基本フォーム作成(出力側) ............................................................................................... 59 Step2.モード1出力(割り込み処理) ........................................................................................... 59 4.5 第5章 FbiPpi.DLLリファレンス 64 PpiOpen .......................................................................................................................................... 64 PpiClose .......................................................................................................................................... 64 PpiControl....................................................................................................................................... 64 PpiInputPort.................................................................................................................................... 65 PpiOutputPort ................................................................................................................................. 65 PpiSetEventMask............................................................................................................................ 66 PpiGetEventMask........................................................................................................................... 66 PpiSetEventConfig ......................................................................................................................... 67 PpiGetEventConfig......................................................................................................................... 67 PpiSetTimerConfig......................................................................................................................... 68 PpiGetTimerConfig ........................................................................................................................ 69 PpiGetTimerCount ......................................................................................................................... 70 PpiGetResetInStatus ....................................................................................................................... 70 PpiEventRequestPending ............................................................................................................... 71 PpiCommonGetPciDeviceInfo....................................................................................................... 72 エラーコード一覧 ........................................................................................................................ 72 第6章 6.1 6.2 6.3 8255 PPIコントローラ説明 73 ポートA,B,C................................................................................................................................. 73 グループA制御,グループB制御 ............................................................................................. 74 各ビットの対応........................................................................................................................... 75 技術資料紹介 84 -3- Interface Corporation TUT-0016 はじめに 平素は格別のご高配を賜り、厚く御礼申し上げます。本冊子は、はじめて弊社PPI製品を利用し Visual Basicにて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成ま でに関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual Basicに てプログラムの開発を行われる際の手助けになればと考えております。 記述する内容に関しましては、基本的なことにとどまっております。また、弊社 Web site(www.interface.co.jp)ではFAQ,製品マニュアル,および本チュートリアル記載のサンプルプ ログラムのソース(BPC-0809)の公開を行っておりますので、こちらもあわせてご覧頂けますと、 より一層ご理解を深めて頂けるものと思います。 注意事項 本冊子では、使用する環境をWindows XP/XP Embedded/Server 2003/2000+Visual Basic Ver. 5.0(SP3) またはVer. 6.0(SP5)を想定し記載しております。 Windows NT/Me/98/95をご利用の場合、I/Oモジュールのインストール方法が本冊子に記載した内 容とは異なりますのでご注意ください。こちらに関しましては、弊社製品マニュアルをご確認く ださい。 Visual Studio .NETでご利用の方は、チュートリアル「Visual Studio .NET移行ガイド」を別途用意 しております。こちらを参照してください。 対応OSはI/Oモジュール型式によって異なりますので、対応ソフトウェア(GPC-2000)のReadmeも しくはヘルプでご確認ください。 対象環境 本チュートリアルは以下の制約事項があります。 PCI-2746C, PCI-2747A 対象型式 (PCI) CPZ-2746 対象型式 (CPZ) CTP-2746 対象型式 (CTP) 対象ユーザ 制御用電子機器および、コンピュータ等に関して基本的な知識を有している方。 ※本冊子は上記の弊社製品型式のみに対応しています。 製品の詳細は弊社Web siteを参照してください。 Interface Corporation -4- TUT-0016 本チュートリアルを行うにあたり、別途以下の製品が必要となります。 <CTP-2746,PCI-2746Cを使用する場合> ・TNS-9601×1台: 垂直96ピンネジ変換端子台 ・ECO-66xx×1本: 96ピンハーフピッチケーブル <CPZ-2746を使用する場合> ・TBZ-960x×1台: 垂直96ピン変換端子台 ・WRZ-66xx×1本: 96ピンハーフピッチコネクタ接続ケーブル <PCI-2747Aを使用する場合> SET-LP01(PCI-2747A,TRM-2601*1,CAB-9816ME*2 各一点のセット)が2点必要です。 ※1 TRM-2601×2台: 30点スモールタップ端子台 ※2 CAB-9816ME×2本: 34ピンフラットコネクタ両端コネクタケーブル(1.6m) 尚、PCI-2747Aは2枚必要になります。 -5- Interface Corporation TUT-0016 第1章 PPI概要 PPIとはProgrammable Peripheral Interfaceの略で、コンピュータ(CPU)と周辺機器間の制御とデータ 転送を行うための8255という型番のICのことです(下図)。8255は、パラレルI/Oインタフェースデ バイスで、8ビット単位で入出力が行えるポートが3つあり、プログラムによる制御でデータ入力, データ出力,ステータス信号入力,コントロール信号出力に使用することができます。 Intel 8255(相当品) (NEC:μPD8255AC-5) 1.1 ポート 8255には8ビットの入出力ポートが3個あり、それぞれをポートA,ポートB,ポートCと呼びます。ま た各ポートごとに独特の性質を持っていますので、ポートの選択によって8255の適応性が生かさ れます(下表)。 ポートA ポートB ポートC 入力時 ラッチ入力あるいはバッファ入力動作 出力時 ラッチ出力動作 入力時 ラッチ入力あるいはバッファ入力動作 出力時 ラッチ出力動作 入力時 バッファ入力動作(ラッチされません) 出力時 ラッチ出力動作 ポートCはモードによって2つの4ビットポートに分割して使用することができま す。また、ポートA,Bのコントロール信号の出力ポート、あるいはステータス信 号の入力ポートとして用いることができます。 ラッチ:変化する入出力信号を特定の時点で、その状態を保持すること。 バッファ:入出力信号を一時的に蓄積すること。 Interface Corporation -6- TUT-0016 1.2 グループ制御 8255を使用するにあたっては、入出力ポートをA,B,Cの3つに分けると同時に、ポートAとポートC の半分、ポートBとポートCの半分といった、2つのグループに分けて考えることもできます(下図)。 このとき、それぞれをグループA,グループBと呼びます。 グループA制御 グループB制御 1.3 動作モード 8255はその使用方法によって次の3つのモード(下表)より動作を選択することができます。 モード0 基本的な入出力ポート モード1 コントロール信号,ステータス信号による制御を伴う入出力ポート モード2 双方向データを扱う入出力ポート ポートA ポートC ポートC 上位4ビット 下位4ビット モード0 8255 OR 入力 ポートB モード1 モード2 8255 8255 OR 出力 入力 出力 制御信号 入出力 制御信号 また、使用する目的に合わせて、各グループごとにモードを設定することができます。可能なモー ドの組み合わせは次の6通りです(下表)。 グループA (1) モード0 (2) モード0 (3) モード1 (4) モード1 (5) モード2 (6) モード2 グループB モード0 モード1 モード0 モード1 モード0 モード1 -7- Interface Corporation TUT-0016 第2章 PPI製品のインストール 作成するアプリケーションからデジタル入力、または出力を行う場合、当然のことながらアプリ ケーションを実行するコンピュータにPPI製品が組み込まれていなければなりません。 ここではWindowsXP/XP Embedded/Server 2003/2000環境における、弊社PPI製品のインストール方 法を記載します。Windows NT/Me/98/95ではインストール方法がここに記載する内容とは異なりま す。こちらに関しては、製品マニュアルまたはオンラインドキュメントをご確認ください。 2.1 コンピュータへの設置方法 ※ 写真は実物と異なる場合があります。 ①コンピュータ本体の電源が“OFF”であることを確認し、電源ケーブルをACコンセントから外しま す。その後、外装カバー,スロットカバーを外します。 ②拡張用スロットへI/Oモジュールを差し込みます。 <例> PCI コネクタ ビス留め I/O モジュール 金メッキ端子がコネクタに隠れていることを確認する。 コンピュータ 基板の左右の端に力を入れ、カツンとショックがある まで押し込む。 ! 注意 製品は正しい向きに実装してください。間違った向きに実装した場合、コンピュータ,I/Oモジ ュールを破損する恐れがあります。 ③パネルをコンピュータ本体とビス留めしてください。 ④本体へ外装カバーを元通り取り付け、電源ケーブルをACコンセントに接続します。その後、コ ンピュータを起動します。 以上でI/Oモジュールの設置は完了です。次にドライバのインストールを行います。 Interface Corporation -8- TUT-0016 2.1.1 デバイスドライバのインストール ■Windows XP Embedded,Windows XP,Windows Server 2003をご使用の場合 Administratorsのグループに所属しているユーザが、インストールを行ってください。 ※ Windows XP Embeddedは、Windows XPと同様の手順で、ドライバのインストールができます。 (ただし、OSイメージにデバイスの検出に必要なコンポーネントが含まれている必要がありま す。) ①Windows XP Embedded,Windows XP,Windows Server 2003が起動すると、「新しいハードウェアの 検出ウィザード」が表示されます。 ②「一覧または特定の場所からインストールする(詳細)」が選択されていることを確認し、「次へ」 をクリックします。 ③「次の場所で最適のドライバを検索する」を選択し、「次の場所を含める」にチェックをつけ、 ドライバ保存先の「¥Win2000」フォルダを指定し、「次へ」をクリックします。 ドライバ保存先の「¥Win2000」フォルダを 指定します。 ④ファイルのコピーが始まります。 -9- Interface Corporation TUT-0016 ⑤インストールが完了した旨のダイアログボックスが表示されるので、「完了」ボタンをクリッ クします。 以上で、Windows XP Embedded,Windows XP,Windows Server 2003用のデバイスドライバのインス トールは完了です。デバイスドライバのインストール完了後以降は、システム起動時に上記②の ように「新しいハードウェアの検索ウィザード」が起動することはありません。 • Windows XP Embedded 用ハードウェア情報ファイルのインポートをする場合 ・ドライバダウンロード方法 ①弊社Web siteよりGPC-2000のDriver Disk [Windows XPe,XP,2003,2000]をダウンロードし ます。 ②ダウンロードしたプログラムを実行すると、「Win2000」フォルダが作成されます。 ・ドライバインストール方法 ①Windows XP Embedded 開発環境の Component Database Manager を起動します。 ②弊社製品のハードウェア情報ファイルをインポートします。作成した「Win2000」フォ ルダ内の拡張子がSLDのファイルを、画面の指示に従ってインポートしてください。 ③以上で、ハードウェア情報のインポートは完了です。 Interface Corporation - 10 - TUT-0016 ■Windows 2000をご使用の場合 Administratorsのグループに所属しているユーザが、インストールを行ってください。 ①Windows 2000が起動すると、「新しいハードウェアの検出ウィザード」が表示されるので、「次 へ」ボタンをクリックします。 ②「デバイスドライバに最適なドライバを検索する(推奨)」を選択し、「次へ」ボタンをクリック します。 ③「検索場所のオプション」で「場所を指定」を選択し、「次へ」ボタンをクリックします。 ④「参照」ボタンをクリックし、「製造元のファイルのコピー元」にドライバ保存先の「¥Win2000」 フォルダを指定します。その後、「OK」ボタンをクリックします。 - 11 - Interface Corporation TUT-0016 ⑤デバイスドライバが見つかった旨のダイアログボックスが表示されるので、「次へ」ボタンを クリックします。 ⑥ファイルのコピーが始まります。 ⑦インストールが完了した旨のダイアログボックスが表示されるので、「完了」ボタンをクリッ クします。 以上で、Windows 2000用のデバイスドライバのインストールは完了です。 デバイスドライバのインストール完了後以降は、システム起動時に上記②のように「新しいハー ドウェアの検索ウィザード」が起動することはありません。 インストールを完了したら、リソース(I/Oアドレス,割り込みレベル)の設定,競合の有無の確認を行 ってください。 ドライバのインストールが正常に行われると、システムプロパティのデバイスマネージャに表示 されます。 ここに I/O モジュールが追加 されます。 Interface Corporation - 12 - TUT-0016 2.2 サンプルプログラム,ヘルプ,ヘッダファイル,インポートライブラリ,最新情報ドキュメントファイ ルのインストール 1. 弊社Web siteよりGPC-2000のUtility Diskをダウンロードします。 2. ダウンロードしたプログラムを実行すると、「SETUP」フォルダが作成されます。 3.「SETUP」フォルダ内のSETUP.EXEを実行して下さい。プログラムが起動しインストールが開 始されます。 インストールが完了すると、「スタート」メニューの「プログラム」に、「Interface GPC-2000」 が追加されます。 - 13 - Interface Corporation TUT-0016 第3章 Visual BasicによるPPI制御 Visual Basicより、PPI製品を制御するには、DLLを利用します。Visual Basicでは直接I/Oやメモリ にアクセスすることができません。従って、PPI製品に対して直接的に信号を送ることができませ ん。そこで、I/Oモジュールに対して直接的に信号を送るプログラム(DLL)から必要な手続き(関数) を呼び出し、このDLLを介してI/Oモジュールの制御を行います。 Visual Basic アプリケーション ダイナミックリンクライブラリ (FBIPPI.DLL) Win32 API 仮想デバイスドライバ (CP2746C.sys) 入力 PPI製品 出力 Interface Corporation - 14 - TUT-0016 3.1 ピンアサインメント PPI製品への信号入力、またはPPI製品からの信号出力は、I/Oモジュールのコネクタ部分より行わ れますが、使用する製品型式によって、各ピンに割り当てられた役割が異なります。配線時には、 これらピンアサインメントをよく確認の上、配線してください。 以下、弊社PCI-2746Cのピンアサインメントを一例として記載します。 −COM1 −COM1 1PA0 1PA1 1PA2 1PA3 1PA4 1PA5 1PA6 1PA7 1PB0 1PB1 1PB2 1PB3 1PB4 1PB5 1PB6 1PB7 +COM1 +COM1 −FCOM NC IR.IN1 NC NC +FCOM −RCOM1 RSTOUT/P.OUT −COM2 −COM2 1PC0 1PC1 1PC2 1PC3 1PC4 1PC5 1PC6 1PC7 NC NC NC NC NC NC NC NC +COM2 +COM2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 −COM3 −COM3 2PA0 2PA1 2PA2 2PA3 2PA4 2PA5 2PA6 2PA7 2PB0 2PB1 2PB2 2PB3 2PB4 2PB5 2PB6 2PB7 +COM3 +COM3 −FCOM NC NC NC IR.IN2 +FCOM −RCOM2 RSTIN −COM4 −COM4 2PC0 2PC1 2PC2 2PC3 2PC4 2PC5 2PC6 2PC7 NC NC NC NC NC NC NC NC +COM4 +COM4 NC:未接続 使用コネクタ:PCR-E96LMDC(本多通信工業) - 15 - Interface Corporation TUT-0016 ●コネクタの+COM1∼4,+FCOM端子からPCIバスの+5V電源が出力されています。 ●入出力信号はそれぞれ対応したCOMをご使用ください。 COMの対応 信 号 1PA0∼1PA7 1PB0∼1PB7 1PC0∼1PC7 2PA0∼2PA7 2PB0∼2PB7 2PC0∼2PC7 IR.IN1,IR.IN2 RSTOUT/P.OUT RSTIN COM −COM1,+COM1 −COM2,+COM2 −COM3,+COM3 −COM4,+COM4 −FCOM,+FCOM −RCOM1 −RCOM2 PCI-2747A,CTP-2746,CPZ-2746に関しましては、製品マニュアルか弊社製品カタログを参照してく ださい。 Interface Corporation - 16 - TUT-0016 3.2 DLLプロシージャ呼び出しによるプログラミング(概要) Visual BasicよりDLLプロシージャ呼び出しプログラミングを行うには、弊社、PPI制御用ソフト (FBIPPI.DLL)をダイナミックリンクし使用します。DLLとはダイナミックリンクライブラリ (Dynamic Link Library)の略でアプリケーションの実行時に動的にリンクして利用できるプロシー ジャのライブラリです。プロシージャとは実行時に1つの単位として処理されるコードの集まり を意味します。 Visual BasicにてDLLプロシージャを利用するには、Declare ステートメントを使ってプロシージャ の位置を指定します。 外部プロシージャ宣言記述例 Declare Function PpiOpen Lib "FbiPpi.DLL" (ByVal lpszName As String, ByVal fdwAttrs As Long) As Long Declare Function PpiClose Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function PpiControl Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal bControlData As Byte) As Long Declare Function PpiInputPort Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal dwPort As Long, ByRef pbValue As Byte) As Long Declare Function PpiOutputPort Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal dwPort As Long, ByVal pbValue As Byte) As Long Declare Function PpiSetEventMask Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal bEventMask As Byte) As Long Declare Function PpiGetEventMask Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbEventMask As Byte) As Long Declare Function PpiSetEventConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal bEventConfig As Byte) As Long プログラム記述例 'PPI 製品のオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) 外部プロシージャ - 17 - Interface Corporation TUT-0016 3.3 PPI製品制御概略 PPI製品への制御を行う場合、基本的に下記の制御シーケンス(順番)で行います。 1 I/Oモジュール初期化 プログラム起動 2 I/Oモジュール設定 8255の設定 3 各種処理 データの入出力 4 終了処理 プログラム終了 ①I/Oモジュールの初期化 Visual Basicで作成されたアプリケーションがPPI製品への操作を行う場合、まずアプリケーシ ョンは、PPI製品を利用可能な状態にする必要があります。 この処理がI/Oモジュールの初期化です。I/Oモジュールの初期化を行うと、プログラムはPPI製 品へのアクセスが可能となります。本処理が行われないとPPI製品へのアクセスは行えません。 ②I/Oモジュールの設定 I/Oモジュールに搭載された8255の各ポートに対し、モードの設定や各ポートをコンピュータか ら見て入力/出力のどちらで使うかを設定します。 ③各種処理 データ・ポートより信号の入力または出力を行います。 ④終了 I/Oモジュールの使用終了を行うための手続きです。プログラム終了時には必ず必要です。 Interface Corporation - 18 - TUT-0016 第4章 チュートリアル ここでは、実際に弊社PPI製品を用いて、I/Oモジュールへの信号入力およびI/Oモジュールからの 信号出力を行います。本チュートリアルを行うにあたっては、ご使用になるI/Oモジュールにより 以下の準備を行ってください。 CTP-2746,PCI-2746Cをご使用の場合 CTP-2746,PCI-2746Cにてチュートリアルを行う場合、以下の製品が必要になります。 CTP-2746,PCI-2746C 1枚:PPI製品 TNS-9601 1台:垂直96ピンネジ変換端子台 ECO-66xx 1本:96ピンハーフピッチコネクタ両端ケーブル コンピュータにPPI製品(CTP-2746,PCI-2746C)を実装し、ケーブル(ECO-66xx)を用いて端子台 (TNS-9601)に接続してください。 CPZ-2746をご使用の場合 CPZ-2746にてチュートリアルを行う場合、以下の製品が必要になります。 CPZ-2746 1枚:PPI製品 TBZ-960x 1台:垂直96ピン変換端子台 WRZ-64xx,WRZ-66xx 1本:96ピンハーフピッチケーブル コンピュータにPPI製品(CPZ-2746)を実装し、ケーブル(WRZ-66xx)を用いて端子台(TBZ-960x)に接 続してください。 INPUT/OUTPUT 端子台 PPI製品 - 19 - Interface Corporation TUT-0016 PCI-2747Aをご使用の場合 PCI-2747Aにてチュートリアルを行う場合、以下の製品が必要になります。 SET-LP01(工業高校向けラーニングパック)×2点 PCI-2747A PPI製品×2枚 TRM-2601 30点端子台×2台 CAB-9816ME 34ピンフラットコネクタ両端ケーブル×2本 コンピュータにPPI製品(PCI-2747A)を2枚実装し、それぞれケーブル(CAB-9816ME)を用いて端子 台(TRM-2601)に接続してください。 端子台 INPUT/OUTPUT PPI製品 Interface Corporation - 20 - TUT-0016 4.1 モード0入力/出力 CTP-2746,PCI-2746C,CPZ-2746には8255が2個実装されています。ここでは、その2個の8255のうち、 一方をモード0の出力に、もう一方をモード0の入力に設定し、簡単な通信を行うプログラムの作 成を行います。 8255(2) 通信 8255(1) PCI-2747Aを使用する場合は、一方のI/Oモジュールから、もう一方のI/Oモジュールに対し通信を 行います。 本チュートリアルでは便宜上I/Oモジュールに実装された8255をそれぞれ「8255(1)」,「8255(2)」 と表記しています。 では、使用する製品型式に応じて、端子台上で次の図のように対応するピンをビニール被覆線で 接続してください。 -COM1~ -COM4はI/Oモジュール内で接続されていますので、接続は不要です。 ただし、外部回路との接続時は、必ず接続してください。 PCI-2746C,CTP-2746を使用する場合 8255(1)側 8255(2)側 信号 1PA0 1PA1 ピン 3 4 1PA7 10 ・ ・ ・ ・ ・ ・ ・ ・ ・ 信号 2PA0 2PA1 ピン 51 52 2PA7 58 ・ ・ ・ ・ ・ ・ ※ ピン番号はTNS-9601のものです。 PCI-2747Aを2枚使用する場合 8255(1)側 8255(2)側 信号 PA0 PA1 ピン CNA2 CNA3 PA7 CNA9 ・ ・ ・ ・ ・ ・ ・ ・ ・ 信号 PA0 PA1 ピン CNA2 CNA3 PA7 CNA9 ・ ・ ・ ・ ・ ・ ※ ピン番号はTRM-2601のものです。2台のTRM-2601を接続するように配線してください。 ※ I/Oモジュール番号「0」のPCI-2747Aを8255(1)の端子台に、I/Oモジュール番号「1」のPCI-2747A を8255(2)の端子台に接続してください。 CPZ-2746を使用する場合 8255(1)側 8255(2)側 信号 1PA0 1PA1 ピン 46 45 1PA7 39 ・ ・ ・ ・ ・ ・ ・ ・ ・ 信号 2PA0 2PA1 ピン 94 93 2PA7 87 ・ ・ ・ ・ ・ ・ ※ ピン番号はTBZ-960xのものです。 - 21 - Interface Corporation TUT-0016 Step1.基本フォーム作成 ここでは、これから作成するプログラムの画面作成を行います。 ①Visual Basicを起動し新しい標準EXEプロジェクトを作成します。 新規作成タブより「標準EXE」を選択した後「開く」ボタンをクリックします。 標準EXEを選択します ②既定のフォームのオブジェクト名を”frmPPITest”に変更し、フォームのCaptionプロパティ "PPI モード0入出力確認用プログラム" に変更します。 画面上にフォームが1つ表示されているので、そのフォームを選択し、プロパティウィンドウ に値を設定します。(オブジェクト名)を“frmPPITest”にCaptionを“PPIモード0 入出力確認用 プログラム”にそれぞれ変更します。 オブジェクト名を変更します Caption を変更します Interface Corporation - 22 - TUT-0016 ③プロジェクトに標準モジュールを追加します。 標準モジュールを追加します ここまでで、基本フォームの作成は完了です。 Step2.DLLプロシージャ宣言 DLL プロシージャを利用するには、Declareステートメントを使ってプロシージャの位置を指定し、 プロシージャの呼び出しに使う引数の識別を行わなければなりません。 DLLとはダイナミックリンクライブラリ(Dynamic Link Library)の略でアプリケーションの実行時 に動的にリンクして利用できるプロシージャのライブラリです。そもそも、VisualBasicでは直接I/O やメモリにアクセスすることができません。言い換えれば、PPI製品に対して直接的に信号を送る ことができません。そこで、I/Oモジュールに対して直接的に信号を送るプログラム(DLL)から必 要な手続き(プロシージャ)を呼び出し、このDLLを介してI/Oモジュールの制御を行います。 ここで一度宣言したDLLプロシージャは、Visual Basic のプロシージャと同じようにコードで呼び 出すことが可能となります。 - 23 - Interface Corporation TUT-0016 ①標準モジュールに下記を追加します。 (標準モジュールのプロシージャ宣言のコード) 'FbiPpi.BAS ' ' FbiPpi.DLL から export されている関数のプロトタイプ宣言,構造体宣言,識別子定義 ' ' Copyright (C) 1998 Interface Corpration ' ----------------------------------------------------------------------' 識別子 ' ----------------------------------------------------------------------Public Const FBIPPI_FLAG_SHARE = &H2 'デバイスの重複オープンを許可します。 Public Const FBIPPI_8255_CONTROLLER1 = 0 Public Const FBIPPI_8255_CONTROLLER2 = 1 Public Const FBIPPI_PORT_A = 0 Public Const FBIPPI_PORT_B = 1 Public Const FBIPPI_PORT_C = 2 '8255 ポート数(ポート A,B,C) '8255 ポート数(ポート A,B,C) '8255 ポートポート A '8255 ポートポート B '8255 ポートポート C ' ----------------------------------------------------------------------' 戻り値 ' ----------------------------------------------------------------------Public Const FBIPPI_ERROR_SUCCESS = 0 ' 正常終了 Public Const FBIPPI_ERROR_NOT_DEVICE = &HC0000001 ' 指定されたデバイスを見つけることができません Public Const FBIPPI_ERROR_NOT_OPEN = &HC0000002 ' システムがデバイスをオープンできません Public Const FBIPPI_ERROR_INVALID_HANDLE = &HC0000003 ' デバイスハンドルが正しくありません Public Const FBIPPI_ERROR_ALREADY_OPEN = &HC0000004 ' OPEN しているデバイスを OPEN しようとしました Public Const FBIPPI_ERROR_HANDLE_EOF = &HC0000005 ' EOF に達しました Public Const FBIPPI_ERROR_MORE_DATA = &HC0000006 ' さらに多くのデータが利用可能です Public Const FBIPPI_ERROR_INSUFFICIENT_BUFFER = &HC0000007 ' データ領域が小さすぎます Public Const FBIPPI_ERROR_IO_PENDING = &HC0000008 ' 非同期 I/O 操作が進行中です Public Const FBIPPI_ERROR_NOT_SUPPORTED = &HC0000009 ' サポートされていない機能です Public Const FBIPPI_ERROR_MEMORY_NOTALLOCATED = &HC0001000 ' 作業用メモリの確保に失敗しました Public Const FBIPPI_ERROR_PARAMETER = &HC0001001 ' 引数パラメータの値が不正です Public Const FBIPPI_ERROR_INVALID_CALL = &HC0001002 ' 不正なファンクション呼び出しです Public Const FBIPPI_ERROR_DRVCAL = &HC0001003 ' ドライバ が 呼び出せません Public Const FBIPPI_ERROR_NULL_POINTER = &HC0001004 ' NULL ポインタが渡されました ' ----------------------------------------------------------------------' DLL ' ----------------------------------------------------------------------Declare Function PpiOpen Lib "FbiPpi.DLL" (ByVal lpszName As String, ByVal fdwAttrs As Long) As Long Declare Function PpiClose Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function PpiControl Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal bControlData As Byte) As Long Declare Function PpiInputPort Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal dwPort As Long, ByRef pbValue As Byte) As Long Declare Function PpiOutputPort Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal dwPort As Long, ByVal pbValue As Byte) As Long Declare Function PpiSetEventMask Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal bEventMask As Byte) As Long Declare Function PpiGetEventMask Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbEventMask As Byte) As Long Declare Function PpiSetEventConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal bEventConfig As Byte) As Long Declare Function PpiGetEventConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbEventConfig As Byte) As Long Declare Function PpiSetTimerConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal bTimerConfigValue As Byte) As Long Declare Function PpiGetTimerConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbTimerConfigValue As Byte) As Long Declare Function PpiGetTimerCount Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbTimerCount As Byte) As Long Declare Function PpiGetResetInStatus Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbResetInStatus As Byte) As Long Declare Function PpiEventRequestPending Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwEventEnableMask As Long, ByRef pdwEventBuf As Long, ByRef pOverlapped As OVERLAPPED) As Long Declare Function PpiCommonGetPciDeviceInfo Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pdwDeviceID As Long, ByRef pdwVenderID As Long, ByRef pdwClassCode As Long, ByRef pdwRevisionID As Long, ByRef pdwBaseAddress0 As Long, ByRef pdwBaseAddress1 As Long, ByRef pdwBaseAddress2 As Long, ByRef pdwBaseAddress3 As Long, ByRef pdwBaseAddress4 As Long, ByRef pdwBaseAddress5 As Long, ByRef pdwSubsystemID As Long, ByRef pdwSubsystemVenderID As Long, ByRef pdwInterruptLine As Long, ByRef pdwBoardID As Long) As Long Interface Corporation - 24 - TUT-0016 ' ----------------------------------------------------------------------' WIN32API より ' ----------------------------------------------------------------------Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 'Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (lpEventAttributes As SECURITY_ATTRIBUTES, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long 'Windows98/95 では SECURITY_ATTRIBUTES を指定するとエラーとなります 'lpEventAttributes に NULL を指定するため、下記のように API ビューワで宣言されている '定義と違う宣言を行いますのでご注意ください。 Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (ByVal lpEventAttributes As Long, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 本コードは、製品に添付されるサンプルプログラムに、同じものが記載されております。また、 弊社Web siteよりもダウンロードできますので、そちらを流用してください。 Step3.初期化処理と終了処理 ここでは、実際のプログラム作成を行う前に、PPI製品の初期化処理と終了処理に関して、知って おかなければならないこと、および制約事項について記載します。 PPI製品の制御を行うには、まずI/Oモジュールの初期化を行わなければなりません。I/Oモジュー ルの初期化は以下のコードにより行います。 (I/O モジュールの初期化) Dim lpszName As String Dim hDeviceHandle as Long 'I/O モジュール初期化を行います lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) このとき、文字列変数lpszNameに設定する値は、使用するI/Oモジュールのデバイス名を指定しま す。デバイス名は、コントロールパネルよりシステムを選択し「システムのプロパティ」の「デ バイスマネージャ」より確認できます。 - 25 - Interface Corporation TUT-0016 I/O モ ジ ュ ー ル の 初 期 化 は PpiOpen 関 数 に よ り 行 い ま す 。 ま た 、 設 定 す る パ ラ メ ー タ に FBIPPI_FLAG_SHAREとありますが、これは、同じデバイス名のI/Oモジュールを2つ以上のアプ リケーションで共有するか否かを設定しています。本サンプルコードでは「共有する」となって います。また、同変数には&h2が格納されています。&h2以外の値を設定すると「共有しない」と なります。 「使用例」 使用するI/Oモジュールのデバイス名を指定します。 hDeviceHandle = PpiOpen(lpszName,使用するI/Oモジュールのデ FBIPPI_FLAG_SHARE) バイス名を指定します。 共有する場合&h2を指定します。共有しな い場合はそれ以外の値を指定します。 デバイスハンドルを格納する長整数 (Long)型の変数を指定します。 また、アプリケーションの終了時、もしくは処理の終了時に、I/Oモジュールに対して必ず終了処 理を行わなければなりません。 I/Oモジュールの終了処理は以下のコードにより行います。 (I/O モジュールの終了処理) ‘終了処理 nRet = PpiClose(hDeviceHandle) I/Oモジュールの終了処理はPpiClose関数より行います。ここで、注意しなければならないのは、 設定する引数のhDeviceHandleです。hDeviceHandleにはI/Oモジュールの初期化の際のPpiOpen関数 の戻り値を指定します。PpiOpen 関数実行時、その戻り値であるhDeviceHandleには有効なハンド ル(番号)が格納されています。 ハンドルとは使用するデバイスの接続に関する情報が格納されたメモリ領域を、識別するための 値を示します。 プログラム作成時、このhDeviceHandleの値が、終了処理を行うデバイスの、PpiOpen関数実行時 に取得された値となるように、PpiOpen関数とPpiClose関数は必ず組になるよう注意してください。 ハンドル PpiOpen 「使用例」 関数が失敗するとエラーコードが格納されます。 nRet = PpiClose(hDeviceHandle) I/Oモジュールのオープン時に取得した デバイスハンドルを指定します。 PpiClose Interface Corporation - 26 - TUT-0016 Step4.モード0入出力 では、実際に通信プログラムの作成を行います。ここでは8255(1)のポートAから出力したデータ を8255(2)のポートAより入力します。 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdTest」,Captionプロパティを「モード0 入出力」に変更します。 ②フォーム上にテキストボックス(TextBox)コントロールを描画し、オブジェクト名を「txtMon」 に変更します。 ③作成したコマンドボタン(cmdTest)をダブルクリックし編集ウィンドウを開き以下のコードを記 述します。 (コマンドボタン(cmdTest)の Click イベントのコード) Private Sub cmdTest_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim bRecv As Byte Dim I 'PCI-2747A を2枚使用している場合の追加コード 'Dim lpszName2 As String 'Dim hDeviceHandle2 As Long Dim strSndDat As String '送信文字列 'PPI 製品のオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If 'PCI-2747A を2枚使用している場合は以下のコードを追加 'lpszName = "FBIPPI2" & Chr(0) 'hDeviceHandle2 = PpiOpen(lpszName2, FBIPPI_FLAG_SHARE) 'If hDeviceHandle = &HFFFF Then ' MsgBox ("デバイスのオープンに失敗しました") ' Exit Sub 'End If '8255(1)をモード 0 全点入力に設定します[制御データ=10011011] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &H9B) If nRet <> 0 Then MsgBox ("8255(1)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If - 27 - Interface Corporation TUT-0016 '8255(2)をモード 0 全点出力に設定します[制御データ=10000000] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER2, &H80) 'PCI-2747A を2枚使用している場合のは以下のコードに変更 'nRet = PpiControl(hDeviceHandle2, FBIPPI_8255_CONTROLLER1, &H80) If nRet <> 0 Then MsgBox ("8255(2)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If strSndDat = "HELLO" '出力文字列を設定します ' 設定された文字列を1文字ずつ処理します For I = 1 To Len(strSndDat) bSend = Asc(Mid(strSndDat, I, 1)) '送信文字列より1文字取り出しアスキーコードに変換します '8255(2)のポート A からデータ(1文字)を出力します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_A, bSend) 'PCI-2747A を2枚使用している場合のは以下のコードに変更 'nRet = PpiOutputPort(hDeviceHandle2, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bSend) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(1)ポート A よりデータ(1文字)を入力します nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '入力されたデータをイミディエイトウィンドウに表示します txtMon.SelText = Chr(bRecv) Next 'PPI 製品をクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If 'PCI-2747A を2枚使用している場合は以下のコードを追加 'nRet = PpiClose(hDeviceHandle2) 'If nRet <> 0 Then ' MsgBox ("デバイスのクローズに失敗しました") 'End If End Sub ※ PCI-2747Aを2枚使用している場合のコードは、ソース中にコメント文として記載しています。 Interface Corporation - 28 - TUT-0016 プログラムの入力が終わったら保存した後、プログラムを実行し「モード0 入出力」ボタンをクリッ クしてください。 テキストボックス(txtMon)に「HELLO」と表示されます。 8255(2)より出力されたデータが、端子台を介し8255(1)に入力され、その入力されたデータが表示 されています。 端子台 HELLO PPI製品 HELLO では、「27ページ コマンドボタン(cmdTest)のClickイベントのコード」の処理を読み取ってみま しょう。I/Oモジュールの初期化処理後プログラムは8255の設定を行っています。8255の設定には PpiControl関数を使用します。 「使用例」 設定する8255を指定します。 8255に設定するコマンド です。 nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &H9B) 関数が失敗するとエラー コードが格納されます。 I/Oモジュールのオープン時に取得 したデバイスハンドルを指定しま す。 - 29 - Interface Corporation TUT-0016 第3引数に設定する8255 PPIコントローラ制御レジスタへの制御データですが、下図のように決め られています。 制御レジスタ D7 D6 D5 D4 D3 D2 D1 D0 グループB ポートC下位 1=入力 0=出力 ポートB 1=入力 0=出力 モード選択 1=モード1 0=モード0 グループA ポートC上位 1=入力 0=出力 ポートA 1=入力 0=出力 モード選択 00=モード1 01=モード0 1X=モード2 機能制御 1=モード選択 0=ビットセット/リセット ここでは、8255(1)をモード0の全点入力に、8255(2)をモード0の全点出力に設定しますので、それ ぞれの制御レジスタには「10011011」と「10000000」を設定します。 プログラム中ではこれらを16進数表記にしていますので「&h9B」と「&h80」を設定しています。 Interface Corporation - 30 - TUT-0016 次に、データの出力を行うわけですが、For ∼ Next文にて出力文字列を1文字(1バイト)ずつア スキーコードに変換し順に8255(2)のポートAより出力しています。データの出力にはPpiOutputPort 関数を使用します。 「使用例」 設定する8255を指定しま す。 nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, _ FBIPPI_PORT_A, bSend) 関数が失敗するとエ ラーコードが格納さ れます。 出力する1バイトの データを指定しま す。 I/O モ ジ ュ ー ル の オープン時に取得し たデバイスハンドル を指定します。 出力するポートを指 定します。 データを8255(2)のポートAより出力した直後、今度はそのデータを8255(1)のポートAより入力し ています。データの入力にはPpiInputPort関数を使用します。 「使用例」 設定する8255を指定しま す。 nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, _ FBIPPI_PORT_A, bRecv) 関数が失敗するとエ ラーコードが格納さ れます。 入力する1バイトの データを格納する変 数を指定します。 I/O モ ジ ュ ー ル の オープン時に取得し たデバイスハンドル を指定します。 入力するポートを指 定します。 最後にI/Oモジュールの終了処理を行ってプログラムは終了します。 - 31 - Interface Corporation TUT-0016 4.2 モード1入力 ここでは、PPI製品の8255(1)をモード1入力に設定し、8255(2)より出力されるデータを入力する制 御信号を用いた簡単な通信プログラムの作成を行います。 では、まずこの制御信号について見てみます。 8255は設定されたモードにより、定められた動作をします。この定められた動作を示しているタ イミングチャートを下図に記載します。タイミングチャートとは信号線に与える信号の手順を示 す図のことです。 STB IBF REI をセットしなければ、 INTR は H レベルのままです。 INTR RD 外部から のデータ H L H L H L H L ラッチされたデータ 時間の経過 制御信号線は必ず5Vか0Vのどちらかの状態になります。それぞれをH(High)レベル,L(Low)レベル といいます。コンピュータ上のデータとしては「1」と「0」に相当します※1。各制御信号の名称 に関しては巻末の「8255 PPI コントローラ説明」を参照してください。 ※1 PPI製品は正論理で動作しています。 では、このタイミングチャートを解読してみましょう。 まず、入力ポートには外部の接続機器からデータが入力されているとします。このとき、接続さ れた外部機器よりSTBをLレベル、Hレベルの順に変化させると、入力データがラッチされ、同時 にINTR信号がHレベルに変化します※2。また、STBをLレベルにした際にはIBFがHレベルに変化 しています。 そして、ラッチされたデータを読み込む(RD)とIBFがHレベルからLレベルに変化します。 ※2 INTR信号を有効にするためには、ビット操作命令でREIに「1」をセットします。 Interface Corporation - 32 - TUT-0016 以上のことから、以下のハンドシェーク通信が可能であると考えられます。またここでは、便宜 上通信の終了時には出力側が入力側に通信終了コードを送信するものとします。 「入力側」 (1)INTR信号がHレベルになるまで待機する。 (2)データを読み込む。 (3)通信終了コードが送られてくるまで(1)から繰り返す。 「出力側」 (1)データを出力する。 (2)入力側のSTBをLレベル,Hレベルの順に変化させる。 (3)入力側のIBF信号を確認しLレベルになるまで待機する。 (4)次のデータがある場合は(1)から繰り返す。 これらのことをフローチャートにまとめると下図のようになります。 入力側(8255(1)) 出力側(8255(2)) - 33 - Interface Corporation TUT-0016 では、端子台上で下図のように対応するピンをビニール被覆線で接続してください。 -COM1~ -COM4はI/Oモジュール内で接続されていますので、接続は不要です。 ただし、外部回路との接続時は、必ず接続してください。 PCI-2746C,CTP-2746を使用する場合 8255(1) 側 信号 ピン 1PA0 3 1PA1 4 ・ ・ ・ ・ ・ ・ 1PA7 10 1PC5(IBF) 1PC4(STB) 1PC3(INT) 36 35 34 1PB7 18 ・ ・ ・ 8255(2) 側 信号 ピン 2PA0 51 2PA1 52 ・ ・ ・ ・ ・ ・ 2PA7 58 2PB7 2PC2 66 81 ※ ピン番号はTNS-9601のものです。 PCI-2747Aを2枚使用する場合 8255(1) 信号 PA0 3PA1 ・ ・ ・ 9PA7 側 ピン CNA2 CNA3 ・ ・ ・ CNA9 PC5(IBF) PC4(STB) PC3(INT) CNC7 CNC6 CNC5 PB7 CNB9 8255(2) 信号 PA0 PA1 ・ ・ ・ PA7 ・ ・ ・ PB7 PC2 側 ピン CNA2 CNA3 ・ ・ ・ CNA9 CNB9 CNC4 ※ ピン番号はTRM-2601のものです。2台のTRM-2601を接続するように配線してください。 ※ I/Oモジュール番号「0」のPCI-2747Aを8255(1)の端子台に、I/Oモジュール番号「1」のPCI-2747A を8255(2)の端子台に接続してください CPZ-2746を使用する場合 8255(1) 側 信号 ピン 1PA0 46 1PA1 45 ・ ・ ・ ・ ・ ・ 1PA7 39 1PC5(IBF) 1PC4(STB) 1PC3(INT) 13 14 15 1PB7 31 ・ ・ ・ 8255(2) 側 信号 ピン 2PA0 94 2PA1 93 ・ ・ ・ ・ ・ ・ 2PA7 87 2PB7 2PC2 ※ ピン番号はTBZ-960xのものです。 Interface Corporation - 34 - 79 64 TUT-0016 これより、プログラムの作成を行います。まず、入力側のプログラムから作成します。 Step1.基本フォーム作成(入力側) ①Visual Basicを起動し新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を“frmPpiRecv”に、フォームのCaptionプロパティを"PPIモー ド1入力確認用プログラム"に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Step2.モード1入力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdRecv」に、Captionプロパティを「PPI モード1 入力」に変更します。 ②フォーム上にテキストボックス(TextBox)コントロールを描画し、オブジェクト名を「txtMon」 に変更します。 ③作成したコマンドボタン(cmdRecv)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 (コマンドボタン(cmdRecv)の Click イベントのコード) Private Sub cmdRecv_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bRecv As Byte Dim I 'デバイス名 '関数の戻り値 'デバイスハンドル '受信データ Dim fReadOk As Boolean '制御信号監視用フラグ '画面初期化 txtMon = "" 'PPI 製品のオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(1)の設定を行います 'グループ A=Mode1 入力 'グループ B=Mode=0 入力 - 35 - Interface Corporation TUT-0016 '[制御データ=10111011] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HBB) If nRet <> 0 Then MsgBox ("8255(1)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'INTR 信号を有効にするため、8255(1)グループ A の RIE に 1 をセットします '[制御データ=00001001] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &H9) Do '1PB7 の状態を監視し High になるまで待機します fReadOk = False Do Until fReadOk = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'ビット判定 If (bRecv And &H80) = &H80 Then fReadOk = True End If DoEvents Loop '8255(1)ポート A よりデータ(1文字)を入力します nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '入力されたデータをテキストボックスに表示します txtMon.SelText = bRecv & Chr(13) & Chr(10) If bRecv = 255 Then Exit Do Loop 'PPI 製品をクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub Step3. 基本フォーム作成(出力側) モード1での入力確認用にモード0でのデータ出力プログラムの作成を行います。 ①Visual Basicを起動し新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPPISend」に、フォームのCaptionプロパティを「PPI モード1入力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Interface Corporation - 36 - TUT-0016 Step4.モード0出力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdSend」に、Captionプロパティを「データ出力」に変更します。 ②作成したコマンドボタン(cmdSend)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 (コマンドボタン(cmdSend)の Click イベントのコード) Private Sub cmdSend_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim I Dim fNextSend As Boolean 'デバイス名 '関数戻り値 'デバイスハンドル '送信データ '信号監視用フラグ 'PPI 製品のオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) 'PCI-2747A を2枚使用している場合は上記2行を以下のコートに変更 'lpszName = "FBIPPI2" & Chr(0) 'hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) ' 'また、コード中にある"FBIPPI_8255_CONTROLLER2"は 'すべて"FBIPPI_8255_CONTROLLER1"に変更する If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(2)の設定を行います 'Mode=0 'PortA=OUT 'PortB=IN 'PortC=OUT '[制御データ=10000010] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER2, &H82) If nRet <> 0 Then MsgBox ("8255(2)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)より 0∼255 の数値データを出力します For I = 0 To 255 bSend = I '8255(2)のポート A からデータを出力します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_A, bSend) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If - 37 - Interface Corporation TUT-0016 ' '8255(1)の STB に Low パルスを送信します ' '8255(2)の 2PC2 を Low にセットし入力側のデータをラッチします nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFB) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)の 2PC2 を High にセットし入力側のデータをラッチを終了します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFF) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)の 2PB7 の状態を監視し Low になるまで待機します fNextSend = False Do Until fNextSend = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(2)ポート B の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If If (Not bRecv And &H80) = &H80 Then fNextSend = True End If DoEvents Loop Next MsgBox "送信完了" 'PPI 製品をクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub ※ PCI-2747Aを2枚使用している場合は、「27ページ コマンドボタン(cmdTest)のClickイベント のコード」と同様の修正を行ってください。 Interface Corporation - 38 - TUT-0016 プログラムの入力が終わったら、保存した後、入力側/出力側のプログラムをそれぞれ実行してく ださい。まず入力側の「PPI モード1入力」ボタンをクリックしてください。まだ、なにもおきま せん。今度は出力側の「データ出力」ボタンをクリックしてください。入力側のテキストボック ス(txtMon)に下図のよう表示されます。 ※ 1∼255まで表示され、255が表示されると通信が終了します。 これは、入力側/出力側、それぞれのプログラムが特定の条件を満たさない限りデータの入力/出力 を行わないようにしているためです。 また、こうすることによりデータの取りこぼし等を防ぎ、安定した通信を行うことが可能になり ます。 D0~D7 8255 STB IBF INTR 4.3 モード1出力 ここでは、モード1出力に設定した8255(1)からデータを出力し、8255(2)よりデータを入力する 『32ページ 4.2 モード1入力』とは逆の動作をする、制御信号を用いた簡単な通信プログラム の作成を行います。 下図にモード1出力設定時のタイミングチャートを示します。 - 39 - Interface Corporation TUT-0016 WR OBF WEI をセットしなければ、 INTR は H レベルのままです。 INTR ACK H L H L H L H L 外部への 出力データ 出力される新しいデータ 時間の経過 では、このタイミングチャートを解読してみましょう。 まず、INTR信号がHレベルのとき出力データの書き込み(WR)を行うと、INTR信号がHレベルから Lレベルに変化します※。データの書き込みが完了すると、接続された外部機器にデータが出力さ れ、OBF信号がHレベルからLレベルに変化します。この後、接続された外部機器よりACK信号を Lレベル,Hレベルの順に変化させると、OBF信号,INTR信号がもとの状態(Hレベル)に変化します。 ※ INTR信号を有効にするためには、ビット操作命令でWEIに「1」をセットします。 以上のことから、以下のハンドシェイク通信が可能であると考えられます。またここでは、便宜 上通信の終了時には出力側が入力側に通信終了コードを送信するものとします。 「出力側」 (1)データを出力する (2)INTRを確認しHレベルになるまで待機する (3)次のデータがある場合は(1)から繰り返す 「入力側」 (1)出力側のOBF信号がLレベルになるまで待機する (2)データを読み込む (3)出力側のACKをLレベル、Hレベルの順に変化させる (4)通信終了コードが送られてくるまで(1)から繰り返す Interface Corporation - 40 - TUT-0016 これらのことをフローチャートにまとめると下図のようになります。 出力側(8255(1)) 出力側(8255(2)) 開始 出力側のOBF はLレベル? Yes データ入力 出力側のACKを Lレベル,Hレベル の順に変化させる 通信終了 コード? Yes 終了 では、端子台上で下図のように対応するピンをビニール被覆線で接続してください。 -COM1~ -COM4はI/Oモジュール内で接続されていますので、接続は不要です。 ただし、外部回路との接続時は、必ず接続してください。 PCI-2746C,CTP-2746を使用する場合 8255(1) 側 信号 ピン 1PA0 3 1PA1 4 ・ ・ ・ ・ ・ ・ 1PA7 10 1PC7(IBF) 1PC6(STB) 1PC3(INT) 38 37 34 1PB7 18 ・ ・ ・ 8255(2) 側 信号 ピン 2PA0 51 2PA1 52 ・ ・ ・ ・ ・ ・ 2PA7 58 2PB7 2PC2 66 81 ※ ピン番号はTNS-9601のものです。 - 41 - Interface Corporation TUT-0016 PCI-2747Aを2枚使用する場合 8255(1) 信号 PA0 PA1 ・ ・ ・ PA7 側 ピン CNA2 CNA3 ・ ・ ・ CNA9 PC7(IBF) PC6(STB) PC3(INT) CNC9 CNC8 CNC5 PB7 CNB9 ・ ・ ・ 8255(2) 信号 PA0 PA1 ・ ・ ・ PA7 PB7 PC2 側 ピン CNA2 CNA3 ・ ・ ・ CNA9 CNB9 CNC4 ※ ピン番号はTRM-2601のものです。2台のTRM-2601を接続するように配線してください。 ※ I/Oモジュール番号「0」のPCI-2747Aを8255(1)の端子台に、I/Oモジュール番号「1」のPCI-2747A を8255(2)の端子台に接続してください。 CPZ-2746を使用する場合 8255(1) 側 信号 ピン 1PA0 46 1PA1 45 ・ ・ ・ ・ ・ ・ 1PA7 39 1PC7(IBF) 1PC6(STB) 1PC3(INT) 11 12 15 1PB7 31 ・ ・ ・ 8255(2) 側 信号 ピン 2PA0 94 2PA1 93 ・ ・ ・ ・ ・ ・ 2PA7 87 2PB7 2PC2 79 64 ※ ピン番号はTBZ-960xのものです。 これより、プログラムの作成を行います。まず、出力側のプログラムから作成します。 Step1.基本フォーム作成(出力側) ①Visual Basicを起動し新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPPISend」に、フォームのCaptionプロパティを「PPI モード1出力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Interface Corporation - 42 - TUT-0016 Step2.モード1出力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdSend」に、Captionプロパティを「PPI モード1 出力」に変更します。 ②作成したコマンドボタン(cmdSend)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 (コマンドボタン(cmdSend)の Click イベントのコード) Private Sub cmdSend_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim bRecv As Byte Dim I Dim fNextSend As Boolean 'PPI I/O モジュールのオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(1)の設定を行います 'グループ A=Mode1 出力 'グループ B=Mode0 入力 '[制御データ=10100011] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HA3) If nRet <> 0 Then MsgBox ("8255(1)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'INTR 信号を有効にするため 8255(1)グループ A の WIE に 1 をセットします '[制御データ=00001101] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HD) '8255(1)より 0∼255 の数値データを出力します For I = 0 To 255 bSend = I '8255(1)のポート A からデータを出力します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bSend) '8255(1)の 1PB7 の状態を監視し High になるまで待機します fNextSend = False Do Until fNextSend = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート B の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If If (bRecv And &H80) = &H80 Then fNextSend = True End If - 43 - Interface Corporation TUT-0016 DoEvents Loop If nRet <> 0 Then MsgBox ("8255(1)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If Next MsgBox "送信完了" 'PPI I/O モジュールをクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub Step3.基本フォーム作成(入力側) モード1での出力確認用にモード0でのデータ入力プログラムの作成を行います。 ①Visual Basicを起動し新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPpiRecv」に、フォームのCaptionプロパティを「PPI モード1出力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Interface Corporation - 44 - TUT-0016 Step4.モード0入力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdRecv」に、Captionプロパティを「データ入力」に変更します。 ②作成したコマンドボタン(cmdRecv)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 (コマンドボタン(cmdRecv)の Click イベントのコード) Private Sub cmdRecv_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim bRecv As Byte Dim I Dim fReadOk As Boolean txtMon = "" 'PPI I/O モジュールのオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(2)の設定を行います 'Mode=0 'PortA=IN 'PortB=IN 'PortC=OUT '[制御データ=10010010] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER2, &H92) If nRet <> 0 Then MsgBox ("8255(2)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFF) Do '2PB7 の状態を監視し Low になるまで待機します(OBF のポーリング) fReadOk = False Do Until fReadOk = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'ビット判定 If (Not bRecv And &H80) = &H80 Then fReadOk = True End If DoEvents '8255(2)ポート A よりデータ(1文字)を入力します nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_A, bRecv) If nRet <> 0 Then MsgBox ("8255(2)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If Loop - 45 - Interface Corporation TUT-0016 '8255(1)に ACK の Low パルスを送信します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFB) If nRet <> 0 Then MsgBox ("8255(2)ポート C の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFF) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '入力されたデータをテキストボックスに表示します txtMon.SelText = bRecv & Chr(13) & Chr(10) If bRecv = 255 Then Exit Do Loop 'PPI I/O モジュールをクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub PCI-2747Aを2枚使用している場合は、「27ページ コマンドボタン(cmdTest)のClickイベントの コード」と同様の修正を行ってください。 プログラムの入力が終わったら、保存した後、入力側/出力側のプログラムをそれぞれ実行してく ださい。まず出力側の「PPI モード1出力」ボタンをクリックしてください。まだ、なにもおきま せん。今度は入力側の「データ入力」ボタンをクリックしてください。入力側のテキストボック ス(txtMon)に下図のように表示されます。 ※ 1∼255まで表示され、255が表示されると通信が終了します。 これも、入力側/出力側、それぞれのプログラムが特定の条件を満たさない限りデータの入力/出力 を行わないようにしているためです。 D0~D7 ACK 8255 OBF INTR 以上が、モード1による制御信号を用いた簡単な通信プログラムです。 Interface Corporation - 46 - TUT-0016 4.4 モード2入力 ここでは、PPI I/Oモジュールの8255(1)をモード2に設定し、8255(2)より出力されるデータを入力 する制御信号を用いた簡単な通信プログラムの作成を行います。 下図にモード2設定時のタイミングチャートを示します。 H L H L H L H L H L H L WR OBF INTR ACK STB IBF データ 出力データ 入力データ H L RD タイミングチャートを見る限りでは、データ・ポートが双方向であること以外、入出力時におけ る制御信号の変化は、モード1の入力,モード1の出力時におけるそれと変わりはありません。 そこで、通信プログラムは『32ページ 4.2 モード1入力』で使用したものを流用し、端子台の 結線を変更することで、動作の検証を行ってみます。 では、端子台上で下図のように対応するピンをビニール被覆線で接続してください。 -COM1~ -COM4はI/Oモジュール内で接続されていますので、接続は不要です。 ただし、外部回路との接続時は、必ず接続してください。 PCI-2746C,CTP-2746を使用する場合 8255(1) 側 信号 ピン 1PA0 3 1PA1 4 ・ ・ ・ ・ ・ ・ 1PA7 10 1PC7(OBF) 1PC6(ACK) 1PC5(IBF) 1PC4(STB) 1PC3(INT) 38 37 36 35 34 1PB7 18 ・ ・ ・ 8255(2) 側 信号 ピン 2PA0 51 2PA1 52 ・ ・ ・ ・ ・ ・ 2PA7 58 2PB7 2PC2 2PB6 2PC3 66 81 65 82 ※ ピン番号はTNS-9601のものです。 - 47 - Interface Corporation TUT-0016 PCI-2747Aを2枚使用する場合 8255(1) 信号 PA0 PA1 ・ ・ ・ PA7 側 ピン CHA2 CHA3 ・ ・ ・ CHA9 PC7(OBF) PC6(ACK) PC5(IBF) PC4(STB) PC3(INT) CHC9 CHC8 CHC7 CHC6 CHC5 PB7 CNB9 8255(2) 信号 PA0 PA1 ・ ・ ・ PA7 PB7 PC2 PB6 PC3 側 ピン CHA2 CHA3 CHA9 CNB9 CHC4 CNB8 CHC5 ※ ピン番号はTRM-2601のものです。2台のTRM-2601を接続するように配線してください。 ※ I/Oモジュール番号「0」のPCI-2747Aを8255(1)の端子台に、I/Oモジュール番号「1」のPCI-2747A を8255(2)の端子台に接続してください。 CPZ-2746を使用する場合 8255(1) 側 信号 ピン 1PA0 46 1PA1 45 ・ ・ ・ ・ ・ ・ 1PA7 39 1PC7(OBF) 1PC6(ACK) 1PC5(IBF) 1PC4(STB) 1PC3(INT) 11 12 13 14 15 1PB7 31 ・ ・ ・ 8255(2) 側 信号 ピン 2PA0 94 2PA1 93 ・ ・ ・ ・ ・ ・ 2PA7 87 2PB7 2PC2 2PB6 2PC3 79 64 80 63 ※ ピン番号はTBZ-960xのものです。 これより、プログラムの作成を行います。まず、入力側のプログラムから作成します。 Step1.基本フォーム作成(入力側) ①Visual Basicを起動し、新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を“frmPpiRecv”に、フォームのCaptionプロパティを"PPIモー ド2入力確認用プログラム"に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Interface Corporation - 48 - TUT-0016 Step2.モード2入力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdRecv」に、Captionプロパティを「PPI モード2 入力」に変更します。 ②フォーム上にテキストボックス(TextBox)コントロールを描画し、オブジェクト名を「txtMon」 に変更します。 ③作成したコマンドボタン(cmdRecv)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 プログラムは「45ページ コマンドボタン(cmdRecv)のClickイベントのコード」を流用しています。 実質の修正は1行のみです。 (コマンドボタン(cmdRecv)の Click イベントのコード) Private Sub cmdRecv_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bRecv As Byte Dim I 'デバイス名 '関数の戻り値 'デバイスハンドル '受信データ Dim fReadOk As Boolean '制御信号監視用フラグ '画面初期化 txtMon = "" 'PPII/O モジュールのオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(1)の設定を行います 'グループ A=Mode=2 'グループ B=Mode=0 入力 '[制御データ=11000011] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HC3) If nRet <> 0 Then MsgBox ("8255(1)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'INTR 信号を有効にするため 8255(1)グループ A の RIE に 1 をセットします '[制御データ=00001001] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &H9) Do '1PB7 の状態を監視し High になるまで待機します fReadOk = False Do Until fReadOk = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If - 49 - Interface Corporation TUT-0016 'ビット判定 If (bRecv And &H80) = &H80 Then fReadOk = True End If DoEvents Loop '8255(1)ポート A よりデータ(1文字)を入力します nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '入力されたデータをテキストボックスに表示します txtMon.SelText = bRecv & Chr(13) & Chr(10) If bRecv = 255 Then Exit Do Loop 'PPII/O モジュールをクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub …修正部分 Step3.基本フォーム作成(出力側) モード2での入力確認用にモード0でのデータ出力プログラムの作成を行います。 ①Visual Basicを起動し、新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPPISend」に、フォームのCaptionプロパティを「PPI モード2入力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Step4.モード0出力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdSend」に、Captionプロパティを「データ出力」に変更します。 ②作成したコマンドボタン(cmdSend)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 プログラムは「37ページ コマンドボタン(cmdSend)のClickイベントのコード」を流用しています。 修正は3個所です(結線を変更しているのでパラメータの修正が必要になります)。 Interface Corporation - 50 - TUT-0016 (コマンドボタン(cmdSend)の Click イベントのコード) Private Sub cmdSend_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim I Dim fNextSend As Boolean 'デバイス名 '関数戻り値 'デバイスハンドル '送信データ '信号監視用フラグ 'PPII/O モジュールのオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(2)の設定を行います 'Mode=0 'PortA=OUT 'PortB=IN 'PortC=OUT '[制御データ=10000010] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER2, &H82) If nRet <> 0 Then MsgBox ("8255(2)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)より 0∼255 の数値データを出力します For I = 0 To 255 bSend = I '8255(2)のポート A からデータを出力します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_A, bSend) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If ' '8255(1)の STB に Low パルスを送信します ' '8255(2)の 2PC3 を Low にセットし入力側のデータをラッチします nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HF7) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)の 2PC3 を High にセットし入力側のデータをラッチを終了します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFF) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)の 2PB6 の状態を監視し Low になるまで待機します fNextSend = False Do Until fNextSend = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(2)ポート B の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub - 51 - Interface Corporation TUT-0016 End If If (Not bRecv And &H40) = &H40 Then fNextSend = True End If DoEvents Loop Next MsgBox "送信完了" 'PPII/O モジュールをクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub …修正部分 PCI-2747Aを2枚使用している場合は、「27ページ コマンドボタン(cmdTest)のClickイベントの コード」と同様の修正を行ってください。 プログラムの入力が終わったら、保存し、入力側/出力側のプログラムをそれぞれ実行してくださ い。『32ページ 4.2 モード1入力』と同一の結果が得られることが確認できます。 4.5 モード2出力 ここでは、モード2に設定した8255(1)からデータを出力し、8255(2)よりデータを入力する『47ペー ジ 4.4 モード2入力』とは逆の動作をする、制御信号を用いた簡単な通信プログラムの作成を 行います。 配線は、端子台上で対応するピンをビニール被覆線で接続します。 では、出力側のプログラムから作成します。 Step1.基本フォーム作成(出力側) ①Visual Basicを起動し、新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPPISend」に、フォームのCaptionプロパティを「PPI モード2 出力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Interface Corporation - 52 - TUT-0016 Step2.モード1出力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdSend」に、Captionプロパティを「PPI モード2 出力」に変更します。 ②作成したコマンドボタン(cmdSend)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 プログラムは「37ページ コマンドボタン(cmdSend)のClickイベントのコード」を流用しています。 実質の修正は1行のみです。 (コマンドボタン(cmdSend)の Click イベントのコード) Private Sub cmdSend_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim bRecv As Byte Dim I Dim fNextSend As Boolean 'PPI 製品のオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(1)の設定を行います 'グループ A=Mode2 'グループ B=Mode0 入力 '[制御データ=11xxx011] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HC3) If nRet <> 0 Then MsgBox ("8255(1)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'INTR 信号を有効にするため 8255(1)グループ A の WIE に 1 をセットします '[制御データ=00001101] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HD) - 53 - Interface Corporation TUT-0016 '8255(1)より 0∼255 の数値データを出力します For I = 0 To 255 bSend = I '8255(1)のポート A からデータを出力します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bSend) '8255(1)の 1PB7 の状態を監視し High になるまで待機します fNextSend = False Do Until fNextSend = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート B の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If If (bRecv And &H80) = &H80 Then fNextSend = True End If DoEvents Loop If nRet <> 0 Then MsgBox ("8255(1)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If Next MsgBox "送信完了" 'PPI 製品をクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub …修正部分 Step3.基本フォーム作成(入力側) モード2での出力確認用にモード0でのデータ入力プログラムの作成を行います。 ①Visual Basicを起動し、新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPpiRecv」に、フォームのCaptionプロパティを「PPI モード2出力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Interface Corporation - 54 - TUT-0016 Step4.モード0入力 ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdRecv」に、Captionプロパティを「データ入力」に変更します。 ②作成したコマンドボタン(cmdRecv)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 モード2ではACK信号がLレベルのときのみデータの出力がなされます。「49ページ コマンドボ タン(cmdRecv)のClickイベントのコード」は下記のように修正します。 (コマンドボタン(cmdRecv)の Click イベントのコード) Private Sub cmdRecv_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim bRecv As Byte Dim I Dim fReadOk As Boolean txtMon = "" 'PPI 製品のオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox ("デバイスのオープンに失敗しました") Exit Sub End If '8255(2)の設定を行います 'Mode=0 'PortA=IN 'PortB=IN 'PortC=OUT '[制御データ=10010010] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER2, &H92) If nRet <> 0 Then MsgBox ("8255(2)のモード設定に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFF) Do '2PB7 の状態を監視し Low になるまで待機します(OBF のポーリング) fReadOk = False Do Until fReadOk = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'ビット判定 If (Not bRecv And &H80) = &H80 Then fReadOk = True End If DoEvents - 55 - Interface Corporation TUT-0016 Loop nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFB) If nRet <> 0 Then MsgBox ("8255(2)ポート C の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(2)ポート A よりデータ(1文字)を入力します nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_A, bRecv) If nRet <> 0 Then MsgBox ("8255(2)ポート A の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If '入力されたデータをテキストボックスに表示します txtMon.SelText = bRecv & Chr(13) & Chr(10) nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER2, FBIPPI_PORT_C, &HFF) If nRet <> 0 Then MsgBox ("8255(2)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If If bRecv = 255 Then Exit Do Loop 'PPI 製品をクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub PCI-2747Aを2枚使用している場合は、「55ページ コマンドボタン(cmdRecv)のClickイベントの コード」と同様の修正を行ってください。 プログラムの入力が終わったら、保存した後、入力側/出力側のプログラムをそれぞれ実行してく ださい。『39ページ 4.3 モード1出力』と同一の結果が得られることが確認できます。 Interface Corporation - 56 - TUT-0016 4.6 割り込み処理 ここでは、割り込み処理の方法に関し記載します。『39ページ 4.3 モード1出力』の「37ペー ジ コマンドボタン(cmdSend)のClickイベントのコード」を例にしてみます。同リスト中に以下の コードがあります。 '1PB7 の状態を監視し High になるまで待機します fReadOk = False Do Until fReadOk = True nRet = PpiInputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_B, bRecv) If nRet <> 0 Then MsgBox ("8255(1)ポート B の入力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'ビット判定 If (bRecv And &H80) = &H80 Then fReadOk = True End If DoEvents Loop この処理は、8255(1)のINTR信号の出力をポートBより入力し、INTR信号が上がる(Hレベル)のを Do∼Loopによるループ処理で待っています。 いわゆるINTR信号のポーリングを行っているわけで す。 ところで、このINTR信号はPCIの割り込み信号線に対しても出力されています。つまりは、内部 的にコンピュータ上で検出できるわけです。『39ページ 4.3 モード1出力』では割り込み信号 入力用に1PB7を利用し、接続された1PC3のINTR信号の変化を検知していたわけですが、Win32 APIを利用した割り込み処理を使うことでこの結線は不要となります。 では、端子台上で『39ページ 4.3 モード1出力』での接続を下図のように変更します。 -COM1~ -COM4はI/Oモジュール内で接続されていますので、接続は不要です。 ただし、外部回路との接続時は、必ず接続してください。 PCI-2746C,CTP-2746を使用の場合 8255(1) 側 信号 ピン 1PA0 3 1PA1 4 ・ ・ ・ ・ ・ ・ 1PA7 10 1PC7(OBF) 1PC6(ACK) ・ ・ ・ 38 37 8255(2) 側 信号 ピン 2PA0 51 2PA1 52 ・ ・ ・ ・ ・ ・ 2PA7 58 2PB7 2PC2 66 81 ※ ピン番号はTNS-9601のものです。 - 57 - Interface Corporation TUT-0016 PCI-2747Aを2枚使用の場合 8255(1) 側 信号 ピン PA0 CNA2 PA1 CNA3 ・ ・ ・ PA7 CNA9 PC7(OBF) PC6(ACK) ・ ・ ・ CNC9 CNC8 8255(2) 信号 PA0 PA1 ・ ・ ・ PA7 PB7 PC2 側 ピン CNA2 CNA3 CNA9 CNB9 CNC4 ※ ピン番号はTRM-2601のものです。2台のTRM-2601を接続するように配線してください。 ※ I/Oモジュール番号「0」のPCI-2747Aを8255(1)の端子台に、I/Oモジュール番号「1」のPCI-2747A を8255(2)の端子台に接続してください。 CPZ-2746を使用の場合 8255(1) 側 信号 ピン 1PA0 46 1PA1 45 ・ ・ ・ ・ ・ ・ 1PA7 39 1PC7(OBF) 1PC6(ACK) ・ ・ ・ 11 12 8255(2) 側 信号 ピン 2PA0 94 2PA1 93 ・ ・ ・ ・ ・ ・ 2PA7 87 2PB7 2PC2 79 64 ※ ピン番号はTBZ-960xのものです。 次に『39ページ 4.3 モード1出力』のモード1での出力プログラムを割り込み信号を利用した ものに書き換えてみます。 割り込み処理における非同期I/O処理を実現するために、ここではWin32 APIに定義される以下の 関数、および構造体を使用しています。 ・CreateEvent関数 イベントオブジェクトの作成を行います。 ・Overlapped構造体 非同期I/O制御に必要な構造体です。 ・WaitForSingleObject関数 オブジェクトがシグナル状態になるまで待機します ・CloseHandle関数 オブジェクトハンドルのクローズを行います。 各関数および構造体の詳細はMicrosoft社提供のWin32 APIリファレンスか、もしくはその他専門書 籍を参照してください。 Interface Corporation - 58 - TUT-0016 Step1.基本フォーム作成(出力側) ①Visual Basicを起動し新しい標準EXEプロジェクトを作成します。 ②既定のフォームのオブジェクト名を「frmPPISend」に、フォームのCaptionプロパティを「PPI モード1 出力確認用プログラム」に変更します。 ③プロジェクトに標準モジュールを追加します。 ④標準モジュールに「24ページ 標準モジュールのプロシージャ宣言のコード」を追加します。 Step2.モード1出力(割り込み処理) ①フォーム上にコマンドボタン(CommandButton)コントロールを描画し、オブジェクト名を 「cmdSend」に、Captionプロパティを「PPIモード1 出力」に変更します。 ②作成したコマンドボタン(cmdSend)をダブルクリックし編集ウィンドウを開き以下のコードを 記述します。 (コマンドボタン(cmdSend)の Click イベントのコード) Private Sub cmdSend_Click() ' 変数定義 Dim lpszName As String Dim nRet As Long Dim hDeviceHandle As Long Dim bSend As Byte Dim bRecv As Byte Dim I Dim fNextSend As Boolean Dim lpOverlapped As OVERLAPPED Dim dwEventBuf As Long 'PPII/O モジュールのオープンを行います。 lpszName = "FBIPPI1" & Chr(0) hDeviceHandle = PpiOpen(lpszName, FBIPPI_FLAG_SHARE) If hDeviceHandle = &HFFFF Then MsgBox "デバイスのオープンに失敗しました" Exit Sub End If '8255(1)の設定を行います 'Mode=1:PortA=OUT 'Mode=0:PortB=IN 'PortC=制御 '[制御データ=10100011] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HA3) If nRet <> 0 Then MsgBox "8255(1)のモード設定に失敗しました" nRet = PpiClose(hDeviceHandle) Exit Sub End If '8255(1)グループ A の WIE に 1 をセットします '[制御データ=00001101] nRet = PpiControl(hDeviceHandle, FBIPPI_8255_CONTROLLER1, &HD) '8255(1)の割り込みイベントの設定を行います。 nRet = PpiSetEventConfig(hDeviceHandle, &HF1) nRet = PpiSetEventMask(hDeviceHandle, &H1) '8255(1)より 0∼255 の数値データを出力します For I = 0 To 255 bSend = I - 59 - Interface Corporation TUT-0016 '8255(1)のポート A からデータを出力します nRet = PpiOutputPort(hDeviceHandle, FBIPPI_8255_CONTROLLER1, FBIPPI_PORT_A, bSend) If nRet <> 0 Then MsgBox ("8255(1)ポート A の出力に失敗しました") nRet = PpiClose(hDeviceHandle) Exit Sub End If 'イベントオブジェクトの作成を行います。 lpOverlapped.hEvent = CreateEvent(0, True, False, 0) 'I/O モジュールのイベント要求を待ちます nRet = PpiEventRequestPending(hDeviceHandle, &H1, dwEventBuf, lpOverlapped) If nRet <> &HC0000008 Then MsgBox ("割り込みイベント待ち開始に失敗しました " + Str(nRet)) End If '割り込みがあるまで待機します nRet = WaitForSingleObject(lpOverlapped.hEvent, 15000) '15 秒でタイムアウトします If nRet <> 0 Then MsgBox "タイムアウトエラー" nRet = PpiClose(hDeviceHandle) Exit Sub End If If nRet <> 0 Then MsgBox "8255(1)ポート A の出力に失敗しました" nRet = PpiClose(hDeviceHandle) Exit Sub End If Next '作成したイベントを終了します CloseHandle (lpOverlapped.hEvent) MsgBox "送信完了" 'PPII/O モジュールをクローズします nRet = PpiClose(hDeviceHandle) If nRet <> 0 Then MsgBox ("デバイスのクローズに失敗しました") End If End Sub 入力側のプログラムは「モード1出力」と同じものを使用します。 プログラムの入力が終わったら、保存し、入力側/出力側のプログラムをそれぞれ実行してくださ い。「モード1出力」と同一の結果が得られることが確認できます。 では、ここより使用したFbiDio.DLLの関数について記載します。 「51ページ コマンドボタン(cmdSend)のClickイベントのコード」ではINTR(1PC3)がLレベルから Hレベルに変化した時のみ割り込みイベントが発生し、HレベルからLレベルに変化しても割り込 みイベントは発生しません。これは、どういった信号を割り込みとして扱うか、I/Oモジュールに 設定しているからです。割り込み要因の設定にはPpiSetEventConfig関数を使用します。 「使用例」 I/O モジュールのオープン時に取得したデバイスハンドルを指定 します。 nRet = PpiSetEventConfig(hDeviceHandle, &HF1) 関数が失敗するとエラーコードが格納されます。 Interface Corporation - 60 - 割り込み要因の論理を設定します。 TUT-0016 割り込み要因の論理の設定ですが、設定される数値データは2進数変換時、各ビットにおいて以下 の意味をもっています。 Bit7 Bit6 Bit5 Bit4 EDS4 EDS3 EDS3 EDS1 SIG1∼SIG4の各々がどういっ た条件の時、割り込みとするか を設定します。 Bit3 SIG4 Bit2 SIG3 Bit1 SIG2 Bit0 SIG1 各ビットを割り込み接点に アタッチします。 割り込み発生論理設定状態 EDS1 SIG1の割り込み発生論理の設定 EDS2 SIG2の割り込み発生論理の設定 EDS3 SIG3の割り込み発生論理の設定 EDS4 SIG4の割り込み発生論理の設定 値 意味 0 High → Lowの遷移で割り込み発生 1 Low → Highの遷移で割り込み発生 SIG1[割り込み要因割り当て] 値 意味 0 8255(1)のポートC接点3(ピン名:1PC3)入力信号 SIG2[割り込み要因割り当て] 値 意味 0 8255(1)のポートC接点0(ピン名:1PC0)入力信号 1 IR.IN1 ※ PCI-2747AはIR.IN1信号を持ちません。 SIG3[割り込み要因割り当て] 値 意味 0 8255(2)のポートC接点3(ピン名:2PC3)入力信号 ※ PCI-2747Aは8255(2)を持ちません。 SIG4[割り込み要因割り当て] 値 意味 0 8255(2)のポートC接点0(ピン名:2PC0)入力信号 1 IR.IN2 ※ PCI-2747Aは8255(2)、IR.IN2信号を持ちません。 ※ 電源投入時,PCIバスリセット時,外部リセット信号入力時は全て設定値が0となっています。 「51ページ コマンドボタン(cmdSend)のClickイベントのコード」においては、&hF0が設定され ています。つまり、Bit7∼Bit0までが「11110000」と設定され、その意味は「1PC3,1PC0,2PC3,2PC0 のうちどれかが、LレベルÆHレベルに変化した時それを割り込み入力とする」と定義しているわ けです。 しかし、今回割り込みとして使用したい信号は1PC3のINTRのみですので、他の信号の変化は無視 するよう設定する必要があります。 この処理のことをマスク処理といいます。割り込み入力のマスク処理にはPpiSetEventMask関数を 使用します。 - 61 - Interface Corporation TUT-0016 「使用方法」 割り込み要因のマスク/アン マスクを設定します。 関数が失敗するとエラー コードが格納されます。 nRet = PpiSetEventMask(hDeviceHandle, &H1) I/O モジュールのオープン 時に取得したデバイスハ ンドルを指定します。 割り込み要因のマスクの設定ですが、設定される数値データは2進数変換時、各ビットにおいて以 下の意味をもっています。0の時その接点はマスクされます。 Bit7 未使用 Bit6 未使用 Bit5 SIGR Bit4 SIGT Bit3 SIG4 Bit2 SIG3 Bit1 SIG2 Bit0 SIG1 PpioSetEventConfig関数で設定した 各接点に対応します。 SIGR=外部割り込み SIGT=タイマ割り込み 値 0 1 意味 マスクする マスクしない 「51ページ コマンドボタン(cmdSend)のClickイベントのコード」では&h1が設定されています。 つまりBit7∼Bit0までが「00000001」と設定され、1PC3以外の入力信号はマスク処理されているの で、1PC3以外の状態の変化は割込み信号として処理されません。 最後に、実際の監視処理の開始ですが、PpiEventRequestPending関数が呼び出されて初めて処理が 開始されます。 「使用方法」 許可するイベントをビットア サインで設定します。 関数が失敗 す るとエラー コードが格納されます。 nRet = PpiEventRequestPending(hDeviceHandle, &H1, pEventBuf, lpOverlapped) I/O モジュールのオープン 時に取得したデバイスハン ドルを指定します。 通知されたイベン ト内容が格納され ます。 OVERLAPPED データ構造体へ のポインタを指定します。 許可するイベントですが、設定される数値データは2進数変換時、各ビットにおいて以下の意味を もっています。‘1’の時そのイベントは有効となります。「51ページ コマンドボタン(cmdSend) のClickイベントのコード」ではBit5∼Bit0までが「000001」と設定され、1PC3で入力信号を検知 すると割り込みイベントとして認識するよう定義しています。 Interface Corporation - 62 - TUT-0016 Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 8255(1)のポートC接点3(ピン名:1PC3)入力信号 8255(1)のポートC接点0(ピン名:1PC0)入力信号 または、IR.IN1(外部割り込み入力信号)からの入力信号 ※ PCI-2747AはIR.IN1信号を持ちません。 8255(2)のポートC接点3(ピン名:2PC3)入力信号 ※ PCI-2747Aは8255(2)を持ちません。 8255(2)のポートC接点0(ピン名:2PC0)入力信号 または、IR.IN2(外部割り込み入力信号)からの入力信号 ※ PCI-2747Aは8255(2)、IR.IN2信号を持ちません。 インターバルタイマ 外部リセット入力(RSTIN)割り込み ここまでが、Win32APIを用いた割り込み処理のプログラム例です。割り込みを多用するとプログ ラムが複雑になることがあります。ですが柔軟なシステム作成において、この割り込み処理は有 効な手段となります。 - 63 - Interface Corporation TUT-0016 第5章 FbiPpi.DLLリファレンス PpiOpen 指定されたデバイス名のI/Oモジュールのオープンを行い、以後のI/Oモジュールへのアクセスを行えるようにします。 宣言 Declare Function PpiOpen Lib “FbiPpi.DLL” (ByVal lpszName As String, ByVal fdwFlags As Long) As Long パラメータ lpszName fdwFlags 任意のデバイス名を指定します。 オープン時のフラグを指定します。 値 FBIPPI_FLAG_SHARE 意味 同じデバイスを重複(共有)してオープンすることを許可します。 戻り値 関数が成功すると有効なデバイスハンドルが返されます。 関数が失敗するとINVALID_HANDLE_VALUEが返されます。INVALID_HANDLE_VALUEの値は、FFFFFFFFh(-1)です。 解説 WindowsXP/XP Embedded/Server2003/2000/Me/98/95では、「コントロールパネル」の「デバイス」に「FbiPciPpi」が追加され認 識された当社デジタル入出力I/Oモジュールが一覧表示されます。一覧の製品型式の横にI/Oモジュール上のロータリスイッチの 値とデバイス名が表示されます。自己診断プログラムでも確認できます。 WindowsNTでは、自己診断プログラムにて割り当てられたデバイス名をご確認ください。 デバイス名はI/Oモジュール上のロータリスイッチ(RSW1)の値で決定されるわけではありません。 使用するI/Oモジュール枚数やスロット位置の変更等でシステム構成が変化すると割り当てられる名前が変化する場合がありま す。システム構成が変化する環境でご使用になる場合は、デバイス名の指定が変更できるようにアプリケーションを作成くださ い。I/Oモジュール上に実装されたRSW1(I/OモジュールID設定)の値を取得し、アプリケーションで目的のI/Oモジュールであるか を判断することができます。詳しくは、PpiCommonGetPciDeviceInfo関数 の説明を参照してください。 PpiClose I/Oモジュールのクローズを行い、I/Oモジュールアクセスのために使用されていた各種リソースの解放し、以後のI/Oモジュール へのアクセスを禁止します。 宣言 Declare Function PpiClose Lib “FbiPpi.DLL” (ByVal hDeviceHandle As Long) As Long パラメータ hDeviceHandle 有効なデバイスハンドルを指定します 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『エラーコード一覧』を参照してください。 PpiControl 8255 PPIコントローラ制御レジスタを制御します。 宣言 Declare Function PpiControl Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal bControlData As Byte) As Long パラメータ hDeviceHandle dwController 有効なデバイスハンドルを指定します 制御する8255を指定します。 値 意味 FBIPPI_8255_CONTROLLER1 8255コントローラ(1) FBIPPI_8255_CONTROLLER2 8255コントローラ(2) ※ PCI-2747AではFBIPPI_8255_CONTROLLER1を指定します。 bControlData 制御データを指定します。8255のモード設定、入出力設定の設定データは「8255 PPIコント ローラ説明」を参照してください。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 Interface Corporation - 64 - TUT-0016 PpiInputPort 8255コントローラのポートからデータを読み込みます。 宣言 Declare Function PpiInputPort Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal dwPort As Long, ByRef pbValue As Byte) As Long パラメータ hDeviceHandle dwController 有効なデバイスハンドルを指定します 制御する8255を指定します。 値 意味 FBIPPI_8255_CONTROLLER1 8255コントローラ(1) FBIPPI_8255_CONTROLLER2 8255コントローラ(2) ※ PCI-2747AではFBIPPI_8255_CONTROLLER1を指定します。 dwPort 入力を行うポートを指定します。 値 意味 FBIPPI_PORT_A ポートA FBIPPI_PORT_B ポートB FBIPPI_PORT_C ポートC pbValue バッファへのポインタを指定します。このバッファに指定されたポートより取得した状態が格 納されます。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 PpiOutputPort 8255コントローラのポートへデータを出力します。 宣言 Declare Function PpiOutputPort Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwController As Long, ByVal dwPort As Long, ByVal pbValue As Byte) As Long パラメータ hDeviceHandle dwController 有効なデバイスハンドルを指定します 制御する8255を指定します。 値 意味 FBIPPI_8255_CONTROLLER1 8255コントローラ(1) FBIPPI_8255_CONTROLLER2 8255コントローラ(2) ※ PCI-2747AではFBIPPI_8255_CONTROLLER1を指定します dwPort 入力を行うポートを指定します。 値 意味 FBIPPI_PORT_A ポートA FBIPPI_PORT_B ポートB FBIPPI_PORT_C ポートC pbValue バッファへのポインタを指定します。このバッファに格納した値が指定されたポートより出力され ます。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 - 65 - Interface Corporation TUT-0016 PpiSetEventMask 割り込みマスク状態を設定します。 宣言 Declare Function PpiSetEventMask Lib "FbiPpi.DLL” (ByVal hDeviceHandle As Long,ByVal bEventMask As Byte) As Long パラメータ hDeviceHandle bEventMask 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファに設定された値により, 割り込み要因のマスク/アンマスクの設定が行われます。設定は下記のビットの組み合わせで行い ます。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 − − SIGR SIGT SIG4 SIG3 SIG2 SIG1 SIGR=外部割り込み SIGT=タイマ割り込み SIG1∼4は、PpiSetEventConfig関数にて設定される割り込み要因 値 意味 0 マスク 1 アンマスク 電源投入時は全てマスク状態(0)です。 PCIバスリセット時,外部リセット入力時はSIGR以外がマスク状態(0)になります。SIGRのマスク/ アンマスク状態は変更しません。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 PpiGetEventMask 割り込みマスク状態を取得します。 宣言 Declare Function PpiGetEventMask Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbEventMask As Byte) As Long パラメータ hDeviceHandle pbEventMask 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファにI/Oモジュールに設定された割り込み要 因のマスク/アンマスクの状態が格納されます。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 − − SIGR SIGT SIG4 SIG3 SIG2 SIG1 SIGR=外部割り込み SIGT=タイマ割り込み SIG1∼4は、PpiSetEventConfig関数にて設定される割り込み要因 値 意味 0 マスク 1 アンマスク 電源投入時は全てマスク状態(0)です。 PCIバスリセット時,外部リセット入力時はSIGR以外がマスク状態(0)になります。SIGRのマス ク/アンマスク状態は変更しません。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 Interface Corporation - 66 - TUT-0016 PpiSetEventConfig 割り込み要因の割り当て,割り込み発生論理を設定します。 宣言 Declare Function PpiSetEventConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal bEventConfig As Byte) As Long パラメータ hDeviceHandle bEventConfig 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファに割り込み要因の割り当て,割り込み発生論理の設 定データを設定します。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 EDS4 EDS3 EDS3 EDS1 SIG4 SIG3 SIG2 SIG1 割り込み発生論理設定状態 EDS1 EDS2 EDS3 EDS4 値 0 1 SIG1の割り込み発生論理の設定 SIG2の割り込み発生論理の設定 SIG3の割り込み発生論理の設定 SIG4の割り込み発生論理の設定 意味 High → Low Low → High SIG1[割り込み要因割り当て] 値 0 意味 8255(1)のポートC接点3(ピン名:1PC3)入力信号 SIG2[割り込み要因割り当て] 値 0 1 意味 8255(1)のポートC接点0(ピン名:1PC0)入力信号 IR.IN1 ※ PCI-2747AはIR.IN1信号を持ちません。 SIG3[割り込み要因割り当て] 値 0 意味 8255(2)のポートC接点3(ピン名:2PC3)入力信号 ※ PCI-2747Aは8255(2)を持ちません。 SIG4[割り込み要因割り当て] 値 0 1 意味 8255(2)のポートC接点0(ピン名:2PC0)入力信号 IR.IN2 ※ PCI-2747Aは8255(2)、IR.IN2信号を持ちません。 ※ 電源投入時、PCIバスリセット時,外部リセット信号入力時は全て設定値が0となっています。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 PpiGetEventConfig 割り込み要因の割り当て,割り込み発生論理の設定状態を取得します。 宣言 Declare Function PpiGetEventConfig Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbEventConfig As Byte) As Long パラメータ hDeviceHandle bEventConfig 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。割り込み要因の割り当て,割り込み発生論理の状態が格納され ます。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 EDS4 EDS3 EDS3 EDS1 SIG4 SIG3 SIG2 SIG1 割り込み発生論理設定状態 EDS1 EDS2 EDS3 EDS4 値 0 1 SIG1の割り込み発生論理の設定 SIG2の割り込み発生論理の設定 SIG3の割り込み発生論理の設定 SIG4の割り込み発生論理の設定 意味 High → Low Low → High SIG1[割り込み要因割り当て] 値 0 意味 8255(1)のポートC接点3(ピン名:1PC3)入力信号 - 67 - Interface Corporation TUT-0016 SIG2[割り込み要因割り当て] 値 0 1 意味 8255(1)のポートC接点0(ピン名:1PC0)入力信号 IR.IN1 SIG3[割り込み要因割り当て] 値 0 意味 8255(2)のポートC接点3(ピン名:2PC3)入力信号 SIG4[割り込み要因割り当て] 値 0 1 意味 8255(2)のポートC接点0(ピン名:2PC0)入力信号 IR.IN2 ※ 電源投入時、PCIバスリセット時,外部リセット信号入力時は全て設定値が0となっています。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 PpiSetTimerConfig インターバルタイマの設定を行います。 宣言 Declare Function PpiSetTimerConfig Lib “FbiPpi.DLL” (ByVal hDeviceHandle As Long, ByVal bTimerConfigValue As Byte) As Long パラメータ hDeviceHandle bTimerConfigValue 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファにインターバルタイマの設定を以下のビット 構成で設定します。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 − CTL7 CTL6 CTL5 CTL4 CTL3 CTL2 CTL1 タイマ周期はCTL5∼7で設定した基準周期と、CTL1∼4で設定した分周値の積となります。 (周期=基準周期×分周値) CTL4 CTL3 CTL2 CTL1 タイマ停止 0 0 0 0 1分周 0 0 0 1 2分周 0 0 1 0 3分周 0 0 1 1 4分周 0 1 0 0 5分周 0 1 0 1 6分周 0 1 1 0 7分周 0 1 1 1 8分周 1 0 0 0 9分周 1 0 0 1 10分周 1 0 1 0 11分周 1 0 1 1 12分周 1 1 0 0 13分周 1 1 0 1 14分周 1 1 1 0 15分周 1 1 1 1 CTL5∼7基準周期設定 10μs 100μs 1ms 10ms 100ms CTL7 0 0 0 0 1 CTL6 0 0 1 1 0 CTL5 0 1 0 1 0 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 Interface Corporation - 68 - TUT-0016 PpiGetTimerConfig インターバルタイマの設定情報を取得します。 宣言 Declare Function PpiGetTimerConfig Lib “FbiPpi.DLL” (ByVal hDeviceHandle As Long, ByRef pbTimerConfigValue As Byte) As Long パラメータ hDeviceHandle pbTimerConfigValue 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファにインターバルタイマの設定が以下のビッ ト構成で格納されます。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 − CTL7 CTL6 CTL5 CTL4 CTL3 CTL2 CTL1 タイマ周期はCTL5∼7で設定した基準周期と、CTL1∼4で設定した分周値の積となります。 (周期=基準周期×分周値) タイマ停止 1分周 2分周 3分周 4分周 5分周 6分周 7分周 8分周 9分周 10分周 11分周 12分周 13分周 14分周 15分周 CTL4 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 CTL3 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 CTL2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 CTL7 0 0 0 0 1 CTL6 0 0 1 1 0 CTL5 0 1 0 1 0 CTL1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 CTL5∼7基準周期設定 10μs 100μs 1ms 10ms 100ms 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 - 69 - Interface Corporation TUT-0016 PpiGetTimerCount インターバルタイマのカウント値を取得します。 宣言 Declare Function PpiGetTimerCount Lib “FbiPpi.DLL” (ByVal hDeviceHandle As Long, ByRef pbTimerCount As Byte) As Long パラメータ hDeviceHandle pbTimerCount 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファにインターバルタイマの現在のカウンタ 値が以下のビット構成で格納されます。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 − − − − CTL4 CTL3 CTL2 CTL1 PpiSetTimerConfig関数より設定した周期における、現在の状態値を4bitカウンタで取得しま す。 0カウント 1カウント 2カウント 2カウント 4カウント 5カウント 6カウント 7カウント 8カウント 9カウント 10カウント 11カウント 12カウント 13カウント 14カウント 15カウント CTL4 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 CTL3 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 CTL2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 CTL1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 PpiGetResetInStatus 外部リセット入力信号の状態を取得します。 宣言 Declare Function PpiGetResetInStatus Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByRef pbResetInStatus As Byte) As Long パラメータ hDeviceHandle pbResetInStatus 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファに外部リセット入力信 号の状態が格納されます。 値 0 1 意味 リセット入力無効 リセット入力有効 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 解説 外部リセット信号が有効の間(pbResetInStatus = 1)は、出力、および割り込みマスク、要因等の設定をすることができません。 外部リセット信号入力でリセットされた場合、PpiGetResetInStatusでリセット入力信号が無効になったことを確認してからI/O モジュールの再設定を行ってください。 Interface Corporation - 70 - TUT-0016 PpiEventRequestPending 割り込みイベント要求を待ちます。 宣言 Declare Function PpiEventRequestPending Lib "FbiPpi.DLL" (ByVal hDeviceHandle As Long, ByVal dwEventEnableMask As Long, ByRef pdwEventBuf As Long, ByRef pOverlapped As OVERLAPPED) As Long パラメータ hDeviceHandle dwEventEnableMask 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファに許可するイベントを以下のビットアサイ ンで指定します。該当ビットが1のとき有効です。 Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 pdwEventBuf バッファへのポインタを指定します。このバッファに通知されたイベントが以下のビットアサ インで格納されます。該当ビットが1のとき有効です。 Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 lpOverlapped 8255(1)のポートC接点3(ピン名:1PC3)入力信号 8255(1)のポートC接点0(ピン名:1PC0)入力信号または、IR.IN1(外部 割り込み入力信号)からの入力信号 ※ PCI-2747AはIR.IN1信号を持ちません。 8255(2)のポートC接点3(ピン名:2PC3)入力信号 ※ PCI-2747Aは8255(2)を持ちません。 8255(2)のポートC接点0(ピン名:2PC0)入力信号または、IR.IN2(外部 割り込み入力信号)からの入力信号 ※ PCI-2747Aは8255(2)、IR.IN2信号を持ちません。 インターバルタイマ 外部リセット入力(RSTIN)割り込み 8255(1)のポートC接点3(ピン名:1PC3)入力信号 8255(1)のポートC接点0(ピン名:1PC0)入力信号または、IR.IN1(外部 割り込み入力信号)からの入力信号 ※ PCI-2747AはIR.IN1信号を持ちません。 8255(2)のポートC接点3(ピン名:2PC3)入力信号 ※ PCI-2747Aは8255(2)を持ちません。 8255(2)のポートC接点0(ピン名:2PC0)入力信号または、IR.IN2(外部 割り込み入力信号)からの入力信号 ※ PCI-2747Aは8255(2)、IR.IN2信号を持ちません。 インターバルタイマ 外部リセット入力(RSTIN)割り込み OVERLAPPEDデータ構造体へのポインタを指定します。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』』を参照し てください。 - 71 - Interface Corporation TUT-0016 PpiCommonGetPciDeviceInfo デバイスID,リソース情報,I/OモジュールID(RSW1)等の情報を取得します。 宣言 Declare Function PpiCommonGetPciDeviceInfo Lib “FbiPpi.DLL” (ByVal hDeviceHandle As Long, ByRef pdwDeviceID As Long, ByRef pdwVenderID As Long, ByRef pdwClassCode As Long, ByRef pdwRevisionID As Long, ByRef pdwBaseAddress0 As Long, ByRef pdwBaseAddress1 As Long, ByRef pdwBaseAddress2 As Long, ByRef pdwBaseAddress3 As Long, ByRef pdwBaseAddress4 As Long, ByRef pdwBaseAddress5 As Long, ByRef pdwSubsystemID As Long, ByRef pdwSubsystemVenderID As Long, ByRef pdwInterruptLine As Long, ByRef pdwBoardID As Long) As Long パラメータ hDeviceHandle pdwDeviceID pdwVenderID pdwClassCode pdwRevisionID pdwBaseAddress0 pdwBaseAddress1 pdwBaseAddress2 pdwBaseAddress2 pdwBaseAddress4 pdwBaseAddress5 pdwSubsystemID pdwSubsystemVenderID pdwInterruptLine pdwBoardID 有効なデバイスハンドルを指定します。 バッファへのポインタを指定します。このバッファにデバイスIDデータが格納されます。弊社 PCIバス用DIOI/Oモジュールは、製品型式の数字部分4桁が適用されます。PCI-2104Cならば 2104(16進数では838h)、PCI-2725ならば2725(16進数ではAA5h)です。 バッファへのポインタを指定します。このバッファにベンダIDデータが格納されます。弊社の ベンダIDは、1147h(16進数)です。 バッファへのポインタを指定します。このバッファにクラスコードデータが格納されます。 バッファへのポインタを指定します。このバッファにリビジョンIDデータが格納されます。 バッファへのポインタを指定します。このバッファにリソース0データが格納されます。弊社PCI バス用DIOI/Oモジュールは、ここに占有するI/O領域が格納されます。取得した値をFFFChでマ スクした値が占有するI/O領域のベースアドレスです。 バッファへのポインタを指定します。このバッファにリソース1データが格納されます。弊社PCI バス用DIOI/Oモジュールでは、使用しません。 バッファへのポインタを指定します。このバッファにリソース2データが格納されます。弊社PCI バス用DIOI/Oモジュールでは、使用しません。 バッファへのポインタを指定します。このバッファにリソース3データが格納されます。弊社PCI バス用DIOI/Oモジュールでは、使用しません。 バッファへのポインタを指定します。このバッファにリソース4データが格納されます。弊社PCI バス用DIOI/Oモジュールでは、使用しません。 バッファへのポインタを指定します。このバッファにリソース5データが格納されます。弊社PCI バス用DIOI/Oモジュールでは、使用しません。 バッファへのポインタを指定します。このバッファにサブシステムIDデータが格納されます。 バッファへのポインタを指定します。このバッファにデバイスIDデータが格納されます。 バッファへのポインタを指定します。このバッファに割込みラインデータが格納されます。 バッファへのポインタを指定します。このバッファにI/OモジュールIDデータが格納されます。 戻り値 関数が成功すると0が返されます。 関数が失敗すると0以外の値が返ります。関数が失敗した場合の戻り値については『72ページ エラーコード一覧』を参照して ください。 エラーコード一覧 定数 FBIPPI_ERROR_SUCCESS FBIPPI_ERROR_NOT_DEVICE FBIPPI_ERROR_NOT_OPEN FBIPPI_ERROR_INVALID_HANDLE FBIPPI_ERROR_ALREADY_OPEN FBIPPI_ERROR_HANDLE_EOF FBIPPI_ERROR_MORE_DATA FBIPPI_ERROR_INSUFFICIENT_BUFFER FBIPPI_ERROR_IO_PENDING FBIPPI_ERROR_NOT_SUPPORTED FBIPPI_ERROR_MEMORY_NOTALLOCATED FBIPPI_ERROR_PARAMETER FBIPPI_ERROR_INVALID_CALL FBIPPI_ERROR_DRVCAL FBIPPI_ERROR_NULL_POINTER Interface Corporation 値 0 &HC0000001 &HC0000002 &HC0000003 &HC0000004 &HC0000005 &HC0000006 &HC0000007 &HC0000008 &HC0000009 &HC0001000 &HC0001001 &HC0001002 &HC0001003 &HC0001004 内容 正常終了 指定されたデバイスがありません システムがデバイスをオープンできません デバイスハンドルが正しくありません すでにOPENしているデバイスをOPENしようとしました EOFに達しました さらに多くのデータが利用可能です システムコールに渡されたデータ領域が小さすぎます 非同期I/O操作が進行中です サポートされていない機能です 作業用メモリの確保に失敗しました 引数パラメータの値が不正です 不正なファンクション呼び出しです ドライバ が 呼び出せません。 ドライバ,DLL間でNULLポインタが渡されました - 72 - TUT-0016 第6章 8255 PPIコントローラ説明 8255は、プログラマブル汎用I/Oデバイスです。3組(8ビット)の入出力ポートがあり、プログラム による制御でデータ入力,データ出力,ステータス信号入力,コントロール信号出力に使用すること ができます。 6.1 ポートA,B,C 8255は8ビットの入出力ポートが3個あり、それぞれをポートA,ポートB,ポートCと呼びます。 各ポートごとに独特の性質を持っていますので、ポートの選択によって8255の適応性が生かされ ます。 ポートA ポートB ポートC 入力時 ラッチ入力あるいはバッファ入力動作 出力時 ラッチ出力動作 入力時 ラッチ入力あるいはバッファ入力動作 出力時 ラッチ出力動作 入力時 バッファ入力動作(ラッチされません) 出力時 ラッチ出力動作 ポートCはモードによって2つの4ビットポートに分割して使用することが できます。 また、ポートA,Bのコントロール信号の出力ポート、あるいはステータス信 号の入力ポートとして用いることができます。 各ポートと信号名は次の表のように対応しています。 PA0∼PA7 PB0∼PB7 PC0∼PC7 ポートA ポートB ポートC - 73 - Interface Corporation TUT-0016 6.2 グループA制御,グループB制御 8255を使用するにあたって、ポートA,ポートB,ポートCを2つに分けグループA,グループBとしま す。 モード0 モード1 モード2 基本的な入出力ポート コントロール信号,ステータス信号による制御を伴う入出力ポート 双方向データを扱う入出力ポート 使用する目的に合わせて、各グループごとにモードを設定します。可能なモードの組み合わせは 次の6通りです。 ・グループA:モード0, グループB:モード0 ・グループA:モード0, グループB:モード1 ・グループA:モード1, グループB:モード0 ・グループA:モード1, グループB:モード1 ・グループA:モード2, グループB:モード0 ・グループA:モード2, グループB:モード1 モードの選択はPpiControl関数にて行います。指定する制御データ下記のフォーマットとなりま す。 制御データ(8ビットのバイトデータ) D7 D6 D5 D4 D0 グループB ポートC下位 ポートB D1 モード選択 D2 D3 D3 グループA ポートC上位 ポートA D4 モード選択 D5, D6 D7 機能制御 D2 D1 D0 0 出力 1 入力 0 出力 1 入力 0 モード0 1 モード1 0 出力 1 入力 0 出力 1 入力 00 モード0 01 モード1 1X モード2 0 ビットセット,リセット 1 モード選択 ポートCをコントロール信号の出力,ステータス信号の入力として使用する場合、PpiControl関数に てビットセット/リセットすることができます。 この操作を行うことによって割り込み許可、割り込み禁止等の設定をします。 コントロール信号のビットセット/リセットを行う場合の制御データ 0(D7) X X X D3 D2 Interface Corporation - 74 - D1 D0 TUT-0016 6.3 各ビットの対応 D0 セット/ リセット D1 D2 D3 D7 ポートC ビット選択 機能制御 0 リセット 1 セット 0 1 2 3 4 ビット D1 0 1 0 1 0 D2 0 0 1 1 0 D3 0 0 0 0 1 0を指定しビットセット,リセット機能選択 5 1 0 1 6 0 1 1 7 1 1 1 備考:I/Oモジュールがリセットされた時、あるいはモードを選択した時、自動的に全ビットは リセットされます。 (1)モード0 このモードでは基本的な入出力ポートとして動作をします。この場合、モード0になっている各 ポートはバッファ入力,ラッチ出力動作をします。 出力ポートに指定されたポートは、出力値をラッチし、常に端子から出力します。モード設定直 後はLowレベルを出力します。 また出力ポートに指定されているポートを読み出せば、出力している値が得られます。 PpiContorol関数にて下記の制御データを指定することによりポートA,ポートB,ポートC(上位), ポートC(下位)それぞれを独立に入力あるいは出力ポートに設定します。 モード0を設定する場合の制御データ 1(D7) D0 0(D6) グループB D1 D2 D3 0(D5) D4 ポートC下位 PC0∼PC3 (PC0∼PC2) ※ ポートB D4 モード選択 ポートC上位 PC4∼PC7 ポートA D5,D6 モード選択 D7 グループA D3 機能制御 0(D2) 0 1 D1 D0 出力 入力 0 出力 1 入力 0を指定しグループBをモード0を指定 0 出力 1 入力 0 出力 1 入力 00(D6,D5)を指定し モード0を指定 1を指定しモード選択機能を選択 ※ グループAがモード0以外の場合にはグループBが使えるポートCのビットはPC0∼PC2の3ビッ トになります。 - 75 - Interface Corporation TUT-0016 (2)モード1 データの入出力制御にコントロール信号,ステータス信号を用いるモードです。モード1では、グ ループA,グループBを単位として使用し、グループAはデータ・ポートにポートA(PA0∼PA7),コン トロール/ステータス・ポートにポートC上位ビット(PC3∼PC7),グループBはデータ・ポートにポー トB(PB0∼PB7),コントロール/ステータス・ポートにポートC下位3ビット(PC0∼PC2)によって構成 します。 モード1では、ポートCへの書き込みはビットセット/リセット機能で行います。 モード1を設定する場合の制御データ 1(D7) 0(D6) 1(D5) D0 グループB D1 D2 D3 グループA D4 D5,D6 D7 機能制御 D4 D3 1(D2) D1 D0 0 出力 1 入力 0 出力 1 入力 モード選択 1を指定しモード1を指定 0 ポートC 出力 ・ポートA入力時 1 入力 PC6,PC7 ・ポートA出力時 PC4,PC5 0 ポートA 出力 1 入力 モード選択 01(D6,D5)を指定しモード1を指定 1を指定しモード選択機能を選択 ポートC PC3※ ポートB ※ グループAがモード0の時のみポートCのPC3を使用できます。それ以外ではPC3はグループA に属します。 モード1でのポートCの機能 ビット PC0 グループB PC1 PC2 グループA PC3※ PC3 PC4 PC5 PC6 PC7 データ入力ポート時 INTR(INTerrupt Request) データ出力ポート時 INTR(INTerrupt Request) IBF(Input Buffer Full F/F) OBF (Output Buffer Full F/F) STB (STroBe input) ACK (Data Acknowledge input) RIE(Read Interrupt Enable WIE(Write Interrupt Enable flag) flag) 入出力 入出力 INTR(INTerrupt Request) INTR(INTerrupt Request) 入出力 STB (STroBe input) RIE(Read Interrupt Enable flag) IBF(Input Buffer Full F/F) 入出力 ACK(Data Acknowledge input) 入出力 WIE(Write Interrupt Enable flag) 入出力 OBF (Output Buffer Full F/F) ※ グループAがモード0の時のみ使用できます。それ以外ではPC3はグループAに属します。 Interface Corporation - 76 - TUT-0016 <データ・ポートを入力に指定した時の動作> データ・ポート(グループAならポートA、グループBならポートB)を入力ポートに指定すると、デー タ・ポートは入力ポートとなり、コントロール/ステータス・ポート(ポートC)は次のように定義さ れます。(説明中では信号名の上線を省略しています。) STB(Strobe Input)・・・・入力 この入力をLowレベルにすると、外部接続機器からデータ・ポートに送られている信号をデータ・ ポートがラッチします。 IBF(Input Buffer Full F/F)・・・・出力 この出力がHighレベルの時は入力バッファが満たされていることを意味し、外部接続機器に対し てデータの転送の禁止を知らせます。この信号はSTBの立ち下がりでHighレベルとなりデータ読 み出し終了時でLowレベルになります。モード設定直後の初期値はLowレベルです。 INTR(Interrupt Request)・・・・出力 この出力は外部接続機器からのデータが入力ポートにラッチされたときにHighレベルとなり、コ ンピュータに対するデータ読み出し要求割り込み信号として働きます。 なお、 RIE により割り込み許可を行っていない場合、出力はHighレベルのままとなります。 RIE(Read Interrupt Enable flag) コンピュータに対するデータ読み出し要求割り込みの許可フラグで、このビットをビット操作命 令で1にすることによって割り込み許可、0にすることによって割り込み禁止にします。RIEを書き 換えても同じビットに割り当てられているSTBの機能には影響を与えません。 IBF信号がLowレベルになる前にSTBがLowレベルになるとポート内ラッチデータが変化してしま います。 STBはIBFがLowレベルになるまではHighレベルに保たなければなりません。 モード1の入力ポート指定状態でポートCを読み出せばIBF,INT,RIEのステータスが得られます。 ●モード1(グループA)入力 - 77 - Interface Corporation TUT-0016 ●モード1(グループB)入力 ※印の場合、8255内部のラッチが変化してしまいますので、IBF=”0”になるまでSTBを”1”に保つ ようにする必要があります。 ●モード1入力タイミング t ST ST B t S IB IB F tPH tP S 外部バス RD t S IT IN T Interface Corporation - 78 - TUT-0016 <データ・ポートを出力に指定した時の動作> データ・ポート(グループAならポートA、グループBならポートB)を出力ポートに指定すると、デー タ・ポートは出力ポート(モード設定直後はLowレベルを出力)となり、コントロール/ステータス・ ポート(ポートC)は次のように定義されます。(説明中では信号名の上線を省略しています。) OBF (Output Buffer Full F/F)・・・・出力 この信号はコンピュータからのデータを受け出力ポートにラッチされた時にLowレベルとなり、 外部接続機器に対してのデータ受け取り要求として働きます。 OBFはACK=1のときのデータ書き込み終了時でLowレベルになり外部接続機器がデータを受け取 った時のACKの立ち下がりでHighレベルになります。 モード設定直後の初期値はHighレベルです。 ACK(Data Acknowledge input)・・・・入力 この入力は外部接続機器が出力ポートのデータを受け取ったということを知らせる信号です。 データを受け取った時にLowレベルの信号を出すように外部接続機器を設計します。 INTR (Input Request)・・・・出力 この出力は外部接続機器がデータを受け取った時にHighレベルとなり、コンピュータに対する次 のデータの書き込み要求割り込み信号として働きます。 なお、 WIE にて割り込み許可を行っていない場合、Highレベルのままとなります。 WIE (Write Interrupt Enable Flag) コンピュータに対するデータ書き込み要求割り込みの許可フラグで、このビットをビット操作命 令で1にすることによって割り込み許可、0にすることによって割り込み禁止にします。 WIEを書き換えても同じビットに割り当てられているACKの機能には影響を与えません。 OBF信号がHighレベルになる前にデータの書き込みを行うとポート出力が変化してしまいますの で、OBF信号がLowレベルの間は書き込みは避けてください。 モード1の出力ポート指定状態でポートCを読み出せば、OBF,NT,WIEのステータスが得られます。 - 79 - Interface Corporation TUT-0016 ●モード1(グループA)出力 ●モード1(グループB)出力 ●モード1出力タイミング WR IN T tAO B OBF t A IT ACK t AK 外部バス Interface Corporation - 80 - TUT-0016 (3)モード2 このモードはグループAのみが可能で、ポートAがコントロール/ステータス信号(ポートC上位5ビ ット)の制御によって入力,出力の双方向の8ビット・データ・ポートとして使用され、モード1の入 力ポート動作,出力ポート動作を合わせたような動作をします。 グループA・モード2でのポートCの機能 ビット PC3 PC4 PC5 PC6 PC7 INTR(INTerrupt Request) STB(STroBe input) RIE(Read Interrupt Enable flag) IBF(Input Buffer Full F/F) DAC(Data Acknowledge input) WIE(Write Interrupt Enable flag) OBF(Output Buffer Full F/F) DAKとSTBの信号でポート0の入力状態,出力状態を切り換えながら、データを双方向へ送ること ができます。モード2ではポートCへの書き込みはビット操作命令で行います。各信号の動作,機能 はモード1の説明を参照してください。 モード2においてポートCを読み出せば、OBF,IBF,INTR,WIE,RIEのステータスが得られます。 備考:モード1と入力動作は同じです。出力動作は次の点が違います。 ・ACK信号がLowレベルの時のみ、出力データがポートAより出力される。 ・出力ポートの出力データは読み出せない。 - 81 - Interface Corporation TUT-0016 モード2入出力タイミング 8255 → PC I バ ス データ書き込み WR IN T 8255 → PC I バ ス データ読み出し RD tAK ACK tST ST B tAO B OBF t S IB IB F tP S tP H tAD tKD 外部バス 外 部 バ ス → 8255 8255 → 外 部 バ ス (4)特殊なモードの組み合わせについて ポートCの全てのビットがコントロール/ステータス信号として用いられるわけではありません。 グループA,グループBともにユーザがデータの入出力に利用できるビットがあります。これらのビ ットを持つモードの組み合わせによって次のような機能を持ちます。 入力動作としてプログラムした時 全ての入力ラインをポートCの読み出し中にアクセスできます。 出力動作としてプログラムした時 ポートC上位4ビット(PC4∼PC7)とポートC下位4ビット(PC0∼PC3)は、それぞれビット操作命令を 用いて個別に書き込みができます。ポートC下位3ビット(PC0∼PC2)は3ビット単位でも書き込み ができます。 Interface Corporation - 82 - TUT-0016 モード1でのPC6,PC7またはPC4,PC5のデータの入出力のセットは、モード選択時の制御データの ビット3(ポートC(上位))で、PC3はビット0(ポートC(下位))で行います。 “1”で入力,“0”で出力ポートにセットします。 入力ポートにセットしたビットのデータは、ポートCの読み出し動作でシステム・バスに読み出せ ます。一方出力ポートにセットしたビットにデータを書き込むためには、ビット操作命令を実行 してください。1度のビット操作命令で出力できるのは1ビットのON/OFFのみです。例えば PC6,PC7と2ビットのデータを書き込むためにはビット操作命令を2回実行してください。 1回目:PC6への書き込み 2回目:PC7への書き込み ポートCに8ビット単位でデータを書き込めるのは、モード0でポートCの上位,下位ビットともに出 力ポートと指定した時だけです。 - 83 - Interface Corporation TUT-0016 技術資料紹介 弊社では下記の技術資料を提供しております。 詳しくは、弊社Web site(www.interface.co.jp)、または弊社窓口までお問い合わせください。 カタログ PRM-0061 PRM-0062 PRM-0063 CPZカタログ(日本語版) PCIカタログ(日本語版) CSIカタログ(日本語版) チュートリアル TUT-0058 TUT-0056 TUT-0055 TUT-0054 TUT-0053 TUT-0050 TUT-0048 TUT-0044 TUT-0043 TUT-0041 TUT-0040 TUT-0039 TUT-0038 TUT-0037 TUT-0036 TUT-0034 TUT-0033 TUT-0032 TUT-0031 TUT-0030 TUT-0029 TUT-0028 TUT-0027 TUT-0026 TUT-0025 TUT-0024 TUT-0023 TUT-0022 TUT-0021 TUT-0020 TUT-0019 TUT-0018 TUT-0017 TUT-0016 TUT-0015 TUT-0014 TUT-0008 TUT-0007 TUT-0006 TUT-0005 TUT-0004 TUT-0003 TUT-0002 TUT-0001 チュートリアル CPZ拡張ユニット 入門編 チュートリアル XP Embedded OS構築編 チュートリアル 画像入力I/Oモジュール CANチュートリアル モーションコントロールチュートリアル RTLinuxによるモーションコントローラI/Oモジュール制御プログラミング チュートリアル(GPG-7400用) RTLinuxによるメモリンクI/Oモジュール制御プログラミング チュートリアル RTLinuxによるメモリ共有インタフェースI/Oモジュール制御プログラミング チュートリアル RTLinuxによる調歩同期シリアル通信I/Oモジュール制御プログラミング チュートリアル RTLinuxによるGP-IBI/Oモジュール制御プログラミング チュートリアル RTLinuxによるDAI/Oモジュール制御プログラミング チュートリアル RTLinuxによるADI/Oモジュール制御プログラミング チュートリアル RTLinuxによるDIOI/Oモジュール制御プログラミング チュートリアル RTLinuxによるHDLCI/Oモジュール制御プログラミング チュートリアル RTLinuxによるPCI/CompactPCI/CardBus制御入門書(導入編) Visual C++によるPPI入門書 Visual Basicによるメモリ共有インタフェース入門書 Visual C++によるメモリ共有インタフェース入門書 Visual Basicによるメモリンク入門書 Visual C++によるメモリンク入門書 Visual BasicによるHDLC入門書 Visual C++によるHDLC入門書 Visual BasicによるGP-IB入門書 Visual C++によるGP-IB入門書 Visual BasicによるDIO入門書 Visual C++によるDIO入門書 Visual BasicによるDA入門書 Visual C++によるDA入門書 Visual BasicによるAD入門書 Visual C++によるAD入門書 Visual Basicによるモーションコントローラ入門書 Visual C++によるモーションコントローラ入門書 メモリンクを使用した負荷分散システム事例チュートリアル Visual BasicによるPPI入門書 モーションコントロールチュートリアル Microsoft Visual Studio .NET移行ガイド 拡張ユニット チュートリアル(問題解決編) 拡張ユニットチュートリアル(入門編) C(98)/ISA製品からPCI/CompactPCI製品への移行チュートリアル(DOS編) DOSによるLAP-B入門書 DOSによるAD入門書 LinuxによるPCI/CompactPCI/CardBus制御 入門書 PCI-ISAバスブリッジチュートリアル PCI-Cバスブリッジチュートリアル 技術情報資料 初めてのCANインタフェース Linux, リアルタイムLinux移植(SH-4)経験談及び当社の今後の取り組みについて LinuxからPCI/CompactPCII/Oモジュールを制御する方法 ActiveXコントロールによるシステム組み込み技術 CompactPCIへの置き換え+システム構築/移行ガイド MS-DOSからPCI/CompactPCII/Oモジュールを制御する方法 Interface Corporation - 84 - TUT-0016 参考文献 著 者 題 名 里 和政/神崎 康宏/斎藤 健司 トランジスタ技術SPECIAL №9「§1-2 パラレル・インタ フェース用LSIの使い方」 (CQ出版社:1988年) Intel IntelR82C55A CHMOS PROGRAMMABLE PERIPHERAL INTERFACE Datasheets (Intel:October 1995) マイクロソフト株式会社 監修, Microsoft Visual C++/Visual Basic Win32 API オフィシャル アスキー書籍編集部 リファレンス 改訂版 (株式会社アスキー:1997年)[ISBN4-7561-1106-8] ! 警告 本ドキュメントの一部または全てを弊社の許可なく、複写,複製,転載,電子化することを禁じま す。 - 85 - Interface Corporation TUT-0016 2006年 10月 Ver. 1.6 発行 発行所 〒732-0828 広島県広島市南区京橋町10-21 TEL 082-262-7777 FAX 082-262-5066 定価 ¥2,000 本書の内容の一部または全部を、無断で転載することを禁止します。 本書の内容は、将来予告なく変更することがありますので、予めご了承ください。 © 2000, 2006 Interface Corporation. All rights reserved. サポート体制 本製品についてのお問い合わせは、お客様相談センタで承ります。弊社Web siteのオンライ ンQA(「サポート」→「お客様相談センタ」をクリック)、E-mailまたはフリーダイヤルをご利用く ださい。 お問い合わせ先 <お客様相談センタ> 0120-447213 FAX 0120-458257 TEL (祝日および弊社休業日を除く月~金 AM9:00~PM5:00迄) E-mail [email protected] TUT-0016 Ver. 1.6 Vol. 1/1 www.interface.co.jp Visual BasicによるPPI入門書 TUT-0016 Ver. 1.6 www.interface.co.jp