チュートリアル - interfacevisual...

108
www.interface.co.jp チュートリアル Visual C++によるGP-IB入門書

Upload: others

Post on 04-Apr-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

www.interface.co.jp

チュートリアル

Visual C++によるGP-IB入門書

Page 2: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

www.interface.co.jp

商標/登録商標 本ドキュメントに掲載されている会社名,製品名は、それぞれ各社の商標または登録商標です。 保障の内容と制限 弊社はドキュメント内の情報の正確さに万全を期しています。万一、誤記または誤植等があった

場合、弊社は予告なく改訂する場合があります。ドキュメントまたはドキュメント内の情報に起

因するいかなる損害に対しても弊社は責任を負いません。 製品に含まれるバグ、あるいは製品の供給(納期遅延),性能、もしくは使用に起因する付帯的損害もしくは間接的損害に対して、弊社に全面的に責がある場合でも、弊社はその製品に対する改良

(正常に動作する)、代品交換までとし、金銭面での賠償の責任は一切負わないものとしますので、予めご了承ください。 ドキュメント内の図や表は説明のためであり、ユーザ個別の応用事例により変化する場合があり

ます。 著作権,知的所有権 弊社は本製品に含まれるおよび本製品に対する権利や知的所有権を保持しています。 本製品はコンピュータ ソフトウェア(プログラム),図,文章,写真等を含んでいます。 複製の禁止 弊社の許可なく、本製品(ドキュメント含む)の全て、または一部に関わらず、複製,改変等を行うことはできません。 責任の制限 弊社は、弊社または再販売者の予見の有無に関わらず、発生したいかなる特別損害,偶発的損害,間接的な損害,重大な損害について、責任を負いません。 補償の内容 本ドキュメントで使用している弊社製品の補償については、各製品のマニュアルを参照してくだ

さい。

本書の内容の一部または全部を、無断で転載することを禁止します。 本書の内容は、将来予告なく変更することがありますので、予めご了承ください。 © 2001, 2006 Interface Corporation. All rights reserved.

Page 3: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 1 - Interface Corporation

改訂履歴

Ver. 年 月 改 訂 内 容 1.7 2006年12月 ●技術資料一覧更新。

●製品紹介削除。 ●インストール説明 Windows Vista/XP/XP Embedded/

Server 2003/2000へ変更。 1.6 2005年3月 ●対応型式追加。

●インストール説明 Windows XP/Server 2003/2000へ変更。 ●技術資料一覧更新。 ●誤記修正。

1.5 2003年10月 ●誤記修正。 1.4 2003年7月 ●誤記修正。 1.3 2003年1月 ●誤記修正。 1.2 2002年9月 ●製品紹介,対応型式変更。 1.1 2002年1月 ●GP-IB ActiveXコントロールがBPA-0515として分離・独立したこ

とによる修正。 ●CompactPCI I/Oモジュール追加。 ●製品紹介,価格変更,型式追加,ソフトウェア紹介追加。

1.0 2001年2月 新規作成

本チュートリアルをご使用の際は、必ず各製品型式の最新のドキュメント(ユーザーズマニュアル,Help)をあわせて参照してください。また、最新のドライバソフトウェアをご使用ください。 ユーザーズマニュアル,ドライバソフトウェアは弊社Web site(www.interface.co.jp)からダウンロードできます。(Helpはドライバソフトウェアに含まれています)

Page 4: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 2 -

目 次

第 1章 GP-IBとは 5

1.1 GP-IBの特長 .................................................................................................................................. 5 1.2 バス接続 ......................................................................................................................................... 6 1.3 アドレス ......................................................................................................................................... 7 1.4 リスナ,トーカ,コントローラ....................................................................................................... 7 1.5 アドレス・コマンドとユニバーサル・コマンド .................................................................... 7 1.6 インタフェース機能..................................................................................................................... 8 1.7 システム構成例 ............................................................................................................................. 9

第 2章 GP-IB製品のインストール 10

2.1 コンピュータへの設置方法....................................................................................................... 10 2.1.1 デバイスドライバのインストール................................................................................ 11 ■Windows Vistaをご使用の場合 ....................................................................................... 11 ■Windows XP Embedded,Windows XP,Windows Server 2003をご使用の場合............ 14 ■Windows 2000をご使用の場合 ....................................................................................... 16

2.2 ソフトウェアセットアップ....................................................................................................... 17 2.3 ドライバパラメータの変更....................................................................................................... 18

第 3章 Visual C++によるGP-IB制御 19

3.1 ピンアサインメント................................................................................................................... 21 3.2 ActiveXコントロールによるプログラミング(概要) .............................................................. 22 3.3 ActiveXコントロールのインストール(Excel版,高機能版).................................................... 22 3.4 ActiveXコントロールのインストール(標準版) ...................................................................... 22 3.5 DLL関数呼び出しによるプログラミング(概要).................................................................... 24 3.6 GP-IB制御概略 ............................................................................................................................ 24

第 4章 チュートリアル(高機能版ActiveXコントロール) 26

4.1 高機能版と標準版ActiveXコントロールの違い..................................................................... 26 4.2 データ送受信(コントローラモード)........................................................................................ 28

Step1.メインウィンドウ作成 ...................................................................................................... 28 Step2.環境設定 .............................................................................................................................. 34 Step3.初期化処理と終了処理 ...................................................................................................... 37 Step4.データ送受信(コントローラモード) ............................................................................... 41

4.3 データ送受信(非コントローラモード).................................................................................... 47 4.4 SRQ割り込みとポーリング処理 ............................................................................................... 52 4.5 SRQイベント ............................................................................................................................... 56

第 5章 チュートリアル(DLL編) 61

5.1 データ送受信(コントローラモード)........................................................................................ 61 Step1.メインウィンドウ作成 ...................................................................................................... 61 Step2.DLL関数宣言 ...................................................................................................................... 63

Page 5: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 3 - Interface Corporation

Step3.初期化処理と終了処理 ...................................................................................................... 66 Step4.データ送受信(コントローラモード) ............................................................................... 70

5.2 データ送受信(非コントローラモード).................................................................................... 74 5.3 SRQ割り込みとポーリング処理 ............................................................................................... 78 5.4 SRQイベント ............................................................................................................................... 82

第 6章 GP-IBリファレンス 88

6.1 標準版ActiveXコントロールリファレンス ............................................................................. 88 6.2 標準版DLLリファレンス ........................................................................................................... 91 6.3 高機能版ActiveXコントロールリファレンス......................................................................... 92 6.4 高機能版DLLリファレンス ....................................................................................................... 98

技術資料紹介 102

Page 6: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 4 -

はじめに

平素は格別のご高配を賜り、厚く御礼申し上げます。本冊子は、はじめて弊社GP-IB製品を利用しVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成までに関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual C++にてプログラムの開発を行われる際の手助けになればと考えております。 記述する内容に関しましては、基本的なことにとどまっております。また、弊社 Web site(www.interface.co.jp)ではFAQ,製品マニュアル,および本チュートリアル記載のサンプルプログラムのソース(BPC-0810)の公開を行っておりますので、こちらもあわせてご覧頂けますと、より一層ご理解を深めて頂けるものと思います。

注意事項

本冊子では、使用する環境をWindows XP/XP Embedded/Server 2003/2000+Visual C++ 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-430x)のReadmeもしくはHelpでご確認ください。

対象環境 本チュートリアルは以下の制約事項があります。 対象型式 (PCI)

PCI-4304P

PCI-4301 PCI-4302 PCI-4304

対象型式 (CPZ)

CPZ-4304P

CPZ-4302P CPZ-4304 CPZ-4302

対象型式 (CTP)

CTP-4302P

CTP-4304 CTP-4304P CTP-4302

対象型式 (CSI)

CSI-432101

対象型式 (LPC)

LPC-432101

対象型式 (PEX)

PEX-432101

対象ユーザ 制御用電子機器および、コンピュータ等に関して基本的な知識を有している方。

※本冊子は上記の弊社製品型式のみに対応しています。 製品の詳細は弊社Web siteを参照してください。

Page 7: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 5 - Interface Corporation

第1章 GP-IBとは

世の中には、色々な事象を電気的に捉えるための様々な計測機器があります。 電圧を測定する電圧計,電流を測定する電流計,電圧波形を観測するオシロスコープ..... これら計測機器を使って様々な計測が行われますが、対象となる(捉えたい)事象が、複雑または複数になってくると、 ・計測したデータを自動的にコンピュータに記録し、後で解析したい。 ・複数の計測機器を一度にまとめて操作したい。 ・計測したデータを使っていろいろな制御を行いたい。 等の要求が出てきます。この要求に応えたのがGP-IBです。 GP-IBとは、General Purpose Interface Busの略で、もともとは米ヒューレット・パッカード社*(以下HP社)が考案したインタフェース(HP-IB:Hewlett-Packard Interface Bus)でした。それを、1974年にIEEE(アメリカ電気電子学会)が承認した規格です。 GP-IBは、コンピュータと外部機器との接続を目的として制定された規格で、外部機器を並列に接続できる点,データの転送が高速に行える点等の特徴を持っています。計測機器(デジタルマルチメーター,ロジックアナライザ)等の外部機器にはGP-IBインタフェースを持っているものが多くあり、コンピュータの拡張スロットにGP-IB I/Oモジュールを挿入することによって、コンピュータから制御や計測データの取り込みが行うことができます。 また、GP-IBは一般的に使われている呼び名ですが、IEEE-488バス,HP-IB(HP社の計測器等ではHP-IBと表記されています)も同じものを示します。

※ 日本ヒューレット・パッカード株式会社の計測機器事業は、別会社「アジレント・ テクノロジー」となっております。

1.1 GP-IBの特長

GP-IBを使うことによって以下のようなことが行うことができます。 ・プログラムによる自動測定。 ・1つの機器から複数の機器へデータを送る。 ・非同期システムを構築できるので、通信速度の異なる機器の混在が可能。 ....等 一般に、「1台のコンピュータに複数の機器をつないで自動計測を行い、その計測データを一括管理する。」といった使われ方が多いようです。

Page 8: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 6 -

1.2 バス接続

GP-IBは1つの回線に多数の端末を接続する分岐方式での接続形態をなします。それぞれの機器やコンピュータは、バス(24ピンのケーブル)で接続してデータ伝送を行います。バスに接続できる機器の数はコンピュータを含め最大15台です。バスは、その長さは「各機器間で4m以内」,「機器の数が11台以上の場合はその総合計が20m以内」,「機器が10台以下の場合では、機器の数を2倍した値以下」でなければなりません。また、データの転送速度が250KB/秒を越えるような場合には、さらに制限が厳しくなります。

コンピュータを含め 15台まで

(1枚の I/Oモジュールに 14台まで

の機器を接続できます。)

接続仕様

GP-IBのバスは16本の信号線と8本のグランド線からなります。信号線は3つのグループに分けられ、1つは8本の信号線からなる「データ線」,1つは3本の信号線からなる「データ伝送制御線」, 1つは5本の信号線からなる「バス管理線」です。 データ線はデータをASCIIコードとしてパラレルに転送するのに使用します。データ線上では計測器の測定結果や条件設定だけではなく、機器を指定するための情報伝達にも使用されます。 データ伝送制御線はデータ線上の信号の確実な受渡しを行なうためのハンドシェークを行なうラ

インです。(3線ハンドシェーク) バス管理線はバス上のデータの流れを制御するために使用します。

Page 9: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 7 - Interface Corporation

1.3 アドレス

GP-IBは分岐方式ですのでデータを伝送する時や、接続機器のリモートコントロールを行う際には、対象となる機器を指定しなければなりません。接続する機器に固有の番号を割り付け、この番号

を使って機器の特定を行います。 GP-IBではこの番号のことをアドレス(Address)といいます。 アドレスには0~30を使います。 アドレスは正確には、1次アドレス(Primary Address)と呼ばれます。1次アドレスに対し2次アドレス(Secondary Address)もありますが、全ての機器が、2次アドレスを備えているわけではありません。2次アドレスは、1台の機器の内部が論理的に複数の機能単位から構成されている時に、GP-IBからその機能単位を指定するために用いられます。 アドレスは、機器についているスイッチ等で変えられるものと、最初から決まっているものがあ

ります。プログラム作成者は接続する機器のアドレスを必ず知っていなければなりません。

1.4 リスナ,トーカ,コントローラ

GP-IBではバス上に接続された機器の中で、プリンタやプロッタ等のデータを受信する機器をリスナ(Listener)といい、反対に計測器等のデータを送信する機器をトーカ(Talker)といいます。この他に、トーカやリスナを指定したりバスの管理を行う機器をコントローラ(Controller)といいます。 1台の機器が複数の役割(トーカとリスナ)を持つことはできますが、同時には持てません。トランシーバのように送信と受信を交互に切替えることで行います。 また、1つの機器でコントローラとトーカ,リスナ機能をあわせもつものもあります。

1.5 アドレス・コマンドとユニバーサル・コマンド

コントローラは、トーカとリスナのアドレスを指定してバス上のデータの流れを整理したり、コ

マンド(命令)を特定の機器や全ての機器に発信します。 特定の機器のみに発信するものをアドレス・コマンドといい、全ての機器に発信するものをユニ

バーサル・コマンドといいます。

Page 10: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 8 -

1.6 インタフェース機能

GP-IBで接続する機器は、それぞれバス上で信号のやりとりをします。その機能であるリスナ, トーカ,コントローラの3つを先に示しましたが、これらをインタフェース機能といいます。インタフェース機能は下表のように10種の機能として分類されています。 GP-IBに接続する機器は、これら全てのインタフェース機能を備えていなければならないわけではなく、システムの目的に必要なものだけを備えていれば問題ありません。 インタフェース機能 概 要

SH機能 (Source Handshake)

データ線へメッセージを送信するための機能です。AH機能をもった機器との間でハンドシェークを行ないます。

AH機能 (Acceptor Handshake)

データ線からメッセージを受信するための機能です。SH機能をもった機器との間でハンドシェークを行ないます

T機能 (Talker)

他の機器へデータを送出する機能です。自分以外のアドレスがトーカとして指定されるとただちに機能を停止します。これにより、機器が自分自身へデータを送ることを防ぐことができます。トーカはSH機能と組で動作します。

L機能 (Listener)

他の機器からデータを受信する機能です。自分自身の出したデータを受けとることを防ぐ機能も含みます。リスナはAH機能と組で動作します。

SR機能 (Service Request)

機器が異常や、予め設定された状態に達したとき、特定のサービスをコントローラに要求する機能です。

RL機能 (Remote/Local)

機器の制御をバスからの情報によって動作させるか、機器のローカルな情報(機器の操作パネルからの操作)から動作させるかを切り替える機能です。

PP機能 (Parallel Poll)

コントローラからのパラレル・ポールに応答する機能です。

DC機能 (Device Clear)

バスからあるコマンドを受信した時、機器を予め定められた初期状態に戻す機能です。

DT機能 (Device Trigger)

バスからあるコマンドを受信した時、機器はトーカまたはリスナの機能を開始します。

C機能 (Controller)

バスに接続された機器に対して、トーカやリスナとして動作するように指示する機能です。この機能は29種の能力に細分化されています。コントローラはSH機能と組で動作します。

Page 11: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 9 - Interface Corporation

1.7 システム構成例

以下にGP-IBを使ったシステムの1例を記載します。

コントローラ/リスナ(PC)ADDRESS = 2

トーカ(DMM)ADDRESS = 22

トーカ(DMM)ADDRESS = 23

計測データ集録システム

上記システムは、2台のデジタル・マルチ・メータ(DMM)より送られる計測データをコンピュータ上に蓄積し、コンピュータではそのデータの集計,解析が行うことができます。

システム画面

Page 12: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 10 -

第2章 GP-IB製品のインストール

作成するアプリケーションからGPIB機器に対して処理を行う場合、当然のことながらアプリケーションを実行するコンピュータにGP-IB製品が組み込まれていなければなりません。 ここではWindowsVista/XP/XP Embedded/Server 2003/2000環境における、弊社GP-IB製品のインストール方法を記載します。Windows NT/Me/98/95ではインストール方法がここに記載する内容とは異なります。こちらに関しては、製品マニュアルまたはオンラインドキュメントをご確認くださ

い。

2.1 コンピュータへの設置方法

※ 写真は実物と異なる場合があります。

①コンピュータ本体の電源が“OFF”であることを確認し、電源ケーブルをACコンセントから外します。その後、外装カバー,スロットカバーを外します。

②拡張用スロットへI/Oモジュールを差し込みます。

<例>

基板の左右の端に力を入れ、カツンとショックがあるまで押し込む。

I/Oモジュール

コンピュータ

PCIコネクタ

金メッキ端子がコネクタに隠れていることを確認する。

ビス留め

注意!

製品は正しい向きに実装してください。間違った向きに実装した場合、コンピュータ,I/Oモジ

ュールを破損する恐れがあります。

③パネルをコンピュータ本体とビス留めしてください。

④本体へ外装カバーを元通り取り付け、電源ケーブルをACコンセントに接続します。その後、コンピュータを起動します。

以上でI/Oモジュールの設置は完了です。次にドライバのインストールを行います。

Page 13: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 11 - Interface Corporation

2.1.1 デバイスドライバのインストール

■Windows Vistaをご使用の場合

Administratorsのグループに所属しているユーザが、インストールを行ってください。 ※ 「続行するにはあなたの許可が必要です」と警告が表示されることがあります。その場合、 「続行」をクリックしてください。

①Windows Vistaが起動すると、「新しいハードウェアが見つかりました」が表示されます。

②「ドライバソフトウェアを検索してインストールします(推奨)」をクリックします。

③「オンラインで検索しません」をクリックします。

Page 14: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 12 -

④「ディスクはありません。他の方法を試します」をクリックします。

⑤「コンピュータを参照してドライバソフトウェアを検索します(上級)」をクリックします。

⑥ドライバ保存先の「¥Win2000」フォルダを指定し、「次へ」をクリックします。

Page 15: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 13 - Interface Corporation

⑦ファイルのコピーが始まります。 ※ 「ドライバソフトウェアの発行元を検証できません」と表示された場合、「このドライバ ソフトウェアをインストールします」をクリックします。

⑧インストールが完了した旨のダイアログボックスが表示されるので、「閉じる」ボタンをクリックします。

以上で、Windows Vista用のドライバインストールは完了です。

Page 16: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 14 -

■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」フォルダを指定します。

④ファイルのコピーが始まります。

Page 17: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 15 - Interface Corporation

⑤インストールが完了した旨のダイアログボックスが表示されるので、「完了」ボタンをクリッ

クします。

以上で、Windows XP Embedded,Windows XP,Windows Server 2003用のデバイスドライバのインストールは完了です。デバイスドライバのインストール完了後以降は、システム起動時に上記②の

ように「新しいハードウェアの検索ウィザード」が起動することはありません。

• Windows XP Embedded 用ハードウェア情報ファイルのインポートをする場合 ・ドライバダウンロード方法 ①弊社Web siteよりGPC-430xのDriver Disk [Windows XPe,XP,2003,2000]をダウンロードします。

②ダウンロードしたプログラムを実行すると、「Win2000」フォルダが作成されます。

・ドライバインストール方法 ①Windows XP Embedded 開発環境の Component Database Manager を起動します。

②弊社製品のハードウェア情報ファイルをインポートします。作成した「Win2000」フォルダ内の拡張子がSLDのファイルを、画面の指示に従ってインポートしてください。

③以上で、ハードウェア情報のインポートは完了です。

Page 18: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 16 -

■Windows 2000をご使用の場合

Administratorsのグループに所属しているユーザが、インストールを行ってください。 ①Windows 2000が起動すると、「新しいハードウェアの検出ウィザード」が表示されるので、「次へ」ボタンをクリックします。

②「デバイスドライバに最適なドライバを検索する(推奨)」を選択し、「次へ」ボタンをクリックします。

③「検索場所のオプション」で「場所を指定」を選択し、「次へ」ボタンをクリックします。

④「参照」ボタンをクリックし、「製造元のファイルのコピー元」にドライバ保存先の「¥Win2000」フォルダを指定します。その後、「OK」ボタンをクリックします。

Page 19: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 17 - Interface Corporation

⑤デバイスドライバが見つかった旨のダイアログボックスが表示されるので、「次へ」ボタンを

クリックします。 ⑥ファイルのコピーが始まります。 ⑦インストールが完了した旨のダイアログボックスが表示されるので、「完了」ボタンをクリッ

クします。

以上で、Windows 2000用のデバイスドライバのインストールは完了です。 デバイスドライバのインストール完了後以降は、システム起動時に上記②のように「新しいハー

ドウェアの検索ウィザード」が起動することはありません。 インストールを完了したら、リソース(I/Oアドレス,割り込みレベル)の設定,競合の有無の確認を行ってください。 ドライバのインストールが正常に行われると、システムプロパティのデバイスマネージャに表示

されます。

ここに I/O モジュールが追加

されます。

2.2 ソフトウェアセットアップ

次の手順で、ソフトウェアGPC-430xのインストールを行ってください。

(1)弊社Web siteからダウンロードした圧縮ファイルを解凍して、解凍フォルダ内の「SETUP.EXE」を実行してください。Help,サンプルプログラム等が指定ドライブにインストールされます。

(2)画面に表示される指示に従って操作してください。

インストールに成功すると、「スタート」メニューの「プログラム」に「Interface GPC-430x」が登録されます。ソフトウェアの使用方法につきましては、README.HTM,Helpをご覧ください。

Page 20: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 18 -

2.3 ドライバパラメータの変更

(1)スタートメニューの「設定(S)」-「コントロールパネル(C)」よりコントロールパネルを開きます。

(2)コントロールパネルの「Interface GP-IB Configuration」をダブルクリックします。 (3)ここでI/Oモジュール番号(上記では0)が(1)で設定した値と異なっている場合は、そのI/Oモジュールを選択後「初期化情報」をクリックすることで設定値の変更が行うことができます。

(4)変更するI/Oモジュール型式をクリックして、選択状態にしてください。

I/Oモジュールの追加

(5)「Interface GP-IB Configuration」ダイアログの「初期化情報」ボタンをクリックすると、初期情報設定ダイアログが表示されます。

