Comments
Description
Transcript
DCモーター過渡現象解析用高速自動測定システム開発
卒 業 研 究 題 報 告 目 DC モーター過渡現象解析用高速自動測定システム開発 指 導 河津 教 哲 員 教授 報 告 者 学籍番号:1040202 氏名 北地 敦明 平成 高知工科大学 16 年 2月 9日 電子・光システム工学科 目 1 前書き 2 目的 3 フィードバック理論 4 次 3−1 フィードバック制御の構成 3−2 フィードバック制御の利点と欠点 3−3 フィードバック伝達関数 構築回路 4−1 構築基準 4−2 素子特性 (1)PN接合 (2)発光ダイオード(LED) (3)受光トランジスタ(フォトトランジスタ) 4−3 5 6 制作回路 構築システム 5−1 基本原理 5−2 概要 5−3 使用装置 プログラム 6−1 自動測定 6−2 測定プログラム説明 6−3 プログラミング原理 1 7 8 モーター立ち上がり速度・モーター回転数測定実験 7−1 システム確認 7−2 予測 7−3 システムの基本動作確認 7−4 フィードバック係数の効果 7−5 電流制限による効果 7−6 負荷抵抗を用いた測定 7−7 コンデンサ用いた測定 9 考察及びまとめ 8−1 考察 8−2 まとめ 謝辞 10 参考文献 11 付録 作成プログラム エクセル 測定結果 2 1 前書き 近年の技術革新の中で、今日情報化の波も押し寄せてきています。そのなかで必要とさ れているパーソナルコンピュータが、世の中のすべてのものを制御しています。また、L SIの微細化・高速化が進んできているので、制御スピードが高速になってきています。 その中で制御技術は自動車、ディジタル家電と言われている、冷蔵庫・炊飯器・洗濯機・ 掃除機といった物や。また、携帯電話・DVDプレイヤー・ディジタルカメラ・パソコン・ 液晶テレビ・といったマルチメディア製品にいたるものや、人工衛星・旅客機・新幹線等 といった直接生活に関係の無い物まで、制御されています。 これらの事を感じていたので、フィードバック制御を用いたモーター制御を行いたいと 思い、「DCモーター過渡現象用高速自動測定システムの開発」と銘打って卒業研究にして システム開発を目的とする。 3 2 目的 今回の卒業研究を進めていく上で、必要とされる問題点または、テーマを次の3点を目 的として卒業研究を行った。 2−1 先輩の行った研究で取得されたデータの問題点の改良 2−1−1 立ち上がりの特性 2−1−2 フィードバック係数 2−1−3 前年度及び前々年度卒業研究のテーマの結合 2−2 パソコンを用いて高速自動測定制御の技術取得 2−3 今回の卒業研究を通して生きた技術を身につける事 4 3 フィードバック理論 3−1 フィードバック制御の構成 制御対象の出力である制御量センサーによって観測され、目標値(reference)との比較によ りその差が計算される。この情報に基づき制御器(controller)が操作部での操作量を決定し、 制御対象に反映させることをフィードバック(feedback)という。また、このようなシステム (制御方法)をフィードバック制御(feedback control)と呼んでいる。 ここに標準的なフィードバック制御系のブロック線図と図の用語の説明を図3−1、 表13−1(付録)に示す。 外乱 動作信号 目標値 基準入力 要素 制御信号 制御器 主フィード バック量 操作量 操作部 フィード バック要素 制御装置 図3−1 フィードバック制御の標準構成 5 制御対象 出力 3−2 フィードバック制御の利点と欠点 現在の制御系では、ほとんどの制御にフィードバック制御が用いられている。その理由 は、制御対象の特性を正確に把握する事が難しく、外乱が避けられない事が多いため、フ ィードバック制御を用いるとこれらの影響を抑制できるためである。しかし、図3−1で 示すように、フィードバックは基本のフィードバック信号と目標値を比較して入力値を決 めているので、多少の応答に対する適応性に欠点が見られる。 また、フィードバックを敏感に効くようにすると速度が周期的に大きく変動するハンチ ングが起きるので、制御系を安定に保つ事がフィードバック制御の今後の課題でもある。 しかし、上述したような事が現実には起こるため、これらがフィードバック制御の基本と なっている。 さらに近年マイクロプロセッサの発達・普及によりサンプル値制御(sampled data control)の理論に基づいたディジタル制御(digital control)が広く用いられている。ディ ジタル制御系の一般的な構成図を図3−2に示す、図3−1のフィードバック制御系と異 なる点は、制御装置がA/D,D/A変換機及びマイクロプロセッサで置き換えられてい ることである。 図3−2 ディジタル制御系 上述のように、制御系にはさまざまなものがあるが、良い制御系はつぎのような条件 を満足しなければならない。 (a)制御系が安定に動作する (b)目標値変化に対して、出力がすばやく追従する (c)外乱の影響を抑えることができる (d)制御対象の特性の経年変化にも対応できる 6 3−3 フィードバック伝達関数 図3−3 r v u f y n 伝達関数図 目標値 フィードバック量 操作量 外乱(雑音等) 出力と信号 センサノイズ 三つの構成要素である、y・v・n出力が入力の和(もしくは差)の線形関数であると する。そのとき考えられる方程式は y = P (d + u ) v = F ( y + n ) u = C (r − v ) 式3−1で表すことができる。 7 (式 3−1) 次に、式3−1にx1・x2・x3を図3−3のように加える。そのときの信号との関 係式は式3−2に示す。 x 1 = r − Fx 3 x 2 = d + Cx 1 x 3 = n + Px 2 (式 3−2) また、式3−2の式を行列式に変換すると式3−3となる。 1 − C 0 0 1 − P F 0 1 x1 r x 2 = d (式 3−3) x 3 n と示すことができる。 よって、システムが適切であるための必要な条件は、式3−3で示す通り3×3行列が正 則、行列式1+PCF が恒等的には0でないということになる。 8 4 構築回路 4−1 構築基準 フォトダイオードを用いる方法と、フォトトランジスタを用いる方法を試みて、どちら の素子を使用すれば、効率が良いのかを確かめた。 フォトダイオードを使用したときの回路図は図4−1に示す。 図4−1 LED−フォトダイオード回路 フォトダイオードを用いる回路は、フォトダイオードの受光感度が低いため、フォトダ イオードからの信号をトランジスタで電流増幅する必要がある。 9 フォトトランジスタを使用したときの回路図は図4−2に示す。 図4−2 LED−フォトトランジスタ回路 フォトトランジスタを使用した場合、フォトトランジスタの光・電流変換効率が高いの で、増幅回路で電圧を増幅しなくても良いという利点がある。また、フォトトランジスタ の前に抵抗を組み込む事で、5V電源がオンになった場合にフォトトランジスタにコレク タ電流が流れ込まなくなるので、フォトトランジスタはオフの状態になる。反対に、フォ トトランジスタの後ろに抵抗を組み込む事により、5V電源がオンになったときにフォト トランジスタはオンの状態になり、エミッタに電流が流れフォトトランジスタが作動する。 双方の回路を検討した結果、室内の光量(蛍光灯、窓から入る太陽光)の変化に対する 安定性の良いので、今回の測定実験ではフォトトランジスタ方式を使用した回路を採用す る。 10 4−2 素子特性 構築システムを構築するために必要な回路を作成する。回路には発光ダイオード(LE D)と受光トランジスタ(フォトトランジスタ)を使用する。これには回路設計技術が必 要となってくる。 使用するLEDとフォトトランジスタの特性を知っておく必要がある。また、そのため には半導体デバイスの基礎を知っておく必要がある。 次頁からPN接合、LED、フォトトランジスタ特性の原理について述べる。 11 (1) PN接合 PN接合(PN junction)とは、P型半導体の表面とN型半導体の表面を接触させ、その 境界面で双方の半導体の原子が直接的に結合するようにしたものである。 では、実際にはどのように半導体に電流が流れるのか。それは、P型半導体とN型半導 体のエネルギーバンド図で示すと理解しやすいので、N型半導体とP型半導体を対比させ た図4−3を下記に示す。 Efp:P型半導体のフェルミレベル Efn:N型半導体のフェルミレベル Ei :真性フェルミレベル 図4−3 P型半導体とN型半導体の電子と正孔の状態とエネルギーバンド図 12 P型半導体の多数キャリアは正孔であるが、少数キャリアとしての電子も存在し、N型 半導体の多数キャリアは電子で、少数キャリアとして正孔が少量存在している。また、P 型半導体のフェルミレベルは禁止帯の下に、N型半導体のフェルミレベルは禁止帯の上方 に位置している。これは、前頁にある図4−3でも確認が出来る。 P型半導体、N型半導体双方のキャリアの移動によって、N型半導体の接合境界部付近 のドナーは電子を放出し、正イオンとなる。また、P型半導体の接合境界部付近では、ア クセプタが正孔を放出し、負イオンとなる。この結果、P型半導体、N型半導体双方のフ ェルミレベルEfが一致するので、接合部付近には拡散電位差Vdにより、内部電界が発 生する。 P型半導体とN型半導体との接触による、正孔と電子のそれぞれ反対の領域へ向かう拡 散移動は、拡散電位差による電界がキャリアを流す量と、拡散で移動できる量とが等しく なった条件安定する。 空間電荷領域には、ドナーやアクセプタにより変化した電子や正孔等のキャリアは存在 しなくなるので、空乏層(depletion layer)と呼ばれる。 またPN接合では、P型領域とN型領域を比べるとN型領域の電位が高くなるのでエネ ルギー差が生じる、このエネルギー差をエネルギー障壁という。 PN接合に電圧をかけるとエネルギー障壁により、エネルギーの高低が生じ電流が流れ たり流れなかったりといった現象が起こったりする。そのためにオームの法則が通用しな い。電圧をかけたときに、電流が流れる方を順バイアス、電流が流れない方を逆バイアス という。この時の状態を図4−4に示す。 P型 電子 電圧 電圧 (−) (+) 順バイアス 空乏層 N型 電子 (+) 正孔 P型 正孔 電圧 N型 (−) 逆バイアス 図4−4 順・逆バイアスの概念図 13 電圧 (2) 発光ダイオード(LED) 発光ダイオード(Light Emitting Diode:LED)は PN 接合ダイオードの順方向状態に おいて、電子と正孔(ホール)の再結合による発光を積極的に行うようにしたものである。 では、どのようにして再結合が行われているのだろうか。N 型領域の伝導帯の電子が P 型領域の伝導帯に流れ込む。この結果、外部回路には順方向電流が流れる。 どのようなプロセスで順方向に電流が流れるようになっているのか。図4−5に示すよ うに、接合面を通過して P 型領域に注入した電子や、N 型領域に注入した正孔等の少数キ ャリアは、それぞれの領域で電子と正孔と出会うために結合する。すなわち、再結合をお こす。 例をあげると、 P 型領域に注入した電子のいくつかは、P型領域にもともと存在してい た正孔と出会う。つまり、正孔は共有結合にかかわった電子の抜け殻なので、そこに電子 がはまり込む。このような電子と正孔の再結合がそれぞれの半導体の中で生じている。 P型領域に注入された(入れられた)電子は位置のエネルギーを持っている。しかし、 電子は正孔との再結合によって静止するため、このエネルギーを「光」の形で放出する。 同様に、N型領域に注入された正孔は、電子との再結合でエネルギーを「光」の形で放出 する。 図4−5 発光ダイオードの発光モデル 14 エネルギーバンド図で前頁の発光過程を見てみる。すると、図4−6に示すように、外 部より電圧が印加されていないときの、エネルギーバンドはフェルミレベルが一致するた め、P型領域のほうがN型領域よりも高くなる。この状態で、順方向にバイアス電圧 Va を印加する、するとN型領域のフェルミレベルは印加した電圧分のエネルギー[q・Va]だけ 上昇し、N型領域の伝導帯もその分だけ上昇する。このため、電子はP型領域に注入する (入れる)。そして電子と正孔との出会いが生じて再結合が起こる。このときに、電子の持 っていた位置エネルギーが光として放出される。 このときに運動量の変換を必要としない材料は(例えば、Ⅲ−Ⅴ族半導体)では、電子・ 正孔の結合が容易になり、発光する。逆に Si(シリコン半導体)のように運動量の変化を 必要とする材料では再結合エネルギーは熱エネルギーとなる。 図4−6 発光過程を示す概念図 15 (3) 受光トランジスタ(フォトトランジスタ) バイポーラトランジスタを利用し、光を外部より受光してこれを電気信号に変換する半 導体デバイスがある。このデバイスのことをフォトトランジスタ(Photo Transistor)とい う。図4−7にあるように、通常のバイポーラトランジスタのようにベース領域に電極を 設けず、電極の変わりに受光窓を設けて受光できる構造となっている。図4−6のように、 ベース・コレクタの接合部に逆バイアスがかかるように、バイアス電圧をエミッタ・コレ クタ間に加える。この状態で、ベース領域に光を照射すると、光のエネルギーを受けてN 型半導体では電子・正孔対が発生する。 図4−7 フォトトランジスタの構造図 このときのエネルギーバンドは、図4−8のようになる。光の照射によってベース領域 にある価電子帯の電子が励起し、禁止帯を通り抜け伝導帯に入る。このときに、電子−正 孔対が発生する。この現象はベース領域で行われる事が多いが、コレクタ領域・エミッタ 領域でも生じる。またこのようにして発生した電子は、エネルギーレベルが低い状態にあ るベース領域に留まる。反対に正孔はベース領域を拡散して、コレクタ領域に流れる。ま た、逆バイアス電圧に引かれ電位差で生じた坂をあがる。 このときベース領域は正の電位となる。この現象はベース電極に外部から、正のバイア ス電圧を印加させたのと同じで、コレクタ電流が流れる。この電流は、光の照射によって 発生する電子・正孔対の数よりもはるかに多いキャリアにより作られる。これらによって、 光電流の増幅が行われたことになる。 これは、光増倍効果(photo multiplication effect)といわれる現象である。 余談だがフォトトランジスタは、発光ダイオードの光を受光して電気信号に変換する用 途に多く使用される。バーコードの読み取りや、モーターの回転数の測定などがある。 16 図4−8 フォトトランジスタのエネルギーバンド 17 4−3 製作回路 ・光センサー部 今回構築したシステムでは、回転数を計測するために発光素子として発光ダイオード、 受光素子として受光トランジスタを利用した。 現在多種多様なセンサーが存在しているが、その中で近接覚センサーという比較的近距 離において対象物の存在の認識、衝突の防止、形状計測、視覚センサーの位置検出誤差の 補正などを測定するセンサーがある。 そのセンサーには、接触型と非接触型がある。そのなかでも、光学式のものが光センサ ーであり透過型と反射方とに分けられる。 (1) 透過型 発光素子と受光素子を対向させて光量の変化を利用し、物体の有無を検出するタイ プの事を透過型という。物体の有無・物体の通過等の検出に利用する。 (2) 反射方 発光素子から出た光が物体で反射され受光素子に受光されるタイプを反射型という。 光量が物体までの距離に比例する範囲を利用すれば距離の測定が出来る。また、これ も物体の有無を検出できる。 今回の研究では、距離の測定を行わないため透過型の光センサーを利用した。 18 製作した回路を図4−9に示す。また、外観写真を図4−10に示す。 図4−9 図4−10 製作回路図 製作回路写真(Ⅰ) 図4―10 製作回路写真(Ⅱ) (Ⅰ)はプロトタイプ、(Ⅱ)はプロトタイプ(Ⅰ)の改良版である。 19 5 構築システム 5−1 基本原理 発光ダイオード(LED)に直流電圧を与えて一定量発光させる。モーターの軸にシュ リンクチューブをジョイントとして使用しモーター2 個を接合させ、その接合部に切り込み を入れた回転羽を取り付け回転させて、発光ダイオードからの光をチョッピングし受光ト ランジスタ(フォトトランジスタ)を用いた光検出回路に導き、電流を電圧に変換を行い、 光検出回路からの出力として電圧が出力される。また、接続されたモーターは発電機とし て使用されるので、発生電圧をコンデンサで出力波形を平滑化させた電圧を出力させる。 また、負荷抵抗を付加することにより電気的に機械負荷を与えることが出来る。 モーターへの電力供給は、前々年度の卒業研究で使用した電流増幅アンプは最大2Aま での装置だった。今回の卒業研究で使用する電流増幅アンプは最大10Aまで使用可能な ので電流源/主電圧源として電流制御量を変えられる、直流電源を用いる この二つの信号をA/Dボードによりディジタル信号に変換され、パソコンで読み取る 事ができ、光出力の周期を求めることにより、モーターの回転速度の時間的変化・モータ ーの立ち上がりの直流電圧を導き出す。 20 5−2 概要 5−1基本原理で述べている事を解りやすくするために、概要図で示した。 D/Aボードから出力される電流では、モーターを直接動作させるほどの電流が流れな いので、電流増幅アンプを使用した。この電流増幅アンプは前々年度の卒業研究で使用し たものが最大2Aまで使用できる。また、今回のテーマの1つである電流制限による効果 を確認するために最大10Aの電流増幅アンプを使用する。 測定システムの概要図を図5−1に示す。 ※ PC ・・・ パソコン ※ PTr ・・・ フォトトランジスタ ※ LED ・・・ 発光ダイオード ※ D/A ・・・ ディジタル・アナログ変換 ※ A/D ・・・ アナログ・ディジタル変換 図5−1 測定システム概要図 21 5−3 使用装置 今回の研究で使用した装置の詳細を示す。 A/D・D/A変換複合ボードは 0∼10Vまでのユニポーラを指す。 (1) PC(パソコン)IBM 社の Aptiva を使用した。 構築したシステムの入出力表示装置・コントローラとして使用する。 開発言語には Microsoft Visual Basic 6.0(VB)を使用した。 (2) D/A・A/D変換複合ボード Interface 社の PCI−3522A(12ビット 入力8点出力4点10V 単一レンジ) を使用した。 D/A変換ボートは、ディジタル信号をアナログ信号へと変換するものであり、 A/D変換ボードは、アナログ信号をディジタル信号へと変換するもの。 D/A・A/D変換複合ボードは、D/A変換・A/D変換機能を一枚のボード 上で実現しているものである。 D/A・A/D変換複合ボードの使用を表5−1に示す。 D/A・A/D変換複合ボードの外観図を図5−2に示す。 22 表5−1 A/D・D/A変換複合ボードの仕様 項目 仕様 入力チャンネル数 8チャンネル A 入力レンジ ユニポーラ D 入力インピーダンス 10MΩ以上 変 分解能 12ビット 換 相対精度 ±1LSB(MAX) (25℃) 部 誤差 ±0.2%(MAX) (0∼50℃) 変換時間 10μs 出力仕様 出力電流 D 出力チャンネル 4チャンネル A 出力レンジ ユニポーラ 変 出力インピーダンス 1Ω 換 分解能 12ビット 部 相対精度 ±1LSB(MAX) (25℃) 誤差 ±0.4%(MAX) (0∼50℃) セトリングタイム 10μs 23 0∼+10V 5mA 以下 0∼+10V 図5−2 ボード外観図 計測速度に関しては、Interface 社 PCI−3522A ではA/D変換・D/A変換共に 10μsと高速であり、モーター制御に必要な1ms毎のフィードバック制御に対応するこ とが出来る。 分解能に関しては測定誤差を検討する必要がある。A/D変換を行うことにより生じる 量子化誤差について述べる。 量子化誤差とは、連続したアナログ信号をディジタル信号に変換する際、図5−3(a) に示す。図5−3(a)に示す通り、時間間隔ΔT毎の瞬時値に標本化(サンプリング)を 行い、標本化処理を行った瞬時値をΔT毎の時間間隔にわたって保持し、同時に信号が離 散値に割り当てられる、(この割り当てられる事を量子化という)設定したビット数の2値 信号に変換される時に生じる誤差が量子化誤差である。量子化誤差が大きければ大きいほ ど、元信号のアナログ信号との精度が低くなる。反対に量子化誤差が小さければ小さいほ ど、元信号のアナログ信号との精度が高くなる。よって、A/D・D/Aボードを使用し て測定を行う場合には量子化雑音は重要な事項である。 24 測定機器としてA/D・D/Aボード PCI−3522A を使用しているので、このA/D・ D/Aボードの量子化誤差を求め、使用するA/D・D/Aボードが今回の実験に適して いるのかどうか検討する必要がある。 量子化誤差を求めるためには、まずは分解能を求めなければいけない。分解能とは最小 単位の 1 ビット対するアナログ量であり、LSB(Least Significant Bit)として表現される。 1LSBを出力電圧0∼xV、分解能をYビットとすると X / 2 Y = 1 LSB (式 5−1) で求める事ができる。 A/D・D/Aボードの使用を表5−1より読み取り、出力電圧は0∼10Vである。 分解能が 12 ビットなので、 10 / 2 12 = 10 / 4096 ≒ 0 . 00244 (V ≒ 2 . 44 ) ( mV ) (式 5−2) 精度が表5−1より±1LSB なので、データに10V レンジで使用した場合+2.44 mV∼−2.44mV の誤差が生じる。 入力が1V の時でも、誤差が±2.44mV となり0.244%の誤差なので、充分な精 度を有している。また、これにより今回の実験では表5−1の仕様のA/D・D/A変換 複合ボードは充分な精度を有している。 25 (a) (b) 図5−3 量子化誤差 26 (3) 直流電圧源 発光ダイオード(LED)と受光トランジスタ(フォトトランジスタ)に、必要な電圧を 安定に供給するために電圧源として Agilent 社の E3641A を使用した。 (4) 電流増幅アンプ A/D・D/A変換複合ボードは表5−1でボード使用について示してあるが、A/D・ D/A変換複合ボードは出力電流が5mA以下と小さいために、モーターを回転させるた めに必要な電流をボードが出力できないので、電圧はそのままに電流だけを増幅する、電 流増幅アンプを使用してモーターを回転させるために必要な電流を加えた。 使 用 し た 電 流 増 幅 ア ン プ は KIKUSU ELECTRONICS 社 の BIPOLAR POWER SUPPLY/AMPLIFIER(最大2A)を使用し、前々年度の卒業研究を追試後、KIKUSUI 社の PAN16−10A(最大10A)を用いて電流制限量による効果の実験を行った。 図5−4に KIKUSU ELECTRONICS 社の BIPOLAR POWER SUPPLY/AMPLIFIER (最大2A)の概観写真を示す。 図5−4 電流増幅アンプ BIPOLAR POWER SUPPLY/AMPLIFIE 27 図5−5に KIKUSUI 社の PAN 16-10A(最大10A)の概観写真を示す。 図5−5 電流増幅アンプ PAN 16-10A (5) モーター 測定するために使用したモーターは、TAMIYA 社の REV-TUNED MOTER(15133− 300)を使用した、また、発電機に使用したモーターも同じのモーターを使用した。 表5−2 モーターの性能表 適正負荷時の 適正負荷時の 適正電圧 外形寸法 シャフト 消費電流 回転数 1,500 14,300 2.4∼3.0 25.1×20.1 2.0 (mA) (rpm) (V) (mm) (mm) 径 28 振動を吸収するためにモーターの周りにゴムシートを巻いて使用した。 図5−6にモーター・発電機・回転羽接続の概観写真として示す。 (Ⅰ)はプロトタイプ、(Ⅱ)はプロトタイプ(Ⅰ)の改良版である。 芯出しが上手く出来ていなかったのでプロトタイプを動作させると、動作を始めるのに時 間がかかっていた。その問題を改良したのが(Ⅱ)の写真に示すモーターである。 図5−6 モーターと発電機(Ⅰ) 図5−7 モーターと発電機(Ⅱ) (6) その他 今回構築したシステムを開発するにあたり、電流増幅アンプの設定、A/D・D/A変 換複合ボードからの出力電圧、モーター(発電機)からの入力電圧を確認するために、 HEWLETT PACKARD 社の MULTIMETER 3478A を、また出力波形を確認するために、 オシロスコープを IWATU 社の SS−7819、A/D変換複合ボードがパソコンの画面上で波 形が正しく表示されているか確認するためにファンクションジェネレーターは IWATU 社 の FG−350 を用いた。LED、フォトトランジスタ特性を確認し、IWATU 社の TT−506 のカーブトレーサーを使用し時定数を求めた。この様にしてシステム全体の調整及びマッ チングを行った。 発電機の平滑用コンデンサは 16V 2200μFの電界コンデンサを使用した。 コンデンサを使用しているので、CR回路になっている。そのために平均時間をコンデン サで変えた。 29 6 プログラム 6−1 自動測定 構築したシステムを制御するためにサポートされているのは、Visual Basic6.0(VB6.0) である。そこでプログラムを作成し、A/D・D/A変換複合ボードに命令を与えて動作 させた。 Visual Basic では直接I/Oやメモリにアクセスする事が出来ないために、A/D・D/ A変換複合ボードを直接制御することが出来ない。そこで、Visual Basic ではボードに対し て制御を行うプログラム(Dynamic Link Library:DLL)から必要な手続き(関数)を呼 び出し、この DLL を介してボードの制御を行う。 DLL は interface 社のA/D・D/A変換複合ボードの付属 CD からインストールして使 用した。 A/D・D/A変換複合ボードを使用するためには、標準モジュールを追加する必要が あり、必要となるモジュールを作成した。 具体的な追加は、Visual Basic のメニューの「プロジェクト」をクリック→「標準モジュ ールの追加」をクリック→「新規作成」と「既存のファイル」があり、「既存のファイル」 をクリックし、ローカルディスクに移動する→Program Files を開く→Interface のフォル ダを開く→「GPC3100」と「GPC3300」がある。両方フォルダを開くと「samples」のフ ォルダがあり、VBから必要なモジュールを追加する。 なお、モジュールの保存先はインストール時に変更を行っていると、この限りではない。 30 6−2 測定プログラム説明 測定プログラムを作成するために、フローチャートを用いて原案を作っておけば、プロ グラムをスムーズに作成する事が出来る。また、作成中のプログラムのなかで判断をしな ければならない時も視覚的に確認ができるので楽である。 構築したプログラムのフローチャートを図6−1に示す。 START 時間回数チェック A/D入力 立ち上がり電圧チェック フィードバックのための 計算 グラフの描写 D/A出力 END 図6−1 測定プログラムのフローチャート 31 6−3 プログラミング原理 6−3−1 ボードの初期化処理・終了処理 A/D・D/A変換複合ボード共に初期化処理・終了処理は行わなければならない。 A/D・D/A変換複合ボードの初期化処理はそれぞれ AdOpen 関数・DaOpen 関数を 使用する。これらの関数を使用しないとボードへのアクセスは行えない。逆に終了処理を 行う場合、それぞれ AdClose 関数・DaClose 関数を使用する。この関数はA/D・D/A 変換複合ボードにアクセスしている各種リソースの開放が行われ、以後A/D・D/A変 換複合ボードへのアクセスを禁止するものである。 6−3−2 サンプリング アナログ信号のサンプリング条件設定を行う。サンプリング条件のパラメーターはサン プリング条件設定構造体に設定する。 「チャンネル数」 「入力チャンネル番号」 「入力レンジ」 「入力レンジ設定電圧」「サンプリングレート」「入力件数」を行える。 6−3−3 データ取得 A/D・D/A変換複合ボードから入力されるアナログ信号のデータを取得・処理を行 う。また、一件取得を行う場合、データは一件ずつ取得されていくので、取得していった データをフィードバック等に使用することができる。 6−3−4 入出力処理 A/D・D/Aに入力される信号を取得処理と、作成したアナログ信号の出力処理を行 う処理である。また、入出力処理は6−3−2のサンプリング条件設定で設定したデータ が関係してくる。 6−3−5 ファイル出力 A / D ・ D / A 変 換 複 合 ボード に 入力 さ れ るア ナ ロ グ デ ー タを C S V ( Comma Separated Value)形式でファイルに保存することが可能である。CSV形式で保存された ファイルは Microsoft Excel 等で分析・解析を行う事ができる。 32 7 モーター立ち上がり速度・モーター回転数測定実験 7−1 システム確認 測定を行う前に本当にそのシステムが正常・正確に動作しているのかを確認する必要が ある。その過程で間違いが生じればシステム全体に誤差が生じてしまうので、正確なデー タの取得が行えない。 まず、電流増幅アンプの入力電圧と出力電圧を同じ値にしなくてはならないため、上限 2Aの電流増幅アンプ(KIKUSUI ELECTRONICS 社の BIPOLAR POWER SUPPKY / AMPLIFIER)の場合、定電圧源(Agilent 社の E3641A)からモーター(TAMIYA REV ‐TUNED MOTER)の定格電圧は 2.4∼3Vあるので、定電圧源から 1∼5Vを電流増幅ア ンプに入力し、出力をディジタル電流・電圧計で数値を読み取って電圧増幅率を1に調節 した。また、上限10A(KIKUSUI 社の PAN 16‐10A)の電流増幅アンプの場合も、2 Aの電流増幅アンプと同じ方法をとり調整を行った。 つぎに、モーターが本当に入力した電圧で動作をするのかを確認した。まずはモーター 単体に電源を取り付けて 0.1∼3Vを定電圧源で印加し動作確認を行った。 33 7−2 予測 モーターは回転させると発電機として機能するので、回転速度は発電電圧に比例すると の原理を利用してモーターの速度測定実験を行う。それにあたり予測図を図7−1(a)、(b) に示す。 図7−1(a) D/Aからの出力電圧 図7−1(b) A/Dからの入力電圧 図7−1(a)、(b)の予測図の説明としては、D/A・A/D変換複合ボードからの出力 にフィードバックを加えない一定の電圧を印加したとき(b)の図では①になる。また、初 期に大きな印加電圧を加えるフィードバック方式と用いると、②の電圧値が入力され図(b) の②になると考えこの状況について考察した。 34 今回の実験で使用するフィードバックを行う式を式7−1で示す。 フィードバックを加えないときにはモーター印加電圧は次式で表される。 V = V0 電圧を印加し、フィードバックを加えたときの飽和回転速度での発電機電圧(Vr)と、 各時刻における発電機電圧(Va)との差に一定の係数 Fb を乗じた電圧をモーターに入力し た。 V = V 0 + Fb × (Vr − Va ) (式 7−1) V 0 = モーター印加一定電圧 値 Fb = フィードバック係数 Vr = 発電機の飽和電圧値 Va = 発電機から出力された 電圧値 とする。 発電機出力端にコンデンサを挿入すると、A/Dの入力電圧 Va はCR秒の積分平均値を とる。 従って、フィードバック値として時間遅れが生ずるので、測定、出力電圧制御時間との 整合をとる必要がある。 35 7−3 システムの基本動作確認 測定実験を行うための、実行を行うとき。図7−2に示すように、画面上で実行できる ようにプログラムを作成した。「フィードバック係数」「定常出力電圧」「収束電圧」「実行 回数」 を決める必要がある。それらの値を決めると初めて「Start」ボタンをクリックする事がで きる。また、測定し、画面上にグラフを描画する。データを保存する場合は、実行後に「Save」 ボタンをクリックすると、CSV形式でデータを保存する事ができる。 ここで初期値を入力するのに必要な値として、モーター入力する電圧と発電機から発生 する電圧の関係を求めた。 その結果を表7−1と図7−3に示す。 表7−1、図7−3に示すようにモーター入力電流と発電機出力電圧は比例的に増加し ている事がわかる。 図7−2 作成したプログラム 36 表7−1 モーター入力と発電機出力の関係 DC[モーター](V) [モーター](A) DC[発電機](V) 0.12 0.29 0 0.22 0.29 0 0.32 0.29 0.16 0.42 0.3 0.24 0.52 0.31 0.33 0.62 0.33 0.4 0.72 0.35 0.48 0.82 0.36 0.54 0.92 0.38 0.66 1.02 0.4 0.74 1.12 0.4 0.86 1.22 0.42 0.92 1.32 0.45 1.01 1.42 0.45 1.1 1.52 0.45 1.19 1.62 0.45 1.32 1.72 0.45 1.36 1.82 0.47 1.48 1.92 0.47 1.55 2.02 0.48 1.58 2.12 0.48 1.7 2.22 0.5 1.78 2.32 0.52 1.8 2.42 0.53 1.9 2.52 0.54 1.93 2.61 0.54 2.11 2.72 0.53 2.18 2.82 0.53 2.27 2.92 0.54 2.29 3.02 0.55 2.33 37 2.5 発電機出力電圧 2 1.5 1 0.5 0 0 0.5 1 1.5 2 モーター 入力電圧 モーター入力電流 図 7−3 2.5 3 3.5 発電機出力電圧 モーター入力と発電機出力の関係図 以後、このデータをもとに測定を行う。 ま た 、 モ ー タ ー の 内 部 抵 抗 を マ ル チ メ ー タ ー ( HEWLETT PACKARD 社 の MULTIMETER 3478A)を使用して4Wire 方式で測定した結果、0.37∼0.54Ω程度の抵抗 値であった。 モーター入力と発電機出力の関係の表から収束電圧を読み取り、本研究テーマである 「DCモーター過渡現象用高速自動測定」を行う。はじめに前々年度の卒業研究と同じシ ステムを用いて、定常出力電圧 0.5V/1.0V/1.5V/2.0V/2.5Vにフィードバック係数 を、 0/1/3/5/10 を各電圧に与えて測定を行い、システムが正常に動作していること を確認した。 38 7−4 フィードバック係数の効果 電流制限条件による効果を排除するために最大電流が10Aの電流増幅アンプを使用し て、0.5V/1.0V/1.5V/2.0V/2.5Vにフィードバック係数を 0/1/3/5/10 を各電圧 に与えて同じように計測を行った。 2.5 発 電 機 出 力 (V ) 2 1.5 1 0.5 0 1 101 201 301 401 0.5V 図7−4(A) 1.0V 501 時間(msec) 1.5V 601 701 2.0V 2.5V 発電機出力(A/D) 39 801 901 Fb=10,10A 12 10 モーター 入 力 (V ) 8 6 4 2 0 1 101 201 301 401 0.5V 図7−4(B) 図7−4 501 時間(msec) 1V 1.5V 601 701 2V 2.5V モーター入力波形(D/A) 801 901 Fb=10,10A Fb=10のときのモーター入力及び発電機出力波形 図7−4のパラメーターは、計測時間 1msec で 1000 回測定、Fb(フィードバック係 数)10、電流制限値 10A、定常出力電圧 0.5∼2.5Vにおける発電機出力波形を測定した。 収束電圧は表7−1を利用した。 図7−4(A)の入力波形の場合、定常出力電圧が増加していけば安定回転になる回転 数が電圧にほぼ比例する事が解る。また、図7−4(B)に示すように、大電流による加 速度が大きく、更にコンデンサで平均化された電圧により出力電圧に遅れが生ずるので、 オーバーシュート時間が存在する事がわかった。 40 また、モーター回転数の測定を行い、回転周期と出力が比例している事を確認した。一 周期に必要な時間は10数 msec であり、1msec での測定には対応していないことを確認し た。したがって、以下の測定では発電機出力を使用する。 2.5 モーター 出力電圧(V) 2 1.5 1 0.5 0 1 101 201 301 401 系列1 図7−5 501 時間(msec) 系列2 601 系列3 モーター回転数の測定グラフ 41 701 系列4 801 901 7−5 電流制限による効果 7−4フィードバック係数の効果で行った測定を基本にV0を一定(0.5V、1.0V、1.5 V、2.0V、2.5V)にし、フィードバック係数を変化(0、1、3、5、10)させ測定を行っ た 。 電 流 制 限 が か か る 可 能 性 が あ る の で 、 2 A の 電 流 増 幅 ア ン プ ( KIKUSU ELECTRONICS 社 BIPOLAR POWER SUPPLY/AMPLIFIER)と10Aの電流増幅アン プ(Agilent 社 E3641A)を使用した。 これから、図を用いて述べていく。 入力波形と出力波形 1.6 1.4 モーター の入力及び発信機出力( V) 1.2 1 0.8 0.6 0.4 0.2 0 1 101 201 301 1.5V,Fb0,10A 図7−6 401 501 時間(msec) 1.5V,Fb0,10A 601 701 1.5V,Fb0,2A 801 901 1.5V,Fb0,2A 入力波形と出力波形(1) 図7−6では、1.5V・1000 回・Fb0・10Aと 1.5V・1000 回・Fb0・2Aのグラフを 示す。フィードバック係数が0の時には一定電圧をモーターに入力しても、電流制限値に より速度特性が変化することが読み取れるが加速度は電流比 10A:2Aより低く、約 2.5 倍 となった。 42 入力波形と出力波形 12 モーター入力及び発電機出力(V) 10 8 6 4 2 0 1 101 201 301 1.5VFb10 10A 図7−7 401 501 時間(msec) 1.5V Fb10 10A 601 701 1.5V Fb10 2A 801 901 1.5V Fb10 2A 入力波形と出力波形(2) 図7−7では 0.5V・1000 回・Fb10・10Aと 1.5V・1000 回・Fb10・2Aのグラフを 示してあるが、フィードバック係数が10の時電流による入力電圧が振動に伝わるが、こ れは駆動能力とコンデンサによる時間遅れで説明出来る。 43 7−6 負荷抵抗を用いた測定 フィードバック係数を与えた測定を行い、発電機に電気的な負荷を与えて7−4フィー ドバック係数の効果と同じ条件で測定を行った。負荷抵抗を与えた時の回路図を図7−8 に示す。 図7−8 負荷抵抗回路図 負荷抵抗は1Ωを使用した。電圧と負荷抵抗の関係を式で表すと式7−1になる。 R0 = VA (式7−2) R0 + R 式7−1は7−3システムの基本動作確認で行った、モーターの内部抵抗測定で得た抵 抗値を R0 とし、R は負荷抵抗として与えた抵抗である。V0 は式7−1 にある無負荷抵抗 値である。 44 9 8 モーター入力及び発電機出力(V) 7 6 5 4 3 2 1 0 1 101 201 301 401 501 601 701 801 901 時間(msec) コンデンサあり1Ω10A 図7−9 コンデンサあり1Ω10A コンデンサあり1Ω2A コンデンサあり1Ω2A 負荷抵抗1Ω 10A・2Aのグラフ 負荷抵抗 1Ωを与えて、10A、1.5V 及び 2A、1.5V で測定し、グラフにしたのが図7− 9である。 制限電流量により立ち上がり勾配は 10:2 になっている。これは大きな負荷を持つモー ターの立ち上がり時間は電流に比例していることを示している。 45 7−7 コンデンサを用いた測定 コンデンサ(2200μF)と負荷抵抗 1Ωを発電機側に接続及び、コンデンサ(2200μF) と負荷抵抗 1Ωなしの状態をそれぞれ 2A・10Aで測定を行った。なお電圧は 0.5V∼2.5V でとする。 コンデンサ有無の回路図を図7−10、図7−11に示す。 図7−10 コンデンサあり 図7−11 コンデンサなし コンデンサありのデータ図7−9と比較して、負荷抵抗を発電機に接続すると負荷抵抗 なしとどのように違うのか測定を行った。(コンデンサなし) 測定パラメーターは、定常出力電圧 0.5∼2.5V、測定回数 1000 回、電圧 2Aと 10 Aで行った。 図7−12に結果を示す。 46 9 8 モーター入力及び発電機出力(V) 7 6 5 4 3 2 1 0 1 101 201 301 401 501 601 701 801 901 時間( msec) 1Ω 10A 1.0V 図7−1 1Ω 10A 1.0V 1Ω 2A 1.0V 1Ω 2A 1.0V 負荷抵抗1Ω 1.0Vのときの 2Aと 10Aのグラフ コンデンサあり、なしの違いがここでははっきり出ている。コンデンサがなければモー ターの立ち上がり曲線は振動している。また、コンデンサにより平均化された発電機出力 電圧を用いているので、モーターの立ち上がり曲線に振動が表われない。 47 負荷抵抗のあり、なしでどのように変化をするのか実験した。測定するためのパラメー ターは、定常出力電圧は 0.5~2.5V、測定回数は 1000 回、負荷抵抗を1Ωの有無、電流 2 A、10Aで測定を行い。結果は 1.0Vのデータを使用する。 測定結果は図7−13に示す。 9 8 モーター入力及び発電機出力(V) 7 6 5 4 3 2 1 0 1 101 201 301 コンデンサあり負荷抵抗1Ω2A コンデンサなし負荷抵抗1Ω10A コンデンサあり負荷抵抗1Ω10A 図7−13 401 501 時間( msec) 601 コンデンサあり負荷抵抗1Ω2A コンデンサなし負荷抵抗1Ω2A コンデンサあり負荷抵抗1Ω10A 701 801 901 コンデンサなし負荷抵抗1Ω10A コンデンサなし負荷抵抗1Ω2A コンデンサの有無と負荷抵抗の有無 モーター入力及び発電機出力波形は振動している。この振幅はモーター固有振動と同期 と思われる特定条件で大きくなる。振幅の周期はコンデンサなし、負荷抵抗なしのときに 早くなる。 周期は、コンデンサなしは 5∼10msec(100∼200Hz) コンデンサありは 5∼20msec(50∼200HZ) であった。 48 電流制限を排除するために、1,2,3,5,10Aでコンデンサの有無、定常出力電 圧は 1.5Vで測定を行った結果を図7−14に示す。 12 モーター入力及び発電機出力(V) 10 8 6 4 2 0 1 101 201 301 401 501 601 701 801 901 時間( msec) コンデンサなし 3A 1.5V コンデンサなし3A1.5V 図7−14 コンデンサあり3A1.5V コンデンサあり3A1.5V 電流制限コンデンサ有無 モーター入力及び発電機出力波形は振動している。定常回転数に対したときの振動はオ ーバーシュートによる影響が見られ、その後はモーターの固有振動と駆動能力で振動が定 まる。振幅の周期はコンデンサなし、負荷抵抗なしのときに早くなる。 周期は、コンデンサなしは 15∼40msec(60∼25Hz) コンデンサありは 20∼40msec(50∼25HZ) であった。 49 8 考察及びまとめ 8−1 考察 ・ モーター入力電流を制限値によりモーターの立ち上がり速度の勾配が変化した。 これは、モーターに入力される入力電流・モーター回転トルクが比例し、立ち上がり が早くなることによる。 ・ フィードバック係数を大きくするとモーターの立ち上がり速度が大きくなった。 特に電流制限値を10A に指定すると電流制限内でモーター駆動力を大きく出来るた めである。前々年度の卒業研究では、電流制限によりフィードバック係数による立ち上 がり速度は変化しなかった。 ・ 負荷抵抗を接続すると、モーターの立ち上がり速度・立ち上がり曲線が遅くなった。 特に電流制限を少なくすると、この特徴がより明らかであった。 ・ コンデンサを使用したモーター入力及び発電機出力電圧で前々年度の卒業研究では ハンチングが起きていたが、今回の測定ではフィードバック係数が大きいときに現れて いた。 コンデンサ・負荷抵抗を接続したときの、接触抵抗によるものである。 ・ コンデンサを付加したとき電流値が制限値を大きくし、フィードバック係数を大き くすると、立ち上がりの曲線がオーバーシュートした。 モーターに流れる電流が大きすぎて一気にモーターに加速度がつきすぎてしまい、電 圧が一定になっても、コンデンサで平均化しているので、発信機出力電圧が残っている ために、発生したと考えられる。 50 8−2 まとめ システムを再構築しモーター過渡現象の計測を行った。この結果、信頼性のあるシステ ムを作り上げモーター立ち上がり特性を評価することが出来た。 Visual Basic のプログラムを学習して、ソフトウェアに苦手意識をもっていたが、卒業研 究を通じてソフトウェア開発の基本を習得した。また、自動測定という新しい分野を自分 自身のなかで確立する事ができた。 モーター過渡現象を計測するためのシステムを構築するための技術を取得した。 モーター過渡現象を行うには、電源容量とフィードバック係数の増加、負荷抵抗とコン デンサの有無によって時間的な対処をしなくてはならない事と、各素子を接続する場合は ハンダ等を使用する必要性を確認した。社会に出てからもこれらの技術を磨いていきたい。 51 9 謝辞 今回の研究において指導教官。そして学生生活においていろいろとご指導、御教示いた だいた高知工科大学 電子・光システム工学科 河津 哲 教授に心から厚く御礼申し上 げます。学業に楽しみを感じた事が今までなかったのですが、研究を進めて失敗と成功の 繰り返しをしていくにつれて楽しみと充実感を知ることができました。 この卒業研究で培った事を就職してからも大切にしていきたいと思っています。いろい ろな経験をさせていただきまして本当にありがとうございます。 同研究室で、勉強をしたり、遊んだりした。 千世さん 深谷 早弥香さん 岡林 和田 諭史さん 伊坂 航さん 近森 大資さん一年間一緒に研究をできたことを本当にう れしく感じています。一年間誠にありがとうございます。 また、4年間一緒にすごしてきた友達や先輩、後輩には色々と迷惑や心配をかけてきま して、本当に感謝でいっぱいです。今まで本当にありがとうございます。 大学に入学しましてから今に至るまで、いろいろとお世話になりました教授・助教授の方、 職員の皆様本当に有り難うございます。 52 10 参考文献 インターフェイス社 チュートリアル Visual Basic による DA 入門書 チュートリアル Visual Basic によるAD入門書 USER’S MANUAL PCI−3522A コロナ社 図解による半導体デバイスの基礎 玉井 朝倉書店 輝雄 著 新版フィードバック制御の基礎 片山 コロナ社 徹 著 システム制御工学シリーズ フィードバック制御入門 杉江 技術評論社 俊冶 藤田 政之 Visual Basic 6.0 例文事典 ステートメント・関数編 実務プログラミング研究会 メディア・テック出版 著 著 Visual Basic を始める前に知っておきたい プログラミングのしくみ 伊藤 日経BP社 SHOEISHA 華子 著 3週間完全マスター Visual Basic 6.0 グレッグ・ペリー 著 トップスタジオ 訳 10日でおぼえる Visual Basic 6.0 実践教室 VBテックラボ&瀬戸 技術評論社 遥 著 自動計測システムのためのVB6入門 金藤 仁 著 53 高知工科大学 平成15年卒業研究論文 高速自動測定システム開発と過渡現象解析 中上 大輔 高知工科大学 平成14年卒業研究論文 フィードバック機構を用いたモーター立ち上がり速度制御 弓岡 浩二 54 11 付録 表12−1 図3−1の用語説明表 用語 定義 複数の要素から構成される集合体。 システム (system) 目標値 入力と出力があり、それらの要素が全体として の目的をもつ物。 外部から与えられる制御目標となる信号。 (desired value) 基準入力要素 (reference input element) 基準入力 (reference input) 目標値を基準入力信号に変換する要素。 また、設定部とも呼ばれる。 直接、フィードバック信号と比較される信号で、 目標値と一定の関係をもつ。 目標値ということも多い。 制御対象 (controlled object) 出力 (output) 制御を行う対象。 機械・プロセス・各種システム等 制御量。 目標値を追従すべき信号。 フィードバック要素 出力をフィードバック信号に変換する要素。検 (feedback element) 出部もしくはセンサー。 フィードバック量 基準入力と比較されるためにフィードバックさ (feedback signal) れる出力の測定値。 動作信号 基準として入力されている入力信号と、フィー (actuating signal) ドバック信号との差で、制御器を駆動させる。 (制御偏差 = 目標値 − 出力) 制御器 (controller) 動作信号に基づいてアクチュエータに送る制御 信号を生成する要素。 操作量 出力を制御するために、制御対象に加える信号。 (controlled variable) アクチュエータ (actuator) 制御器からの信号をパワー増幅し、操作量に変 化する要素。 (外部エネルギーを必要とする。) 外乱 (disturbance) 制御系の状態を乱す望ましくない外部からの 信号。 55 Visual Basic Program frmMoterRev プログラム Dim nRet As Long '関数戻り値 Dim lpszName As String 'デバイス名 Dim hDeviceHandle As Long 'デバイスハンドル Dim hDeviceHandleAd As Long 'デバイスハンドル Dim hChannel As Long 'チャンネル番号 Dim Config As DASMPLREQ '構造体 Dim configCH As DASMPLCHREQ 'DA 構造体 Dim gConfig As ADSMPLREQ ' A D 構造体 Dim gInfo As ADBOARDSPEC 'ADBOARDSPEC 構造体 Dim DaData(100000) As Integer Dim AdData(100000) As Integer Dim Yscale As Integer Private Sub cmdSave_Click() Dim I As Long Dim rc As Long On Error GoTo ErrHandler CommonDialog1.fileName = ReadINI("Dialog", "Dir") CommonDialog1.ShowSave rc = WriteINI("Dialog", "Dir", CommonDialog1.fileName) Call savetoFile(CommonDialog1.fileName) ErrHandler: End Sub 56 Private Sub cmdStart_Click() Dim I As Long Dim temp As Long Dim SmplChInf As ADSMPLCHREQ 'AD If Val(txtTimes.Text) < 2 Or Val(txtTimes.Text) > 100000 Then M s g B o x "実行回数が不正です" Exit Sub End If lblStatus.Caption = "実行中" frmMotorRev.Refresh 'DA configCH.ulChNo = 2 configCH.ulRange = DA_0_10V 'AD SmplChInf.ulChNo = 1 SmplChInf.ulRange = AD_0_10V For I = 1 To Val(txtTimes.Text) ' A D 読み込み nRet = AdInputAD(hDeviceHandleAd, 1, AD_INPUT_SINGLE, SmplChInf, AdData(I)) If nRet <> AD_ERROR_SUCCESS Then M s g B o x "アナログ入力に失敗しました" lblStatus.Caption = "待機中" Exit Sub End If 57 '出力電圧算出 If op1.Value = True Then DaData(I) = DaData(I - 1) + Val(txtFb.Text) * (409.6 * Val(txtGoal.Text) AdData(I)) End If If op2.Value = True Then D a D a t a ( I ) = (409.6 * Val(txtOut.Text)) + Val(txtFb.Text) * (409.6 * Val(txtGoal.Text) - AdData(I)) End If If op3.Value = True Then DaData(I) = (409.6 * Val(txtOut.Text)) End If If DaData(I) > &HFFF Then '発散防止 D a D a t a ( I ) = &HFFF End If If DaData(I) < 0 Then '発散防止 DaData(I) = 0 End If ' D A 出力 nRet = DaOutputDA(hDeviceHandle, 1, configCH, DaData(I)) If nRet <> DA_ERROR_SUCCESS Then M s g B o x "アナログ出力に失敗しました" lblStatus.Caption = "待機中" Exit Sub End If temp = timeGetTime Do While temp = timeGetTime Loop Next I 58 '電圧を0vにする nRet = DaOutputDA(hDeviceHandle, 1, configCH, 0) If nRet <> DA_ERROR_SUCCESS Then M s g B o x "アナログ出力に失敗しました" lblStatus.Caption = "待機中" End If Call DrawGraph End Sub Private Sub cmdYmax_Click() If Yscale < 10 Then Yscale = Yscale + 1 End If Call SetYscale End Sub Private Sub cmdYmin_Click() If Yscale > 1 Then Yscale = Yscale - 1 End If Call SetYscale End Sub Private Sub Form_Load() ' D A ボードの初期化 lpszName = "FBIDA1" hDeviceHandle = DaOpen(lpszName) If hDeviceHandle = -1 Then M s g B o x "デバイスの初期化に失敗しました" End End If 59 'アナログ出力設定情報読み出し nRet = DaGetSamplingConfig(hDeviceHandle, Config) If nRet <> DA_ERROR_SUCCESS Then M s g B o x "アナログ出力設定情報取得に失敗しました" Exit Sub End If ' A D ボードの初期化 lpszName = "FBIAD1" hDeviceHandleAd = AdOpen(lpszName) If hDeviceHandleAd = -1 Then M s g B o x "デバイスの初期化に失敗しました" End Else 'サンプリング設定情報読み出し nRet = AdGetSamplingConfig(hDeviceHandleAd, gConfig) If nRet <> AD_ERROR_SUCCESS Then M s g B o x "サンプリング設定情報取得に失敗しました" End If nRet = AdGetDeviceInfo(hDeviceHandleAd, gInfo) If nRet <> AD_ERROR_SUCCESS Then M s g B o x "デバイスの情報取得に失敗しました" End If End If Call DrawAxis 60 txtOut.Text = ReadINI("Setting", "Out", "2") txtGoal.Text = ReadINI("Setting", "Goal", "2") txtFb.Text = ReadINI("Setting", "Fb", "1") txtTimes.Text = ReadINI("Setting", "times", "10000") op1.Value = ReadINI("Mode", "op1", "True") op2.Value = ReadINI("Mode", "op2", "False") op3.Value = ReadINI("Mode", "op3", "False") Yscale = ReadINI("Graph", "Yscale", "10") Call SetYscale lblStatus.Caption = "待機中" End Sub Private Sub Form_Unload(Cancel As Integer) '終了処理 nRet = DaClose(hDeviceHandle) '終了処理 nRet = AdClose(hDeviceHandleAd) 'パラメータ保存 nRet = WriteINI("Setting", "Out", txtOut.Text) nRet = WriteINI("Setting", "Goal", txtGoal.Text) nRet = WriteINI("Setting", "Fb", txtFb.Text) nRet = WriteINI("Setting", "Times", txtTimes.Text) nRet = WriteINI("Mode", "op1", op1.Value) nRet = WriteINI("Mode", "op2", op2.Value) nRet = WriteINI("Mode", "op3", op3.Value) nRet = WriteINI("Graph", "Yscale", Str(Yscale)) End Sub 61 Private Function DrawAxis() '目盛線を描画します Dim I As Integer For I = 1 To 9 picGraph.Line (0, picGraph.ScaleHeight / 10 * I)-(picGraph.ScaleWidth, picGraph.ScaleHeight / 10 * I), QBColor(5) Next I For I = 1 To 9 picGraph.Line (picGraph.ScaleWidth / 10 * I, 0)-(picGraph.ScaleWidth / 10 * I, picGraph.ScaleHeight), QBColor(5) Next I End Function Private Function DrawGraph() Dim wMax As Long Dim wMid As Double Dim wMin As Long Dim I As Long picGraph.Enabled = True lblStatus.Caption = "描画中" frmMotorRev.Refresh picGraph.Cls '画面初期化 Call DrawAxis pXMax = picGraph.Width pYMax = picGraph.Height picGraph.DrawWidth = 1 62 ' D A サンプリングデータを描画します For I = 1 To Val(txtTimes.Text) pY = (pYMax / (409.6 * Yscale)) * DaData(I) p X = ( I - 1) * (pXMax / (Val(txtTimes.Text) - 1)) If I <> 1 Then picGraph.Line (bpX, picGraph.ScaleHeight - bpY)-(pX, - bpY)-(pX, picGraph.ScaleHeight - pY), QBColor(7) End If bpX = pX bpY = pY Next I ' A D サンプリングデータを描画します For I = 1 To Val(txtTimes.Text) pY = (pYMax / (409.6 * Yscale)) * AdData(I) p X = ( I - 1) * (pXMax / (Val(txtTimes.Text) - 1)) If I <> 1 Then picGraph.Line (bpX, picGraph.ScaleHeight picGraph.ScaleHeight - pY), QBColor(10) End If bpX = pX bpY = pY Next I lblStatus.Caption = "待機中" End Function Private Sub op1_Click() txtOut.Enabled = False Label6.Enabled = False txtGoal.Enabled = True Label1.Enabled = True txtFb.Enabled = True Label2.Enabled = True End Sub 63 Private Sub op2_Click() txtOut.Enabled = True txtGoal.Enabled = True txtFb.Enabled = True Label6.Enabled = True Label1.Enabled = True Label2.Enabled = True End Sub Private Sub op3_Click() txtOut.Enabled = True txtGoal.Enabled = False txtFb.Enabled = False Label6.Enabled = True Label1.Enabled = False Label2.Enabled = False End Sub Private Sub picGraph_Click() 'If picGraph.Enabled = True Then Call DrawGraph 'End If End Sub Private Sub txtFb_KeyPress(KeyAscii As Integer) If KeyAscii < Asc(" ") Then Exit Sub End If If (KeyAscii < Asc("0") Or KeyAscii > Asc("9")) And KeyAscii <> Asc(".") Then KeyAscii = 0 End If End Sub 64 Private Sub txtGoal_KeyPress(KeyAscii As Integer) If KeyAscii < Asc(" ") Then Exit Sub End If If (KeyAscii < Asc("0") Or KeyAscii > Asc("9")) And KeyAscii <> Asc(".") Then KeyAscii = 0 End If End Sub Private Sub txtTimes_Change() lblMin.Caption = "0[msec]" lblMid.Caption = Val(txtTimes.Text) / 2 & "[msec]" lblMax.Caption = Val(txtTimes.Text) & "[msec]" End Sub Private Sub txtTimes_KeyPress(KeyAscii As Integer) I f KeyAscii < Asc(" ") Then Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub 65 Private Sub savetoFile(fileName As String) Dim I As Long Dim tmpStr As String Dim tmpStr2 As String Dim tmpStr3 As String Dim Z As Long '追加 Dim kisu As Long '追加 Open fileName For Output As #1 Print #1, "Measureing Parameters" Print #1, "目標回転数(電圧)[V]," & txtGoal.Text Print #1, "フィードバック係数," & txtFb.Text Prin t #1, "実行回数," & txtTimes.Text Print #1, "回数,D/A[V],A/D[V]" For I = 3 To Val(txtTimes.Text) DaData(Z) = (DaData(I - 3) + DaData(I - 2) + DaData(I - 1) + DaData(I) + DaData(I + 1) + DaData(I + 2) + DaData(I + 3)) / 7 AdData(Z) = (AdData(I - 3) + AdData(I - 2) + AdData(I - 1) + AdData(I) + AdData(I + 1) + AdData(I + 2) + AdData(I + 3)) / 7 Print #1, I & "," & 10 / 4096 * DaData(Z) & "," & 10 / 4096 * AdData(Z) Next I 'For I = 1 To Val(txtTimes.Text) ' Print #1, I & "," & 10 / 4096 * DaData(I) & "," & 10 / 4096 * AdData(I) ' Next I Close #1 ErrHandler: End Sub 66 Private Function SetYscale() cmdYmax.Caption = Yscale & "[V]" lblYmid.Caption = Yscale / 2 & "[V]" cmdYmin.Caption = "0[V]" End Function 67 標準モジュール FbiAd(FbiAd13.bas) '----------------------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Overlapped process identifier '----------------------------------------------------------------------------------------------------------Public Const FLAG_SYNCA = 1 ' Sampling in a background thread Public Const FLAG_ASYNCA = 2 ' Sampling in asynchronous operation '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic File format identifier '----------------------------------------------------------------------------------------------Public Const FLAG_BIN = 1 ' Binary format file Public Const FLAG_CSV = 2 ' CSV format file '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Sampling status identifier '----------------------------------------------------------------------------------------------Public Const AD_STATUS_STOP_SAMPLING = 1 Public Const AD_STATUS_WAIT_TRIGGER = 2 ' A sampling has been stopped. ' A sampling is in a waiting state for a trigger. Public Const AD_STATUS_NOW_SAMPLING = 3 68 ' A sampling is running. '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Event factor identifier '----------------------------------------------------------------------------------------------Public Const AD_EVENT_SMPLNUM = 1 ' An event that will be signaled when specified a number of samples are acquired. Public Const AD_EVENT_STOP_TRIGGER = 2 ' A sampling stopped because a trigger asserted. Public Const AD_EVENT_STOP_FUNCTION = 3 ' A sampling is stopped by software Public Const AD_EVENT_STOP_TIMEOUT = 4 ' The sampling terminated because a timeout interval elapsed. Public Const AD_EVENT_STOP_SAMPLING = 5 Public Const AD_EVENT_STOP_SCER = 6 ' The sampling is completed ' A sampling is stopped by clock error. Public Const AD_EVENT_STOP_ORER = 7 ' A sampling is stopped by overrun error. Public Const AD_EVENT_SCER = 8 ' clock error Public Const AD_EVENT_ORER = 9 ' overrun error Public Const AD_EVENT_STOP_LV_1 = 1 0 ' The sampling is completed (PCI-3179 channel1) Public Const AD_EVENT_STOP_LV_2 = 11 ' The sampling is completed (PCI-3179 channel2) Public Const AD_EVENT_STOP_LV_3 = 1 2 (PCI-3179 channel3) 69 ' The sampling is completed Public Const AD_EVENT_STOP_LV_4 = 1 3 ' The sampling is completed (PCI-3179 channel4) '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Input configuration identifier '----------------------------------------------------------------------------------------------Public Const AD_INPUT_SINGLE = 1 ' Single-ended Public Const AD_INPUT_DIFF = 2 ' Differential '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Volume identifier '----------------------------------------------------------------------------------------------Public Const AD_ADJUST_BIOFFSET = 1 Public Const AD_ADJUST_UNIOFFSET = 2 ' Bipolar offset adjustment ' Unipolar offset adjustment Public Const AD_ADJUST_BIGAIN = 3 ' Bipolar gain adjustment Public Const AD_ADJUST_UNIGAIN = 4 ' Unipolar gain adjustment '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Adjustment item identifier '----------------------------------------------------------------------------------------------Public Const AD_ADJUST_UP = 1 ' Up Public Const AD_ADJUST_DOWN = 2 Public Const AD_ADJUST_STORE = 3 ' Down ' Store Public Const AD_ADJUST_STANDBY = 4 ' Standby Public Const AD_ADJUST_NOT_STORE = 5 ' Not stored 70 '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Data identifier '----------------------------------------------------------------------------------------------Public Const AD_DATA_PHYSICAL = 1 ' Physical value (voltage [V], current [mA]) Public Const AD_DATA_BIN8 = 2 ' 8bit binary Public Const AD_DATA_BIN12 = 3 ' 12bit binary Public Const AD_DATA_BIN16 = 4 ' 16bit binary Public Const AD_DATA_BIN24 = 5 ' 24bit binary '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Data conversion identifier '----------------------------------------------------------------------------------------------Public Const AD_CONV_SMOOTH = 1 ' S moothing is applied to samples. Public Const AD_CONV_AVERAGE1 = & H 1 0 0 ' Averaging is applied to samples. Public Const AD_CONV_AVERAGE2 = &H200 to samples. 71 ' Shifted averaging is applied '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Sampling mode identifier '----------------------------------------------------------------------------------------------Public Const AD_IO_SAMPLING = 1 ' I/O Public Const AD_FIFO_SAMPLING = 2 ' FIFO Public Const AD_MEM_SAMPLING = 4 ' Memory Public Const AD_BM_SAMPLING = 8 ' Bus master '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Trigger point identifier '----------------------------------------------------------------------------------------------Public Const AD_TRIG_START = 1 ' Start-trigger(Default) Public Const AD_TRIG_STOP = 2 ' Stop-trigger Public Const AD_TRIG_START_STOP = 3 ' Start/stop-trigger '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Trigger level identifier '----------------------------------------------------------------------------------------------Public Const AD_FREERUN = 1 ' Trigger-less(Default) Public Const AD_EXTTRG = 2 ' External trigger Public Const AD_EXTTRG_DI = 3 ' External tr igger with DI masking Public Const AD_LEVEL_P = 4 ' Level trigger: level sensitive (low-to-high transition) Public Const AD_LEVEL_M = 5 ' Level trigger: level sensitive (high-to-low transition) 72 Public Const AD_LEVEL_D = 6 ' Level trigger: level sensitive Public Const AD_INRANGE = 7 ' Level trigger: into the range Public Const AD_OUTRANGE = 8 ' Level trigger: out of the range Public Const AD_ETERNITY = 9 ' Indefinite sampling Public Const AD_SMPLNUM = 10 ' Sampling num Public Const AD_START_P1 = &H10 ' Start-trigger: Level 1: low-to- high transition Public Const AD_START_M1 = &H20 ' Start-trigger: Level 1: high-to-low transition Public Const AD_START_D1 = &H40 ' Start-trigger: Level 1: high-to-low or low -to-high transition (direction DON'T CARE) Public Const AD_START_P2 = &H80 ' Start-trigger: Level 2: low-to- high transition Public Const AD_START_M2 = &H100 ' Start-trigger: Level 2: high-to-low transition Public Const AD_START_D2 = &H200 ' Start-trigger: Level 2: high-to-low or low -to-high transition (direction DON'T CARE) Public Const AD_STOP_ P 1 = & H 4 0 0 ' S t o p -trigger: Level 1: low-to- high transition Public Const AD_STOP_M1 = &H800 ' Stop-trigger: Level 1: high-to-low transition Public Const AD_STOP_D1 = &H1000 ' Stop-trigger: Level 1: high-to-low or low -to-high transition (direction DON'T CARE) 73 Public Const AD_STOP_P2 = &H2000 ' Stop-trigger: Level 2: low-to- high transition Public Const AD_STOP_M2 = &H4000 ' Stop-trigger: Level 2: high-to-low transition Public Const AD_STOP_D2 = &H8000 ' Stop-trigger: Level 2: high-to-low or low -to-high transition (direction DON'T CARE) Public Const AD_ANALOG_FILTER = &H10000 ' Use an analog trigger filter '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Polarity identifier '----------------------------------------------------------------------------------------------Public Const AD_DOWN_EDGE = 1 ' Falling edge(Default) Public Const AD_UP_EDGE = 2 ' Rising edge Public Const AD_EXTRG_IN = 3 ' External trigger input Public Const AD_EXCLK_IN = 4 ' External sampling pacer clock input Public Const AD_EDGE_P1 = &H10 ' Level 1: low-to- high transition Public Const AD_EDGE_M1 = &H20 ' Level 1: high-to-low transition Public C o n s t A D _ E D G E _ D 1 = & H 4 0 ' L e v e l 1 : h i g h-to-low or low -to-high transition (direction DON'T CARE) Public Const AD_EDGE_P2 = &H80 ' Level 2: low-to- high transition Public Const AD_EDGE_M2 = &H100 ' Level 2: high-to-low transition 74 Public C o n s t A D _ E D G E _ D 2 = & H 2 0 0 ' L e v e l 2 : h i g h-to-low or low -to-high transition (direction DON'T CARE) Public Const AD_DISABLE = &H80000000 ' Disable '-----------------------------------------------------------------------------------------------' ' GPC-3100 VisualBasic Pulse polarity identifier '----------------------------------------------------------------------------------------------Public Const AD_LOW_PULSE = 1 ' Low-pulse(Default) Public Const AD_HIGH_PULSE = 2 ' High-pulse '-----------------------------------------------------------------------------------------------' ' GPC-3100 VisualBasic Double-clocked mode identifier '----------------------------------------------------------------------------------------------Public Const AD_NORMAL_MODE = 1 ' Use it in normal clock mode Public Const AD_FAST_MODE = 2 ' Use double-clocked mode '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Status identifier '----------------------------------------------------------------------------------------------Public Const AD_NO_STATUS = 1 ' Without status Public Const AD_ADD_STATUS = 2 ' Add status 75 '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Error control identifier '----------------------------------------------------------------------------------------------Public Const AD_STOP_SCER = 1 ' Stop by clock error Public Const AD_STOP_ORER = 2 ' Stop by overrun errpr '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Data save identifier '----------------------------------------------------------------------------------------------Public Const AD_APPEND = 1 ' Append Public Const AD_OVERWRITE = 2 'Overwrite '----------------------------------------------------------------------------------------------' GPC-3100 VisualBasic Range identifier '----------------------------------------------------------------------------------------------Public Const AD_0_1V = &H1 ' Voltage: unipolar 0 to 1 V Public Const AD_0_2P5V = &H2 ' Voltage: unipolar 0 to 2.5 V Public Const AD_0_5V = &H4 ' Voltage: unipolar 0 to 5 V Public Const AD_0_10V = &H8 ' Voltage: unipolar 0 to 10 V Public Const AD_1_5V = &H10 ' Voltage: unipolar 1 to 5 V Public Const AD_0_2V = &H20 ' Voltage: unipolar 0 to 2 V Public Const AD_0_0P125V = &H40 ' Voltage: unipolar 0 to 0.125V Public Const AD_0_1P25V = &H80 ' Voltage: unipolar 0 to 1.25v Public Const AD_0_0P625V = &H100 ' Voltage: unipolar 0 to 0.625V 76 Public Const AD_0_20mA = &H1000 ' Current: unipolar 0 to 20 mA Public Const AD_4_20mA = &H2000 ' Current: unipolar 4 to 20 mA Public Const AD_1V = &H10000 ' Voltage: bipolar +/ - 1 V Public Const AD_2P5V = &H20000 ' Voltage: bipolar +/ - 2.5 V Public Const AD_5V = &H40000 ' Voltage: bipolar +/ - 5 V Public Const AD_10V = &H80000 ' Voltage: bipolar +/- 10 V Public Const AD_0P125V = &H400000 ' Voltage: bipolar +/ - 0.125V Public Const AD_1P25V = &H800000 ' Voltage: bipolar +/ - 1.25V Public Const AD_0P625V = &H1000000 ' Voltage: bipolar +/ - 0.625V '-----------------------------------------------------------------------------------------------' ' GPC-3100 VisualBasic Isolation identifier '----------------------------------------------------------------------------------------------Public Const AD_ISOLAT I O N = 1 ' P h o t o -isolated board Public Const AD_NOT_ISOLATION = 2 ' Not isolated board '-----------------------------------------------------------------------------------------------' ' GPC-3100 VisualBasic Synchronous mode identifier '----------------------------------------------------------------------------------------------Public Const AD_MASTER_MODE = 1 ' Master mode Public Const AD_SLAVE_MODE = 2 ' Slave mode 77 '------------------------------------------------------------------------------' ' GPC-3100 VisualBasic Structure declaration '------------------------------------------------------------------------------ ' ----------------------------------------------------------------------' Sampling request condition structure for each channel ' ----------------------------------------------------------------------Type ADSMPLCHREQ ulChNo As Long ulRange As Long End Type ' ----------------------------------------------------------------------' Trigger request condition structure for each channel ' ----------------------------------------------------------------------Type ADTRIGCHREQ ulChNo As Long fTrigLevel As Single fHysteresis As Single End Type 78 ' ----------------------------------------------------------------------' Sampling request condition structure ' ----------------------------------------------------------------------Type ADSMPLREQ ulChCount As Long SmplChReq(0 To 255) As ADSMPLCHREQ ulSamplingMode As Long ulSingleDiff As Long ulSmplNum As Long ulSmplEventNum As Long fSmplFreq As Single ulTrigPoint As Long ulTrigMode As Long lTrigDelay As Long ulTrigCh As Long fTrigLevel1 As Single fTrigLevel2 As Single ulEClkEdge As Long ulATrgPulse As Long ulTrigEdge As Long ulTrigDI As Long ulFastMode As Long End Type 79 ' ----------------------------------------------------------------------' Sampling request condition structure for bus master ' ----------------------------------------------------------------------Type ADBMSMPLREQ ulChCount As Long SmplChReq(0 To 255) As ADSMPLCHREQ ulSingleDiff As Long ulSmplNum As Long ulSmplEventNum As Long ulSmplRepeat As Long ulBufferMode As Long fSmplFreq As Single fScanFreq As Single ulStartMode As Long ulStopMode As Long ulPreTrigDelay As Long ulPostTrigDelay As Long TrigChReq(0 To 1) As ADTRIGCHREQ ulATrgMode As Long ulATrgPulse As Long ulStartTrigEdge As Long ulStopTrigEdge As Long ulTrigDI As Long ulEClkEdge As Long ulFastMode As Long ulStatusMode As Long ulErrCtrl As Long End Type 80 ' ----------------------------------------------------------------------' Board specification structure ' ----------------------------------------------------------------------Type ADBOARDSPEC ulBoardType As Long ulBoardID As Long dwSamplingMode As Long ulChCountS As Long ulChCountD As Long ulResolution As Long dwRange As Long ulIsolation As Long ulDi As Long ulDo As Long End Type 81 '----------------------------------------------------------------------------------------------' G P C -3100 VisualBasic Error identifier '----------------------------------------------------------------------------------------------Public Const AD_ERROR_SUCCESS = 0 Public Const AD_ERROR_NOT_DEVICE = &HC0000001 Public Const AD_ERROR_NOT_OPEN = &HC0000002 Public Const AD_ERROR_INVALID_HANDLE = &HC0000003 Public Const AD_ERROR_ALREADY_OPEN = &HC0000004 Public Const AD_ERROR_NOT_SUPPORTED = &HC0000009 Public Const AD_ERROR_NOW_SAMPLING = &HC0001001 Public Const AD_ERROR_STOP_SAMPLING = &HC0001002 Public Const AD_ERROR_START_SAMPLING = &HC0001003 Public Const AD_ERROR_SAMPLING_TIMEOUT = &HC0001004 Public Const AD_ERROR_INVALID_PARAMETER = &HC0001021 Public Const AD_ERROR_ILLEGAL_PARAMETER = &HC0001022 Public Const AD_ERROR_NULL_POINTER = &HC0001023 Public Const AD_ERROR_GET_DATA = &HC0001024 Public Const AD_ERROR_FILE_OPEN = &HC0001041 Public Const AD_ERROR_FILE_CLOSE = &HC0001042 Public Const AD_ERROR_FILE_READ = &HC0001043 Public Const AD_ERROR_FILE_WRITE = &HC0001044 Public Const AD_ERROR_INVALID_DATA_FORMAT = &HC0001061 Public Const AD_ERROR_INVALID_AVERAGE_OR_SMOOTHING = &HC0001062 Public Const AD_ERROR_INVALID_SOURCE_DATA = &HC0001063 Public Const AD_ERROR_NOT_ALLOCATE_MEMORY = &HC0001081 Public Const AD_ERROR_NOT_LOAD_DLL = &HC0001082 Public Const AD_ERROR_CALL_DLL = &HC0001083 82 '------------------------------------------------' GPC-3100 VisualBasic Function declaration '------------------------------------------------Declare Function AdOpen Lib "FbiAd.DLL" (ByVal lpszName As String) As Long Declare Function AdClose Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function AdGetDeviceInfo Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pBoardSpec As ADBOARDSPEC) As Long Declare Function AdSetBoardConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal hEvent As Long, ByVal lpCallBackProc As Long, ByVal dwUser As Long) As Long Declare Function AdGetBoardConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef ulAdSmplEventFactor As Long) As Long Declare Function AdSetSamplingConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pAdSmplConfig As ADSMPLREQ) As Long Declare Function AdGetSamplingConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pAdSmplConfig As ADSMPLREQ) As Long Declare Function AdGetSamplingData Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pSmplData As Any, ByRef ulSmplNum As Long) As Long Declare Function AdClearSamplingData Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function AdStartSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulSyncFlag As Long) As Long Declare Function AdStartFileSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal pszPathName As String, ByVal ulFileFlag As Long) As Long 83 Declare Function AdTriggerSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long, ByVal ulRange As Long, ByVal ulSingleDiff As Long, ByVal ulTriggerMode As Long, ByVal ulTrigEdge As Long, ByVal ulSmplNum As Long) As Long Declare Function AdMemTriggerSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChCount As Long, ByRef lpSmplChReq As ADSMPLCHREQ, ByVal ulSmplNum As Long, ByVal ulRepeatCount As Long, ByVal ulTrigEdge As Long, ByVal fSmplFreq As Single, ByVal ulEClkEdge As Long, ByVal ulFastMode As Long) As Long Declare Function AdSyncSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulMode As Long) As Long Declare Function AdStopSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function AdGetStatus Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef ulAdSmplStatus As Long, ByRef ulAdSmplCount As Long, ByRef ulAdAvailCount As Long) As Long Declare Function AdInputAD Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulCh As Long, ByVal ulSingleDiff As Long, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByRef lpData As Any) As Long Declare Function AdInputDI Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef dwData As Long) As Long Declare Function AdOutputDO Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal dwData As Long) As Long Declare Function AdAdjustVR Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulAdjustCh As Long, ByVal ulSingleDiff As Long, ByVal ulSelVolume As Long, ByVal ulControl As Long, ByVal ulTap As Long) As Long 84 Declare Function AdDataConv Lib "FbiAdDC.DLL" (ByVal uSrcFormCode As Long, ByRef pSrcData As Any, ByVal uSrcSmplDataNum As Long, ByRef pSrcSmplReq As ADSMPLREQ, ByVal uDestFormCode As Long, ByRef pDestData As Any, ByRef puDestSmplDataNum As Long, ByRef pDestSmplReq As ADSMPLREQ, ByVal uEffect As Long, ByVal uCount As Long, ByVal lpfnConv As Long) As Long Declare Function AdReadFile Lib "FbiAdDC.DLL" (ByVal pszPathName As String, ByRef pSmplData As Any, ByVal uFormCode As Long) As Long Declare Function AdBmSetSamplingConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pAdBmSmplConfig As ADBMSMPLREQ) As Long Declare Function AdBmGetSamplingConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pAdBmSmplConfig As ADBMSMPLREQ) As Long Declare Function AdBmGetSamplingData Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef pBmSmplData As Any, ByRef ulBmSmplNum As Long) As Long Declare Function AdBmStartFileSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal pszPathName As String, ByVal ulFileFlag As Long) As Long Declare Function AdLvSetSamplingConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long, ByVal ulSmplNum As Long, ByVal fSmplFreq As Single, ByVal ulRange As Long, ByVal hEvent As Long, ByVal lpCallBackProc As Long, ByVal dwUser As Long) As Long Declare Function AdLvGetSamplingConfig Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long, ByRef ulSmplNum As Long, ByRef fSmplFreq As Single, ByRef ulRange As Long) As Long Declare Function AdLvCalibration Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long, ByVal ulCalibration As Long) As Long Declare Function AdLvGetSamplingData Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long, ByRef pSmplData As Any, ByRef ulSmplNum As Long) As Long 85 Declare Function AdLvStartSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long) As Long Declare Function AdLvStopSampling Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long) As Long Declare Function AdLvGetStatus Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByVal ulChNo As Long, ByRef ulAdSmplStatus As Long, ByRef ulAdSmplCount As Long, ByRef ulAdAvailCount As Long) As Long Declare Function AdMeasureTemperature Lib "FbiAd.DLL" (ByVal hDeviceHandle As Long, ByRef fTemperature As Single) As Long Declare Function CreateEvent Lib "KERNEL32" Alias "CreateEventA" (ByVal lpEventAttributes As Long, ByVal ManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long Declare Function WaitForSingleObject Lib "KERNEL32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long Declare Function ResetEvent Lib "KERNEL32" (ByVal hEvent As Long) As Long 86 標準モジュール FbiDa(FbiDa13.bas) '----------------------------------------------------------------------------------------------' Overlapped process identifier '----------------------------------------------------------------------------------------------Public Const FLAG_SYNC = 1 ' Output in a background thread. Public Const FLAG_ASYNC = 2 ' Output in asynchronous operation. '----------------------------------------------------------------------------------------------' File format identifier '----------------------------------------------------------------------------------------------Public Const FLAG_BIN = 1 ' Binary format file Public Const FLAG_CSV = 2 ' CSV format file '-----------------------------------------------------------------------------------------------' ' Analog output status identifier '----------------------------------------------------------------------------------------------Public Const DA_STATUS_STOP_SAMPLING = 1 ' The output is stopped. Public Const DA_STATUS_WAIT_TRIGGER = 2 ' The output is waiting for an assertion of the trigger. Public Const DA_STATUS_NOW_SAMPLING = 3 87 ' The output is running. '----------------------------------------------------------------------------------------------' Event factor identifier '----------------------------------------------------------------------------------------------Public Const DA_EVENT_STOP_TRIGGER = 1 ' The output has been stopped because a trigger asserted. Public Const DA_EVENT_STOP_FUNCTION = 2 ' The output has been stopped by software. Public Const DA_EVENT_STOP_SAMPLING = 3 ' The Analog output is completed. Public Const DA_EVENT_RESET_IN = 4 Public Const DA_EVENT_CURRENT_OFF = 5 ' The reset input signal asserted. ' The current breaking has been detected. '----------------------------------------------------------------------------------------------' Volume identifier '----------------------------------------------------------------------------------------------Public Const DA_ADJUST_BIOFFSET = 1 Public Const DA_ADJUST_UNIOFFSET = 2 ' Bipolar offset adjustment ' Unipolar offset adjustment Public Const DA_ADJUST_BIGAIN = 3 ' Bipolar gain adjustment Public Const DA_ADJUST_UNIGAIN = 4 ' Unipolar gain adjustment 88 '----------------------------------------------------------------------------------------------' Adjustment item identifier '----------------------------------------------------------------------------------------------Public Const DA_ADJUST_UP = 1 ' Up Public Const DA_ADJUST_DOWN = 2 ' Down Public Const DA_ADJUST_STORE = 3 ' Store Public Const DA_ADJUST_STANDBY = 4 ' Standby Public Const DA_ADJUST_NOT_STORE = 5 ' Not stored '----------------------------------------------------------------------------------------------' Data identifier '----------------------------------------------------------------------------------------------Public Const DA_DATA_PHYSICAL = 1 ' Physical value (voltage [V], current [mA]) Public Const DA_DATA_BIN8 = 2 ' 8bit binary Public Const DA_DATA_BIN12 = 3 ' 12bit bin ary Public Const DA_DATA_BIN16 = 4 ' 16bit binary Public Const DA_DATA_BIN24 = 5 ' 24bit binary 89 '----------------------------------------------------------------------------------------------' Data conversion identifier '----------------------------------------------------------------------------------------------Public Const DA_CONV_SMOOTH = 1 ' S moothing is applied to samples. Public Const DA_CONV_AVERAGE1 = & H 1 0 0 ' A v e r a g i n g i s a p p l i e d to samples. Public Const DA_CONV_AVERAGE2 = &H200 ' Shifted averaging is applied to samples. '----------------------------------------------------------------------------------------------' Data transfer architecture identifier '----------------------------------------------------------------------------------------------Public Const DA_IO_SAMPLING = 1 ' I/O Public Const DA_FIFO_SAMPLING = 2 ' FIFO Public Const DA_MEM_SAMPLING = 4 ' Memory '----------------------------------------------------------------------------------------------' Trigger point identifier '----------------------------------------------------------------------------------------------Public Const DA_TRIG_START = 1 ' Start-trigger(Default) Public Const DA_TRIG_STOP = 2 ' Stop-trigger Public Const DA_TRIG_START_STOP = 3 90 ' Start/stop-trigger '----------------------------------------------------------------------------------------------' Trigger level identifier '----------------------------------------------------------------------------------------------Public Const DA_FREERUN = 1 ' Trigger-less(Default) Public Const DA_EXTTRG = 2 ' External trigger Public Const DA_EXTTRG_DI = 3 ' External trigger with DI masking '----------------------------------------------------------------------------------------------' Polarity identifier '----------------------------------------------------------------------------------------------Public Const DA_DOWN_EDGE = 1 ' Falling edge(Default) Public Const DA_UP_EDGE = 2 ' Rising edge 91 '----------------------------------------------------------------------------------------------' Range identifier '----------------------------------------------------------------------------------------------Public Const DA_0_1V = &H1 ' Voltage: unipolar 0 to 1 V Public Const DA_0_2P5V = &H2 ' Voltage: unipolar 0 to 2.5 V Public Const DA_0_5V = &H4 ' Voltage: unipolar 0 to 5 V Public Const DA_0_10V = &H8 ' Voltage: unipolar 0 to 10 V Public Const DA_1_5V = &H10 ' Voltage: unipolar 1 to 5 V Public Const DA_0_20mA = &H1000 ' Current: unipolar 0 to 20 mA Public Const DA_4_20mA = &H2000 ' Current: unipolar 4 to 20 mA Public Const DA_1V = &H10000 ' Voltage: bipolar +/- 1 V Public Const DA_2P5V = &H20000 ' Voltage: bipolar +/ - 2.5 V Public Const DA_5V = &H40000 ' Voltage: bipolar +/ - 5 V Public Const DA_10V = &H80000 ' Voltage: bipolar +/ - 10 V '----------------------------------------------------------------------------------------------' Isolation identifier '----------------------------------------------------------------------------------------------Public Const DA_ISOLATION = 1 ' Photo-isolated board Public Const DA_NOT_ISOLATION = 2 92 ' Not isolated board '----------------------------------------------------------------------------------------------' Range identifier '----------------------------------------------------------------------------------------------Public Const DA_RANGE_UNIPOLAR = 1 Public Const DA_RANGE_BIPOLAR = 2 ' Unipolar ' Bipolar '----------------------------------------------------------------------------------------------' Waveform generation mode identifier '----------------------------------------------------------------------------------------------Public Const DA_MODE_CUT = 1 ' Time-based waveform generation Public Const DA_MODE_SYNTHE = 2 ' F r e q u e n c y -based waveform generation '----------------------------------------------------------------------------------------------' Repeat mode identifier '----------------------------------------------------------------------------------------------Public Const DA_REPEAT_NONINTERVAL = 1 ' Repeat without the wait state (Default) Public Const DA_REPEAT_INTERVAL = 2 ' Repeat with the wait state '----------------------------------------------------------------------------------------------' Counter clear identifier '----------------------------------------------------------------------------------------------Public Const DA_COUNTER_CLEAR = 1 Public Const DA_COUNTER_NONCLEAR = 2 93 ' Cleared (Default) ' Not cleared '----------------------------------------------------------------------------------------------' DA latch identifier '----------------------------------------------------------------------------------------------Public Const DA_LATCH_CLEAR = 1 ' The voltage is set to the lowest voltage of the range. Public Const DA_LATCH_NONCLEAR = 2 ' The voltage is sustained. '----------------------------------------------------------------------------------------------' Clock source identifier '----------------------------------------------------------------------------------------------Public Const DA_CLOCK_TIMER = 1 ' Internal programmable timer (8254 compatible) Public Const DA_CLOCK_FIXED = 2 ' Fixed 5 MHz clock '----------------------------------------------------------------------------------------------' Configurations of the connector CN3 identifier '----------------------------------------------------------------------------------------------Public Const DA_EXTRG_IN = 1 ' External trigger input (Default) Public Const DA_EXTRG_OUT = 2 ' External trigger output '----------------------------------------------------------------------------------------------' Configurations of the connector CN4 identifier '----------------------------------------------------------------------------------------------Public Const DA_EXCLK_IN = 1 ' External clock input (Default) Public Const DA_EXCLK_OUT = 2 ' External clock output 94 '----------------------------------------------------------------------------------------------' Filter identifier '----------------------------------------------------------------------------------------------Public Const DA_FILTER_OFF = 1 ' Not used (Default) Public Const DA_FILTER_ON = 2 ' Used '----------------------------------------------------------------------------------------------' S y nchronous analog output identifier '----------------------------------------------------------------------------------------------Public Const DA_MASTER_MODE = 1 ' Master Mode Public Const DA_SLAVE_MODE = 2 ' Slave Mode '------------------------------------------------' Structure declaration '------------------------------------------------' ----------------------------------------------------------------------' Analog output request condition structure for each channel ' ----------------------------------------------------------------------Type DASMPLCHREQ ulChNo As Long ulRange As Long End Type 95 ' ----------------------------------------------------------------------' Analog output request condition structure ' ----------------------------------------------------------------------Type DASMPLREQ ulChCount As Long SmplChReq(0 To 255) As DASMPLCHREQ ulSamplingMode As Long fSmplFreq As Single ulSmplRepeat As Long ulTrigMode As Long ulTrigPoint As Long ulTrigDelay As Long ulEClkEdge As Long ulTrigEdge As Long ulTrigDI As Long End Type ' ----------------------------------------------------------------------' Board specification structure ' ----------------------------------------------------------------------Type DABOARDSPEC ulBoardType As Long ulBoardID As Long ulSamplingMode As Long ulChCount As Long ulResolution As Long ulRange As Long ulIsolation As Long ulDi As Long ulDo As Long End Type 96 ' ----------------------------------------------------------------------' Output range configurations structure for each channel (for PCI-3305) ' ----------------------------------------------------------------------Type DAMODECHREQ ulRange As Long fVolt As Single ulFilter As Long End Type ' ----------------------------------------------------------------------' Waveform generation mode structure (for PCI-3305) ' ----------------------------------------------------------------------Type DAMODEREQ ModeChReq(0 To 1) As DAMODECHREQ ulPulseMode As Long ulSyntheOut As Long ulInterval As Long fIntervalCycle As Single ulCounterClear As Long ulDaLatch As Long ulSamplingClock As Long ulExControl As Long ulExClock As Long End Type 97 '----------------------------------------------------------------------------------------------' Error identifier '----------------------------------------------------------------------------------------------Public Const DA_ERROR_SUCCESS = 0 Public Const DA_ERROR_NOT_DEVICE = &HC0000001 Public Const DA_ERROR_NOT_OPEN = &HC0000002 Public Const DA_ERROR_INVALID_HANDLE = &HC0000003 Public Const DA_ERROR_ALREADY_OPEN = &HC0000004 Public Const DA_ERROR_NOT_SUPPORTED = &HC0000009 Public Const DA_ERROR_NOW_SAMPLING = &HC0001001 Public Const DA_ERROR_STOP_SAMPLING = &HC0001002 Public Const DA_ERROR_START_SAMPLING = &HC0001003 Public Const DA_ERROR_SAMPLING_TIMEOUT = &HC0001004 Public Const DA_ERROR_INVALID_PARAMETER = &HC0001021 Public Const DA_ERROR_ILLEGAL_PARAMETER = &HC0001022 Public Const DA_ERROR_NULL_POINTER = &HC0001023 Public Const DA_ERROR_SET_DATA = &HC0001024 Public Const DA_ERROR_FILE_OPEN = &HC0001041 Public Const DA_ERROR_FILE_CLOSE = &HC0001042 Public Const DA_ERROR_FILE_READ = &HC0001043 98 Public Const DA_ERROR_FILE_WRITE = &HC0001044 Public Const DA_ERROR_INVALID_DATA_FORMAT = &HC0001061 Public Const DA_ERROR_INVALID_AVERAGE_OR_SMOOTHING = &HC0001062 Public Const DA_ERROR_INVALID_SOURCE_DATA = &HC0001063 Public Const DA_ERROR_NOT_ALLOCATE_MEMORY = &HC0001081 Public Const DA_ERROR_NOT_LOAD_DLL = &HC0001082 Public Const DA_ERROR_CALL_DLL = &HC0001083 '------------------------------------------------' Function declaration '------------------------------------------------Declare Function DaOpen Lib "FbiDa.DLL" (ByVal lpszName As String) As Long Declare Function DaClose Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function DaGetDeviceInfo Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pDaBoardSpec As DABOARDSPEC) As Long Declare Function DaSetBoardConfig Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal ulSmplBufferSize As Long, ByVal hEvent As Long, ByVal lpCallBackProc As Long, ByVal dwUser As Long) As Long Declare Function DaGetBoardConfig Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef ulSmplBufferSize As Long, ByRef ulDaSmplEventFactor As Long) As Long Declare Function DaSetSamplingConfig Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pDaSmplConfig As DASMPLREQ) As Long 99 Declare Function DaGetSamplingConfig Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pDaSmplConfig As DASMPLREQ) As Long Declare Function DaSetMode Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pDaMode As DAMODEREQ) As Long Declare Function DaGetMode Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pDaMode As DAMODEREQ) As Long Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pSmplData As Any, ByVal ulSmplDataNum As Long) As Long Declare Function DaClearSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function DaStartSampling Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal ulSyncFlag As Long) As Long Declare Function DaStartFileSampling Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal pszPathName As String, ByVal ulFileFlag As Long, ByVal ulSmplNum As Long) As Long Declare Function DaSyncSampling Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal ulMode As Long) As Long Declare Function DaStopSampling Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long) As Long Declare Function DaGetStatus Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef ulDaSmplStatus As Long, ByRef ulDaSmplCount As Long, ByRef ulDaAvailCount As Long, ByRef ulDaAvailRepeat As Long) As Long Declare Function DaOutputDA Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal nCh As Long, ByRef pDaSmplChReq As DASMPLCHREQ, ByRef pData As Any) As Long 100 Declare Function DaInputDI Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef dwData As Long) As Long Declare Function DaOutputDO Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal dwData As Long) As Long Declare Function DaAdjustVR Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByVal ulAdjustCh As Long, ByVal ulSelVolume As Long, ByVal ulDirection As Long, ByVal ulTap As Long) As Long Declare Function DaDataConv Lib "FbiDaDc.DLL" (ByVal uSrcFormCode As Long, ByRef pSrcData As Any, ByVal uSrcSmplDataNum As Long, ByRef pSrcSmplReq As DASMPLREQ, ByVal uDestFormCode As Long, ByRef pDestData As Any, ByRef puDestSmplDataNum As Long, ByRef pDestSmplReq As DASMPLREQ, ByVal uEffect As Long, ByVal uCount As Long, ByVal pfnConv As Long) As Long Declare Function DaWriteFile Lib "FbiDaDc.DLL" (ByVal pszPathName As String, ByRef pSmplData As Any, ByVal ulFormCode As Long, ByVal ulSmplNum As Long, ByVal ulChCount As Long) As Long Declare Function CreateEvent Lib "KERNEL32" Alias "CreateEventA" (ByVal lpEventAttributes As Long, ByVal ManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long Declare Function WaitForSingleObject Lib "KERNEL32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long Declare Function ResetEvent Lib "KERNEL32" (ByVal hEvent As Long) As Long 101 モジュールプログラム Declare Ini(Ini.bas) Function GetPrivateProfileString Lib "KERNEL32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Declare Function WritePrivateProfileString Lib "KERNEL32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long Const IniFileName = "config.ini" Public Function WriteINI(Section As String, Entry As String, WriteData As String) As Long WriteINI = WritePrivateProfileString(Section, Entry, WriteData, MyPath & IniFileName) End Function Public Function ReadINI(Section As String, Entry As String, Optional Def As String) As String Dim n As String * 255 Dim rc As Long rc = GetPrivateProfileString(Section, Entry, "", n, 255, MyPath & IniFileName) If rc <> 0 Then ReadINI = Left(n, InStr(n, Chr(0)) - 1) Else ReadINI = Def End If End Function 102 Public Function MyPath() MyPath = App.Path If Right(MyPath, 1) <> "¥" Then MyPath = MyPath & "¥" End If End Function モジュールプログラム Module1(Module13.bas) Public Declare Function timeGetTime Lib "winmm.dll" () As Long '一定時間処理を停止する ' '引数 lngTickTime - 停止時間(1/1000 秒単位) '戻値 なし Public Function WaitTime(ByVal lngtickTime As Long) Dim lngEnd As Long '終了時間 '終了時間設定 lngEnd = timeGetTime + lngtickTime '終了時間まで空ループ Do While (timeGetTime < lngEnd) '制御をシステムに渡す DoEvents Loop End Function 103