• 検索結果がありません。

RTLinuxによるGP-IBボード制御プログラミングチュートリアル

N/A
N/A
Protected

Academic year: 2021

シェア "RTLinuxによるGP-IBボード制御プログラミングチュートリアル"

Copied!
84
0
0

読み込み中.... (全文を見る)

全文

(1)

チュートリアル

RTLinuxによるGP-IBボード制御

プログラミング チュートリアル

(2)

商標/登録商標

本ドキュメントに掲載されている会社名,製品名は、それぞれ各社の商標または登録商標です。

保障の内容と制限

弊社はドキュメント内の情報の正確さに万全を期しています。万一、誤記または誤植等があった

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

因するいかなる損害に対しても弊社は責任を負いません。

製品に含まれるバグ、あるいは製品の供給(納期遅延),性能、もしくは使用に起因する付帯的損害

もしくは間接的損害に対して、弊社に全面的に責がある場合でも、弊社はその製品に対する改良

(正常に動作する)、代品交換までとし、金銭面での賠償の責任は一切負わないものとしますので、

予めご了承ください。

ドキュメント内の図や表は説明のためであり、ユーザ個別の応用事例により変化する場合があり

ます。

著作権,知的所有権

弊社は本製品に含まれるおよび本製品に対する権利や知的所有権を保持しています。

本製品はコンピュータ ソフトウェア(プログラム),図,文章,写真等を含んでいます。

複製の禁止

弊社の許可なく、本製品(ドキュメント含む)の全て、または一部に関わらず、複製,改変等を行う

ことはできません。

責任の制限

弊社は、弊社または再販売者の予見の有無に関わらず、発生したいかなる特別損害,偶発的損害,

間接的な損害,重大な損害について、責任を負いません。

補償の内容

本ドキュメントで使用している弊社製品の補償については、各製品のマニュアルを参照してくだ

さい。

本書の内容の一部または全部を、無断で転載することを禁止します。

本書の内容は、将来予告なく変更することがありますので、予めご了承ください。

© 2002, 2007 Interface Corporation. All rights reserved.

(3)

改訂履歴

Ver.

年 月

改 訂 内 容

1.4

2007年1月

●『第1章 1.7 システム構築例』追加。

●マルチメータ型式変更。

HP34401A→Agilent34401A

●フォーマット変更。

●対応型式追加。

●技術資料一覧更新。

1.3

2005年 10月

●対応型式追加。

●技術資料一覧更新。

1.2

2004年 9月

●対応型式追加。

●技術資料一覧更新。

1.1

2002年 11月

●対応型式追加。

1.0

2002年 8月

新規作成

本チュートリアルをご使用の際は、必ず各製品型式の最新のドキュメント(ユーザーズマニュア

ル,Help)をあわせて参照してください。また、最新のドライバソフトウェアをご使用ください。

ユーザーズマニュアル,ドライバソフトウェアは弊社Web site(www.interface.co.jp)からダウンロー

ドできます。(Helpはドライバソフトウェアに含まれています)

(4)

目 次

第 1 章 GP-IBとは

6

1.1 GP-IBの特長 ... 6

1.2 バス接続 ... 7

1.3 アドレス ... 8

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

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

1.6 インタフェース機能... 9

1.7 システム構成例... 10

1.8 サービスリクエスト... 11

1.9 GP-IB計測機器の制御 ... 12

1.10 GP-IBについての情報 ... 13

第 2 章 GP-IB on RTLinux

14

2.1 パフォーマンス... 14

2.1.1 応答性 ... 14

2.1.2 周期性 ... 16

2.2 RTLinuxによるGP-IB I/Oモジュール制御... 17

2.3 GP-IB I/Oモジュール制御概略... 18

2.4 リアルタイムカーネルの組み込み ... 19

第 3 章 GP-IB I/Oモジュール制御の第一歩

20

3.1 GP-IBドライバの組み込み ... 20

3.2 GP-IB機器へのデータ送信 ... 23

3.3 GP-IB機器へのデータ送信プログラムの解説... 27

3.4 GP-IB機器からのサービスリクエスト(SRQ)を捉える ... 30

3.5 GP-IB機器からのサービスリクエスト(SRQ)を捉えるプログラム ... 33

第 4 章 より高度な処理を行おう

37

4.1 周期的にデータの送受信を行う... 37

4.2 周期的なデータ送受信を行うプログラムの解説 ... 44

4.2.1 共通定義ファイルの役割... 46

4.2.2 RT-Linuxモジュールの動き... 47

4.2.3 Linuxプロセスの動き ... 49

4.3 複数のGP-IB機器を制御する ... 50

4.4 複数のGP-IB機器を制御するプログラムの解説... 60

4.4.1 RTLinuxモジュールの動き ... 62

第 5 章 デバッグ手法

66

5.1 ドライバデバッグ支援機能を使ってみる ... 66

5.1.1 関数呼び出しトレース... 67

5.1.2 エラー情報 ... 68

(5)

5.1.3 I/Oモジュールリソース情報 ... 69

5.1.4 バスコマンド送信情報... 70

5.1.5 データ送信情報 ... 71

5.1.6 データ受信情報 ... 72

5.1.7 GP-IBバスライン情報 ... 73

5.1.8 GP-IBファンクションステータス情報 ... 74

第 6 章 リファレンス

75

6.1 関数一覧 ... 75

6.2 戻り値一覧... 76

技術資料紹介

78

(6)

はじめに

平素は格別のご高配を賜り、厚くお礼申し上げます。本冊子はRTLinux/Free上で弊社

PCI,CompactPCI GP-IB I/Oモジュールを制御したい方を対象に、GP-IB I/Oモジュールの概要,ソフ

トウェアのインストール方法,プログラミング方法を記載しています。

RTLinux上での弊社GP-IB I/Oモジュールを使ったプログラミングにお役に立てれば幸いです。

本書では、以下記載がない限り、「RTLinux」は「RTLinux/Free」のことを指します。

なお本冊子はRTLinuxバージョン3.1を対象に作成されています。RTLinuxのバージョンが異なる場

合、動作保証はいたしかねますので予めご了承ください。

●ご意見・ご要望

弊社へのご意見,ご要望がございましたら、下記までお問い合わせください。

www.interface.co.jp

E-mail:support@interface.co.jp

●本冊子で扱うソフトウェア

本冊子で扱うソフトウェア製品は下記の通りです。

ソフトウェア製品名

型 式

GP-IBインタフェースボードLinux/RT対応ドライバソフトウェア

GPG-4301,4304

●ソフトウェアの入手方法について

ソフトウェアは弊社Web siteよりダウンロード(無料)できます。

CD-ROM等、媒体による提供は有償となります。価格に送料,消費税は含まれません。

※ ダウンロードするためには、ユーザID登録が必要になります。

(7)