(6)設定変更後、再起動を行います。

Page 21: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 19 - Interface Corporation

第3章 Visual C++によるGP-IB制御

Visual C++より、GP-IB I/Oモジュールを制御するには、DLLを利用します。Visual C++(Windowsプログラミング)では直接I/Oやメモリにアクセスすることができません。従って、GP-IB I/Oモジュールに対して直接的に信号を送ることができません。そこで、I/Oモジュールに対して直接的に信号を送るプログラム(DLL)から必要な関数(プロシージャ)を呼び出し、このDLLを介してI/Oモジュールの制御を行います。

仮想デバイスドライバ

Win32 API

ダイナミックリンクライブラリ

Visual C++アプリケーション

ActiveX Control

I/Oモジュール

出力

入力

Page 22: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 20 -

アプリケーション作成において、ActiveXコントロールを使用するか、DLLを利用するかは、以下を参考にしてください。アプリケーションに、より柔軟な仕様を組み込むには、高機能版ActiveXコントロール,高機能版DLLを利用します。詳細についてはHelpをご覧ください。 本チュートリアルでは高機能版ActiveXコントロール,高機能版DLLを用いてプログラムを作成しています。

ソフトウェア 用途 IEEE488.2版DLL (GPC-4301N)

IEEE488.2規格に準拠した操作を行いたい方 主にC言語で開発をされる方

高機能版DLL (GPC-4301, GPC-4304)

複数台のGP-IB機器と接続されたい方 I/Oモジュールの持つ機能を全て使いたい方 主にC言語で開発をされる方

標準版DLL (GPC-4301, GPC-4304)

1台のGP-IB機器と接続されたい方 主にC言語で開発をされる方

GP-IB ActiveXコントロール (BPA-0515)

複数台のGP-IB機器と接続されたい方 I/Oモジュールの持つ機能を全て使いたい方 Visual Basicで開発をされる方

GP-IB Excel対応版ActiveXコントロール(BPA-0515)

GP-IB機器から取得したデータをExcelで処理したい方 プログラム経験のほとんど無い方

標準版ActiveXコントロール (BPA-0515)

1台のGP-IB機器と接続されたい方 Visual Basicで開発をされる方

GPC-4301,GPC-4301N,GPC-4304,BPA-0515は、弊社Web siteより無料でダウンロードできます。 ※ GPC-4301NはPCI-4301,PCI-4302,CTP-4302,CTP-4302P,CPZ-4302,CPZ-4302P,LPC-432101,

PEX-432101,CSI-432101のみ対応しています。

Page 23: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 21 - Interface Corporation

3.1 ピンアサインメント

配線時には、これらピンアサインメントをよく確認の上、配線してください。以下、弊社PCI GP-IB 製品共通のピンアサインメントを記載します。 (CompactPCI I/Oモジュール,CardBusカードのピンアサインメントは、I/Oモジュールのマニュアルを参照してください。)

<パネル面>

CN1部品面

はんだ面

汎用 LED(LED1) 点灯:マスタモード 消灯:スレーブモード (本製品とソフトウェアを使用する時)

アクセス LED(LED2)点灯(500ms間):I/Oアクセスが発生。連続でアクセスした場合、最後のアクセスから500ms後に消灯。

PCI-4304,4304Pのパネル面

<パネル面>

CN1部品面

はんだ面

コントローラ動作可/不可(LED3:赤)点灯:コントローラ動作可能消灯:コントローラ動作不可 (本製品とソフトウェアを使用する時)

I/Oアクセス状態(LED1:緑)I/Oアクセス時には、点滅します。

GPIBアクセス状態(LED4:赤)GPIBアクセス時には、点滅します。

PCI-4301,4302のパネル面

SHIELD

SRQIFC

NDACNRFD

DAVEOI

DIO4DIO3DIO2DIO1

2423222120191817161514131

2345

6789

101112 LOGIC GND GND

GNDGNDGND GNDGNDRENDIO8DIO7DIO6DIO5

CN1 (IEEE Std 488.1)(相当品)

ATN

Page 24: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 22 -

3.2 ActiveXコントロールによるプログラミング(概要)

ActiveXコントロールを利用することにより、Visual C++上の複雑な定義を行うことなく、コントロールをフォーム上に描画し、描画したコントロールにパラメータを設定することにより直感的

にGP-IB I/Oモジュールが利用可能となります。 <プログラム記述例> Gpib1.Open (); ActiveXコントロールオブジェクト

3.3 ActiveXコントロールのインストール(Excel版,高機能版)

Visual C++にて弊社GP-IB I/Oモジュール制御用Excel対応版ActiveXコントロールおよび高機能版ActiveXコントロールを利用するには、BPA-0515をインストールする必要があります。 (BPA-0515は、弊社Web siteより無料でダウンロードできます。)

(1)BPA-0515の「SETUP.EXE」を実行し、指示に従ってインストールを行います。 (2)インストールが成功すると、「スタート」メニューの「プログラム」に、「Interface BPA-0515」が追加されます。

(3)ActiveXコントロールはこの時点でシステムに組み込まれていますので、Visual Basic上から使用することができます。

3.4 ActiveXコントロールのインストール(標準版)

BPA-0515には、標準版ActiveXコントロールも添付されておりますが、標準版ActiveXコントロールを使用する際は、以下のような手順が必要です。

Visual C++にて弊社GP-IB I/Oモジュール制御用 Excel対応版ActiveXコントロールおよび高機能版ActiveXコントロールを利用するには、REGSVR32.EXE (Windowsに搭載されるプログラム)を使用して「ActiveXコントロール」をレジストリに登録する必要があります。 以下にGP-IB ActiveXコントロールの登録方法を記載します。

(1)BPA-0515の「SETUP.EXE」を実行し、指示に従ってインストールを行います。 (2)インストールが成功すると、「スタート」メニューの「プログラム」に、「Interface BPA-0515」が追加されます。

(3)インストール完了後、「¥Program Files¥Interface¥BPA0515¥Standard」に「Standard.EXE」が格納されています。 「Standard.EXE」は標準版ActiveXコントロールを圧縮した自己解凍形式のファイルです。 「Standard.EXE」をダブルクリックし、解凍先のフォルダを指定し、「OK」ボタンをクリックしてください。

(4)標準版ActiveXコントロールが解凍され、解凍先フォルダの中に「GPC43043.DLL」が格納されています。

(5)「GPC43043.DLL」をWindows NT,2000の場合には「WINNT¥SYSTEM32」へ、Windows XP,98,95の場合には「WINNT¥SYSTEM」へ格納します。

Page 25: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 23 - Interface Corporation

(6)「スタート」-「ファイル名を指定して実行(R)…」を選択します。 (7)名前のところに「REGSVR32 C:¥Windows¥System¥Gpc43043.dll」(Windows XP,98,95の場合)とタイプし、「OK」ボタンをクリックします。

ここにタイプします。

Windows98,95,Meの場合※

起動ドライブがAドライブとなるPC98シリーズ等の場合、 「REGSVR32 A:¥Windows¥System¥Gpc43043.dll」となります。REGSVR32の後にGPC43043.DLLが格納された位置を指定してください。

(8)登録が正常に行われると以下のよう表示されます。

登録完了メッセージ

登録が正常に行われない場合、I/Oモジュールのインストールが正常に行えていないことが考えられます。 「スタート」-「設定」-「コントロールパネル」を開き、「Interface GP-IB Configuration」をダブルクリックし設定内容を確認してください。 ここで、I/Oモジュールが正しく登録されていない場合等以下のエラーが発生します。

登録失敗時のメッセージ

注意!

ActiveXコントロールをインストールする際は、各OSと各プログラム言語について、最新のサー

ビスパックをインストールしてください

ActiveXコントロールをインストールする前に、以下の共有DLLがシステムに組み込まれてい

る最新であることを確認してください。 ・MFC42.DLL ・MSVCRT.DLL ・MSVCP60.DLL

上記ファイルが無い、もしくは最新でないと、ActiveXコントロールのインストールに失敗する

可能性があります。

Page 26: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 24 -

3.5 DLL関数呼び出しによるプログラミング(概要)

Visual C++よりDLL関数呼び出しプログラミングを行うには、弊社、GP-IB制御用ソフトウェア(GPC4304.DLL:高機能版DLL,GPC43042.DLL:標準版DLL)をダイナミックリンクし使用します。DLLとはダイナミックリンクライブラリ(Dynamic Link Library)の略でアプリケーションの実行時に動的にリンクして利用できる関数のライブラリです。 Visual C++にてDLL関数を利用するには、(GPC4304.LIB:高機能版LIB,GPC43042.LIB:標準版LIB)ファイルをリンクしてDLL関数のアドレスを指定します。(リンクの方法は『26ページ 第4章 チュートリアル(高機能版ActiveXコントロール)』で記載しています)

3.6 GP-IB制御概略

弊社GP-IB I/Oモジュールを使用しGP-IBインタフェースをもった機器に対して制御を行う場合、基本的に下記の制御シーケンス(順番)で行います。

(1) I/Oモジュール初期化 プログラム起動 ↓ (2) I/Oモジュールの設定 ↓ (3) GP-IB初期化 ↓ (4) 各種処理 ↓ (5) 終了処理 プログラム終了

(1)I/Oモジュールの初期化

Visual C++で作成されたアプリケーションが、接続された機器に対し何らかの処理を行う場合、アプリケーションが直接的に接続された機器に何かをしているわけではありません。GP-IB I/Oモジュールを介して接続された機器に対し間接的に処理が行われます。 従って、まずアプリケーションは、GP-IB I/Oモジュールを利用可能な状態にする必要があります。この処理がI/Oモジュールの初期化です。I/Oモジュールの初期化を行うと、プログラムはGP-IB I/Oモジュールへのアクセスが可能となります。本処理が行われないとGP-IB I/Oモジュールへのアクセスは行えません。

(2)I/Oモジュールの設定 弊社GP-IB I/Oモジュールは、例えばPCI-4301,4302,4304,4304P,CTP-4302,4302P,4304,4304P, CPZ-4302,4302P,4304,4304P,LPC/PEX-432101の組み合わせで併用することにより最大16枚までの使用が可能です。また、1枚のI/Oモジュールに最大14台の機器を接続することができます。I/Oモジュールからデータの伝送を行う場合等、先に記述しておりますとおり、GP-IB I/Oモジュールを介して接続された機器に対し間接的に処理が行われますので、どのI/Oモジュールに対して処理を行うか、また、どの機器に対しデータの伝送を行うか等を設定する必要があります。これが、I/Oモジュールの設定です。

Page 27: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 25 - Interface Corporation

(3)GP-IB初期化 接続した機器は通常そのままではデータの伝送は行えません。これら接続した機器にも準備作業が必要となります。これが、GP-IBの初期化です。

IFC送信(※1),REN設定(※2)デバイス・クリア(※3)等所定の手続きを行います。この手続きは使用する機器により異なります。

(※1)IFC(Interface Clear) 全ての機器に対するGP-IBインタフェース機能の初期化要求です。

(※2)REN(Remote Enable) 全ての機器のリモート状態(論理的にバスに接続された状態),ローカル状態(論理的にバスから切り離された状態)を切り替えます。機器にRL機能がある時にのみ有効です。ローカル状態では操作をその機器の操作パネルから行います。

(※3)デバイス・クリア(Device Clear) 全ての機器を初期状態に戻します。機器によって初期状態の意味は異なります。 DC機能がある時にのみ有効です。

(4)各種処理 機器へのコマンド送信または計測値の受信等を行います。 ここで、GP-IBで重要なものの1つにサービスリクエスト(SRQ)があります。 GP-IBでシステムを組む場合、トーカ/リスナの指定をして測定データを取得する等の処理はシーケンスに行なわなければなりません。しかし、実際のシステムでは計測データがいつ届くかわからなかったり、計測中はコンピュータ側(コントローラ)が別の処理を行なったりと必ずしもシーケンスに処理が行えるとも限りません。 ここで使われるのが、SRQ割り込みとポーリング処理です。 使用している機器がSR機能をもっている場合、コントローラに対しサービス要求(割り込み)を通知することができます。コントローラは、どの機器がサービス要求をしているのかを探して、その要求に応じた処理を行います。 ここで、サービス要求をしている機器を探す方法として、シリアル・ポーリングとパラレル・ポーリングがあります。 シリアル・ポーリングは、コントローラがサービス要求元と思われる機器を1台ずつ順番に呼び出して、その時の機器の状態を示すステータス・バイトと呼ばれる1バイトの情報を送らせ、この内容を調べることで、サービス要求元とその要因を取得します。 規格上、ポーリング機能とSR機能は別の機能なので、SR機能のない機器でもポーリングは可能です。そうすればコントローラは好きな時にステータス・バイトを読むことで、現在の機器の状態を知ることができ、それに応じた処理を行うことができます。パラレル・ポーリングは8本のデータ・ラインを1本ずつ8組の機器に割り当て、8組のトーカのどれがサービス要求しているかを一度に判別する方法ですが、使用方法には制限があります。 (チュートリアルではシリアル・ポールのみを記載しています)

(5)終了

I/Oモジュールの使用終了を行うための手続きです。プログラム終了時には必要です。 (ActiveXコントロール利用時はフォームのUnloadと同時にI/Oモジュールへの終了処理が行われますので、プログラムによってはソースに記述する必要がない場合もあります)

Page 28: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 26 -

第4章 チュートリアル(高機能版ActiveXコントロール)

ここでは、高機能版ActiveXコントロールを用いたGP-IB制御を行います。ActiveXコントロールとは、ひとことで言えばソフトウェアコンポーネントです。ActiveXコントロールを用いることで、プログラムのコード量を減らすことが可能になり、DLL関数を用いた場合よりも簡単にGP-IBが制御できます。 弊社にはExcel対応版ActiveXコントロール,高機能版ActiveXコントロール,標準版ActiveXコントロールの3種類のActiveXコントロールがあります。Excel対応版ActiveXコントロールは、GP-IB機器から取得したデータをExcel上に取り込めるという特長があります。高機能版ActiveXコントロールはI/Oモジュールの持つ全ての機能を使用したい場合に使用します。 以下に高機能版ActiveXコントロールの特長を示しました。Excel版ActiveXコントロールに関しては参考文献(大川義邦著:Windows2000による計測・制御プログラミングのノウハウ)を参照してください。

4.1 高機能版と標準版ActiveXコントロールの違い

高機能版には以下の特長があります。

(1)SRQイベントのサポート SRQの発生をポーリングする必要がありません。 GP-IB機器からサービス要求(SRQ)が発生した場合の処理を、SRQイベントで記述できます。

(2)複数機器の接続サポート 高機能版では最大32台(2次アドレス機器を含む)をサポートしています。

(3)非コントローラモードのサポート

GP-IB I/Oモジュール間の通信が行えます。 (4)非同期データ転送のサポート データ転送完了をポーリングする必要がありません。データ送受信メソッドの実行後、直ちに

処理を抜けられます。送受信完了後の処理は、送受信完了イベントで記述できます。 (5)プロパティページのサポート プロパティの変更を視覚的に行えます。

(6)GP-IB機器を名前で扱える 高機能版では接続機器を名前で指定できます。機器アドレスを隠蔽しているため、デザイン時

以外は機器アドレスを意識する必要がありません。 (7)I/Oモジュールがインストールされていなくてもデザインが可能 高機能版では、I/Oモジュールが挿入されていなくてもデザインが可能になります。

Page 29: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 27 - Interface Corporation

(8)バスコマンドの送出 直接バスコマンドが送出できます。 通常は、メソッドで全バスコマンドをサポートしていますが、それで対応できない測定機に対

して、直接バスコマンドでの制御が行えます。 (9)パラレルポーリングのサポート サービス要求(SRQ)発生時に、シリアルポーリングが各装置を順番にポーリングしていくのに対して、8台までの装置を同時にポーリングできます。

(10)ローカル/リモートモードのサポート 計測機器のパネルからの制御を、有効/禁止にできます。

(11)パスコントロールのサポート アクティブコントローラを、他の装置に譲渡できます。

(12)システムコントロールの要求/解除 システムコントローラを、他の装置に譲渡できます。

(13)事象変化の検出 トーカ/リスナ/デバイストリガ/デバイスクリアの状態検出が行えます。

以上が、高機能版ActiveXコントロールの特長です。

では、実際にGP-IB機器の制御を行う簡単なプログラムの作成を行います。高機能版ActiveXコントロール使用したプログラムです。 (Active Xの代わりにDLL関数を使用した場合については、『61ページ 第5章 チュートリアル(DLL編)』を参照してください。) 接続は以下の2通り行なっています。

非コントローラ リスナ/トーカ: アドレス = 22

コントローラ : アドレス = 0

コントローラ :アドレス = 0

リスナ /トーカ : アドレス = 22

接続例 1

接続例 2

Page 30: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 28 -

まず、コンピュータにPCI-4301,4302,4304,4304P,CTP-4302,4302P,4304,4304P,CPZ-4302,4302P, 4304,4304P,CSI/LPC/PEX-432101のいずれかが1枚実装され、それに計測機器が1台接続されていることを想定しています(接続例1)。もう一つは2枚のGP-IB I/Oモジュールをコントローラ,非コントローラとして接続していることを想定しています(接続例2)。 ただし、I/Oモジュール同士を接続する場合は両コントローラでプログラムを実行する必要があります。これは以後に説明する「データの送受信」についてのプログラムに相当します。コントロー

ラでは「データの送受信(コントロールモード)」のプログラムを、非コントローラでは「データの送受信(非コントロールモード)」のプログラムを同時に実行してください。 GP-IB機器のアドレスはコントローラとして扱うGP-IB I/Oモジュールを「0」,制御するGP-IB機器を「22」,非コントローラとして扱うGP-IB I/Oモジュールを「22」とします。また、GP-IB I/OモジュールのI/Oモジュール番号を「0」とします。 本チュートリアルではGP-IB I/OモジュールにPCI-4304を、接続するGP-IB機器にHP社マルチメータ(34401A)を使用しています。

4.2 データ送受信(コントローラモード)

ここでは、GP-IB I/Oモジュールがコントローラモード時でのデータ送受信で使用するプログラムの作成を行います。使用するメソッド,プロパティ,イベントの詳細は『92ページ 6.3 高機能版ActiveXコントロールリファレンス』を参照してください。 では、この高機能版ActiveXコントロールを使用したプログラムの作成を行ってみましょう。

Step1.メインウィンドウ作成

ここでは、これから作成するプログラムの画面作成を行います。 Visual C++を起動し新しいプロジェクトを作成します。 1. 「ファイル」メニューより「新規作成」を選択します。 2. 新規作成ダイアログが表示されますので、「プロジェクト」タブを選択します。 ・MFC AppWizard(exe)を選択し、「プロジェクト名」に“GpibTrans_m_ActvX”と記入します。 ・「位置」には作業するフォルダを指定してください。その後「OK」をクリックします。

Page 31: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 29 - Interface Corporation

MFC AppWizard(exe)を実行します フォルダを指定します

プロジェクト名を書き込みます

3. 作成するアプリケーションの種類は「ダイアログベース」、リソースで使用する言語の指定は「日本語」を選択し、「次へ」をクリックします。

ダイアログベースを選択します

4. ステップ2では「ActiveXコントロール」にチェックを入れクリック、ステップ3では「次へ」をクリック、ステップ4で「終了」をクリックします。

Page 32: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 30 -

5. 新規プロジェクト情報というダイアログが表示されますので、「OK」をクリックしてください。

OKをクリックします

6. プロジェクトにGP-IB ActiveXコントロール(高機能版)を追加します。 「プロジェクト」→「プロジェクトへ追加」を選択し、「コンポーネントおよびコントロール」

を選択します。

「コンポーネントおよびコントロール」選択します

Page 33: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 31 - Interface Corporation

・「Registered ActiveX Controls」を選択し、「挿入」ボタンをクリックします。

「Registered ActiveX Controls」を選択します

「挿入」ボタンをクリックします

・表示されたコンポーネントから「Interface BPA-0515 GP-IB Advanced Control 1.1」を選択し、「挿入」ボタンをクリックします。

クリックしますInterface BPA-0515 GP-IB Advanced Control 1.1を選択します

Page 34: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 32 -

・「OK」ボタンを押した後、クラスの確認画面でクラスの確認を行ってください。そして、「OK」ボタンをクリックし、コンポーネントおよびコントロールギャラリ画面を閉じてください。こ

れで、高機能版GP-IB ActiveXコントロールがプロジェクトに挿入されました。 クリックします

7. ResourceViewを表示し、Dialogフォルダを展開して「IDD_GP-IBTRANS_M_ACTVX_DIALOG」をダブルクリックします。コントロール内にGP-IB ActiveXコントロール(高機能版)アイコンが追加されていることが確認できます。

ダブルクリックします

ResourceViewを選択します

ActiveXコントロール(高機能版)のアイコンが確認できます

Page 35: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 33 - Interface Corporation

8. ダイアログボックスの必要のないボタン,スタティックテキストを削除します。「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択し、Deleteキーを押してください。

それぞれ選択して Deleteキーで削除します

9. コントロールからGP-IB ActiveXコントロール(高機能版)を選択し、ダイアログ上(ここでは右下隅)に配置します。

ActiveXコントロール(高機能版)を貼り付けます

ここまでで、メインウィンドウの作成は完了です。

Page 36: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 34 -

Step2.環境設定

ここでは、ActiveXコントロール(高機能版)のプロパティページにプログラムを実行させる環境を定義し、オブジェクトの作成方法を記述します。 1. 高機能版ActiveXコントロールのプロパティページを開きます。さきほど貼り付けたActiveXコントロール(高機能版)のアイコンにカーソルを合わせ、右クリックし、プロパティを選択します。プロパティの項目は2つ(1番下と下から4番目)ありますが、どちらを選択しても構いません。

どちらを選んでも構いません

2. 「I/Oモジュール初期設定」タブをクリックしI/Oモジュールの設定を行います。

各種設定を行います

Page 37: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 35 - Interface Corporation

デフォルトでは、以下のようになっています。

