...

Visual BasicによるPPI入門書

by user

on
Category: Documents
22

views

Report

Comments

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
Fly UP