●GP-IB I/OモジュールのLinux/RTLinux対応ドライバソフトウェア(GPG-4301,4304)のドキュメン

ト構成について

各ドキュメントに掲載している内容は下記のとおりです。

ドキュメント

内 容

Readme

製品のインストール方法や、アンインストール方法,ファイル構成の他、製品

に関する最新情報を掲載しています。

このドキュメントを最初に確認してください。

Help

ドライバソフトウェアの仕様

,

関数の個別説明、および使用方法等の説明を掲載し ています。プログラム作成時に確認してください。

チュートリアル

本ドキュメントです。初めてRTLinux上でGP-IB I/Oモジュールを制御する時

や、GP-IB I/Oモジュールを使用したシステム構築時の参考として確認してく

ださい。

本ドキュメントの他、

RTLinuxの導入編のチュートリアルを合わせて参照して

ください。

RTLinuxのインストールや、基本的なプログラミング等が記載されています。

また、本ドキュメントは、予めRTLinuxのインストール、および使用されるソフトウェア

(GPG-4301,4304)のインストールを済ませた方を対象に記述しています。

●本書での表記について

コマンドの実行例において、行頭に「%」がつく場合は一般ユーザでの実行、「#」がつく場合

はrootでの実行を意味します。「%」や「#」は実際に入力する文字ではありませんのでご注意

ください。

対象環境

本チュートリアルは以下の制約事項があります。

対象型式

(PCI)

PCI-4301

PCI-4304P

PCI-4302 PCI-4304

対象型式

(CPZ)

CPZ-4302

CPZ-4304P

CPZ-4302P CPZ-4304

対象型式

(CTP)

CTP-4302

CTP-4304P

CTP-4302P CTP-4304

対象型式

(PEX)

PEX-432101

対象型式

(LPC)

LPC-432101

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

※ 本冊子は上記の弊社製品型式のみに対応しています。

製品の詳細は弊社Web siteを参照してください。

※ 本冊子は、CPC-4301を対象に記述しています。GPG-4304を誤使用の場合は、4301を全て4304

に置き換えてください。

(8)

第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台のコンピュータに複数の機器をつないで自動計測を行い、その計測データを一括管

理する。」といった使われ方が多いようです。

(9)

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線ハンドシェーク)

バス管理線はバス上のデータの流れを制御するために使用します。

★3 線式ハンドシェーク 3 線式ハンドシェークは、名の通り、3 本のハンドシェークラインを使って、データのやり取りの制御を 行うことから名づけられました。

それぞれのハンドシェークラインは、それぞれ、DAV(Data Valid),NRFD(Not Ready For Data) ,NDAC(Not Data Accepted)が割り当てられています。

GP-IB は 3 線式ハンドシェークを通信制御に用いることで、データ転送能力の異なる機器間で、確実な データ転送を保証しています。

(10)

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 アドレス・コマンドとユニバーサル・コマンド

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

マンド(命令)を特定の機器や全ての機器に発信します。

特定の機器のみに発信するものをアドレス・コマンドといい、全ての機器に発信するものをユニ

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

(11)

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機能と組で動作します。

(12)

1.7 システム構成例

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

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

計測データ集録システム

上記システムは、2台のデジタル・マルチ・メータ(DMM)より送られる計測データをコンピュータ

上に蓄積し、コンピュータではそのデータの集計,解析が行うことができます。

システム画面

(13)

1.8 サービスリクエスト

サービスリクエストとは、機器から事象の変化をコントローラに伝えるための仕組みです。コン

ピュータでは、事象の変化を受け取るために「割り込み」を用いますが、サービスリクエストも

同じことを実現します。

GP-IBでは、機器がコントローラに事象の変化を伝えるために、SRQラインと呼ばれる信号線を用

います。

コントローラは、SRQラインの変化を検知すると、通常シリアルポールを発行し、サービスリク

エストを発行した機器を特定し、特定した機器に対する処理を行います。

サービスリクエストは、機器内の処理に時間がかかる所で多く用いられます。

例えば、ロジックアナライザでは、サンプリングの開始から完了のタイミングをコントローラに

伝えるために、サービスリクエストを用いたりします。

これにより、コントローラがサンプリングが完了したかどうか、何度もチェックしにいかずに済

みます。

★シリアルポール

シリアルポール処理とは、コントローラが機器(トーカ,

リスナ)に対して、サービスリクエストを送信したかどう

か、1台ずつ順番(シリアル)に問い合わせ、ステータスバ

イト(コンピュータでは割り込みステータスにあたりま

す)を受信する処理を指します。

サービスリクエストを送信した機器は、ステータスバイ

ト中のRQS(リクエスト・サービス)ビットをONにしてい

ます。

コントローラは、このビットをチェックすることで、

サービスリクエストを送信している機器を特定するこ

とができます。

①サービス要求(SRQ) ②シリアルポーリング(STB 受信) 機器 1 コントローラ 呼びましたか? 機器 2 はい、呼びました。 今、こんな状態です。 コントローラ 機器 1 機器 2 呼びましたか? いいえ ※ 機器 1,2:トーカまたは、リスナ シリアルポールの流れ コントローラ 機器 1 機器 2 もしもし STB STB

(14)

1.9 GP-IB計測機器の制御

ここまでの説明は、GP-IBという通信バスについての説明でした。

では、実際にGP-IBインタフェースを持つ、マルチメータやロジックアナライザ等の計測機器を、

どうやって制御していけば良いのでしょうか?

注意を要する項目を何点か挙げましょう。

項 目

内 容

計測機器を制御するには、計測

機器を制御するコマンドを送

る必要がある。

計測機器は、それ自体が一つのコンピュータのようなものと見

なしてください。

コンピュータなので、「サンプリング開始」,「エラーは発生し

てないか?」等の指示を出すコマンド(命令)を送る必要がありま

す。

今までの説明は、各機器間で、コマンドやデータをやり取りす

るための方法を説明しているに過ぎません。

(相手に意思を伝えるために、「口を使って日本語で説明する」

というやり方を定義していると考えてください)

制御するコマンドが多くの場

合文字列である。

計測機器を制御するコマンドは、多くは文字列を送ることで実

現します。

例えば、Agilent34401Aというアジレント・テクノロジー社のマ

ルチメータに対して、ある時点の電圧を計測するためには、

「MEASure:VOLTage:DC?」という文字列を送ります。

制御するコマンドが計測機器

ごとに異なる。

計測機器を制御するコマンドは、機器ごとに異なります。

例えば、Aさんと話すのと、Bさんと話すのでは、話す相手と話

題によって会話の内容が異なります。計測機器も製品の目的が

異なるので、制御するコマンドも変わる訳です。

従って、計測機器を制御するには、制御したい機器のマニュア

ルを参照する必要があります。