設定項目 内 容 初期値 I/Oモジュール番号 I/Oモジュール番号 マスタ/スレーブ* マスタ(コントローラモード),

スレーブ(非コントローラモード)の設定 マスタ

マイアドレス GP-IB I/Oモジュールの1次アドレス 0 2次アドレス GP-IB I/Oモジュールの2次アドレス 無し データ入出力方式 データ出力方式の設定 FIFO データ転送モード 非同期データ転送設定 同期 送受信タイムアウト データ転送タイムアウト 30 STB応答時間 STB受信タイムアウトの時間設定 30 送信バッファサイズ 送信バッファサイズ 65536 受信バッファサイズ 受信バッファサイズ 65536 送信デリミタ* 送信デリミタ(非コントローラモード時) CRLF+EOI 受信デリミタ* 受信デリミタ(非コントローラモード時) CRLF+EOI NRFD信号ライン待ち設定 GP-IBバス NRFD信号ライン待ち設定 無効

※ 「マスタ/スレーブ」,「送信デリミタ」,「受信デリミタ」の設定はコントロールパネルより 行います。「送信デリミタ」,「受信デリミタ」は使用する機器に合わせたものに設定してく ださい 3. 「接続機器設定」タブをクリックし接続機器の設定を行います。プロパティページ下部に接続する機器を設定し「追加」ボタンをクリックしてください。デバイス名は半角32文字以内で自由に設定できます。(ここではデバイス名をHP34401Aに設定しています。)

Page 38: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 36 -

4. 次に先程と同じようにActiveXコントロール(高機能版)アイコンを右クリックし、ClassWizard を選択します。

ClassWizardを選択します

5. 「メンバ変数タブ」をクリックし、以下の設定で、「変数の追加」ボタンをクリックします。 プロジェクト名 GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvXDlg

コントロールID IDC_BPA0515ADVANCEDCTRL1

クリックします

6. 「メンバ変数の追加」ウィンドウが表示されますので、以下の設定にし、「OK」ボタンをクリックしてください。

メンバ変数 m_GpibHost カテゴリ コントロール 変数のタイプ CGpibAdvnanced

クリックします

タイプとメンバを確認して「OK」ボタンをクリックしてください。これでオブジェクトが作成できました。プログラム中ではm_GpibHost.“メソッド名”等と記述することでメソッドやプロパティが使用できます。

Page 39: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 37 - Interface Corporation

Step3.初期化処理と終了処理

GP-IB機器の制御を行う場合には、先にも記載したとおりI/Oモジュールの初期化,GP-IB機器の初期化を行う必要があります。(『24ページ 3.6 GP-IB制御概略』を参照) I/Oモジュールの初期化は、ActiveXコントロールのOpenメソッドにより行います。 次に、実際にデータ送受信を行うためにGP-IBの初期化を行います。ここでは、以下のGP-IB初期化処理を行います。 ・IFC(Interface Clear)信号の送出 ・REN(Remote Enable)信号の送出 ・DC(Device Clear)実行

それぞれの処理にはActiveXコントロールの以下のメソッドを使います。

IFC(Interface Clear)信号の送出 ⇒ SetIfcメソッド REN(Remote Enable)信号の送出 ⇒ SetRenメソッド DC(Device Clear)実行 ⇒ ExecDeviceClearメソッド

また、GP-IB I/Oモジュールが、コントロール(マスタ)モードに設定されているかの確認も初期化の中に加えています。 アプリケーションの終了時、もしくは処理の終了時に、I/Oモジュールに対して必ず終了処理を行わなければなりません。終了処理は、ActiveXコントロールのCloseメソッドにより行います。 では、実際に初期化処理と終了処理のプログラムの作成を行います。

1. FileViewを表示し、SourceFileフォルダを展開してGpibTrans_m_ActvXDlg.cpp関数の最初の部分に(List 1-1)を記述します。

(List 1-1:GpibTrans_m_ActvXDlg.cppのコード) // GpibTrans_m_ActvXDlg.cpp : インプリメンテーション ファイル // #include "stdafx.h" #include "GpibTrans_m_ActvX.h" #include "GpibTrans_m_ActvXDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CString gszDevice; // 制御対象のGP-IB機器名 この部分を追加

Page 40: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 38 -

2. メニューバーの「表示」を選択し、「ClassWizard」を開きます。 3. 「ClassWizard」の以下のように設定して、「関数の追加」をクリックします。

プロジェクト GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvX オブジェクト名 CGpibTrans_m_ActvXDlg メッセージ WM_CLOSE

「関数の追加」をクリックします

4. 以下のように、OnClose関数が追加されますので、「OK」をクリックします。

関数が追加される

5. ClassViewを表示し、CGpibTrans_m_ActvXDlgクラスを展開してOnInitDialog関数とOnClose関数に、それぞれ(List 1-2),(List 1-3)のコードを記述します。

このクラスにコードを追加します

Page 41: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 39 - Interface Corporation

(List 1-2:CGpibTrans_m_ActvXDlgクラスのOnInitDialog関数のコード) CGpibTrans_m_ActvXDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 特別な初期化を行う時はこの場所に追加してください。 LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ // プロパティページの"接続機器設定"タブのNo.1に登録されている機器名を // グローバル変数gszDeviceに代入します。 gszDevice = m_GpibHost.GetDeviceName1(); // GP-IB I/Oモジュールのオープンを行います lRet = m_GpibHost.Open(); if (lRet != 0) { szErrMsg.Format("初期化に失敗しました(%d)", lRet); MessageBox(szErrMsg,"オープンエラー", MB_ICONERROR); exit(0); } // GP-IB I/Oモジュールが、マスターモードに設定されていることを確認します。 if (m_GpibHost.GetIsMaster() == FALSE) { MessageBox("GP-IB I/Oモジュールが、マスターモードに設定されていません", "実行エラー", MB_ICONERROR); m_GpibHost.Close(); exit(0); } // IFC送出を行います lRet = m_GpibHost.SetIfc(); if (lRet != 0) { szErrMsg.Format("IFCの送出に失敗しました(%d)", lRet); MessageBox(szErrMsg,"実行エラー", MB_ICONERROR); m_GpibHost.Close(); exit(0); } // RENの設定を行います lRet = m_GpibHost.SetRen(); if (lRet != 0) { szErrMsg.Format("RENの設定に失敗しました(%d)", lRet); MessageBox(szErrMsg,"実行エラー", MB_ICONERROR); m_GpibHost.Close(); exit(0); } // デバイスクリアを行います lRet = m_GpibHost.ExecDeviceClear(); if (lRet != 0) { szErrMsg.Format("デバイスクリアに失敗しました(%d)", lRet); MessageBox(szErrMsg,"実行エラー", MB_ICONERROR); m_GpibHost.Close(); exit(0); } return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }

(List 1-3:CgpibTrans_m_ActvXDlgクラスのOnClose関数のコード) CGpibTrans_m_ActvXDlg::OnClose() { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してく ださい LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ lRet = m_GpibHost.Close(); if(lRet != 0){ szErrMsg.Format("終了処理に失敗しました(%d)",lRet); MessageBox(szErrMsg,"クローズエラー", MB_ICONERROR); } CDialog::OnClose(); }

プログラムの入力が終わったら保存してください。

この部分は、デフォルトのままです

ここから記述します

Page 42: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 40 -

では、初期化と終了処理についての説明を行います。ここで使用したOnInitDailog関数は、ダイアログボックスが表示される前に実行される関数であり、OnClose関数は、ウィンドウまたはアプリケーションが終了しなければならない時に実行される関数です。つまり、プログラムを実行しダ

イアログが作成(表示)される前に初期化処理(OnInitDialog関数)を行い、ウィンドウが終了する時に終了処理(OnClose関数)を行います。 『61ページ 第5章 チュートリアル(DLL編))』で作成するサンプルププログラムは、初期化と終了処理をOnCreate関数とOnDestroy関数で行っています。 DLL関数の場合は、OnCreate関数,OnDestroy関数ではなくActiveXコントロール同様に、OnInitDialog関数,OnClose関数で初期化,終了処理を行っても構いませんが、ActiveXコントロールでの初期化,終了処理をOnCreate関数,OnClose関数で行うことはできません。なぜなら、ActiveXコントロールは、ダイアログに張り付いている状態にあります。ですから、ダイアログが表示(作成)される前にActiveXコントロールのメソッド,プロパティを使用することができません。(下図参照)

……ウィンドウを作成します。

OnInitDialog実行

OnCreate実行

プログラム実行

ActiveXコントロールが有効になる。

……ダイアログを表示します。

OnClose実行 ……ダイアログを破棄します。

ActiveXコントロールが無効になる。

……ウィンドウを閉じます。OnDestroy実行

初期化の項目は、最初に説明した「IFC信号の送出」「REN信号の送出」「デバイスクリア」に加えて、GP-IB I/Oモジュールがマスタに設定されているかの確認も行っています。

「使用例」

(初期化処理)

lRet = m_GpibHost.Open( ); // GP-IB I/Oモジュールオープン

lRet = m_GpibHost.GetIsMaster( ); // マスタ/スレーブの設定確認

lRet = m_GpibHost.SetIfc( ); // IFC送出

lRet = m_GpibHost.SetRen( ); // RENの設定

lRet = m_GpibHost.ExecDeviceClear( ); // デバイスクリア

(終了処理)

lRet = m_GpibHost.Close( ); // GP-IB I/Oモジュールクローズ

IFC送出時間を設定します。(100μ単位)

Page 43: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 41 - Interface Corporation

Step4.データ送受信(コントローラモード)

では、データ送信(コントロールモード)を行うプログラムを作成します。データ送受信の一連の作業の流れは、データ送信→データ受信→受信データ取得となります。

データ送信(相手)

データ受信

受信データ取得

データ受信が終わると、それを知らせるイベントが上がる

ここで初めて受信データを取得する 1. ResourceViewを表示し、ダイアログボックス(IDO_GP-IBTRANS_M_ACTVX_DIALOG)をダブルクリックして開きます。

ダブルクリックします

2. ダイアログボックス上に、送信データを書き込むエディットボックス、受信データを表示するエディットボックスと送信/受信を行うボタンを配置します。右クリックでプロパティを開き、それぞれ以下のように設定してください。

IDC_SENDDATA

チェックをつけます

(エディットボックス 1:送信データを書き込む)

IDC_RECVDATA

チェックをつけます

(エディットボックス 2:受信データを表示する)

(ボタン1) ID IDC_SEND キャプション 送信 (ボタン2) ID IDC_RECV キャプション 受信

エディットボックス 1とボタン 1

エディットボックス 2とボタン 2

Page 44: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 42 -

3. 送信データ,受信データを格納するメンバ変数の追加設定を行います。メニューより「表示」を選択し「Class Wizard」を開き、「メンバ変数」タブを表示します。

4. 最初に送信データを保存するメンバ変数を追加します。以下のように設定し、「変数の追加」をクリックします。 プロジェクト GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvXDlg コントロール IDC_SENDDATA

5. さらに以下のように設定し、「OK」をクリックします。 メンバ変数 m_szSendData カテゴリ 値 変数のタイプ Cstring

6. 同様にして、受信データを保存するメンバ変数の追加も行います。同じように「Class Wizard」を開き以下のように設定してください。 プロジェクト GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvXDlg コントロール IDC_RECVDATA メンバ変数 m_szRecvData カテゴリ 値 変数のタイプ Cstring

※ 追加した2つのメンバ変数共に、「最大文字数」を“32”に設定します。

追加されたメンバ変数

“32”にします

Page 45: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 43 - Interface Corporation

7. データ送信,データ受信を行う関数と受信データを取得する関数の追加設定を行います。 メニューより「表示」を選択し「ClassWizard」を開き、「メッセージマップ」タブを表示します。

8. 最初にデータ送信を行う関数を追加します。以下のように設定し、「関数の追加」をクリックします。 プロジェクト GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvX Dlg オブジェクトID IDC_SEND メッセージ BN_CLICKED

9. メンバ関数を決定するダイアログボックスが表示されますので、“OnSend”となっていることを確認し、「OK」をクリックします。

10. 同様にして、データ受信を行う関数とデータ受信完了を通知するイベントの追加を行います。以下のように設定して「関数の追加」ボタンを押してください。関数名は、それぞれ“OnSend”と“OnReceiveFinishBpa0515advancedctrl1”となります。

(データ受信関数)

プロジェクト GpibTrans_m_ActvX クラス名 C GpibTrans_m_ActvX Dlg オブジェクトID IDC_RECV メッセージ BN_CLICKED

(データ受信完了イベント) プロジェクト GpibTrans_m_ActvX クラス名 C GpibTrans_m_ActvX Dlg オブジェクトID IDC_ BPA0515ADVANCEDCTRL1 メッセージ ReceiveFinish

追加された関数

11. ClassViewを表示し、CGpibTrans_m_ActvXDlgクラスを展開して、OnSend関数,

OnRecv関数,OnReceiveFinishBpa0515advancedctrl1関数に、それぞれ(List 1-4),(List 1-5),(List 1-6)のコードを記述します。

Page 46: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 44 -

(List 1-4:CgpibTrans_m_ActvXDlg関数のOnSend関数のコード) CGpibTrans_m_ActvXDlg::OnSend() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ COleVariant vtData; // SlaveSendメソッドを呼び出し、データを送信します。 // 第2引数を省略する(NULL終端までの文字列を送信する) UpdateData(TRUE); vtData = m_szSendData; lRet = m_GpibHost.MasterSend(gszDevice, vtData, COleVariant((long)0, VT_ERROR)); if (lRet != 0) { szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg,"送信エラー", MB_ICONERROR); } }

(List 1-5:CgpibTrans_m_ActvXDlgクラスのOnRecv関数のコード) CGpibTrans_m_ActvXDlg::OnRecv() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 LONG lRecvSize; // 受信データサイズ CString szErrMsg; // エラーメッセージ // I/Oモジュール番号0よりデータ受信を開始します lRet = m_GpibHost.MasterReceive(gszDevice, “”, &lRecvSize); // データ受信 if(lRet != 0){ szErrMsg.Format("データ受信に失敗しました(%d)",lRet); MessageBox(szErrMsg,"受信エラー", MB_ICONERROR); } }

(List 1-6 : CgpibTrans_m_ActvXDlgクラスのOnReceiveFinishBpa0515advancedctrl1関数のコード) CGpibTrans_m_ActvXDlg::OnReceiveFinishBpa0515advancedctrl1(long bytesTotal) {

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ // GetDataメソッドは、変数の型に応じてデータを返します。 // そのため、予めVariant型変数に文字列を代入して初期化 // した変数を指定することで、文字列を取得できます。 COleVariant vtData(""); // GetDataメソッドを呼び出し、受信バッファからデータを // 取り出し、メッセージボックスで表示します。 lRet = m_GpibHost.GetData(vtData, COleVariant((long)0, VT_ERROR)); if (lRet != 0) { szErrMsg.Format("データ取得に失敗しました:%d", lRet); MessageBox(szErrMsg, "実行エラー", MB_ICONERROR); } else { m_szRecvData = vtData.bstrVal; // 受信データをメンバ変数に格納 UpdateData(FALSE); // エディットボックスに表示 } }

プログラムの入力が終わったら保存してください。

Page 47: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 45 - Interface Corporation

List 1-4では、エディットボックスに入力されたデータをMasterSendメソッドにて送信を行っています。List 1-5は、MasterReceiveメソッドでデータを受信します。正常に完了(デリミタ受信または指定データ長受信)した時、ReceiveFinishイベントが発生し、 OnReceiveFinishBpa0515advancededctrl1の関数が呼ばれます。データ受信が完了を知らせるReceiveFinishイベントの中で、MasterReceiveメソッド実行後の受信データを取得するのに、GetDataメソッドを使用します。

処 理 使用メソッド/イベント 1 データ送信 MasterSendメソッド 2 データ受信 MasterReceiveメソッド 3 受信データ取得 OnReceiveFinishイベント

GetDataメソッド

「使用例」

COleVariant vtData;

lRet = m_GpibHost.MasterSend(gszDevice, vtData, COleVariant((long)0, VT_ERROR));

リスナ機器名を指定します。

送信するデータを指定します。

メソッド実行後の状態が格納されます。

送信データ長(バイト数)を指定します。※1

※1 引数の省略:オプション引数はVARIANTとして宣言する必要があります。引数を省略する場合には、呼び出し側のプログラムは初期化されたVARIANTを渡す必要があります。

「使用例」

lRet = m_GpibHost.MasterReceive(gszDevice, “ “, &lRecvSize);

トーカ機器名を指定します。

リスナの機器名を指定します。 メソッド実行後の状態が格納されます。

データ完了時に受信バッファに格納されている受信データのサイズを格納する変数を意思低します。*2

※2 非同期転送時には、この値は無効です。 リスナの指定が無い場合は、第2引数に空文字列“”を指定します。

プログラムを動かしてみる環境は、図「チュートリアルの接続例」で行います。では、エディッ

トボックス1(送信データ)に“READ?”と入力し「送信」ボタンをクリックしてください。その後、「受信」ボタンをクリックしてください。「受信」をクリックした時点での電圧値が受信データ

としてエディットボックスに表示されます。

データ受信完了時に受信バッファに格納されている受信データのサイズを格納する変数を指定します。※2

「使用例」

lRet = m_GpobHost.GetData(vtData, COleVariant((long)0, VT_ERROR));

取得するデータ長(バイト数)を指定します。

取得したデータが格納される場所を指定します。メソッド実行後の状態が 格納されます。

Page 48: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 46 -

送信データ

受信データ

ここで、送信データ“READ?”は、使用しているGP-IB機器(Hewlett Packard社 34401A)に対して、以下のような指示をしています。 トリガ・システムのステートを「アイドル」ステートから「トリガ待ち」ステートに変えます。

READ?コマンド受信後、指定したトリガ条件が満たされると測定が始まり、読み取り値は直ちに出力バッファへ送られます。 送信がうまく行えない場合、次のことを確認してみてください。 ・送信文字列(コマンド)に誤りはありませんか? ・使用しているデリミタコードは接続している機器の仕様にあったものですか?

※ 送信する文字列は接続している機器の仕様に合わせ、機器が正常に受信できたか確認するコマンドを送信してみてください。

正常にデータが受信できない、またはGP-IBに接続された機器がデータを送信していない場合、画面に表示されませんが、約3秒後にエラーが発生します(この間プログラムはロックされています)。これをタイムアウトエラーと呼びます。エラー発生までの時間はプロパティページの「送受信タ

イムアウト」より決定されます。

※ “-14”はメソッドの戻り値で、タイムアウトを示します。 その他のメソッドの値についてはメソッド戻り値一覧で確認してください。

また、“DISPLAY:TEXT ‘HELLO’”とエディットボックス1に入力し「送信」ボタンをクリックすると、HP 34401Aのフロントパネルに“HELLO”と表示されます。

HELLO

Page 49: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 47 - Interface Corporation

4.3 データ送受信(非コントローラモード)

では、次にGP-IB I/Oモジュールが非コントローラモード時でのデータ送受信で使用するプログラムを作成します。使用するメソッド,プロパティ,イベントの詳細は巻末の高機能版ActiveXコントロールリファレンスを参照してください。 ここで作成するデータ送受信(非コントロールモード)プログラムは、基本的にStep4で作成したデータ送受信(コントロールモード)プログラムと作成手順は同じです。 1. Visual C++を起動し新しいプロジェクト(プロジェクト名:GpibTrans_s_ActvX)を作成し、環境設定まで行います。(Step1,Step2を参照してください)

2. OnClose関数を追加し、OnInitDialog関数,OnClose関数にコードを記述します。OnInitDialog関数には、(List 1-7)を記述し、OnClose関数には、(List 1-3)を記述します。(Step3を参照) ※ Step3の手順1にある「制御対象名の変数追加」は、行う必要ありません。

(List 1-7:CgpibTrans_s_ActvXDlgクラスのOnInitDialog関数のコード) CGpibTrans_m_ActvXDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 特別な初期化を行う時はこの場所に追加してください。 LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ lRet = m_GpibHost.Open(); if(lRet != 0){ szErrMsg.Format("初期化に失敗しました(%d)", lRet); MessageBox(szErrMsg,"オープンエラー", MB_ICONERROR); exit(0); } // GP-IB I/Oモジュールが、スレーブモードに設定されていることを確認します。 if (m_GpibHost.GetIsMaster() != FALSE) { MessageBox("GP-IB I/Oモジュールが、スレーブモードに設定されていません。", "実行エラー", MB_ICONERROR); m_GpibHost.Close(); exit(0); } return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }

この部分は、デフォルトのままです

ここから記述します

Page 50: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 48 -

3. データ送受信(非コントローラモード)用のダイアログボックスを作成します。基本的にデータ送受信(コントローラモード)と変わりはありません。Step4を参照に行ってください。 (変更点)

コントローラモード 非コントローラモード プロジェクト名 GpibTrans_m_ActvX GpibTrans_s_ActvX クラス名 CGpibTrans_m_ActvXDlg CGpibTrans_s_ActvXDlg

4. 作成したOnSend関数,OnRecv関数にそれぞれ(List 1-8),(List 1-9)のコードを記述します。

(List 1-8:CgpibTrans_s_ActvXDlgクラスのOnSend関数のコード) void CGpibTrans_s_ActvXDlg::OnSend() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ COleVariant vtData; // SlaveSendメソッドを呼び出し、データを送信します。 // 第2引数を省略する(NULL終端までの文字列を送信する) UpdateData(TRUE); // 送信データをメンバ変数に格納 vtData = m_szSendData; // データ代入 lRet = m_GpibHost.SlaveSend(vtData, COleVariant((long)0, VT_ERROR));// データ送信 if (lRet != 0) { szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg,"送信エラー", MB_ICONERROR); } }

(List 1-9:CgpibTrans_s_ActvXクラスのOnRecv関数のコード) void CGpibTrans_s_ActvXDlg::OnRecv() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 LONG lRecvSize; // 受信データサイズ CString szErrMsg; // エラーメッセージ // I/Oモジュール番号0よりデータ受信を開始します lRet = m_GpibHost.SlaveReceive(&lRecvSize); // データ受信 if(lRet != 0){ szErrMsg.Format("データ受信に失敗しました(%d)",lRet); MessageBox(szErrMsg,"受信エラー", MB_ICONERROR); } }

5. データ受信完了を通知するイベント(OnReceiveFinishGpc4304advancedctrl1イベント)に は、先ほどと同じコード(List 1-6)を記述します。

プログラムの入力が終わったら保存してください。

Page 51: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 49 - Interface Corporation

では、プログラムを実行してみます。先ほどのではなく、今度は図4-1の接続例2で行います。それぞれのコンピュータにPCI-4304を差し込みます。 次に、各I/Oモジュールの設定を行います。コントローラ/非コントローラは、どちらのI/Oモジュールがなっても構いません。それぞれの設定を行った方のI/Oモジュールがコントローラまたは、非コントローラに設定されます。下図を参照に設定を行ってください。 ・コントローラモードの設定

1.コントロールパネルの

「InterfacePCI GPIB」の設定

注)左図のように「I/Oモジュール番号」