なお、IEEE488.2規格では、共通コマンドと呼ばれるものを定義

することで、ある程度コマンド体系を共通化しようとしていま

す。

これに従った製品間同士では、非常に似通ったコマンドを使っ

て制御することができます。

受け取るデータの形式が計測

機器ごとに異なる。

例えばマルチメータに対して「電圧値を測定」とコマンドを送

り、計測したデータを取得する時、取得するデータの形式につ

いても注意が必要です。

多くの場合、「+5.000」等の文字列が送られることが多いのです

が、「NDCV5.000」というような先頭にプレフィクスが付いた

文字列を返す計測機器もあります。

また、ロジックアナライザやオシロスコープのように、複数の

データを得る場合、そのフォーマットはマルチメータとは異な

ります。

これらのフォーマットは、制御したい機器のマニュアルに記載

されています。

デリミタが計測機器ごとに異

なる。

デリミタとは、送受信する文字列やデータの区切りを表す特殊

なコードのことを指します。(文章を区切る句読点のようなもの

です)

このコードは、計測機器によって異なります。が、多くの場合

「EOI」か「CR」「LF」が用いられます。

(15)

GP-IB I/Oモジュールに対して制御するプログラムとしては、文字列の「送信」と「受信」したデー

タの解析がほとんどです。

サービスリクエストを使用すると少々面倒になりますが、RTLinux上のプログラミングとしては、

送信と受信のAPIを使用するだけで、ほぼ事足ります。

また、送受信するデータの内容は、文字列でやり取りされるものが多いため、データのやり取り

をコンソールに表示しながらプログラミングを進めることにより、デバッグを簡単に進めること

ができます。

1.10 GP-IBについての情報

GP-IBについて、もっと詳しく知りたい時、以下を参考にしてください。

項 目

説 明

書籍から情報を得る

「IEEE488/GP-IB設計マニュアル」 総合電子出版 菅原宏和著

GP-IBについて初歩から詳細まで解説されています。

「PC-9801 GP-IB活用法」 工学図書(株) 磯部俊夫著

本の前半でGP-IBの概要が説明されています。

インターネットから情

報を得る

検索サイト等で、「GP-IB」や「HP-IB」等のキーワードで探すと、情

報が得られます。

HP社から情報を得る GP-IBは、元々HP(Hewlett Packard)社が計測器用標準インタフェースと

して開発したのが始まりです。

(HP社ではGP-IBをHP-IBと呼びます)

なお、HP社の計測部門は、現在アジレント・テクノロジー社として分

社化されていますので、ご注意ください。

規格から情報を得る GP-IBはIEEE-488.1および488.2として規格化されています。

標準規格団体から、これらの資料を得ることも可能です。

日本では、JIS C1901-1987として和訳,規格化されているので、手軽に

読むことができます。

(16)

第2章 GP-IB on RTLinux

RTLinuxは、Linux上でリアルタイム処理を可能にするOSです。そのRTLinux上でGP-IB製品を動か

すことにより、リアルタイム性が要求されるシステムを構築することが可能になります。

2.1 パフォーマンス

RTLinuxとLinuxで、応答性と周期性を比較します。

2.1.1 応答性

SRQによる割り込みが発生してから、コールバック関数内ですぐにシリアルポーリング関数を呼

び出し、最初のインタフェース・メッセージが発行されるまでの応答時間を測定しました。

RTLinux,Linuxともに、1000回応答時間を測定しています。

SRQ 割り込み

コールバック関数

コールバック関数呼び出し

シリアル・ポール

この時間を測定

シリアル・ポール関数

時間

インタフェース・メッセージ発行

応答性の測定

RTLinuxでは、平均応答時間,最大応答時間,最小応答時間の全てにおいてLinuxよりも優れた結果が出て います。 RTLinuxの平均応答時間は、Linuxより6μs程度速い結果となりました。また、注目されるのが、最大応 答時間です。Linuxでは、32.8μsにまで応答時間のぶれが発生しているのに対し、RTLinuxでは、 25.45μsまでしかぶれが発生していません。

(17)

応答時間の分布

件 数

データ区間

(

μs)

RTLinux

Linux

∼15

0 0

16 425

0

17 534

0

18 36

0

19 2

2

20 0

82

21 0 206

22 0 216

23 0 165

24 1

98

25 2

93

26 0

61

27 0

25

28 0

9

29 0

19

30 0

17

31∼

0 16

応答時間のトータル結果

測定環境 トータル結果

RTLinux

Linux

平均(

μs)

17.186 23.512

最大(

μs)

25.45 32.8

最小(

μs)

16.7 19.95

標準偏差(

μs)

0.575 2.371

0 100 200 300 400 500 600 ~1 5 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31~ RTLinux Linux データ区間(μs) 件数 RTLinuxとLinuxの応答時間の比較グラフ

※ 弊社CompactPCI CPUモジュール(CTP-PE09)で測定しております。

(18)

2.1.2 周期性

次に、指定した周期でコマンド送信を繰り返し行い、その周期性のぶれを測定しました。

こちらも各周期で1000回ずつ測定を行っています。

RTLinuxとLinuxの周期周期性測定結果

RTLinux Linux

測定 環境 指定 周期(μs) 平均 (μs) 最大 (μs) 最小 (μs) 標準偏差 (μ

s

) 平均 (μs) 最大 (μs) 最小 (μs) 標準偏差 (μ

s

) 10000 10001.03 10002.95 9984.6 0.842 10001.16 10387.25 9616.75 31.17 1000 1000.088 1010.1 985.6 0.895 10001.19 10318.05 9673.45 32.599

Linuxでは1ms周期を実行しても10ms以下の周期実行は行えていません。さらに、最大値,最小値の

ぶれ幅も大きい結果となりました。RTLinuxでは、ほぼ指定周期通りに実行され、さらに最大値と

最小値のぶれも小さくなっています。

0 100 200 300 400 500 600 700 800 900 1000 ~9980 9985 9990 9995 10000 10005 10010 10015 10020 10025~ RTLinux Linux 周期(μs) 件数

RTLinuxとLinuxの周期性結果グラフ

違いを分かりやすくするために、10msでの周期実行の違いをグラフに示しました(縦軸は、件数を、

横軸は測定時間を示しています)。

LinuxよりもRTLinuxのほうが、ぶれが小さいことが分かります。

(19)

2.2 RTLinuxによるGP-IB I/Oモジュール制御

RTLinux上で弊社GP-IB I/Oモジュールを制御するには、お客様の作成するRTLinuxモジュールから

RTLinux対応GP-IBドライバソフトウェアの関数を呼び出すことで行います。通常、RTLinux

モジュールではRTLinuxスレッドを生成し、ここから関数を呼び出して処理を行います。

また、RTLinuxモジュールとLinuxアプリケーションがデータのやりとりを行う場合は、RT-FIFO