は I/Oモジュール上にある RSW1の番号

に、「動作モード」は“MASTER”に、「送

信(受信)デミリタ」を“EOI”に設定「し

ます。

2.プロパティページの設定

(『データ送受信 (コントローラモード)』

Step2参照)

3.「接続機器設定」の設定

(『データ送受信(非コントローラモード)』の

Step2参照)

ここでの接続機器は、PCI-4304になります。デ

バイス名を“PCI-4304”に 1 次アドレスは、先

ほど設定したコントローラの設定値“0”と異な

る値にします。

Page 52: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 50 -

非コントローラモードの設定

1.コントロールパネルの「InterfacePCI GP-IB」の設定

注)左図のように「I/Oモジュール番号」は I/Oモジュール

上にある RSW1の番号に、「動作モード」は“SLAVE”に、

「送信(受信)デミリタ」を“EOI”に設定「します。また、

「1次アドレス」は、コントローラの「接続機器設定」で

設定した値に設定します。

2.プロパティページの設定

(『高機能版と標準版 ActiveXコントロールの違い』の Step2

参照)

左図のように各設定を行います。

注)「マスタ/スレーブ」は、“スレーブ”に、「マイアドレス」

は、1次アドレスの値を設定します。

では、プログラムを動かしてみます。コントロール側で“GPC4304”と入力し、「送信」をクリックします。その後、非コントロール側で「受信」をクリックすると、“GPC4304”と受信データが表示されます。

コントローラモード 非コントローラモード

「送信」をクリック 「受信」をクリック

Page 53: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 51 - Interface Corporation

次に非コントロール側で“GPC4304”と入力し、「送信」をクリックします。その後、コントロール側で「受信」をクリックすると、“GPC4304”と受信データが表示されます。

コントローラモード 非コントローラモード

「送信」をクリック「受信」をクリック

List1-8のSlaveSendメソッド,List1-9のSlaveReciveメソッドの役割は、Step4のMasterSendメソッド,MasterReciveメソッドと同じです。

「使用例」

lRet = m_GpibHost.SlaveSend(vtData, COleVariant((long)0, VT_ERROR));

送信するデータを指定します。

送信データ長 (バイト数)を指定します。

メソッド実行後の状態が格納されます。

「使用例」

lRet = m_GpibHost.SlaveReceive(&lRecvSize);

メソッド実行後の状態が格納されます。

データ受信完了時に受信バッファに格納されている受信データのサイズを格納する変数を指定します。

Page 54: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 52 -

4.4 SRQ割り込みとポーリング処理

GP-IBバス上に接続されたトーカやリスナは機器がSR(Service Request)機能をもつ場合、機器に異常やデータ送信準備が完了した等の特定の状態に達すると、SRQ信号を発信しコントローラに知らせます。 コントローラはこのSRQ信号を受け取り、SRQ信号の発信元を特定することで、機器の異常や特定の状態に対する処置を行うことが可能となります。 このSRQ信号の発信元を探し出す処理をポーリングと言います。ポーリングにはシリアル・ポーリングとパラレル・ポーリングとがありますが、ここではシリアル・ポーリングについてのみ記

載します。また、一般的にはシリアル・ポーリングが多用されています。 高機能版GP-IB ActiveXコントロールでは、SRQ信号の検知をイベントとしてとらえることが可能です。SRQ信号の確認ができたら、次はシリアル・ポーリングを行います。シリアル・ポーリングは高機能版GP-IB ActiveXコントロールのExecSpollメソッドより行います。シリアル・ポーリングを実行するとSRQ信号を発信している機器の状態を示す値を取得することができます。この値のことをステータス・バイトと言います。

では、SRQ信号を確認しシリアル・ポーリングを行うプログラムの作成を行います。

1. 新しいプロジェクトを作成します。プロジェクト名は、“GpibSpActvX”とします。プロジェクトを作成してから初期化までの手順はStep1~Step3までを参照してください。

2. 次にシリアル・ポーリングを行うボタンを作成します。コントロールからボタンを選択し、ダイアログボックスに貼り付けます。ダイアログボックスに貼り付けた後にボタンにカーソルを

合わせ、右クリック→「プロパティ」を選択し、以下のように設定します。 ID IDC_SPOLL キャプション SP実行

IDC_SPOLL SP実行とします

Page 55: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 53 - Interface Corporation

ボタンはこのように配置します

3. メンバ関数“OnSpoll”を作成します。「SP実行」ボタンにカーソルを合わせ、右クリック→「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト GpibSpActvX クラス名 CGpibSpActvXDlg オブジェクト IDC_SPOLL メッセージ BN_CLICKED

「関数の追加」をクリックします

メンバ関数名を決定するダイアログボックスが表示されますので、“OnSpoll”になっていることを確認し、「OK」をクリックします。

Page 56: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 54 -

4. そのまま「コード編集」ボタンをクリックし、“OnSpoll”関数を実装します。以下のように コード(List 1-10)を記述してください。

(List 1-10:CGpibSpActvXDlgクラスのOnSpoll関数のコード) void CGpibSpActvXDlg::OnSpoll() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ COleSafeArray saStbTbl; // ステータス・バイトを格納するための配列 LONG lStbTbl[2]={0,0}; // シリアル・ポーリングを行う機器数+1の配列 // (それぞれの要素を0で初期化) LONG lStb; // ステータス・バイトを格納するバッファ LONG lElement[]={0}; // 要素を指定するための配列 LONG lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 BOOL bSrqFlag; // SRQ信号有効・無効を格納するための変数 char szSpStatus[256]; // シリアル・ポーリングステータス // ステータス・バイトを格納するための1次元配列saRetを作成します saStbTbl.CreateOneDim(VT_I4, 2, lStbTbl, 0); while(lLoop < 10000){

// SRQ信号の有無を確認します bSrqFlag = m_GpibHost.GetCheckSrq(); // SRQ信号が有効になった場合ループを抜けます if(bSrqFlag == TRUE) break; lLoop++;

} if(bSrqFlag == TRUE){ // SRQ信号有効時

lRet = m_GpibHost.ExecSpoll(gszDevice, saStbTbl); if (lRet != 0) {// シリアル・ポーリング失敗時

szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", lRet); MessageBox(szErrMsg, "ポーリングエラー", MB_ICONERROR);

} else{ // シリアル・ポーリング成功時

saStbTbl.GetElement(lElement, &lStb); // 作成した配列の0番目の要素 //(取得したステータスバイト) // をlStbに格納します

sprintf(szSpStatus, "%Xh", lStb); MessageBox(szSpStatus, "ステータス・バイト", MB_ICONEXCLAMATION);

} } else{// SRQ信号無効時

MessageBox("SRQ信号が無効です", "SRQ信号無効エラー", MB_ICONERROR); } }

以上でSRQ割り込みとポーリング処理のプロクラムは完成です。プログラムを実行後、機器からSRQが発行された時に、「SP実行」ボタンをクリックすると、接続された機器に対しSRQ信号確認後シリアル・ポーリングを行います。そして、得られたステータス・バイトをメッセージボックスに表示します。 実際にシリアル・ポーリングを行うために、機器からSRQを発行させる機能、およびSRQ信号をクリアするコードを追加してみましょう。

Page 57: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 55 - Interface Corporation

5. 先程実装したメンバ関数“OnSpoll”を以下のように変更します。網掛けの部分を追加してください。

(List 1-11:CGpibSpActvXDlgクラスのOnSpoll関数(変更後)のコード) void CGpibSpActvXDlg::OnSpoll() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ COleSafeArray saStbTbl; // ステータス・バイトを格納するための配列 LONG lStbTbl[2]={0,0};// シリアル・ポーリングを行う機器数+1の配列 // (それぞれの要素を0で初期化) LONG lStb; // ステータス・バイトを格納するバッファ LONG lElement[]={0}; // 要素を指定するための配列 LONG lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 BOOL bSrqFlag; // SRQ信号有効・無効を格納するための変数 char szSpStatus[256]; // シリアル・ポーリングステータス // スタンダード・イベント・レジスタのBit0に1を立て、

// オペレーション完了をイネーブルにします lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*ese 1"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // ステータス・バイト・サマリ・レジスタのBit5に1を立て、

// スタンダード・イベントをイネーブルにします lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*sre 32"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // *OPCコマンドを実行してオペレーション完了を知らせます lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*OPC"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // ステータス・バイトを格納するための1次元配列saRetを作成します saStbTbl.CreateOneDim(VT_I4, 2, lStbTbl, 0); while(lLoop < 10000){

// SRQ信号の有無を確認します bSrqFlag = m_GpibHost.GetCheckSrq(); // SRQ信号が有効になった場合ループを抜けます if(bSrqFlag == TRUE) break; lLoop++;

} if(bSrqFlag == TRUE){ // SRQ信号有効時

lRet = m_GpibHost.ExecSpoll(gszDevice, saStbTbl); if (lRet != 0) { // シリアル・ポーリング失敗時

szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", lRet); MessageBox(szErrMsg, "ポーリングエラー", MB_ICONERROR);

} else{ // シリアル・ポーリング成功時

saStbTbl.GetElement(lElement, &lStb); // 作成した配列の0番目の要素 //(取得したステータスバイト)

// をlStbに格納します sprintf(szSpStatus, "%Xh", lStb); MessageBox(szSpStatus, "ステータス・バイト", MB_ICONEXCLAMATION);

} } else{// SRQ信号無効時

MessageBox("SRQ信号が無効です", "SRQ信号無効エラー", MB_ICONERROR); }

この網掛け部分でSRQの発行を行います

Page 58: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 56 -

// レジスタをクリアします lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*CLS"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // SRQ受信割り込みを無効化します m_GpibHost.SetCheckSrq(FALSE); }

それではプログラムを実行してみましょう。まず、機器に電源が入っていることを確認してくだ

さい。「SP実行」ボタンを押すと、以下のようにメッセージボックスが出現し、“60h”(16進数で60)というステータス・バイトが表示されました。

SRQの発行,クリア,ステータス・バイトに関しては機器によって異なります。詳しくはお持ちの機器のマニュアルをお読みください。

4.5 SRQイベント

実際のシステムでは接続機器からSRQ割り込みがいつ発生するか分かりません。先程のプログラムでは、SRQの確認をループさせて検知を行いました。しかし、ループ回数以内でSRQを検知できない場合も考えられます。こういった場合、別スレッドで無限ループさせてSRQの確認を行えばよいかもしれませんが、ある程度のプログラミング能力が必要な上、処理速度が落ちる等の問

題点が発生します。 そこで用意されたのがSRQイベントです。高機能版ActiveXコントロールでは機器からSRQが発行され、GP-IB I/Oモジュールがそれを検知した時点でイベントが立ち上がります。そのイベント処理の中でポーリングを行えば、ループさせるよりも効率が上がります。ここではその手順を掲載

します。 1. 新しいプロジェクトを作成します。プロジェクト名は“GpibEventActvX”とします。プロジェクトを作成してから初期化までの手順はStep1~Step3までを参照してください。

2. イベントの登録を行います。以下のように設定し、「関数の追加」ボタンをクリックします。 プロジェクト GpibEventActvX クラス名 CGpibEventActvXDlg オブジェクト名 IDC_GPC4304ADVANCEDCTRL1 メッセージ SqpEvent

この網掛け部分でSRQのクリアを行います

Page 59: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 57 - Interface Corporation

「関数の追加」をクリックします

3. 「メンバ関数の追加」ウィンドウのメンバ関数名を”OnSrqEvent”にし、「OK」ボタンをクリックしてください。

OnSrqEventとします

4. そのまま「コード編集」ボタンをクリックし、イベントが立ち上がった時に呼ばれる

“OnSrqEvent”関数を実装します。以下のようにコード(List1-12)を記述してください。

(List 1-12:CGpibEventActvXDlgクラスのOnSrqEventイベントのコード) void CGpibSrqActvXDlg::OnSrqEvent() {

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ COleSafeArray saStbTbl; // ステータス・バイトを格納するための配列 LONG lStbTbl[2]={0,0}; // シリアル・ポーリングを行う機器数+1の配列

// (それぞれの要素を0で初期化) LONG lStb; // ステータス・バイトを格納するバッファ LONG lElement[]={0}; // 要素を指定するための配列 char szSpStatus[256]; // シリアル・ポーリングステータス // ステータス・バイトを格納するための1次元配列saRetを作成します saStbTbl.CreateOneDim(VT_I4, 2, lStbTbl, 0);

Page 60: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 58 -

// SRQ信号の有無を確認します lRet = m_GpibHost.GetCheckSrq(); if(lRet == TRUE){// SRQ信号が有効な場合

//シリアル・ポーリングを実行します lRet = m_GpibHost.ExecSpoll(gszDevice, saStbTbl); if (lRet != 0) {

szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", lRet); MessageBox(szErrMsg, "ポーリングエラー", MB_ICONERROR);

} else{

saStbTbl.GetElement(lElement, &lStb); // 作成した配列の0番目の要素 //(取得したステータスバイト) // をlStbに格納します

sprintf(szSpStatus, "%Xh", lStb); MessageBox(szSpStatus, "ステータス・バイト", MB_ICONEXCLAMATION);

} } else{// SRQ信号が無効な場合

MessageBox("SRQ信号は無効です","SRQ信号無効エラー", MB_ICONERROR); }

// レジスタをクリアします lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*CLS"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // SRQ受信割り込みを無効化します m_GpibHost.SetCheckSrq(FALSE); }

※ コード中の網掛け部分はSRQのクリアを行う部分ですので、機器によって異なります。

これでイベントが発生した場合に行われる処理の作成が完了しました。先ほどと同じように、実

際にイベントが立ち上がるか確認するためにSRQ信号を発行させる処理を加えてみましょう。 5. コントロールからボタンを選択し、ダイアログボックスに貼り付けます。ダイアログボックスに貼り付けた後にボタンにカーソルを合わせ、右クリック→「プロパティ」を選択し、以下の

ように設定します。 ID IDC_ACTION キャプション 動作実行

6. メンバ関数“OnActionl”を作成します。「動作実行」ボタンにカーソルを合わせ、右クリック→「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト GpibEventActvX クラス名 CGpibEventActvXDlg オブジェクト IDC_ACTION メッセージ BN_CLICKED

メンバ関数名を決定するダイアログボックスが表示されますので、“OnAction”になっていることを確認し、「OK」をクリックします。

7. そのまま「コード編集」ボタンをクリックし、“OnAction”関数を実装します。以下のように コード(List1-13)を記述してください。

Page 61: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 59 - Interface Corporation

(List 1-13:CGpibSpActvXDlgクラスのOnAction関数のコード) void CGpibEventActvXDlg::OnAction() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ // スタンダード・イベント・レジスタのBit0に1を立て、オペレーション完了をイネーブルにします lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*ese 1"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // ステータス・バイト・サマリ・レジスタのBit5に1を立て、

// スタンダード・イベントをイネーブルにします lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*sre 32"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // *OPCコマンドを実行してオペレーション完了を知らせます lRet = m_GpibHost.MasterSend(gszDevice, COleVariant("*OPC"), COleVariant((long)0, VT_ERROR)); if(lRet != 0){

szErrMsg.Format("データ送信に失敗しました(%d)", lRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} }

※ このコード中はSRQの発行を行う部分ですので、機器によって異なります。 それでは、機器の電源が入っていることを確認してプログラムを実行してください。「動作実行」

ボタンを押すと、SRQ信号が発行され、イベントが立ち上がります。イベント内で、シリアル・ポーリングを行っていますので、先程と同じように以下のようなメッセージボックスが表示され

ます。

では、これより使用したメソッド、プロパティについて説明します。 (List 1-10)ではまず、SRQ信号が有効か無効かを判断しています。SRQ信号の有無はCheckSrqプロパティで行います。(List 1-10)ではSRQ信号の情報を取得し、(List 1-11)ではプロパティの値を設定しています。

「使用例」・ 情報を取得する場合

lRet = m_GpibHost.GetCheckSrq ( );

・ 設定する場合m_GpibHost.SetCheckSrq (FALSE);

プロパティの値(TRUE/FALSE)が格納されます。

SRQ受信割り込みの有効(TRUE)/無効(FALSE)を

設定します。

Page 62: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 60 -

このプロパティは、コントローラがSRQを受信するとTRUEになります。FALSEになる条件は、コントローラがシリアル・ポーリングを実行するか、もしくは、上の使用例のようにCheckSrqプロパティを、強制的にFALSEに設定した場合です。 何らかの要因でシリアル・ポーリングをしてもSRQ発信機器が検出できなかった場合、このCheckSrqプロパティはクリア(FALSEに設定)されません。その場合は、プロパティの設定で、強制的にFALSEにすることが可能です。 ただし、このCheckSrqを強制的にTRUEに設定することはできません。つまり、「このプロパティをTRUEに設定して機器からSRQを発行しよう」というような使い方はできません。機器からSRQ信号が出された時に、はじめてこのプロパティがTRUEになります。

次に、シリアル・ポーリングですが、ExecSpollメソッドを使用します。

「使用例」

lRet = m_GpibHost.ExecSpoll(gszDevice, saStbTbl);

メソッド実行が失敗するとエラー

コードが格納されます。

シリアル・ポーリングを行う GP-IB機器名(DeviceNameXx

プロパティの値)を指定します。

取得したステータス・バイトを格納する配列変数を指定します。

第2引数には、必ずGP-IB機器の数+1の領域を持った配列変数を指定してください。各機器から得られたステータスの次の配列要素に-1が格納されるためです。また、List 1-10のように、VARIANT型から派生したクラスに宣言した配列も使用できます。 以上でSRQ割り込み発生時のポーリング処理,SRQイベント処理が行えるようになりました。実際のシステム構築には、そのシステムの目的(仕様)にあわせ、これらの処理を組み合わせ、また、繰り返し行うことになると思います。受信したデータを元に次の処理を行うであるとか、SRQを確認後、コマンドの送信を行う等です。 本冊子では紹介しておりませんが、エラーイベント等を利用すると、いわゆる危機回避ロジック

をシステム内に組み込むことが可能です。「機能をいかにうまく組み合わせて使うか」がシステ

ム構築における信頼性向上の鍵となります。

Page 63: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 61 - Interface Corporation

第5章 チュートリアル(DLL編)

ここでは、高機能版ActiveXコントロール編で作成したプログラムをDLL関数を用いて行います。 まずDLLとはダイナミックリンクライブラリ(Dynamic Link Library)の略でアプリケーションの実行時に動的にリンクして利用できる関数のライブラリです。そもそも、Windowsアプリケーションプログラミングでは直接I/Oやメモリにアクセスすることができません。言い換えれば、GP-IB I/Oモジュールに対して直接的に信号を送ることができません。そこで、I/Oモジュールに対して直接的に信号を送るプログラム書庫(DLL)から必要な手続き(関数)を呼び出し、このDLLを介してボートの制御を行います。 本チュートリアルではDLLを使用します。また、ここで使用する関数の詳細はHelpを参照してください。

5.1 データ送受信(コントローラモード)

Step1.メインウィンドウ作成

ここでは、これから作成するプログラムの画面作成を行います。 Visual C++を起動し新しいプロジェクトを作成します。 1. 「ファイル」メニューより「新規作成」を選択します。 2. 新規作成ダイアログボックスが表示されますので、「プロジェクト」タブを選択します。

MFC AppWizard(exe)を選択し、「プロジェクト名」に“GpibTrans_m_Dll”と記入します。 「位置」には作業するフォルダを指定してください。その後「OK」をクリックします。

MFC AppWizard(exe)を選択します。 作業するフォルダを指定します。

プロジェクト名を書き込みます。

Page 64: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 62 -

3. 作成するアプリケーションの種類は「ダイアログベース」、リソースで使用する言語の指定は「日本語」を選択し、「次へ」をクリックします。

ダイアログベースを選択します

4. ステップ2,ステップ3では「次へ」をクリックし、ステップ4で「終了」をクリックします。 5. 新規プロジェクト情報というダイアログボックスが表示されますので「OK」をクリックします。

ここまでで、新規プロジェクトの作成は完了です。

Page 65: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 63 - Interface Corporation

Step2.DLL関数宣言

DLL関数を利用するには、GPC4304.LIBファイルを使って関数の位置を指定し、関数の呼び出しに使う引数の識別を行わなければなりません。ここで一度リンクしたDLL関数は、Visual C++の関数と同じようにコードで呼び出すことが可能となります。 また、識別子はGPC4304.Hに定義されています。GP-IB I/Oモジュールを制御するには ・GPC4304.LIBファイルをリンクさせる。 ・GPC4304.Hファイルをインクルードする。

という2つの作業が必要となるわけです。 ※ 標準版DLLを使用する場合はGPC43042.LIB,GPC43042.Hとなります。 プロジェクトにGPC4304.LIB,GPC4304.Hのパス設定を行います。 ・「ツール」→「オプション」を選択し、「ディレクトリ」タブを選択します。

・表示するディレクトリを「インクルードファイル」にします。 ・空白の部分をダブルクリックします。(下図参照)

ダブルクリックします インクルードファイルにします

クリックします

Page 66: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 64 -

Includeを選択します

・ディレクトリの追加を行います。ディレクトリ先を<Program Files>¥Interface¥GPC4304 ¥Includeに設定して「OK」をクリックします。(下図参照) ・下図のようにディレクトリに追加されます。

インクルードファイルにします

追加されたディレクトリ

Libを指定します。

Page 67: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 65 - Interface Corporation

・次に、表示するディレクトリを「ライブラリファイル」にします。 ・ディレクトリの追加を行います。ディレクトリ先を<Program Files>¥Interface¥Gpc4304¥libと設定して「OK」をクリックします。 ・下図のようにディレクトリに追加されます。

ライブラリファイルにします

追加されたディレクトリ

2. プロジェクトにGPC4304.LIBファイルをリンクします。 ・「プロジェクト」→「設定」を選択し、「リンク」タブを選択します。 ・設定の対象を「全ての構成」に設定し、「オブジェクト/ライブラリモジュール」に“gpc4304.lib”と書き込み「OK」をクリックします。

GPC4304.LIBをリンクします

すべての構成にします

“GPC4304.LIB”“GPC4304.H”は、Setupでインストールされる<インストール先>¥lib,<インストール先>¥Includeにあります。 (インストール先:<Program Files>¥Interface¥Gpc4304)

Page 68: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 66 -

Step3.初期化処理と終了処理

初期化処理はI/Oモジュールの初期化とGP-IBの初期化処理を行うわけですが、高機能版ActiveXコントロール編に記載した初期化処理をDLLで記述すると次の(List 2-1),(List 2-2)のようになります。

では実際にGP-IBの初期化と終了処理を行うプログラムを作成します。 1. 表示メニューからClassWizardを起動する。 2. 「メッセージマップ」タブを選択し、以下のように設定します。(下図参照)

プロジェクト GpibTrans_m_Dll クラス名 CGpibTrans_m_Dll Dlg オブジェクト CGpibTrans_m_Dll Dlg メッセージ WM_CREATE

CGpibTrans_m_DllDlgを選択 WM_CREATEを選択

CGpibTrans_m_DllDlgを選択

3. 「関数の追加」をクリックします。 4. 同様にメッセージに「WM_DESTROY」を選択し、「関数の追加」をクリックします。 5. 「OK」をクリックし、Class Wizardを終了します 6. ワークスペースの「FileView」タブをクリックし、「Source Files」フォルダを展開し、「CGpibTrans_m_DllDlg.cpp」をダブルクリックします。GpibTrans_m_DllDlg.cppに(List2-1)の網掛け部分を追加します。

(List 2-1:CGpibTrans_m_DllDlg.cppの変更コード)

// GpibTrans_m_DllDlg.cpp : インプリメンテーション ファイル // #include "stdafx.h" #include "GpibTrans_m_Dll.h" #include "GpibTrans_m_DllDlg.h" #include "gpc4304.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define BoardNo 0

Page 69: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 67 - Interface Corporation

1. ワークスペースの「ClassView」タブをクリックし、「CGpibTrans_mDllDlg」フォルダを展開します。

2. フォルダの下の「OnCreate」をダブルクリックしOnCreate関数に(List 2-2)の網掛け部分を追加します。

(List 2-2:CGpibTrans_m_DllDlgクラスのOnCreate関数のコード)

int CGpibTrans_m_DllDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) {

if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;

INT nRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ

// I/Oモジュールアクセス番号BoardNoのI/Oモジュールを初期化 nRet = PciGpibExInitBoard(BoardNo, 0); if (nRet != GP-IB_SUCCESS) {

szErrMsg.Format("I/Oモジュールアクセス番号%dのI/Oモジュールが初期化できません(%d)",BoardNo,nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR); exit(0); // プログラム終了

}

// IFCを送出 nRet = PciGpibExSetIfc(BoardNo, 1); if (nRet != GP-IB_SUCCESS) {

szErrMsg.Format("IFC送出に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR); PciGpibExFinishBoard(BoardNo); exit(0); //プログラム終了

} // REN信号有効 nRet = PciGpibExSetRen(BoardNo); if (nRet != GP-IB_SUCCESS) { szErrMsg.Format("REN信号有効に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR); PciGpibExFinishBoard(BoardNo); exit(0); //プログラム終了

} // デバイスクリアの実行 nRet = PciGpibExExecDevClear(BoardNo); if (nRet != GP-IB_SUCCESS) {

szErrMsg.Format("デバイスクリアの実行に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR); PciGpibExFinishBoard(BoardNo); exit(0); //プログラム終了

} return 0; }

1. 同様に、「OnDestroy」をダブルクリックし、OnDestroy関数に(List 2-3)の網掛け部分を追加します。

(List 2-3:CGpibTrans_m_DllDlgクラスのOnDestory関数のコード)

void CGpibTrans_m_DllDlg::OnDestroy() { CDialog::OnDestroy();

INT nRet; // 関数の戻り値 CString szErrMsg; // エラーメッセージ

// I/Oモジュールアクセス番号BoardNoのI/Oモジュールを使用終了

nRet = PciGpibExFinishBoard(BoardNo); if(lRet != GP-IB_SUCCESS) {

szErrMsg.Format("I/Oモジュールアクセス番号%dの終了に失敗しました(%d)",BoardNo,nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR);

} }

Page 70: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 68 -

プログラムの入力が終わったら、保存した後、プログラムを実行してみてください。何もエラー

が表示されなければ、GP-IBの初期化および終了処理部分のプログラムは完成です。 では、入力したプログラムを読み取ってみましょう。 (List 2-2)では高機能版ActiveXコントロール編で説明した手順と同様の初期化処理を行っています。 まず指定されたI/Oモジュールの初期化を行っています。 これにはPciGpibExInitBoard関数を使用します。

第1引数に指定するBoardNoにはロータリスイッチ(RSW1)の値を設定します。「マイコンピュータ」→「コントロールパネル」→「システム」のデバイスマネージャで確認できます。

第2引数にはウィンドウハンドルを指定します。 ウィンドウハンドルとは、Windowsにおける各ウィンドウが持つ固有の数値です。 これはウィンドウを識別するためのハンドルで、後で使用するデータ転送関数において指定した

ウィンドウへメッセージポストをするために必要になります。 第2引数の値は作成するアプリケーションが同期処理をするか非同期処理をするかによって変わってきます。 同期処理とはデータ転送用関数を実行するとその関数からの転送結果を待って次の処理に移りま

す。今回のプログラムでは同期処理を行いますのでウインドウハンドルは必要ありません。 0かNULLを指定してください。

「使用例」

nRet = PciGpibExInitBoard(BoardNo, 0);

I/Oモジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。 アプリケーションの

ウィンドウハンドルを指定します。

Page 71: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 69 - Interface Corporation

非同期処理とはデータ転送用関数を実行すると、その関数からの転送結果を待つことなく、次の

処理を行うことができます。ここでその関数が終了するとその関数の実行結果がアプリケーショ

ンへポストされ、アプリケーション側ではこのメッセージコードを受けて、最初に呼び出した転

送用関数を再度呼び出し、データ転送終了時の結果を取得します。 同期転送と非同期転送の選択により、非同期転送時には関数呼び出し後、データ転送終了まで待

つことなく、即関数から戻ってくるため、アプリケーションプログラムも同時処理を行うことが

できます。 転送結果を取得することにより、非同期転送の完了となり、次のデータ転送用関数を呼び出すこ

とができます。また、非同期転送中は、コマンド送出系、データ転送系の関数は使用できません。 次にプログラムではIFC信号の送出を行っています。IFC信号の送出はPciGpibExSetIfc関数を使用します。

第2引数にはIFC送出時間を設定しています。今回は100μ秒に設定されています。 次にプログラムではREN信号を有効にしています。REN信号を有効にするにはPciGpibExSetRen関数を使用します。

次に、デバイスクリアを行っています。デバイスのクリアにはPciGpibExExecDevClear関数を使用します。

(List2-3)では指定されたI/Oモジュールの使用を終了しています。これはアプリケーションを終了する直前に行っています。 I/Oモジュールの使用を終了するにはPciGpibExFinishBoard関数を使用します。

このようにGP-IBの初期化と終了処理はアプリケーション内では1回ずつの実行にするようにしてください。

「使用例」 nRet = PciGpibExSetIfc ( BoardNo, 1 );

I/Oモジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

「使用例」 nRet = PciGpibExSetRen ( BoardNo );

I/Oモジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

「使用例」 nRet = PciGpibExExecDevClear ( BoardNo );

I/Oモジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

「使用例」 nRet = PciGpibExFinishBoard ( BoardNo );

I/Oモジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

Page 72: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 70 -

Step4.データ送受信(コントローラモード)

では実際にデータ送信を行うプログラムを作成します。 ダイアログの作成方法は『61ページ 第5章 チュートリアル(DLL編)』のStep4のデータ送受信(コントローラモード)と同様です。プロジェクト名は“GpibTrans_m_Dll”としてください。また、ActiveXコントロール用の関数追加を行う必要はありません。作成されたダイアログはこのようになります。

では、実際にデータ送信のコードを実装します。 1. ワークスペースの「FileView」タブをクリックし、「Source Files」フォルダを展開し、「CGpibTrans_m_DllDlg.cpp」をダブルクリックします。GpibTrans_m_DllDlg.cppに(List2-4の網掛け部分を追加します。

(List 2-4:CGpibTrans_m_DllDlg.cppの変更コード)

// GpibTrans_m_DllDlg.cpp : インプリメンテーション ファイル // #include "stdafx.h" #include "GpibTrans_m_Dll.h" #include "GpibTrans_m_DllDlg.h" #include "gpc4304.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define BoardNo 0 INT gnDevAdrsTbl[2] = {22, -1}; // 入力機器アドレステーブル

2. ワークスペースの「ClassView」タブをクリックし、GpibTrans_m_DllクラスのCGpibTrans_m_Dllの下のOnSendをダブルクリックします。OnSendに(List 2-5)の網掛け部分を追加します。

Page 73: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 71 - Interface Corporation

(List 2-5:CGpibTrans_m_DllDlgクラスのOnSend関数のコード)

void CGpibTrans_m_DllDlg::OnSend() {

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の戻り値 char SendBuf[32]; // 送信データ CString szErrMsg; // エラーメッセージ

UpdateData(TRUE);

// データ送信 strcpy(SendBuf, m_szSendData); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf),SendBuf, WM_NULL); if(lRet != GP-IB_SUCCESS){

szErrMsg.Format("データ送信に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR);

} }

次にデータの受信のコードを実装します。 ワークスペースの「ClassView」タブをクリックし、GpibTrans_m_DllクラスのCGpibTrans_m_Dllの下のOnSendをダブルクリックします。OnSendに(List 2-6)の網掛け部分を追加します。

(List 2-6:CGpibTrans_m_DllDlgクラスのOnRecv関数のコード)

void CGpibTrans_m_DllDlg::OnRecv() {

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の戻り値 ULONG nLen; // 受信サイズ char RecvBuf[32]; // 受信データ CString szErrMsg; // エラーメッセージ

UpdateData(TRUE);

nLen = sizeof(RecvBuf); if(!nLen){

AfxMessageBox("受信データはありません"); } else{ //データ受信

nRet = PciGpibExMastRecvData(BoardNo, gnDevAdrsTbl, &nLen, RecvBuf, WM_NULL); if(nRet != GP-IB_SUCCESS) {

szErrMsg.Format("データ受信に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR);

} else {

m_szRecvData = RecvBuf; UpdateData(FALSE);

} }

}

Page 74: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 72 -

プログラムの入力が終わったら保存してください。これで『26ページ 4.1 高機能版と標準版ActiveXコントロールの違い』のデータ送受信(コントロールモード)と同じ処理を行うプログラムの作成は完了です。では入力されたプログラムを読み取っていきましょう。 (List 2-4)ではアドレステーブルを宣言しています。ここには接続されている入力機器のアドレスを指定します。また、アドレステーブルへの終端には必ず-1を設定します この場合、入力機器がHP34401Aの1つで入力機器アドレスが22のため INT gnDevAdrsTbl[2] = {22,-1} とします。 入力機器を2台以上接続する場合 この場合、アドレステーブルの記述に関して以下の2つの方法が考えられます。 ① アドレステーブルに入力機器アドレスを追加する。 ② アドレステーブル自体を各入力機器に対して用意する。 これらは複数の計測器をどのように使用するかによって決まります。複数の機器に対して送信だ

けを行うのであれば、①の方法を用います。 例えばint gnDevAdrsTbl[2] = {22,10,5,-1}等と記述します。 これで入力機器アドレス22,10,5の3つの機器に対して同じコマンドが送信されます。 しかし、これらの機器から受信を行う場合、このように記述してしまうとアドレス22の機器からのみデータが受信されます。これを回避するには②の方法を用います。 すなわち、複数台の機器からデータ受信を行う場合には、複数回に分けて受信処理を実行する必

要があるわけです。

(List 2-5)では接続された機器に対してコマンドの送信を行っています。コマンドの送信にはPciGpibExMastSendData関数を使用します。 第2引数ですが、ここには入力機器のアドレステーブルへのポインタを指定します。 第5引数ですが、プログラムは同期処理を行いますのでWM_NULLを指定してください。 (List 2-6)では入力機器から送信コマンドに対するデータを取得します。指定されたバイト数および指定デリミタまでのデータを受信します。データの受信にはPciGpibExMastRecvData関数を使用します。

「使用例」 nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL);

I/Oモジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

入力機器アドレステーブルへのポインタを指定します。

非同期動作終了時にアプリケーションに通知されるメッセージを指定します。

送信データ領域へのポインタを指定します。

送信データ長を指定します。

Page 75: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 73 - Interface Corporation

「使用例」

nRet = PciGpibExMastRecvData(BoardNo, gnDevAdrsTbl, &nLen, RecvBuf, WM_NULL);

I/O モジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

非同期動作終了時にアプリケーションに通知されるメッセージを指定します。

受信バッファ領域へのポインタを指定します。

受信バッファサイズが格納されている変数へのポインタを指定します。

入力機器アドレステーブルへのポインタを指定します。

※1 受信バッファ領域(RecvBuf)は、実際に受信するデータ長+デリミタサイズ(CRLFならば2バイト,LFのみならば1バイト)以上の領域を確保する必要があります。

ここでは受信データを格納するバッファはローカル変数で宣言しています。

非同期で処理をする場合 非同期処理の場合は受信データを格納するバッファはグローバル変数で宣言するようにしてくだ

さい。この理由としては、この領域をローカル変数で宣言してしまうとスタック領域に受信デー

タを格納するバッファが用意されることになります。非同期処理の場合で説明したとおり、その

関数からの転送結果を待つことなく、次の処理を行うことができます。つまり、

PciGpibExMastRecvData関数の処理の終了を待たずOnRecv関数が終了する可能性があります。よって、OnRecv関数の実行が終了した時点で領域が開放されデータが受信できなくなります。

※2 受信バッファサイズ(nLen)には、PciGpibExMastRecvData関数呼び出し前に、受信バッファ領域のサイズを格納しておく必要があります。

Page 76: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 74 -

5.2 データ送受信(非コントローラモード)

次に非コントローラモードでデータ送受信を行うプログラムを作成します。 『26ページ 第4章 チュートリアル(高機能版ActiveXコントロール)』の図「チュートリアルでの接続例」に示したように2枚のGP-IB I/Oモジュールをコントローラ,非コントローラとして使用します。これにより2台のPCでデータの送受信が可能になります。 Visual C++を起動し新しいプロジェクト(プロジェクト名:GpibTrans_s_Dll)を作成し、環境設定まで行います。(『61ページ 5.1 データ送受信(コントローラモード)』のStep1,Step2を参照してください) 1. OnCreate関数を追加し、OnCreate関数,OnDestroy関数にコードを記述します。

OnCreate関数には(List 2-7)を記述し、OnDestroy関数には(List 2-8)を記述します。(『61ページ 5.1 データ送受信(コントローラモード)』のStep3を参照)

(List 2-7:CGpibTrans_s_DllDlgクラスのOnCreate関数のコード)

int CGpibTrans_m_DllDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;

INT nRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ

//I/Oモジュールアクセス番号BoardNoのI/Oモジュールを初期化 nRet = PciGpibExInitBoard(BoardNo, 0); if (nRet != GP-IB_SUCCESS) { szErrMsg.Format("I/Oモジュールアクセス番号%dのI/Oモジュールが初期化できません(%d)",BoardNo,nRet);

MessageBox(szErrMsg,"実行エラー",MB_ICONERROR); exit(0); // プログラム終了

} return 0; }

2. 同様に、「OnDestroy」をダブルクリックし、OnDestroy関数に(List 2-8)の網掛け部分を追加します。

(List 2-8:CGpibTrans_s_DllDlgクラスのOnDestory関数のコード) void CGpibTrans_m_DllDlg::OnDestroy() { CDialog::OnDestroy();

INT nRet; // 関数の戻り値 CString szErrMsg; // エラーメッセージ

// I/Oモジュールアクセス番号BoardNoのI/Oモジュールを使用終了 nRet = PciGpibExFinishBoard(BoardNo); if(nRet != GP-IB_SUCCESS) {

szErrMsg.Format("I/Oモジュールの終了に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR);

} }

Page 77: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 75 - Interface Corporation

データ送受信(非コントローラモード)用のダイアログボックスを作成します。基本的にデータ送受信(コントローラモード)と変わりはありません。変更点は以下の2点です。『61ページ 5.1 データ送受信(コントローラモード))』のStep4を参照に行ってください。 (変更点)

コントローラモード 非コントローラモード プロジェクト名 GpibTrans_m_Dll GpibTrans_s_ Dll クラス名 CGpibTrans_m_ Dll CGpibTrans_s_ Dll

1. 作成したOnSend関数,OnRecv関数にそれぞれ(List 2-9),(List 2-10)の網掛け部分を記述します。 (List 2-9:CGpibTrans_s_ Dll クラスのOnSend関数のコード)

void CGpibTrans_s_DllDlg::OnSend() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

INT nRet; // 関数の戻り値 char SendBuf[32]; // 送信データ Cstring szErrMsg; // エラーメッセージ

UpdateData(TRUE);

// データ送信 strcpy(SendBuf, m_szSendData); nRet = PciGpibExSlavSendData(BoardNo, strlen(SendBuf),SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS) {

szErrMsg.Format("データ送信に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR);

} }

(List 2-10:CGpibTrans_s_ Dll クラスのOnRecv関数のコード) void CGpibTrans_s_ActvXDlg::OnRecv() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

INT nRet; // 関数の戻り値 ULONG nLen; // 受信サイズ CString szErrMsg; // エラーメッセージ

UpdateData(TRUE);

nLen = sizeof(RecvBuf); if(!nLen){

AfxMessageBox("受信データはありません"); } else{ //データ受信

nRet = PciGpibExSlavRecvData(BoardNo, &nLen, RecvBuf, WM_NULL); if(nRet != GP-IB_SUCCESS) {

szErrMsg.Format("データ受信に失敗しました(%d)",nRet); MessageBox(szErrMsg,"実行エラー",MB_ICONERROR);

} else {

m_szRecvData = RecvBuf; UpdateData(FALSE);

} }

}

では、コントローラモードと非コントローラモードの設定を以下のように行い、送受信を行って

みます。

Page 78: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 76 -

コントローラモード 非コントローラモード

(1)動作モードをMASTERに設定(2)1次アドレスは 0に設定(3)送信デリミタを EOIに設定(4)受信デリミタを EOIに設定

(5)動作モードを SLAVEに設定(6)1次アドレスは 22に設定(7)送信デリミタを EOIに設定(8)受信デリミタを EOIに設定

コントロールパネルの「InterfacePCIGPIB」の設定

(1)

(2)

(3)

(4) (5)

(6)

(7)

(8)

非コントローラモードの場合は相手は計測器でなくGP-IB I/Oモジュールになります。計測器は機器固有のアドレスを持っていますが、GP-IB I/Oモジュールにも固有のアドレスを与えてやらなければなりません。 このアドレスは自由に決めてもよいのでこの場合22を指定しています。このアドレスを変更する場合はコントロールパネルの「InterfacePCI/CardBus GP-IB」の設定の変更はもちろんですが、コントロール側のプログラムも変更が必要です。(List2-4)のアドレステーブルの値も変更したアドレスを指定してください。 ただし、複数枚でデータ送受信を行う場合は各I/Oモジュールに重複しないアドレスを指定してください。 ではプログラムを保存して実行してみてください。『74ページ 5.2 データ送受信(非コントローラモード)』のデータ送受信と同様にコントロール側と非コントロール側でデータの送受信が行えると思います。 では入力したプログラムを読み取ってみましょう。 (List2-9)では非コントロール側からのデータ送信を行っています。データの送信にはPciGpibExSlavSendData関数を使用します。

「使用例」

nRet = PciGpibExSlavSendData(BoardNo, strlen(SendBuf), SendBuf, WM_NULL);

I/O モジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

非同期動作終了時にアプリケーションに通知されるメッセージを指定します。

送信データ領域へのポインタを指定します。

送信データ長を指定します。

PciGpibExMastSendDataとの違いは、入力機器アドレスの指定を行う必要がないことです。

Page 79: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 77 - Interface Corporation

(List 2-10)ではコントローラ側からのデータの受信を行います。 データの受信にはPciGpibExSlavRecvData関数を使用します。

「使用例」

nRet = PciGpibExSlavRecvData(BoardNo, &nLen, RecvBuf, WM_NULL);

I/O モジュールアクセス番号を指定します。

関数が失敗するとエラーコードが格納されます。

非同期動作終了時にアプリケーションに通知されるメッセージを指定します。

受信バッファサイズが格納されている変数へのポインタを指定します。

受信バッファ領域へのポインタを指定します。

※1 受信バッファ領域(RecvBuf)は、実際に受信するデータ長+デリミタサイズ(CRLFなら ば2バイト,LFのみならば1バイト)以上の領域を確保する必要があります。

※2 受信バッファサイズ(nLen)にはPciGpibExSlavRecvData関数を呼び出す前に受信バッファ領域のサイズを格納しておく必要があります。

ここまでがDLLによるデータ送受信(非コントロールモード)のプログラム例です。

Page 80: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 78 -