を使用します。

制御構成を簡単に示すと、下図のようになります。

GP-IB I/Oモジュール RTLinux対応 ドライバモジュール (rcp430x.o、rgpg430x.o) RTLinuxモジュール Linux アプリケーション コマンド送信 データ受信 リアルタイムFIFO GP-IB 計測機器 RTLinuxスレッド

RTLinux上でのGP-IB I/Oモジュール制御構成

●RTLinuxモジュール リアルタイム処理を行うモジュール本体です。お客様はRTLinux対応GP-IBドライバソフトウェアを 使って、GP-IB I/Oモジュールを制御するために、このモジュールを作成する必要があります。 ●RTLinuxスレッド 実際にリアルタイム処理を行う際、RTLinuxモジュール下で動作するRTLinuxスレッドを作成します。 このRTLinuxスレッドは通常のLinuxのプロセスよりも優先して実行されます。 ●RT-FIFO リアルタイムFIFOとも呼ばれます。RTLinuxスレッドとLinuxアプリケーション、またはRTLinuxス レッド同士のデータの受け渡しを行うために使用されます。

※ RT-FIFOはデバイスとして扱われており、/dev/rtf0等という名前で存在しています。

(20)

2.3 GP-IB I/Oモジュール制御概略

GP-IB I/Oモジュールの制御は、下記の制御シーケンス(順番)で行います。

I/O モジュール初期化

各種処理

終了処理

(3)

(2)

(1)

GP-IB I/Oモジュールの制御シーケンス

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

GP-IB I/Oモジュールへの操作を行うため、まず、I/Oモジュールを利用可能な状態にします。

この処理がI/Oモジュールの初期化です。I/Oモジュールの初期化を行うと、プログラムはI/Oモ

ジュールへのアクセスが可能となります。本処理が行われないとI/Oモジュールへのアクセスは

行えません。

(2)各種処理

GP-IB I/Oモジュールを使って、制御を行います。

(3)終了処理

I/Oモジュールの使用終了を行うための手続きです。プログラム終了時に行います。

(21)

2.4 リアルタイムカーネルの組み込み

RTLinuxのドライバソフトウェアを組み込む前に、RTLinux導入編のチュートリアルを参照し、

RTLinuxのインストールとRTLinuxモジュールを動かすために必要なリアルタイムカーネルのイ

ンストールを行ってください。

参照箇所:

RTLinuxのインストール 第1章 RTLinuxの導入 リアルタイムカーネルの組み込み 第2章 RTLinuxのインストール

リアルタイムカーネルの組み込み例:

% su ← リアルタイムカーネルを組み込むため、 スーパーユーザになります。 Password: --- ← root のパスワードを入力します。 # cd /usr/src/rtlinux/rtlinux-3.1 # sh scripts/insrtl ← リアルタイムカーネル組み込みスクリプトを 実行します。 # lsmod ← リアルタイムカーネルの組み込みを確認します。

Module Size Used by

rtl_sched 43104 0 (unused)

rtl_fifo 9968 0 (unused)

rtl_posixio 7184 0 [rtl_fifo]

rtl_time 10000 0 [rtl_sched rtl_posixio]

rtl 27184 0 [rtl_sched rtl_fifo rtl_posixio

rtl_time]

↑rtl、rtl_time 等のリアルタイムカーネルが組み込まれています。 リアルタイムカーネルは正常に組み込まれています。

リアルタイムカーネルを組み込んだ後に、GP-IBドライバモジュールを組み込むことにより、

GP-IB I/Oモジュールのリアルタイム制御が行えるようになります。

(22)

第3章 GP-IB I/Oモジュール制御の第一歩

ここでは、弊社GP-IB I/Oモジュールを用いて、GP-IB I/Oモジュールの制御プログラムを作成しま

す。

3.1 GP-IBドライバの組み込み

GP-IB I/Oモジュールを制御するために、GP-IBドライバモジュールを組み込む必要があります。

RTLinuxをインストールし、リアルタイムカーネルを組み込んだ後、「GP-IBインタフェースボー

ド Linux/RTドライバソフトウェア(GPG-4301/GPG-4304)」をインストールします。

すると、以下のモジュールファイルがインストールされます。

GPG-4301をインストールした場合>

ファイル名

内 容

rgpg4301.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

このドライバモジュール内の関数をRTLinuxモジュールから呼び出すことに

より、GP-IB I/Oモジュールを制御することができます。

rcp4301.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

実際にI/Oモジュールを制御するためのモジュールです。

dpg0100.o

弊社RTLinuxドライバ群の共用モジュールです。

dpg0102.o

弊社RTLinuxドライバ群の共用モジュールです。

GPG-4304をインストールした場合>

ファイル名

内 容

rgpg4304.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

このドライバモジュール内の関数をRTLinuxモジュールから呼び出すことに

より、GP-IB I/Oモジュールを制御することができます。

rcp4304.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

実際にI/Oモジュールを制御するためのモジュールです。

dpg0100.o

弊社RTLinuxドライバ群の共用モジュールです。

dpg0102.o

弊社RTLinuxドライバ群の共用モジュールです。

GPG-4301とGPG-4304の両方をインストールした場合>

ファイル名

内 容

rgpg4300.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

このドライバモジュール内の関数をRTLinuxモジュールから呼び出すこと

により、GP-IB I/Oモジュールを制御することができます。

rcp4301.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

実際にI/Oモジュールを制御するためのモジュールです。

rcp4304.o

GP-IB I/Oモジュール制御のドライバモジュール本体です。

実際にI/Oモジュールを制御するためのモジュールです。

dpg0100.o

弊社RTLinuxドライバ群の共用モジュールです。

(23)

★テストドライバについて

前頁のファイル以外に、GPG-4301/4304をインストールすると、rcp4301t.o/rcp4304t.oというファイ

ルが付属します。これは、I/Oモジュールがなくてもテストが行えるようにするための、テストド

ライバです。

rcp4301.o/rcp4304.oの代わりに組み込む

こと

で、I/Oモジュールを実装しなくても、各関数を実行す

ることができます。詳しい説明はHelpを参照してください。

ドライバモジュールの組み込みは、専用のスクリプトで簡単に行えます。

状 況

組み込むスクリプト

GPG-4301のみインストール

insgpibhg.sh

GPG-4304のみインストール

insgpibex.sh

GPG-4301とGPG-4304の両方をインストール

insgpib.sh

<GPG-4301 のみインストールの場合> # cd /usr/src/interface/gpg4301/i386/rtl/drivers # sh insgpibhg.sh <GPG-4304 のみインストールの場合> # cd /usr/src/interface/gpg4304/i386/rtl/drivers # sh insgpibex.sh <GPG-4301 と GPG-4304 の両方をインストールの場合> # cd /usr/src/interface/gpg4304/i386/rtl/drivers # sh insgpib.sh