5.3 SRQ割り込みとポーリング処理

ここでは、DLL関数を使用して、GP-IB機器からのSRQ信号を確認してシリアル・ポーリングを行うプログラムの作成を行います。このDLL編では『52ページ 4.4 SRQ割り込みとポーリング処理』に記載しております高機能版ActiveXコントロール編のソースコードをDLL関数呼び出しに置き換えることでチュートリアルを進めていきます。SRQ信号,シリアル・ポーリングについての説明は『52ページ 4.4 SRQ割り込みとポーリング処理』の高機能版ActiveXコントロール編を参照してください。 では、SRQ信号を確認し、シリアル・ポーリングを行うプログラムの作成を行います。 1. Visual C++を起動し新しいプロジェクトを作成します。 ・「ファイル」メニューより「新規作成」を選択して、「プロジェクト名」を“GpibSpDll”にし、データ送受信の時と同様にして「ダイアログベース」のプロジェクトを作成します。 ・プロジェクトを作成してから初期化までの手順は、『61ページ 5.1 データ送受信(コントローラモード)』のStep1~Step3を参照してください。

2. SRQ信号の設定を行うためのダイアログボックスの設定を行います。 ・ResourceViewを表示し、「Dialog」フォルダを展開して「IDD_GP-IBSPDLL_DIALOG」をダブルクリックします。 ・表示されたダイアログボックスから必要のないボタン,スタティックテキストを削除します。「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択して、Deleteキーを押してください。 ・コントロールから「ボタン」を選択し、ダイアログに貼り付けます。 ・配置した「ボタン」のプロパティを表示させ、以下のように設定します。

ID IDC_SPOLL キャプション SP実行

※ ボタンの配置場所は「SRQ割り込みとポーリング処理(高機能版ActiveXコントロール編)」と同じとなりますので、高機能版ActiveXコントロール編のダイアログボックスの設定を参照してください。

3. シリアル・ポーリングを行う関数の作成を行います。 ・先程ダイアログに貼り付けたボタンにカーソルを合わせ、右クリック→「ClassWizard」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト GpibSpDll クラス名 CGpibSpDllDlg オブジェクト IDC_SPOLL メッセージ BN_CLICKED

Page 81: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 79 - Interface Corporation

・メンバ変数名を決定するダイアログボックスが表示されますので、“OnSpoll”になっていることを確認して「OK」をクリックします。

・そのまま「コード編集」ボタンをクリックして、“OnSpoll”関数を実装します。以下のようにコード(List 2-11)を記述してください。

(List 2-11:CGpibSpDllDlgクラスのOnSpoll関数のコード) void CGpibSpDllDlg::OnSpoll() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nStbTbl[2]; // ステータス・バイト格納テーブル INT nStbAdrs[2]; // SRQ送出機器アドレス格納テーブル INT nSrqRet; // SRQ割り込み確認の実行結果 INT nSpRet; // シリアルポールの実行結果 INT lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 char SpStatus[256]; // シリアル・ポーリングステータス CString szErrMsg; // エラーメッセージ //-------------------------------------------------------------------------------------------------- // シリアルポーリングを行います // SRQ割り込みの確認を行います while(lLoop < 10000){ // SRQ信号の有無を確認します nSrqRet = PciGpibExCheckSrq(BoardNo); // SRQ信号が有効になった場合ループを抜けます if(nSrqRet == GP-IB_SUCCESS) break; lLoop++; } switch(nSrqRet){ case GP-IB_SUCCESS_ACTIVE_SRQ: // SRQ信号が有効な場合の処理 // シリアル・ポーリングを実行します nSpRet = PciGpibExExecSpoll(BoardNo, gnDevAdrsTbl, nStbTbl, nStbAdrs); if(nSpRet != GP-IB_SUCCESS){ szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", nSpRet); MessageBox(szErrMsg, "ポーリングエラー", MB_ICONERROR); } else{ // シリアルポールで得たステータスバイトデータをエディットボックスに表示します sprintf(SpStatus, "%Xh", nStbTbl[0]); MessageBox(SpStatus, "ステータス・バイト", MB_ICONINFORMATION); } break; case GP-IB_SUCCESS_NOT_ACTIVE_SRQ: // SRQ信号が無効な場合の処理 MessageBox("SRQ信号は無効です","SRQ信号無効エラー", MB_ICONERROR); break; default: // エラーが発生した場合の処理 szErrMsg.Format("エラーが発生しました(%d)", nSrqRet); MessageBox(szErrMsg,"SRQ信号確認エラー", MB_ICONERROR); break; } }

以上でSRQ割り込みとポーリング処理のプログラムは完成です。プログラムを実行後、機器からSRQが発行された時に、「SP実行」ボタンをクリックすると、接続された機器に対しSRQ信号確認後シリアル・ポーリングを行います。そして、得られたステータス・バイトをメッセージボッ

クスに表示します。

Page 82: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 80 -

次に、実際にシリアル・ポーリングを行うために、機器からSRQを発行させる機能,SRQ信号をクリアするコードを追加してみましょう。

4. SRQの発行とクリアの機能を追加します。 先程実装したメンバ関数“OnSpoll”に、(List 2-12)の網掛け部分を追加してください。

(List 2-12:CGpibSpDllクラスのOnSpoll関数(変更後)のコード) void CGpibSpDllDlg::OnSpoll() {

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の実行結果 INT nStbTbl[2]; // ステータス・バイト格納テーブル INT nStbAdrs[2]; // SRQ送出機器アドレス格納テーブル INT nSrqRet; // SRQ割り込み確認の実行結果 INT nSpRet; // シリアルポールの実行結果 INT lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 char SpStatus[256]; // シリアル・ポーリングステータス char SendBuf[32]; // 送信コマンドを格納する変数 CString szErrMsg; // エラーメッセージ //-------------------------------------------------------------------------------------------------- // SRQ信号の発行を行います // スタンダード・イベント・レジスタのBit0に1を立て、オペレーション完了をイネーブルにします sprintf(SendBuf,"*ESE 1"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("データ送信に失敗しました(%d)", nRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR); } // ステータス・バイト・サマリ・レジスタのBit5に1を立て、 //スタンダード・イベントをイネーブルにします sprintf(SendBuf,"*SRE 32"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("データ送信に失敗しました(%d)", nRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR); } // *OPCコマンドを実行してオペレーション完了を知らせます sprintf(SendBuf,"*OPC"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("データ送信に失敗しました(%d)", nRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR); } //-------------------------------------------------------------------------------------------------- // シリアルポーリングを行います // SRQ割り込みの確認を行います while(lLoop < 10000){ // SRQ信号の有無を確認します nSrqRet = PciGpibExCheckSrq(BoardNo); // SRQ信号が有効になった場合ループを抜けます if(nSrqRet == GP-IB_SUCCESS) break; lLoop++; }

Page 83: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 81 - Interface Corporation

switch(nSrqRet){ case GP-IB_SUCCESS_ACTIVE_SRQ: // SRQ信号が有効な場合の処理 // シリアル・ポーリングを実行します nSpRet = PciGpibExExecSpoll(BoardNo, gnDevAdrsTbl, nStbTbl, nStbAdrs); if(nSpRet != GP-IB_SUCCESS){ szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", nSpRet); MessageBox(szErrMsg, "ポーリングエラー", MB_ICONERROR); } else{ // シリアルポールで得たステータスバイトデータをエディットボックスに表示します sprintf(SpStatus, "%Xh", nStbTbl[0]); MessageBox(SpStatus, "ステータス・バイト", MB_ICONINFORMATION); } break; case GP-IB_SUCCESS_NOT_ACTIVE_SRQ: // SRQ信号が無効な場合の処理 MessageBox("SRQ信号は無効です","SRQ信号無効エラー", MB_ICONERROR); break; default: // エラーが発生した場合の処理 szErrMsg.Format("エラーが発生しました(%d)", nSrqRet); MessageBox(szErrMsg,"SRQ信号確認エラー", MB_ICONERROR); break; } //-------------------------------------------------------------------------------------------------- // SRQ信号のクリアを行います // GP-IB機器のレジスタをクリアします sprintf(SendBuf,"*CLS"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("レジスタクリアに失敗しました(%d)", nRet); MessageBox(szErrMsg, "レジスタクリアエラー", MB_ICONERROR); } // SRQ信号をクリアします(PCI-4301では必要ありません) nRet = PciGpibExClearSrq(BoardNo); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("SRQクリアに失敗しました(%d)", nRet); MessageBox(szErrMsg, "SRQクリアエラー", MB_ICONERROR); }

}

それではプログラムを実行してみましょう。まず、機器に電源が入っていることを確認してくだ

さい。「SP実行」ボタンを押すと、以下のようにメッセージボックスが出現し、“60h”(16進数で60)というステータス・バイトが表示されました。

SRQの発行,クリア,ステータス・バイトに関しては機器によって異なります。詳しくはご使用の機器のマニュアルを参照してください。

Page 84: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 82 -

5.4 SRQイベント

実際のシステムでは接続機器からSRQ割り込みがいつ発生するか分かりません。先程のプログラムでは、SRQの確認をループさせて検知を行いました。高機能版DLLの関数を使用することで、SRQ割り込みをイベントとしてとらえることができます。ここでは、DLL関数を使用してSRQイベントをコールバック関数に登録し、SRQイベントが発生した際に自動的にシリアル・ポーリングを行う手順について掲載します。

1. Visual C++を起動し新しいプロジェクトを作成します。 ・「ファイル」メニューより「新規作成」を選択して、「プロジェクト名」を“GpibEventDll”にし、データ送受信の時と同様にして「ダイアログベース」のプロジェクトを作成します。 ・プロジェクトを作成してから初期化までの手順は、『61ページ 5.1 データ送受信(コントローラモード)』のStep1~Step3を参照してください。

2. SRQイベントの設定と終了処理を行います。 ・ClassViewを表示し、「GpibEventDllDlg」フォルダを展開してOnCreateをダブルクリックして開きます。

・OnCreate関数に(List 2-13)の網掛けの部分を記述してください。

(List 2-13:CGpibSrqDllDlgクラスのOnCreate関数の追加コード) //デバイスクリアの実行 nRet = PciGpibExExecDevClear(BoardNo); if (nRet != GP-IB_SUCCESS) { szErrMsg.Format("デバイスクリアに失敗しました(%d)", nRet); MessageBox(szErrMsg, "実行エラー", MB_ICONERROR); exit(0); //プログラム終了 } // コールバック関数の設定 nRet = PciGpibExSetSrqEvent(BoardNo, (PLPSRQCALLBACK)lpOnSrqProc, 0); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("コールバック関数の設定に失敗しました(%d)", nRet); MessageBox(szErrMsg, "関数設定エラー", MB_ICONERROR); } return 0;

Page 85: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 83 - Interface Corporation

・同様にしてOnDestroy関数を開き、(List 2-14)の網掛けの部分を記述してください。

(List 2-14:CGpibEventDllDlgクラスのOnCreate関数の追加コード) // TODO: この位置にメッセージ ハンドラ用のコードを追加してください INT nRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ // コールバックイベントの解除を行います nRet = PciGpibExKillSrqEvent(BoardNo); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("イベントの解除に失敗しました(%d)", nRet); MessageBox(szErrMsg, "コールバック解除エラー", MB_ICONERROR); } // I/Oモジュールの終了処理をします nRet = PciGpibExFinishBoard(BoardNo); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("I/Oモジュールアクセス番号%dのI/Oモジュールの終了処理に失敗しました(%d)",BoardNo, nRet); MessageBox(szErrMsg, "クローズエラー", MB_ICONERROR); }

・GpibEventDllDlg.cppを開き、先頭部分に(List 2-15)の網掛けの部分を記述してください。 (List 2-15:GpibEventDllDlg.cppの追加コード)

// GpibEventDllDlg.cpp : インプリメンテーション ファイル // #include "stdafx.h" #include "GpibEventDll.h" #include "GpibEventDllDlg.h" #include "gpc4304.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define BoardNo 0 // I/Oモジュールアクセス番号 INT gnDevAdrsTbl[2] = {22,-1}; // 入力機器アドレステーブル void CALLBACK lpOnSrqProc(int, DWORD );// SRQ信号によるコールバック関数

3. SRQイベントの開始を行うためのボタンの設定を行います。 ・ResourceViewを表示し、「Dialog」フォルダを展開して「IDD_GP-IBEVENTDLL_DIALOG」をダブルクリックします。 表示されたダイアログボックスから必要のないボタン,スタティックテキストを削除します。 ・「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択して、Deleteキーを押してください。 ・コントロールから「ボタン」を選択し、ダイアログに貼り付けます。 ・配置した「ボタン」のプロパティを表示させ、以下のように設定します。

ID IDC_ACTION キャプション 実行開始

Page 86: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 84 -

4. SRQイベントの実装を行います。 ・先程ダイアログボックスに貼り付けたボタンにカーソルを合わせ、右クリック→「ClassWizard」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト GpibEventDll クラス名 CGpibEventDllDlg オブジェクト IDC_ACTION メッセージ BN_CLICKED

・メンバ変数名を決定するダイアログボックスが表示されますので、“OnAction”になっていることを確認して「OK」をクリックします。 ・そのまま「コード編集」ボタンをクリックして、“OnAction”関数を実装します。以下のようにコード(List 2-16)を記述してください。

(List 2-16:CGpibEventDllDlgクラスのOnAction関数の追加コード) void CGpibEventDllDlg::OnAction() {

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の実行結果 char SendBuf[32]; // 送信コマンドを格納する変数 CString szErrMsg; // エラーメッセージ //-------------------------------------------------------------------------------------------------- // SRQ信号の発行を行います // スタンダード・イベント・レジスタのBit0に1を立て、オペレーション完了をイネーブルにします sprintf(SendBuf,"*ESE 1"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("データ送信に失敗しました(%d)", nRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR); } // ステータス・バイト・サマリ・レジスタのBit5に1を立て、 // スタンダード・イベントをイネーブルにします sprintf(SendBuf,"*SRE 32"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){

szErrMsg.Format("データ送信に失敗しました(%d)", nRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} // *OPCコマンドを実行してオペレーション完了を知らせます sprintf(SendBuf,"*OPC"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){

szErrMsg.Format("データ送信に失敗しました(%d)", nRet); MessageBox(szErrMsg, "送信エラー", MB_ICONERROR);

} }

5. コールバック関数の実装を行います。 先程編集したGpibSrqDllDlg.cppを開き、最後の部分に(List 2-17)の関数を記述します。

Page 87: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 85 - Interface Corporation