モジュールが組み込まれているかどうかlsmodコマンドを使って確認します。

# sh insdpibhg.sh # lsmod

Module Size Used by

rgpg4301 2272 0 (unused) rcp4301 74112 0 [rgpg4301] dpg0102 5072 0 [rcp4301] dpg0100 4688 0 [rcp4301] rtl_sched 43200 0 [rcp4301 dpg0100] rtl_fifo 10016 0 (unused) rtl_posixio 7216 0 [rtl_fifo]

rtl_time 10064 0 [rtl_sched rtl_posixio]

rtl 27184 0 [rcp4301 dpg0102 dpg0100 rtl_sched rtl_fif o rtl_posixio rtl_time] 状 況 確認するモジュール名 GPG-4301のみインストール

dpg0100,dpg0102,rcp4301,rgpg4301

GPG-4304のみインストール

dpg0100,dpg0102,rcp4304,rgpg4304

GPG-4301とGPG-4304の両方をインストール

dpg0100,dpg0102,rcp4301,rcp4304,rgpg4300

ここでは、dpg0100,dpg0102,rcp4301,rgpg4301が組み込まれていることが分かります。以上で、GP-IB

I/Oモジュールのリアルタイム制御を行うプログラミングまでの準備が整いました。

(24)

ドライバモジュールの取り外しも、専用のスクリプトで簡単に行えます。 状 況 取り外すスクリプト GPG-4301のみインストール

rmgpibhg.sh

GPG-4304のみインストール

rmgpibex.sh

GPG-4301とGPG-4304の両方をインストール

rmgpib.sh

<GPG-4301 のみインストールの場合> # cd /usr/src/interface/gpg4301/i386/rtl/drivers # sh rmgpibhg.sh <GPG-4304 のみインストールの場合> # cd /usr/src/interface/gpg4304/i386/rtl/drivers # sh rmgpibex.sh <GPG-4301 と GPG-4304 の両方をインストールの場合> # cd /usr/src/interface/gpg4304/i386/rtl/drivers # sh rmgpib.sh

以上で下準備は終わりです。次からいよいよプログラミングを行っていきます。

★スクリプトを使わずに組み込むには? ドライバモジュールの組み込みは、スクリプトを使用する方が簡単なのでお奨めですが、直接ドライバモ ジュールを組み込むことも可能です。 以下に insmod コマンドを使った場合の組み込み例を示します。 insmod コマンドを使って、ドライバモジュールを組み込む場合> GPG-4301 のみインストール時: # insmod dpg0100 # insmod dpg0102 # insmod rcp4301 # insmod rgpg4301 GPG-4304 のみインストール時: # insmod dpg0100 # insmod dpg0102 # insmod rcp4304 # insmod rgpg4304 GPG-4301 と GPG-4304 の両方をインストール時: # insmod dpg0100 # insmod dpg0102 # insmod rcp4301 # insmod rcp4304 # insmod rgpg4300 rmmod コマンドを使って、ドライバモジュールを取り外す場合> GPG-4301 のみインストール時: # rmmod rgpg4301 # rmmod rcp4301 # rmmod dpg0102 # rmmod dpg0100 GPG-4304 のみインストール時: # rmmod rgpg4304 # rmmod rcp4304 # rmmod dpg0102 # rmmod dpg0100

(25)

GPG-4301 と GPG-4304 の両方をインストール時: # rmmod rgpg4300 # rmmod rcp4304 # rmmod rcp4301 # rmmod dpg0102 # rmmod dpg0100

3.2 GP-IB機器へのデータ送信

ここでは、GP-IB I/Oモジュールを使って、マルチメータ(Agilent34401A)に対して、簡単な送信を

行い、マルチメータのパネルに「HELLO」と表示させるプログラムを作成します。

HELLO

プログラム実行時に使用する製品

PCI-4302

1枚:GP-IBインタフェースI/Oモジュール

ECO-2220

1本:GPIB IEEE488準拠ケーブル(2.0m)

Agilent34401A

1台:マルチメータ(アジレント・テクノロジー社製)

下図に、接続構成を示します。

PCI-4302

ECO-2220

Agilent34401A

RSW1:0

I/Oモジュールと機器の接続構成

I/Oモジュール識別用ロータリスイッチ(RSW1)を0に設定し、コンピュータにGP-IB I/Oモジュールを実 装します。

マルチメータ(

Agilent

34401A)とGP-IB I/Oモジュールを、GP-IBケーブルで繋ぎます。 マルチメータのGP-IBアドレスは、22を設定してください。 エディタを起動し、List3-1に示すプログラムを入力して、ファイル名を『

sendtask.c

』として保存して ください。 ※

サンプルプログラムには、理解しやすいよう、日本語コメントを用いています。

しかし、プログラム中に日本語を用いてコンパイルすると、正常にコンパイルできない場合が

あります。その時は、日本語コメントを削除してコンパイルしてください。

(26)

List3-1

sendtask.c

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #include <rtl.h> #include <rtl_sched.h> #include "pcigpib.h"

#define GPIB_BOARDNO 0 /* GP-IB I/Oモジュールのデバイス番号 */ pthread_t send_task_info;

int adrs_tbl[] = { 22, -1 }; /* GP-IB機器アドレス */ char init_data1[] = "*RST"; /* 初期化用コマンド1 */ char init_data2[] = "*CLS"; /* 初期化用コマンド2 */ char send_data[] = "DISPlay:TEXT 'HELLO'"; /* パネル表示コマンド */ /* 送信処理を行うRTLinuxスレッド */

void* send_task(void* arg) {

int ret;

rtl_printf("send_task called arg=%d¥n", arg); do { /* 初期化コマンド1(*RST)を送信(Agilent34401Aをリセットします) */ ret = PciGpibExSendData(GPIB_BOARDNO, adrs_tbl, strlen(init_data1), init_data1, NULL); if(ret){

rtl_printf("SendData error[%d, %s]:ret=%d¥n", GPIB_BOARDNO, init_data1, ret); break;

} else {

rtl_printf("SendData success!![%d, %s]¥n", GPIB_BOARDNO, init_data1); } /* 初期化コマンド2(*CLS)を送信(レジスタクリア) */ ret = PciGpibExSendData(GPIB_BOARDNO, adrs_tbl, strlen(init_data2), init_data2, NULL); if(ret){

rtl_printf("SendData error[%d, %s]:ret=%d¥n", GPIB_BOARDNO, init_data2, ret); break;

} else {

rtl_printf("SendData success!![%d, %s]¥n", GPIB_BOARDNO, init_data2); } /* GP-IB機器のパネルにHELLOを表示させるコマンドを送信 */ ret = PciGpibExSendData(GPIB_BOARDNO, adrs_tbl, strlen(send_data), send_data, NULL); if(ret){

rtl_printf("SendData error[%d, %s]:ret=%d¥n", GPIB_BOARDNO, send_data, ret); break;

} else {

rtl_printf("SendData success!![%d, %s]¥n", GPIB_BOARDNO, send_data); }

}while(0);

(27)

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 /* 初期化関数(モジュールが組み込まれた時、呼ばれる関数) */ int init_module(void) { int ret; rtl_printf("init_module called¥n"); EXPORT_NO_SYMBOLS; /* GP-IB I/Oモジュールの初期化 */ ret = PciGpibExInitBoard(GPIB_BOARDNO, 0); if(ret){

rtl_printf("Board open error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -1;

} else {

rtl_printf("Board open success!! [%d]¥n", GPIB_BOARDNO); }

/* IFCを送出します */

ret = PciGpibExSetIfc(GPIB_BOARDNO, 1); if(ret){

rtl_printf("Set IFC error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -2;

} else {

rtl_printf("Set IFC success!! [%d]¥n", GPIB_BOARDNO); }

/* RENの設定(リモート状態にします) */ ret = PciGpibExSetRen(GPIB_BOARDNO); if(ret){

rtl_printf("Set REN error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -3;

} else {

rtl_printf("Set REN success!! [%d]¥n", GPIB_BOARDNO); }

/* データ送信のためのスレッドを生成、起動する */

return pthread_create(&send_task_info, NULL, (void*)send_task, 0); } /* 終了関数(モジュールが取り外される時、呼ばれる関数) */ void cleanup_module(void) { int ret; rtl_printf("cleanup_module called¥n"); /* GP-IB I/Oモジュールの終了処理 */ ret = PciGpibExFinishBoard(GPIB_BOARDNO); if(ret){

rtl_printf("Board close error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); } else {

rtl_printf("Board close success!! [%d]¥n", GPIB_BOARDNO); } /* データ送信のためのスレッドを削除 */ pthread_cancel(send_task_info); pthread_join(send_task_info, NULL); }

(28)

次に、

List3-2

に示すプログラムを入力し、ファイル名を『Makefile』として保存してください。こ

れは、上記プログラムをコンパイルするメイクファイルです。

List3-2 Makefile

1 2 3 4 5 6 include /usr/include/rtlinux/rtl.mk all: sendtask.o sendtask.o: sendtask.c

$(CC) $(INCLUDE) $(CFLAGS) -o sendtask.o -c sendtask.c

コンパイルすると、RTLinuxモジュールsendtask.oができます。insmodコマンドで、RTLinuxモジュー

ルを組み込みます。

# make # ls

Makefile sendtask.c sendtask.o # insmod sendtask.o

組み込む前に、リスト中のrtl_printf関数の出力内容が画面で確認できるよう、X Windowで使用さ

れている方は、コンソールをもう一つ立ち上げ、次のコマンドを入力してください。

#tail –f /var/log/messages

コンソール画面で作業されている方は、次のように打ち込んでください。

#tail –f /var/log/messages &

これにより、rtl_printf関数が出力する内容が、画面に表示されるようになります。

★/var/log/messages

syslog や cron 等で実行されたサービスのログ等の情報は、「/var/log/」に保存されます。通常、ログは 「/var/log/messages」に保存されることが多いです。 RTLinux では、rtl_printf 関数を使って、ここに出力し、デバッグプリントができるようになっています。 (そのままコンソール画面に出力されるようには、なっていません) 上の用例では、tail コマンドを使って、このログ出力を常に表示状態にしています。 コンソール画面の例で用いた&(アンパサンド)コマンドはジョブコマンドの一種で、tail コマンドをバッ クグランドで実行させています。 コンソール画面では、X Window のように幾つもコンソールを起動することができないので、このように します。

sendtask.oを組み込むと、コンソールに以下のメッセージが出力され、Agilent34401Aのパネルに

「HELLO」と表示されます。

# insmod sendtask.o init_module called

Board open success!! [0] Set IFC success!! [0] Set REN success!! [0] send_task called arg=0 SendData success!![0, *RST] SendData success!![0, *CLS]

(29)

次に、組み込んだRTLinuxモジュールを取り外します。

コンソールに以下を入力し、Enterキーを押します。

# rmmod sendtask

すると、コンソール画面は、以下のメッセージが表示されます。

# rmmod sendtask cleanup_module called Board close success!! [0]

3.3 GP-IB機器へのデータ送信プログラムの解説

それでは、先程のプログラムの解説を行います。

まず、プログラムの動作概要を示します。

sendtask.o RTLinux モジュール RTLinux 組み込み(insmod) 取り外し(rmmod) init_module 関数 cleanup_module 関数 send_task 関数 破棄 生成

GP-IB機器へのデータ送信プログラムの動作概要

作成したRTLinuxモジュールをinsmodコマンドでRTLinuxに組み込む時、init_module関数が呼ばれ

ます。init_module関数ではPciGpibExInitBoard関数を呼び出し、I/Oモジュールの初期化処理を行っ

ています。I/Oモジュールの初期化に成功すれば、IFCの送出,RENの設定を行い、データ送信を行

うスレッド(send_task関数)を生成しています。

また、rmmodコマンドでモジュールを取り外す時、cleanup_module関数が呼ばれます。

cleanup_module関数では、スレッドの破棄、およびPciGpibExFinishBoard関数により、GP-IB I/Oモ

ジュールの終了処理を行っています。

(79∼103行目:GP-IBの初期化)

79行目のPciGpibExInitBoard関数により、指定したI/Oモジュールの初期化を行います。初期化する

I/Oモジュールの指定は、第1引数のデバイス番号により行います。

この関数を呼び出すことで、その他の関数の呼び出しができるようになります。

★デバイス番号 デバイス番号は、制御する GP-IB I/O モジュールを区別する一意の ID 値です。 これにより、複数の GP-IB I/O モジュールを同時に制御することが可能となります。例えば、デバイス 番号 0 の I/O モジュールに対してデータの送信、デバイス番号 5 の I/O モジュールに対してシリアルポー ルという風に制御を行います。

GP-IB ドライバモジュールでは、I/O モジュール上の RSW(I/O モジュール識別ロータリスイッチ)の値が、 デバイス番号として用いられます。

(30)

GP-IB I/Oモジュールに接続したGP-IB機器は、通常そのままではデータの伝送は行えません。接

続した機器に対して準備作業が必要となります。これが、GP-IBの初期化です。

ここではIFC送信(88行目のPciGpibExSetIfc関数),REN設定(97行目のPciGpibExSetRen関数)を行って

います。この初期化の手続きは、使用する機器により異なります。

★IFC(Interface Clear) 全ての機器に対する GP-IB インタフェース機能の初期化要求です。 システムコントローラのみが IFC を送信できます。IFC を送信した機器は、コントローラ・イン・ チャージ状態となります。 例えて言うならば、会議を開始する際、司会役の人間が会議の開始を宣言するようなものです。 ★REN(Remote Enable) 全ての機器をローカル状態(論理的にバスから切り離された状態)から、リモート状態(論理的にバスに接 続された状態)に切り替えます。機器に RL 機能がある時にのみ有効です。

リモート状態になると、RL 機能を搭載した GP-IB 機器は GP-IB I/O モジュールからの制御のみを受け付 ける状態となり、操作パネルからの操作を受け付けない状態となります。 ローカル状態は、機器の操作パネルからの操作が可能です。

(106行目:pthread_create関数)

pthread_create関数では、GP-IB機器へのデータ送信を行う、RTLinuxスレッド(send_task)を生成し

ています。

(24∼63行目:GP-IB機器へのデータ送信)

16行目からはじまるsend_task関数は、GP-IB機器へのデータ送信を行います。

24∼63行目のPciGpibExSendData関数により、GP-IB機器に対してデータを送信します。

GP-IB機器はデータ送信された内容に従って、何らかの処理を行います。

送信内容

処理内容

24行目 "*RST"

Agilent34401Aを電源投入時の状態にリセットします。

38行目 "*CLS"

Agilent34401A内の各レジスタをクリアします。

52行目 "DISPlay:TEXT

'HELLO'"

フロントパネルに、指定されたメッセージを表示させます。

ここでは、’HELLO’を表示させています。

★ 送信内容の注意点 ここで送信している内容が、他の GP-IB 機器に対して そのまま使用できるとは限らないことに注意して ください。同じことを実現するのに、使用する GP-IB 機器によっては、全く異なるデータを送信しなけ ればならない場合があります。 送信すべき内容については、各 GP-IB 機器のマニュアルを参照してください。

PciGpibExSendData関数の第2引数では、送信する相手を示すアドレステーブルを渡しています。

アドレステーブルに記述されたGP-IB機器に対して、データ送信が行われます。9行目のadrs_tbl配

列変数がアドレステーブルを指します。ここでは1次アドレス22の機器に対してコマンド送信を行

っています。

(31)

★データ送信時のアドレステーブルの指定について アドレステーブルは、1 次、2 次アドレスを混在し、複数台の機器を指定することができます。機器のア ドレスは、int 型(整数型)の配列に機器のアドレスを設定して使用します。機器アドレスを指定する場合 は、終端として必ず-1 を格納するようにしてください。 以下に幾つか例を示します。 <2 台の GP-IB 機器(両方共 1 次アドレスのみ)を指定する場合> int adrs_tbl[] = { 14, 21, -1 }; 2 台目:1 次アドレス 21 の GP-IB 機器 1 台目:1 次アドレス 14 の GP-IB 機器 終端 <1 台の GP-IB 機器だが、2 次アドレスを持つ機器を指定する場合> int adrs_tbl[] = { 14, 96, -1 }; 1 次アドレス 14、2 次アドレス 96 の GP-IB 機器 (1 次アドレス,2 次アドレスの順に記述します) 終端 <2 台の GP-IB 機器(片方が 2 次アドレスあり、片方が 1 次アドレスのみ)を指定する場合> int adrs_tbl[] = { 14, 96, 21, -1 }; 2 台目:1 次アドレス 21 の GP-IB 機器 1 台目:1 次アドレス 14、2 次アドレス 96 の GP-IB 機器 終端

(117∼122行目:I/Oモジュールの終了処理)

PciGpibExFinishBoard関数により、I/Oモジュールの終了処理を行います。GP-IB I/Oモジュールを

オープンしたら、必ずクローズするようにしてください。

★PciGpibExFinishBoard 関数を呼ばないとどうなるか?

PciGpibExFinishBoard 関数を呼ばないと、GP-IB I/O モジュールはオープンしたままの状態になります。 オープン状態なので、PciGpibExInitBoard 関数を呼び出した場合、エラーが返ります。

このような場合、対処方法としては、GPG-4301/4304 ドライバモジュール(rcp4301/rcp4304/rcp4300)を、 一旦取り外す必要があります。

(32)

3.4 GP-IB機器からのサービスリクエスト(SRQ)を捉える

GP-IB機器によっては、機器内で発生した事象の変化(計測完了,エラー検出等)をコントローラ

(GP-IB I/Oモジュール)に伝えるために、サービスリクエスト(SRQ)を発行するものがあります。弊

社製品は、このサービスリクエストを割り込みとして検知し、プログラムにて登録されたコール

バック関数を呼び出すことで、事象の変化を伝達する仕組みを提供しています。

ここでは、Agilent34401Aに対して電圧の計測を指示し、計測完了時に発生するサービスリクエス

トをコールバック関数で捉え、シリアルポーリングを行い、Agilent34401Aから計測したデータを

受信するプログラムを作成します。

エディタを起動し、List3-3に示すプログラムを入力し、ファイル名を『srqevent.c』として保存し

てください。

List3-3 srqevent.c

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #include <rtl.h> #include <rtl_sched.h> #include "pcigpib.h"

#define GPIB_BOARDNO 0 /* GP-IB I/Oモジュールのデバイス番号 */ #define ADRS_TBL_SIZE 2 /* GP-IB機器アドレステーブルの配列サイズ */ #define RECV_DATA_SIZE 80 /* 受信バッファのサイズ */

#define DELIM_SIZE 2 /* 受信時のデリミタサイズ(CRLF) */ pthread_t send_task_info;

int adrs_tbl[ADRS_TBL_SIZE] = { 22, -1 }; /* GP-IB機器アドレステーブル */

/* コールバック関数 */

void srq_callback(unsigned long ulEventFactor, unsigned long ulUserData) {

int i, ret;

int device_no = (int)ulUserData; int stb_tbl[ADRS_TBL_SIZE]; int stb_adrs[ADRS_TBL_SIZE]; char recv_data[RECV_DATA_SIZE]; long recv_size;

rtl_printf("srq_callback called [%#lx, %ld]¥n", ulEventFactor, ulUserData);

/* SRQイベントかチェック */

if(ulEventFactor & GPIB_DETECT_SRQ){ /* シリアルポール実行 */

ret = PciGpibExExecSpoll( device_no, adrs_tbl, stb_tbl, stb_adrs); if(ret){

rtl_printf("Serial poll error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return;

} else {

rtl_printf("Serial poll success!!¥n"); } /* シリアルポールの結果を表示 */ /* 注意事項: コードを簡素化するため、GP-IB機器が1次アドレスのみで構成されている 前提で処理しています。 */

for(i = 0; i < ADRS_TBL_SIZE; i++){ if(stb_tbl[i] == -1) break;

rtl_printf("no.%d status byte=%02x addrss=%d¥n", i, stb_tbl[i], stb_adrs[i]); }

(33)

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 /* Agilent34401Aから、データの受信 */ recv_size = RECV_DATA_SIZE - DELIM_SIZE; ret = PciGpibExRecvData( device_no, stb_adrs, &recv_size, recv_data, NULL); recv_data[recv_size] = '¥0';

rtl_printf("PciGpibExRecvData [%d, %d, %s]¥n", ret, recv_size, recv_data); }

}

/* 送信処理を行うサブルーチン(0=成功) */ int send_data(char* send_data)

{

int ret;

rtl_printf("send_data called [%s]¥n", send_data); /* Agilent34401Aに対して、データの送信 */ ret = PciGpibExSendData(GPIB_BOARDNO, adrs_tbl, strlen(send_data), send_data, NULL);

rtl_printf("send_data %s [ret=%d]¥n", (ret == 0) ? "success!!" : "error", ret); return ret;

}

/* 送信処理を行うRTLinuxスレッド */ void* send_task(void* arg)

{

rtl_printf("send_task called arg=%d¥n", arg); do { /* Agilent34401Aをリセットします */ if(send_data("*RST") != 0) break; /* レジスタクリアします */ if(send_data("*CLS") != 0) break; /* SRQ割り込みを有効にします */ if(send_data("*SRE 16") != 0) break; usleep(100L * 1000); /* ウェイト100ms */ /* 電圧測定を行います */ if(send_data("MEASure:VOLTage:DC?") != 0) break; /* 補足説明 上の電圧測定を指示し、電圧を測定完了すると、Agilent34401Aは SRQ割り込みを発生させます。 ドライバモジュールは、SRQ割り込みを検出した後、srq_callback 関数を呼び出します。 */ }while(0); return 0; } /* 初期化関数(モジュールが組み込まれた時、呼ばれる関数) */ int init_module(void) { int ret; rtl_printf("init_module called¥n"); EXPORT_NO_SYMBOLS; /* GP-IB I/Oモジュールの初期化 */ ret = PciGpibExInitBoard(GPIB_BOARDNO, 0); if(ret){

rtl_printf("Board open error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -1;

(34)

127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 } /* IFCを送出します */ ret = PciGpibExSetIfc(GPIB_BOARDNO, 1); if(ret){

rtl_printf("Set IFC error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -2; } /* RENの設定(リモート状態にします) */ ret = PciGpibExSetRen(GPIB_BOARDNO); if(ret){

rtl_printf("Set REN error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -3; } /* イベントマスクおよびコールバック関数登録設定 */ ret = PciGpibExSetEventMask(GPIB_BOARDNO, GPIB_DETECT_SRQ, srq_callback, GPIB_BOARDNO); if(ret){

rtl_printf("Set event mask error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); return -4;

}

/* データ送信のためのスレッドを生成、起動する */

return pthread_create(&send_task_info, NULL, (void*)send_task, 0); } /* 終了関数(モジュールが取り外される時、呼ばれる関数) */ void cleanup_module(void) { int ret; rtl_printf("cleanup_module called¥n"); /* GP-IB I/Oモジュールの終了処理 */ ret = PciGpibExFinishBoard(GPIB_BOARDNO); if(ret){

rtl_printf("Board close error[%d]:ret=%d¥n", GPIB_BOARDNO, ret); } else {

rtl_printf("Board close success!! [%d]¥n", GPIB_BOARDNO); } /* データ送信のためのスレッドを削除 */ pthread_cancel(send_task_info); pthread_join(send_task_info, NULL); }

次に、List3-4に示すプログラムを入力し、ファイル名を『Makefile』として保存してください。こ

れは、上記プログラムをコンパイルするメイクファイルです。

List3-4

Makefile

1 2 3 4 5 6 include /usr/include/rtlinux/rtl.mk all: srqevent.o srqevent.o: srqevent.c

$(CC) $(INCLUDE) $(CFLAGS) -o srqevent.o -c srqevent.c

コンパイルすると、RTLinuxモジュールsrqevent.oができます。insmodコマンドで、RTLinux

モジュールを組み込みます。

# make # ls

Makefile srqevent.c srqevent.o # insmod srqevent.o

(35)

srqevent.oを組み込むと、コンソールに以下のメッセージが出力され、Agilent34401Aからのサービ

スリクエストの検知とコールバック処理が行われたことがわかります。

# insmod srqevent.o init_module called

Board open success!! [0] send_task called arg=0 send_data called [*RST] send_data success!! [ret=0] send_data called [*CLS] send_data success!! [ret=0] send_data called [*SRE 16] send_data success!! [ret=0]

send_data called [MEASure:VOLTage:DC?] send_data success!! [ret=0]

srq_callback called [0x4000000, 0] Serial poll success!!

no.0 status byte=50 addrss=22

PciGpibExRecvData [0, 15, +5.98390000E-05]

次に、組み込んだRTLinuxモジュールを取り外しは、rmmodコマンドで行います。

# rmmod srqevent

3.5 GP-IB機器からのサービスリクエスト(SRQ)を捉えるプログラム

それでは、先程のプログラムの解説を行います。

まず、プログラムの動作概要を示します。

RTLinux srqevent.o RTLinux モジュール 組み込み(insmod) 取り外し(rmmod) init_module 関数 cleanup_module 関数 コールバック生成 srq_callback 関数 シリアルポール実行/受信 SRQ 発行 GP-IB機器からのサービスリクエストを捉えるプログラムの動作概要

作成したRTLinuxモジュールをinsmodコマンドで組み込むと、GP-IBの初期化処理を行い、コール

バック関数の登録を行います。PciGpibExSetEventMask関数により、コールバック関数の登録と、

イベントマスクの設定を行います。

GP-IB機器からサービスリクエスト(SRQ)が発行された時、コールバック関数が呼ばれ、シリアル

ポールとデータの受信処理が行われます。

参照

関連したドキュメント

SVF Migration Tool の動作を制御するための設定を設定ファイルに記述します。Windows 環境 の場合は「SVF Migration Tool の動作設定 (p. 20)」を、UNIX/Linux

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

IDLE 、 STOP1 、 STOP2 モードを解除可能な割り込みは、 INTIF を経由し INTIF 内の割り. 込み制御レジスター A で制御され CPU へ通知されます。

(a) 主催者は、以下を行う、または試みるすべての個人を失格とし、その参加を禁じる権利を留保しま す。(i)

の知的財産権について、本書により、明示、黙示、禁反言、またはその他によるかを問わず、いかな るライセンスも付与されないものとします。Samsung は、当該製品に関する

次に、第 2 部は、スキーマ療法による認知の修正を目指したプログラムとな

手動のレバーを押して津波がどのようにして起きるかを観察 することができます。シミュレーターの前には、 「地図で見る日本