(List 2-17:GpibSrqDllDlg.cppのコールバック関数のコード) void CALLBACK lpOnSrqProc(int nBoardNo, DWORD dwUser) { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の実行結果 INT nStbTbl[2]; // ステータス・バイト格納テーブル INT nStbAdrs[2]; // SRQ送出機器アドレス格納テーブル INT nSrqRet; // SRQ割り込み確認の実行結果 INT nSpRet; // シリアルポールの実行結果 char SpStatus[256]; // シリアル・ポーリングステータス char SendBuf[32]; // 送信コマンドを格納する変数 CString szErrMsg; // エラーメッセージ // コールバックイベントで使用するメッセージボックス //AfxMessageBox("SRQ信号が発生しました"); //-------------------------------------------------------------------------------------------------- // シリアルポーリングを行います // SRQ信号の有無を確認します nSrqRet = PciGpibExCheckSrq(BoardNo); switch(nSrqRet){ case GP-IB_SUCCESS_ACTIVE_SRQ: // SRQ信号が有効な場合の処理 // シリアル・ポーリングを実行します nSpRet = PciGpibExExecSpoll(BoardNo, gnDevAdrsTbl, nStbTbl, nStbAdrs); if(nSpRet != GP-IB_SUCCESS){ szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", nSpRet); AfxMessageBox("ポーリングエラー"); } else{ // シリアルポールで得たステータスバイトデータをエディットボックスに表示します sprintf(SpStatus, "%Xh", nStbTbl[0]); AfxMessageBox(SpStatus); } break; case GP-IB_SUCCESS_NOT_ACTIVE_SRQ: // SRQ信号が無効な場合の処理 AfxMessageBox("SRQ信号無効エラー"); break; default: // エラーが発生した場合の処理 szErrMsg.Format("エラーが発生しました(%d)", nSrqRet); AfxMessageBox("SRQ信号確認エラー"); break; } //-------------------------------------------------------------------------------------------------- // SRQ信号のクリアを行います // GP-IB機器のレジスタをクリアします sprintf(SendBuf,"*CLS"); nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM_NULL); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("レジスタクリアに失敗しました(%d)", nRet); AfxMessageBox("レジスタクリアエラー"); } // SRQ信号をクリアします(PCI-4301では必要ありません) nRet = PciGpibExClearSrq(BoardNo); if(nRet != GP-IB_SUCCESS){ szErrMsg.Format("SRQクリアに失敗しました(%d)", nRet); AfxMessageBox("SRQクリアエラー"); } }

Page 88: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 86 -

以上でSRQ割り込みによるコールバックイベントのプログラムが完成です。セーブをした後で、機器の電源が入っていることを確認してプログラムを実行してください。「実行開始」ボタンを

押すと、SRQイベントが発行されてコールバック関数が呼び出されて、メッセージボックスが表示されます。(表示画面については『26ページ 第4章 チュートリアル(高機能版ActiveXコントロール)』のSRQイベントと同じとなりますので、そちらを参照してください。) では、これより使用したDLL関数についての説明をしていきます。 List 2-11では、PciGpibExCheckSrq関数を使用してSRQ信号の確認を行い、SRQ信号の有効・無効の判定を行っています。また、SRQ信号が有効であった場合に、PciGpibExExecSpoll関数を使用して機器に対してシリアル・ポーリングを行っています。このシリアル・ポーリングで接続された

機器の状態を順番に調べて行き、SRQ信号を発行した機器を特定して、その機器のステータス・バイト・レジスタの値を用意した変数に取得しています。

「使用例」

nRet = PciGpibExCheckSrq(BoardNo);

関数が失敗するとエラーコードが格納されます。

SRQの確認を行う I/Oモジュールのアドレス番号を指定します。

「使用例」

nRet = PciGpibExExecSpoll(BoardNo, gnDevAdrsTbl, nStbTbl, nStbAdrs);

関数が失敗するとエラーコードが格納されます。

シリアル・ポールを行うボードのアドレス番号を指定します。

シリアル・ポールを行う機器のアドレステーブルへの

ポインタを指定します。

シリアル・ポーリングを行い受信した各機器の有効なステータス・バイ

トを格納するテーブルへのポインタを指定します。

SRQを送出し、有効なステータス・バイトを持っていた各機器のアド

レスを格納するテーブルへのポインタを指定します。

List 2-12では、PciGpibExMastSendData関数を使用して接続された機器にコマンドを送信して、SRQ信号の設定を行っています。ここでは、オペレーションの完了によりSRQ信号を発行するようにしています。実際に使用する機器でSRQイベントとして取得したい条件を設定してください。 List 2-13では、PciGpibExClearSrq関数を使用してSRQ信号の受信状態解除を行い、接続された機器にコマンドを送信してレジスタのクリアを行っています。このSRQ信号受信状態の解除とレジスタのクリアによりSRQ信号を再び有効にすることができます。

「使用例」

nRet = PciGpibExClearSrq(BoardNo);

関数が失敗するとエラーコードが格納されます。

SRQ 受信状態の解除を行う I/O モジュールのアドレス番

号を指定します。

Page 89: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 87 - Interface Corporation

List2-14~List2-17ではSRQ信号によるコールバックイベントの登録を行っています。PciGpibExSetSrqEvent関数によって、コールバックイベントへのポインタを登録することで、SRQ信号が発生した際に登録したイベントを実行することができます。また、PciGpibExKillSrqEvent関数を使用することで設定したイベントの解除を行っています。このコールバックイベントのな

かで、前述したシリアル・ポーリング処理を行うことで、SRQ割り込みが発生した際に、自動的にSRQ信号を発生させた機器を調べる処理を行わせることが可能になります。

「使用例」

nRet = PciGpibExSetSrqEvent(BoardNo, (PLPSRQCALLBACK)lpOnSrqProc, dwUser);

関数が失敗するとエラーコードが格納されます。

コールバックイベントの設定を行う I/Oモジュールのアクセス番号を指定します。

コールバック関数のアドレスを指定します。

コールバック関数に渡す任意の 32 ビットデータを指定します。

「使用例」

nRet = PciGpibExKillSrqEvent(BoardNo);

関数が失敗するとエラーコードが格納されます。

SRQの解除を行う I/Oモジュールのアクセス

番号を指定します。

Page 90: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 88 -

第6章 GP-IBリファレンス

6.1 標準版ActiveXコントロールリファレンス

1. メソッド一覧 以下に標準版ActiveXコントロールのメソッド一覧表を示します。詳細についてはHelpを参照してください。

No メソッド名 機 能 1 object.Open 指定番号のI/Oモジュールをオープンします。 2 object.Setlfc 指定番号のI/OモジュールからIFC信号を送出し、I/Oモジュールを

コントローラとします。 3 object.SetRen 指定番号のI/OモジュールのRen信号を有効にします。 4 object.ExecDeviceTrigger 指定番号のI/Oモジュールからデバイストリガを実行します。 5 object.ExecDeviceClear 指定番号のI/Oモジュールからデバイスクリアを実行します。 6 object.CheckSrq 指定番号のI/OモジュールがSRQ信号を受信しているかを確認し

ます。 7 object.ExecSpoll 指定番号のI/Oモジュールからシリアルポーリングを実行します。8 object.Receive 指定番号のI/Oモジュールへの計測器からデータを受信します。9 object.GetData 受信したデータを取得します。 10 object.Send 指定番号から計測機器に対して送信を行ないます。 11 object.Close 指定番号のI/Oモジュールをクローズします。

2. プロパティ一覧 以下に標準版ActiveXコントロールのプロパティ一覧表を示します。詳細についてはHelpを参照してください。

No プロパティ名 機 能 データ型 動 作 1 object.BoardNo プロパティを参照/設定する

I/Oモジュール番号 Long 参照/設定

2 object.TransferTimeOut データ転送タイムアウト Long 参照/設定 3 object.StbRecvTimeOut Stb受信タイムアウト Long 参照/設定 4 object.SendDelimiter 送信デリミタ Long 参照/設定 5 object.RecvDelimiter 受信デリミタ Long 参照/設定 6 object.MyAddress マイアドレス Long 参照/設定 7 object.SecondaryAddress 2次アドレス Long 参照/設定 8 object.SendBufferSize 送信バッファサイズ Long 参照/設定 9 object.RecvBufferSize 受信バッファサイズ Long 参照/設定 10 object.DeviceAddress GP-IB機器アドレス Long 参照/設定 11 object.Device2ndAddress GP-IB機器2次アドレス Long 参照/設定 12 object.SrqFlag SRQ受信 有効/無効フラグ Bool 参照 13 object.StatusByte シリアルポーリング受信ステータス

バイト Long 参照

14 object.Result メソッド実行結果 Long 参照 15 object.SetSrqFlag SRQ受信 有効/無効フラグ強制設定 Bool 設定 16 object.DataTransferMode データ転送モード設定 Long 設定 17 object.NrfdBusLineWait GP-IBバス NRFD信号ライン待ち

設定 Long 設定

Page 91: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 89 - Interface Corporation

3. イベント一覧 以下に標準版ActiveXコントロールのイベント一覧表を示します。詳細についてはHelpを参照してください。 No イベント名 機 能 1 object.ReceiveFinish データ受信が完了すると発生するイベント 2 object.SendFinish データ送信が完了すると発生するイベント 3 object.ErrorEvent 各コマンド/データ転送エラー検出時に発生するイベント

4. 戻り値一覧 以下に標準版ActiveXコントロールのメソッド戻り値を示します。詳細についてはHelpを参照してください。

識別子 戻り値 正常終了 GP-IB_SUCCESS 0 正常終了 GP-IB_ERROR_ILLEGAL_BOARDNO -1 I/Oモジュールアクセス番号が違います。

・コントロールパネルで指定されたI/Oモジュールアクセス番号以外のI/Oモジュールを指定しました。 ・すでに初期化済のI/Oモジュールに対して再初期化を行おうとしました。 ・または初期化が行われていないI/Oモジュールに対して制御を行おうとしました。 ・0~15以外の番号を指定しました。

GP-IB_ERROR_ILLEGAL_INP_ PARAM

-2 入力パラメータに間違いがあります。

GP-IB_ERROR_ILLEGAL_PARAM_ NO

-3 パラメータ番号に間違いがあります。 ・パラメータ番号の値、範囲を確認してください。

GP-IB_ERROR_NOT_USE_SLAVE -4 スレーブモードでは使用できません。 ・スレーブモードにおいて、マスタモードでのみ使用可能な関数を呼び出しました。

GP-IB_ERROR_CMD_TMO -7 バスコマンドの送出に失敗しました。 ・マスタモードにおいて、バスコマンドの送出に失敗しました。以下の要因が考えられます。 ・マスタモードにおいて、SetIfcメソッドを実行していない。・現在、他の機器および非同期入出力中により、GP-IBバスが占有状態である場合 ・スレーブモードにおいて、バスコマンドを送出する関数を実行した場合 ・他のアプリケーションの負荷が重く、バスコマンド送出タイムアウトが発生した場合(この場合、コントロールパネルでタイムアウト時間を増やすようにしてください。)

GP-IB_ERROR_ACTIVE_SRQ -9 シリアル・ポーリングにも関わらずSRQ送出元を検出できませんでした。

GP-IB_ERROR_STB_TMO -10 STB受信時にタイムアウトが発生しました。 ・機器からのステータス・バイトが指定した時間内に受信できませんでした。 ・コントロールパネルの設定「STB応答時間」を増やす必要があります。

GP-IB_ERROR_NOT_ACTIVE_STB -11 有効なステータス・バイトが取得できませんでした。 ・RQSビット(bit6)=1のステータス・バイトが受信できませんでした。

Page 92: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 90 -

識別子 戻り値 正常終了

GP-IB_ERROR_DATA_RECV -12 データ受信に失敗しました。 ・データ受信処理に失敗しました。以下の要因が考えられます。・他の機器もしくは非同期転送中により、GP-IBバスが占有中である場合

GP-IB_ERROR_DATA_SEND -13 データ送信に失敗しました。 ・データ送信処理に失敗しました。以下の要因が考えられます。送信したデータが受信されなかった(この場合、ケーブル接続、全ての機器の電源が入っているか、ケーブル長はGP-IBの規格を守っているか等を確認してください。

・他の機器もしくは非同期転送中により、GP-IBバスが占有中である場合

GP-IB_ERROR_TRANS_TMO -14 タイムアウトが発生しました。 ・送受信時に指定時間内にデータ転送が終了しませんでした。以下の要因が考えられます。 ・指定したデータ長に対するデータ転送時間がタイムアウト時間より長い場合(この場合は送受信タイムアウト時間を長くする必要があります。) ・送受信中に機器からの応答が何らかの要因でなくなった場合

GP-IB_ERROR_NOT_ALLOC_ PAGE

-995 I/Oモジュールの使用終了ができませんでした。 ・以下の要因が考えられます。 ・割り込みの制御に失敗しました(このエラーが発生した場合、

Windowsのシステムに問題があります。リソースの競合がないか確認してください。)。

GP-IB_ERROR_NOT_BOARD -996 ドライバ側のページの確保ができませんでした。 ・以下の要因が考えられます。 ・空きメモリが極端に少ない。 ・ハードディスクの空き容量が極端に少ない場合(1MB以下等)・他に動作しているプロセスが多く存在する。 ・本エラーが発生する場合は、一度に要求するデータサイズを少なくしていくか、もしくはメモリの増設をお勧めします。

GP-IB_ERROR_NOT_BOARD -999 I/Oモジュールが存在しません。 ・以下の要因が考えられます。 ・I/Oモジュール自体に異常がある場合

Page 93: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 91 - Interface Corporation

6.2 標準版DLLリファレンス

1. 標準版DLL関数 以下に標準版DLL関数の一覧表を示します。 No 関 数 名 機 能 1 GpibOpen 指定番号のI/Oモジュールをオープンします。 2 GpibSetIfc 指定番号のI/OモジュールからIFC信号を送出し、I/Oモジュールをコントロー

ラとします。 3 GpibSetRen 指定番号のI/OモジュールのREN信号を有効にします。 4 GpibSetConfig 指定番号のI/Oモジュールのタイムアウト時間,デリミタ設定を変更します。5 GpibExecDeviceTrigger 指定番号のI/Oモジュールからデバイストリガを実行します。 6 GpibExecDeviceClear 指定番号のI/Oモジュールからデバイスクリアを実行します。 7 GpibCheckSrq 指定番号のI/OモジュールがSRQ信号を受信しているかを確認します。 8 GpibExecSpoll 指定番号のI/Oモジュールからシリアルポーリングを実行します。 9 GpibReceive 指定番号のI/Oモジュールにて計測機器から受信を行います。 10 GpibSend 指定番号のI/Oモジュールから計測機器に対して送信を行います。 11 GpibClose 指定番号のI/Oモジュールをクローズします。 12 GpibSetSrqEvent 指定番号のI/OモジュールからのSRQコールバックイベントを登録します。13 GpibWaitSrqEvent 指定番号のI/OモジュールからのSRQコールバックイベントを待ちます。 14 GpibKillSrqEvent 指定番号のI/OモジュールからのSRQコールバックイベント登録を解除しま

す。

2. エラーコード一覧 以下に標準版DLL関数のエラーコードを示します。

エラーコード 値 内 容 GP-IB_SUCCESS 0 正常終了 GP-IB_ERROR_ILLEGAL_BOARDNO -1 I/Oモジュールアクセス番号が違います。 GP-IB_ERROR_ILLEGAL_INP_PARAM -2 入力パラメータに間違いがあります。 GP-IB_ERROR_ILLEGAL_PARAM_NO -3 パラメータ番号に間違いがあります。 GP-IB_ERROR_WRITE_BUS_ COMMAND

-7 バスコマンドの送出に失敗しました。

GP-IB_ERROR_ACTIVE_SRQ -9 シリアル・ポーリングにも関わらずSRQ送出元を検出できませんでした。

GP-IB_ERROR_STB_TMO -10 STB受信時にタイムアウトが発生しました。 GP-IB_ERROR_NOT_ACTIVE_STB -11 有効なステータス・バイトが取得できませんでした。GP-IB_ERROR_DATA_RECV -12 データ受信に失敗しました。 GP-IB_ERROR_DATA_SEND -13 データ送信に失敗しました。 GP-IB_ERROR_TRANS_TMO -14 タイムアウトが発生しました。 GP-IB_ERROR_NOW_BUS_OCCUPATION -20 現在バスが占有状態となっています。 GP-IB_ERROR_SET_CALLBACK_ EVENT

-40 コールバックイベントの登録に失敗しました。

GP-IB_ERROR_KILL_CALLBACK_ EVENT

-41 コールバックイベントの登録解除に失敗しました。

GP-IB_ERROR_WAIT_OBJECT_SIGNAL -42 イベントオブジェクトが有効(シグナル状態)です。 GP-IB_ERROR_WAIT_OBJECT_TMO -43 指定した時間内にイベントオブジェクトがシグナル

状態にならなかったため、タイムアウトしました。 GP-IB_ERROR_WAIT_OBJECT_FAILED -44 イベントオブジェクト待ちにてエラーが発生しまし

た。 GP-IB_ERROR_NOT_SET_CALLBACK_ EVENT

-45 コールバックイベントがまだ登録されていません。

Page 94: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 92 -

エラーコード 値 内 容

GP-IB_ERROR_NOT_CREATE_EVENT -992 イベント作成ができませんでした。 GP-IB_ERROR_NOT_CREATE_THREAD -993 スレッド作成ができませんでした。 GP-IB_ERROR_NOT_INIT_CALL -994 I/Oモジュールの初期化が行われていません。 GP-IB_ERROR_NOT_ALLOC_PAGE -995 I/Oモジュールの使用終了ができませんでした。 GP-IB_ERROR_NOT_BOARD -996 ドライバ側のページの確保ができませんでした。 GP-IB_ERROR_NOT_USE_TIMER -997 タイマ設定に失敗しました。 GP-IB_ERROR_NOT_USE_RESOURCE -998 割込みが使用できません。 GP-IB_ERROR_NOT_BOARD -999 I/Oモジュールが存在しません。 GP-IB_ERROR_SET_SEND_BUFFER -1000 送信バッファにデータをセットできませんでした。 GP-IB_ERROR_OVERFLOW_RECV_ BUFFER

-1001 受信バッファがオーバーフローしています。

GP-IB_ERROR_OUT_OF_USE_VAITYPE -1002 使用できない変数の型を指定しています。 GP-IB_ERROR_NO_RECEIVE_DATA -1003 受信バッファにデータがありません。

6.3 高機能版ActiveXコントロールリファレンス

1. メソッド一覧 以下に高機能版ActiveXコントロールの一覧表を示します。

No メソッド名 操作内容 コントローラ 非コントローラ 1 object.Open 指定番号のI/Oモジュールをオープンします。 ○ ○ 2 object.Close 指定番号のI/Oモジュールをクローズします。 ○ ○ 3 object.SetIfc 指定番号のI/OモジュールからIFC信号を送出しま

す。 ○ -

4 object.SetRen 指定番号のI/OモジュールREN信号を有効にします。 ○ -

5 object.SetDeviceRemote 指定番号のI/Oモジュールから機器をリモートモードに設定します。 ○ -

6 object.ExecDeviceTrigger 指定番号のI/Oモジュールからデバイストリガを実行します。 ○ -

7 object.ExecDeviceClear 指定番号のI/Oモジュールから全機器に対してデバイスクリアを実行します。 ○ -

8 object.ExecSelectDevClr 指定番号のI/Oモジュールから指定機器に対してデバイスクリアを実行します。 ○ -

9 object.SetDeviceLocal 指定番号のI/Oモジュールから機器をローカルモードに設定します。 ○ -

10 object.SetLocalLockout 指定番号のI/Oモジュールから機器をローカルロックアウトに設定します。

○ -

11 object.SetRemoteLockout 指定番号のI/Oモジュールから機器をリモートロックアウトに設定します。

○ -

12 object.ExecPassControl 指定番号のI/Oモジュールから機器に対してパス・コントロールを実行します。

○ -

13 object.SetSysController 指定番号のI/Oモジュールのシステムコントローラを要求または解除します。

○ -

14 object.GoStandby 指定番号のI/Oモジュールをコマンドモードからデータモードへ遷移させます。 ○ -

15 object.GoActiveController 指定番号のI/Oモジュールをデータモードから コマンドモードへ遷移させます。 ○ -

Page 95: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 93 - Interface Corporation

No メソッド名 操作内容 コントローラ 非コントローラ 16 object.ExecSpoll 指定番号のI/Oモジュールからシリアルポーリン

グを実行します。 ○ -

17 object.ExecPpoll 指定番号のI/Oモジュールからパラレルポーリングを実行します。 ○ -

18 object.ConfigPpoll 指定番号のI/Oモジュールから指定機器に対してパラレルポール応答条件を設定します。 ○ -

19 object.UnconfigPpoll 指定番号のI/Oモジュールから指定機器に対してパラレルポール応答条件を解除します。 ○ -

20 object.WriteBusCommand 指定番号のI/Oモジュールからバスコマンドの送出を行います。 ○ -

21 object.WaitSignal 指定番号のI/Oモジュールにて事象変化検出を待ちます。

○ ○

22 object.MasterSend 指定の計測機器へデータを送信します。 ○ - 23 object.SlaveSend データを送信します。 - ○ 24 object.MasterReceive 指定の計測機器からデータを受信します。 ○ - 25 object.SlaveReceive データを受信します。 - ○ 26 object.GetData 受信したデータを受信バッファより取得します。 ○ ○ 27 object.GetStatusCode 現在のバス・ステータスを取得します。 ○ ○ 28 object.SlaveSetSrq 指定番号のI/OモジュールからSRQ信号の送出を

行います。 - ○

29 object.SlaveSetIst 指定番号のI/Oモジュールに対してパラレルポール応答フラグ(リモートコンフィグレーション)を設定します。

- ○

30 object.SlaveSetPp2 指定番号のI/Oモジュールに対してパラレルポール応答フラグ(ローカルコンフィグレーション)を設定します。

- ○

31 object.ShowProperty プロパティページを開きます。 ○ ○

2. プロパティ一覧 以下に高機能板ActiveXコントロールのプロパティ一覧表を示します。

No プロパティ名 内 容 コントローラ 非コントローラ 1 object.BoardNo I/Oモジュールアクセス番号 ○ ○ 2 object.IsMaster マスター/スレーブ状態取得 ○ ○ 3 object.TransferTimeOut データ転送タイムアウト ○ ○ 4 object.StbRecvTimeOut STB受信タイムアウト ○ ○ 5 object.WaitSignalTimeOut 事象変化検出待ちタイムアウト ○ ○ 6 object.DeviceNameXx GP-IB機器識別名 ○ - 7 object.SendDelimiterXx 送信デリミタ ○ - 8 object.RecvDelimiterXx 受信デリミタ ○ - 9 object.SlaveSendDelimiter スレーブ用送信デリミタ - ○ 10 object.SlaveRecvDelimiter スレーブ用受信デリミタ - ○ 11 object.DeviceAddressXx GP-IB機器アドレス ○ - 12 object.Device2ndAddressXx GP-IB機器2次アドレス ○ - 13 object.MyAddress マイアドレス ○ ○ 14 object.SecondaryAddress 2次アドレス ○ ○ 15 object.SendBufferSize 送信バッファサイズ ○ ○ 16 object.RecvBufferSize 受信バッファサイズ ○ ○ 17 object.CheckSrq SRQ受信有効/無効フラグ ○ -

18 object.CheckStb シリアルポーリングされたか否かのフラグ

- ○

19 object.DataTransferMode データ入出力方式設定 ○ ○ 20 object.AsyncTransfer 同期/非同期データ転送設定 ○ ○ 21 object.NrfdBusLineWait GP-IBバスNRFD信号ライン待ち信号 ○ ○

Page 96: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 94 -

3. イベント一覧 以下に高機能ActiveXコントロールのイベント一覧表を示します。

No イベント名 内 容 コントローラ 非コントローラ 1 object.SrqEvent SRQ信号が有効になると呼び出されます。 ○ - 2 object.ReceiveFinish データ受信が完了すると呼び出されます。 ○ ○ 3 object.SendFinish データ送信が完了すると呼び出されます。 ○ ○

4 object.ErrorEvent 各コマンド/データ転送エラー検出時に呼び出されます。 ○ ○

4. 戻り値一覧 以下に高機能ActiveXコントロールのメソッド戻り値一覧表を示します。 戻り値 内 容 対処方法

7 ステータスバイトはコントローラへ通知済みです。

-

6 まだ、シリアルポーリングは実行されていません。

-

5 SRQ信号は無効です。 - 4 SRQ信号は有効です。 - 2 EOIを検出してデータ受信を終了しました。

指定したデリミタではなく、EOI信号の検出によりデータ受信を終了しました。

正常終了です。

1 指定された受信データ長に達してデータ受信を終了しました。

データ受信時に指定した受信データ長に達して終了しました。この状態ではデリミタは検出されておりません。デリミタが有効な状態でデータ送受信を行っている場合には、引き続きデータ受信処理を実行する必要があります。

0 正常終了 -1 I/Oモジュールアクセス番号が違います。

コントロールパネルで指定されたI/Oモジュールアクセス番号以外のI/Oモジュールを指定しました。 すでに初期化済のI/Oモジュールに対して再初期化を行おうとしました。 ・または初期化が行われていないI/Oモジュールに対して制御を行おうとしました。 0~15以外の番号を指定しました。

コントロールパネルで設定したPCI-430xのI/Oモジュール番号設定と、BoardNoプロパティの値が一致しているか、ご確認ください。

-4 スレーブモードでは使用できません。 スレーブモードにおいて、マスタモードでのみ使用可能なメソッド、プロパティを呼び出しています。

コントロールパネルで設定したPCI-430xのマスター/スレーブ設定をご確認ください。

-5 マスタモードでは使用できません。 マスタモードにおいて、スレーブモードでのみ使用可能なメソッド、プロパティを呼び出しています。

コントロールパネルで設定したPCI-430xのマスター/スレーブ設定をご確認ください。

-6 マスタ/スレーブ両方の指定はできません。 WaitSignalメソッドにてマスタのみとスレーブのみの両方の事象変化検出設定を行おうとしました。

WaitSignalメソッドの第1引数の値をご確認ください。

Page 97: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 95 - Interface Corporation

戻り値 内 容 対処方法

-7 バスコマンドの送出に失敗しました。 SetIfcメソッドを実行しているかご確認ください。計測機器のコマンドレスポンスが極端に遅いことが考えられます。コントロールパネルのバスコマンド送出タイムアウト時間を増やしてご確認ください。 OS上では未使用となっているが、ハード的にGP-IB I/Oモジュールの使用割込みレベルと他のデバイスとが重なっている場合があります。別の空きIRQレベルに変更してご確認ください。

-8 検出する事象コードがセットされておりません。 WaitSignalメソッドに有効な事象変化検出コードが設定されていないにも関わらず、‘WaitSignal’メソッドを実行しようとしました。

WaitSignalメソッドの第1引数の値をご確認ください。

-9 シリアル・ポーリングにも関わらずSRQ送出元を検出できませんでした。

機器からSRQ信号が送出されているか、またSRQを送出する設定になっていることをご確認ください。

-10 STB受信時にタイムアウトが発生しました。 機器からのステータス・バイトが指定した時間内に受信できませんでした。

StbRecvTimeOutプロパティにて、「STB応答時間」を大きくしてみてください。

-11 シリアルポーリング時に有効なステータス・バイトが取得できませんでした。 RQSビット(bit6) =1のステータス・バイトが受信できませんでした。

機器からSRQ信号が送出されているか、またSRQを送出する設定になっていることをご確認ください。

-12 データ受信に失敗しました。 以下の要因が考えられます。 他の機器もしくは非同期転送中により、GP-IBバスが占有中である場合

非同期入出力の完了を待つようにしてください。

-13 データ送信に失敗しました。 以下の要因が考えられます。 送信したデータが接続機器側で受信されなかった 存在しないGP-IBアドレスを指定している

ケーブル接続、全ての機器の電源が入っているか、ケーブル長はGP-IBの規格を守っているか等を確認してください。 DeviceAddress1~DeviceAddress32の各プロパティの設定値が存在する機器アドレスであることを確認してください。

-14 タイムアウトが発生しました。 送受信時に指定時間内にデータ転送が終了しませんでした。以下の要因が考えられます。 指定したデータ長に対するデータ転送時間がタイムアウト時間より長いことが考えられます。 送受信中に機器からの応答が何らかの要因でなくなった場合。 指定時間を経過しても、デリミタが受信できなかった場合。 ・OS上では未使用となっているが、ハード的にGP-IB I/Oモジュールの使用割込みレベルと他のデバイスとが重なっている。

TimeOutTransferプロパティにて、送受信タイムアウト時間を長くしてください。 計測機器とデリミタが一致していることを確認してください。 別の空きIRQレベルに変更して動作確認してください。

-15 タイムアウトで終了しました。 WaitSignal’メソッドにおいて、 ’WaitSignalTimeOut’プロパティで指定した時間内に事象変化が検出できませんでした。

WaitSignalTimeOutプロパティにて、事象変化検出タイムアウト時間を大きくしてください。また、機器設定も併せてご確認ください。

Page 98: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 96 -

戻り値 内 容 対処方法

-16 IFC受信による強制終了 データ転送中にIFCを受信したため転送が中断されました。

-17 コントローラがアクティブとなっていません。

マスターモードであることをご確認ください。

-18 すでにデータ・モードとなっています。 マスターモードであることをご確認ください。 -19 コントローラアクティブ状態になりませんで

した。 マスターモードであることをご確認ください。

-20 現在、バスが占有状態となっています(非同期入出力中)。 送受信関数を実行しようとしましたが、GP-IBバスが占有状態(データ転送中)となっています。

非同期入出力の完了を待つようにしてください。

-22 設定変更ができませんでした。 プロパティの設定変更に失敗しました。以下の要因が考えられます。 非同期入出力中にプロパティの設定を変更しようとしました。

非同期入出力の完了を待つようにしてください。

-24 タイマがスタートできませんでした。 タイマリソースが不足しています。その他のアプリケーションを終了させてください。

-25 既にタイマはスタートしています。 -26 タイマが動作中ではありません。 -994 I/Oモジュールの初期化が行われていない状態

では、使用できません。 Openメソッドを実行してください。

-995 I/Oモジュールのクローズでエラーが発生しました。

システム内部でエラーが発生しました。 アプリケーションを再起動してください。

-996 ドライバ側のページの確保ができませんでした。 以下の要因が考えられます。 空きメモリが極端に少ない。 ハードディスクの空き容量が極端に少ない場合(1MB以下等)、他に動作しているプロセスが多く存在する。

本エラーが発生する場合は、メモリ増設、もしくは一度に要求するデータサイズを少なくしてデータの送受信を行うことをお勧めします。

-999 I/Oモジュールが存在しません。 以下の要因が考えられます。 I/Oモジュール自体に異常があることが考えられます。 ・また、ご使用のコンピュータで正しくPCII/Oモジュールが認識されていないことも考えられます。

PCIデバイス表示ツール(弊社Web siteよりダウンロードできます)を使用して、PCII/Oモジュールが正しく認識されていることを確認してください。

-1000 既に、‘Open’メソッドが実行されています。以下の要因が考えられます。 既にオープンしているI/Oモジュールに、‘Close’メソッドを実行しないまま、‘Open’メソッドを実行した。

Closeメソッドを実行しているか確認してください。

Page 99: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 97 - Interface Corporation

戻り値 内 容 対処方法 -1002 受信バッファがオーバーフローしています。

以下の要因が考えられます。 受信バッファサイズを越えるデータを受信しようとしました。

SendBufferSizeプロパティで、受信バッファを大きくしてください。

-1003 送受信データ長が大きすぎます。 送受信データ長は、送受信バッファサイズ以下としてください。若しくは、送受信バッファサイズを変更してください。 ※ バッファサイズを変更すると、Openメソッドを再度実行してください。

-1004 異なる受信デリミタを持つ機器に、同時に送信しようとしています。 以下の要因が考えられます。 データ送信時に、受信デリミタが異なる複数の機器が指定されました。’

RecvDelimiterプロパティで、受信デリミタを変更するか、同じデリミタを持つグループに、送信を分割してください。

-1005 受信バッファにデータがありません。 以下の要因が考えられます。 MasterReceive/SlaveReceiveメソッドを一度も実行していません。

MasterReceive/SlaveReceiveメソッドが実行されているか確認してください。

-1006 登録されてない機器名を指定した。 以下の要因が考えられます。 DeviceNameXxプロパティで設定されていない機器名を指定した。 機器名の指定が必要なメソッドで、機器名を指定しなかった。

メソッドに指定した機器名が、DeviceNameXXプロパティに登録されているか確認してください。 機器名が指定されているか確認してください。

-1007 複数のデバイスは指定できません。 以下の要因が考えられます。 GP-IB機器を1台のみ指定するメソッドで、複数機器を指定した。

メソッドの呼び出し時に、複数の機器名が指定されていないか、確認してください。

-1008 機器名を重複して指定しました。 以下の要因が考えられます。 GP-IB機器の指定が必要なメソッドで、GP-IB機器を重複して指定した。

メソッドの呼び出し時に、指定した機器名が重複していないか確認してください。

-1009 そのメソッドは、現在、他のプロセス(もしくは他のスレッド)で実行中です。 以下の要因が考えられます。 同一I/Oモジュール番号のI/Oモジュールに対して、他のプロセス(もしくは他のスレッド)から同時にメソッドを実行した場合に、発生する可能性があります。※ 各スレッドで、異なるメソッドを事項した場合でも、発生する可能性があります。

このエラーが発生した場合、時間を置いて本メソッドを実行してみるか、もしくは、排他処理を行う様にしてください。

Page 100: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 98 -

6.4 高機能版DLLリファレンス

1. 高機能版DLL関数 以下に高機能DLLの関数一覧表を示します。

No 関 数 名 機 能 1 PciGpibExInitBoard 指定されたI/Oモジュールの初期化を行います。 2 PciGpibExFinishBoard 指定されたI/Oモジュールの使用を終了します。 3 PciGpibExGetInfo 指定されたI/Oモジュールの情報を取得します。 4 PciGpibExSetConfig ライブラリの動作パラメータを設定/変更します。 5 PciGpibExGetConfig ライブラリの動作パラメータを取得します。 6 PciGpibExSetIfc 指定された時間、IFCの送出を行います。(システムコントローラ のみ) 7 PciGpibExSetRen RENラインをセットします。(システムコントローラ のみ) 8 PciGpibExResetRen RENラインをリセットします。(システムコントローラ のみ) 9 PciGpibExSetRemote 指定された機器をリモートモードに設定します。

(システムコントローラ のみ) 10 PciGpibExExecTrigger 指定された機器に対してトリガを行います。

(コントローラ・イン・チャージ-マスタ のみ) 11 PciGpibExExecDevClear 全ての機器に対してデバイスクリアを行います。(コントローラ・イン・チ

ャージ-マスタ のみ) 12 PciGpibExExecSdc 指定された機器に対してデバイスクリアを行います。

(コントローラ・イン・チャージ-マスタ のみ) 13 PciGpibExSetLocal 指定された機器をローカルモードに設定します。

(コントローラ・イン・チャージ-マスタ のみ) 14 PciGpibExSetLlo 全ての機器をローカルロックアウト状態に設定します。

(コントローラ・イン・チャージ-マスタ のみ) 15 PciGpibExSetRwls 指定された機器をリモートロックアウト状態に設定します。

(システムコントローラ のみ) 16 PciGpibExExecPassCtrl 指定された機器に対してパス・コントロールを行います。

(コントローラ・イン・チャージ-マスタ のみ) 17 PciGpibExExecFindListener バス上に接続されているリスナを探します。(コントローラ・イン・チャー

ジ-マスタ のみ) 18 PciGpibExExecDevReset 指定された機器を完全にリセットします。(システムコントローラ のみ) 19 PciGpibExReSysCtrl システムコントローラの要求または解除を行います。

(システムコントローラ のみ) 20 PciGpibExGoStandby コマンドモードからデータモードへ遷移させます。

(コントローラ・イン・チャージ-マスタ のみ) 21 PciGpibExGoActCtrller データモードからコマンドモードへ遷移させます。

(コントローラ・イン・チャージ-マスタ のみ) 22 PciGpibExExecSpoll 指定された機器をシリアルポーリングします。

(コントローラ・イン・チャージ-マスタ のみ) 23 PciGpibExCheckSrq SRQ受信の有効/無効を確認します。

(コントローラ・イン・チャージ-マスタ のみ) 24 PciGpibExClearSrq SRQ受信フラグのクリアを行います。(コントローラ・イン・チャージ-マス

タ のみ) 25 PciGpibExEnableSrq SRQ受信の許可を行います。(コントローラ・イン・チャージ-マスタ のみ)26 PciGpibExDisableSrq SRQ受信の禁止を行います。(コントローラ・イン・チャージ-マスタ のみ)27 PciGpibExExecPpoll パラレルポーリングを行います。

(コントローラ・イン・チャージ-マスタ のみ) 28 PciGpibExCfgPpoll 指定された機器に対してパラレルポール応答条件を設定します。

(コントローラ・イン・チャージ-マスタ のみ) 29 PciGpibExUnCfgPpoll パラレルポール応答条件を解除します。

(コントローラ・イン・チャージ-マスタ のみ) 30 PciGpibExWriteBusCmd バスコマンドの送出を行います。

(コントローラ・イン・チャージ-マスタ のみ)

Page 101: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 99 - Interface Corporation

31 PciGpibExSetSignal 事象変化検出条件の設定を行います。 32 PciGpibExWaitSignal 事象変化検出を待ちます。 33 PciGpibExGetStatus 現在のバス・ステータスを取得します。 34 PciGpibExClrStatus 現在のバス・ステータスのクリアを行います。 35 PciGpibExGetBusLine GP-IBバスラインの状態を取得します。 36 PciGpibExSetBusLine GP-IBバスラインの状態を設定します。 37 PciGpibExMastSendData バスにデータの送信を行います。

(コントローラ・イン・チャージ-マスタ のみ) 38 PciGpibExMastRecvData バスからデータの受信を行います。

(コントローラ・イン・チャージ-マスタ のみ) 39 PciGpibExMastSendFile ファイルから読み込んだデータをバスに送信します。

(コントローラ・イン・チャージ-マスタ のみ) 40 PciGpibExMastRecvFile バスから受信したデータをファイルに書き込みます。

(コントローラ・イン・チャージ-マスタ のみ) 41 PciGpibExSlavSendData バスにデータの送信を行います。(コントローラ・イン・チャージ-マスタ /

コントローラ・イン・チャージ-スレーブ) 42 PciGpibExSlavRecvData バスからデータの受信を行います。(コントローラ・イン・チャージ-マスタ

/ コントローラ・イン・チャージ-スレーブ) 43 PciGpibExSlavSendFile ファイルから読み込んだデータをバスに送信します。(コントローラ・イ

ン・チャージ-マスタ / コントローラ・イン・チャージ-スレーブ) 44 PciGpibExSlavRecvFile バスから受信したデータをファイルに書き込みます。(コントローラ・イ

ン・チャージ-マスタ / コントローラ・イン・チャージ-スレーブ) 45 PciGpibExSlavCheckStb コントローラからシリアルポーリングされたかを確認します。 46 PciGpibExSlavSetSrq SRQの送出(サービス要求)を行います。 47 PciGpibExSlavSetIst パラレル・ポール応答フラグを設定します。 48 PciGpibExSlavSetPp2 パラレル・ポール応答モード(pp2)を設定します。 49 PciGpibExWaitTimer 指定した時間ほど待ちます。 50 PciGpibExStartTimer 汎用タイマのスタートを行います。 51 PciGpibExClearTimer 汎用タイマのカウンタ値のクリアを行います。 52 PciGpibExReadTimer 汎用タイマのカウンタ値の読み出しを行います。 53 PciGpibExStopTimer 汎用タイマの停止を行います。 54 PciGpibExSetSrqEvent 指定番号のI/OモジュールからのSRQコールバックイベントを登録します。

(コントローラ・イン・チャージ-マスタ のみ) 55 PciGpibExWaitSrqEvent 指定番号のI/OモジュールからのSRQコールバックイベントを待ちます。(コ

ントローラ・イン・チャージ-マスタ のみ) 56 PciGpibExKillSrqEvent 指定番号のI/OモジュールからのSRQコールバックイベントの登録を解除

します。(コントローラ・イン・チャージ-マスタ のみ)

Page 102: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 100 -

2. 関数エラーコード一覧 以下に高機能版DLL関数のエラーコードの一覧を示します。

エラーコード 値 内 容 GP-IB_SUCCESS_NOT_FOUND_LISTENER 11 リスナが1台も見つかりませんでした。 - 10 予約 - 9 予約 - 8 予約 GP-IB_SUCCESS_OK_SEND_STB 7 ステータス・バイトはコントローラへ通知済みです。GP-IB_SUCCESS_NOT_EXEC_SPOLL 6 まだ、シリアル・ポーリングは行われていません。 GP-IB_SUCCESS_NOT_ACTIVE_SRQ 5 SRQ信号無効です。 GP-IB_SUCCESS_ACTIVE_SRQ 4 SRQ信号有功です。 - 3 予約 GP-IB_SUCCESS_OK_EOI_DETECT 2 EOIを検出して終了しました。 GP-IB_SUCCESS_OK_RECV_DATA_CNT 1 指定された受信データ数に達して終了しました。 GP-IB_SUCCESS_OK_DELIM_DETECT 0 指定されたデリミタを検出して終了しました。 GP-IB_SUCCESS 0 正常終了 GP-IB_ERROR_ILLEGAL_BOARDNO -1 I/Oモジュールアクセス番号が違います。 GP-IB_ERROR_ILLEGAL_INP_PARAM -2 入力パラメータに間違いがあります。 GP-IB_ERROR_ILLEGAL_PARAM_NO -3 パラメータ番号に間違いがあります。 GP-IB_ERROR_NOT_USE_SLAVE -4 スレーブモードでは利用できません GP-IB_ERROR_NOT_USE_NONE_CIC -4 非Controller_in_Chargeでは使用できません GP-IB_ERROR_NOT_USE_MASTER -5 マスタモードでは使用できません GP-IB_ERROR_NOT_USE_CIC -5 Controller_in_Chargeでは使用できません GP-IB_ERROR_NOT_USE_BOTH_USE -6 マスタ(CIC)/スレーブ(非CIC)の両方では使用できませ

ん GP-IB_ERROR_WRITE_BUS_COMMAND -7 バスコマンドの送出に失敗しました。 GP-IB_ERROR_NO_SET_SIGNAL -8 検出する事象が設定されていません GP-IB_ERROR_ACTIVE_SRQ -9 シリアル・ポーリングにも関わらずSRQ送出元を検出

できませんでした。 GP-IB_ERROR_STB_RECV_TMO -10 STB受信時にタイムアウトが発生しました。 GP-IB_ERROR_NOT_ACTIVE_STB -11 有効なステータス・バイトが取得できませんでした。GP-IB_ERROR_DATA_RECV -12 データ受信に失敗しました。 GP-IB_ERROR_DATA_SEND -13 データ送信に失敗しました。 GP-IB_ERROR_TRANS_TMO -14 タイムアウトが発生しました。 GP-IB_ERROR_WAIT_SIGNAL_TMO -15 タイムアウトで終了しました。 GP-IB_ERROR_IFC_TRANS_EXIT -16 IFC受信による強制終了 GP-IB_ERROR_NO_ACTIVE_CIC -17 コントローラがアクティブとなっていません GP-IB_ERROR_NOW_DATA_MODE -18 すでにデータ・モードとなっています。 GP-IB_ERROR_NOT_CAS -19 コントローラアクティブ状態になっていませんでしたGP-IB_ERROR_NOW_BUS_OCCUPATION -20 現在バスが占有状態となっています。 GP-IB_ERROR_NO_SET -22 設定が変更できませんでした。 GP-IB_ERROR_NOT_START_TIMER -24 タイマがスタートできませんでした。 GP-IB_ERROR_EXIST_START_TIMER -25 既にタイマはスタートしています。 GP-IB_ERROR_NOT_TICK_TIMER -26 タイマが動作中ではありません。 GP-IB_ERROR_FILE_ACCESS -30 ファイルがオープンできません。読み込み/書き込み中

にエラーが発生しました。 GP-IB_ERROR_SET_CALLBACK_EVENT -40 コールバックイベントの登録に失敗しました。 GP-IB_ERROR_KILL_CALLBACK_EVENT -41 コールバックイベントの登録解除に失敗しました。 GP-IB_ERROR_WAIT_OBJECT_SIGNAL -42 イベントオブジェクトが有効(シグナル状態)です。 GP-IB_ERROR_WAIT_OBJECT_TMO -43 指定した時間内にイベントオブジェクトがシグナル状

態にならなかったため、タイムアウトしました。 GP-IB_ERROR_WAIT_OBJECT_FAILED -44 イベントオブジェクト待ちにてエラーが発生しまし

た。

Page 103: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 101 - Interface Corporation

エラーコード 値 内 容

GP-IB_ERROR_NOT_SET_CALLBACK_ EVENT

-45 コールバックイベントがまだ登録されていません。

GP-IB_ERROR_NOT_CREATE_EVENT -992 イベント作成ができませんでした。 GP-IB_ERROR_NOT_CREATE_THREAD -993 スレッド作成ができませんでした。 GP-IB_ERROR_NOT_INIT_CALL -994 I/Oモジュールの初期化が行われていません。 GP-IB_ERROR_NOT_BOARD_CLOSE -995 I/Oモジュールの使用終了ができませんでした。 GP-IB_ERROR_NOT_ALLAC_PAGE -996 ドライバ側のページの確保ができませんでした。GP-IB_ERROR_NOT_USE_TIMER -997 タイマ設定に失敗しました。 GP-IB_ERROR_NOT_USE_RESOURCE -998 割込みが使用できません。 GP-IB_ERROR_NOT_BOARD -999 I/Oモジュールが存在しません。 GP-IB_ERROR_NOT_SUPPORT -2000 サポートしていないAPIです。

※ 各一覧の詳細についてはHelpを参照してください。

Page 104: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

Interface Corporation - 102 -

技術資料紹介 弊社では下記の技術資料を提供しております。 詳しくは、弊社Web site(www.interface.co.jp)、または弊社窓口までお問い合わせください。 カタログ

PRM-0061 CPZカタログ(日本語版) PRM-0062 PCIカタログ(日本語版) PRM-0063 CSIカタログ(日本語版)

チュートリアル TUT-0058 チュートリアル CPZ拡張ユニット 入門編 TUT-0056 チュートリアル XP Embedded OS構築編 TUT-0055 チュートリアル 画像入力I/Oモジュール TUT-0054 CANチュートリアル TUT-0053 モーションコントロールチュートリアル TUT-0050 RTLinuxによるモーションコントローラI/Oモジュール制御プログラミング チュートリアル(GPG-7400用) TUT-0048 RTLinuxによるメモリンクI/Oモジュール制御プログラミング チュートリアル TUT-0044 RTLinuxによるメモリ共有インタフェースI/Oモジュール制御プログラミング チュートリアル TUT-0043 RTLinuxによる調歩同期シリアル通信I/Oモジュール制御プログラミング チュートリアル TUT-0041 RTLinuxによるGP-IBI/Oモジュール制御プログラミング チュートリアル TUT-0040 RTLinuxによるDAI/Oモジュール制御プログラミング チュートリアル TUT-0039 RTLinuxによるADI/Oモジュール制御プログラミング チュートリアル TUT-0038 RTLinuxによるDIOI/Oモジュール制御プログラミング チュートリアル TUT-0037 RTLinuxによるHDLCI/Oモジュール制御プログラミング チュートリアル TUT-0036 RTLinuxによるPCI/CompactPCI/CardBus制御入門書(導入編) TUT-0034 Visual C++によるPPI入門書 TUT-0033 Visual Basicによるメモリ共有インタフェース入門書 TUT-0032 Visual C++によるメモリ共有インタフェース入門書 TUT-0031 Visual Basicによるメモリンク入門書 TUT-0030 Visual C++によるメモリンク入門書 TUT-0029 Visual BasicによるHDLC入門書 TUT-0028 Visual C++によるHDLC入門書 TUT-0027 Visual BasicによるGP-IB入門書 TUT-0026 Visual C++によるGP-IB入門書 TUT-0025 Visual BasicによるDIO入門書 TUT-0024 Visual C++によるDIO入門書 TUT-0023 Visual BasicによるDA入門書 TUT-0022 Visual C++によるDA入門書 TUT-0021 Visual BasicによるAD入門書 TUT-0020 Visual C++によるAD入門書 TUT-0019 Visual Basicによるモーションコントローラ入門書 TUT-0018 Visual C++によるモーションコントローラ入門書 TUT-0017 メモリンクを使用した負荷分散システム事例チュートリアル TUT-0016 Visual BasicによるPPI入門書 TUT-0015 モーションコントロールチュートリアル TUT-0014 Microsoft Visual Studio .NET移行ガイド TUT-0008 拡張ユニット チュートリアル(問題解決編) TUT-0007 拡張ユニットチュートリアル(入門編) TUT-0006 C(98)/ISA製品からPCI/CompactPCI製品への移行チュートリアル(DOS編) TUT-0005 DOSによるLAP-B入門書 TUT-0004 DOSによるAD入門書 TUT-0003 LinuxによるPCI/CompactPCI/CardBus制御 入門書 TUT-0002 PCI-ISAバスブリッジチュートリアル TUT-0001 PCI-Cバスブリッジチュートリアル

技術情報資料 初めてのCANインタフェース Linux, リアルタイムLinux移植(SH-4)経験談及び当社の今後の取り組みについて LinuxからPCI/CompactPCII/Oモジュールを制御する方法 ActiveXコントロールによるシステム組み込み技術 CompactPCIへの置き換え+システム構築/移行ガイド MS-DOSからPCI/CompactPCII/Oモジュールを制御する方法

Page 105: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026

- 103 - Interface Corporation

参考文献

著 者 題 名 朝日新聞社 編 パソコン・データ通信プロトコルハンドブック

(朝日新聞社:1985年) 菅原 宏和 著 IEEE488/GP-IB設計マニュアル(総合電子出版社:1989年) 大川 義邦 著 Windows2000による計測・制御プログラミングのノウハウ

警告!

本ドキュメントの一部または全てを弊社の許可なく、複写,複製,転載,電子化することを禁じま

す。

Page 106: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

TUT-0026 2006年 12月 Ver. 1.7 発行 発行所

〒732-0828 広島県広島市南区京橋町10-21 TEL 082-262-7777 FAX 082-262-5066

定価 ¥2,000

本書の内容の一部または全部を、無断で転載することを禁止します。 本書の内容は、将来予告なく変更することがありますので、予めご了承ください。 © 2001, 2006 Interface Corporation. All rights reserved.

Page 107: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

www.interface.co.jp

サポート体制

本製品についてのお問い合わせは、お客様相談センタで承ります。弊社Web siteのオンライ

ンQA(「サポート」→「お客様相談センタ」をクリック)、E-mailまたはフリーダイヤルをご利用く

ださい。 お問い合わせ先 <お客様相談センタ> TEL 0120-447213 FAX 0120-458257 (祝日および弊社休業日を除く月~金 AM9:00~PM5:00迄) E-mail [email protected]

TUT-0026 Ver. 1.7 Vol. 1/1

Page 108: チュートリアル - InterfaceVisual C++にて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成まで に関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual

www.interface.co.jp

Visual C++によるGP-IB入門書 TUT-0026 Ver. 1.7