C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VB6からGPIB制御を行いたい

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■85467 / inTopicNo.1)  VB6からGPIB制御を行いたい
  
□投稿者/ プログラム勉強中 (1回)-(2017/10/24(Tue) 16:18:16)

分類:[VB6 以前] 

VisualBasic6で作成したアプリケーションからGPIBで計測器を制御しています。
現在、PCカード(REX-5052)経由でGPIB関数を呼び出しているのですが、
PCカードスロットがないパソコン(いずれもWindowsXP)に変更したことでREX-5052が使用できず、
変わりにUSB⇔GPIB変換のREX-USB220を使用しようと考えています。
しかしGPIB制御関数や呼び出し方が変更となりデータ取得ができなくなりました。

REX-5052の場合、GPIB制御をDLL読み込みで記述していましたが、
REX-USB220はActiveXを用いるとのことですので、
"U2GPIBAX"オブジェクトをフォームに貼り付け記述しています。
フォームでは正常に動作するのですが、このオブジェクトを標準モジュールから呼び出す方法がわかりません。

具体的には、標準モジュールに、
「Dim U2GPIBAX_OBJ As U2GPIBAX」という宣言文を使い、U2GPIBAXオブジェクトの各機能を使用したいです。
しかし、「オブジェクト変数またはwithブロック変数が設定されていません。」とエラーが出てしまいうまくいきません。
改善法、サンプルプログラム等をご教示頂きたくお願いします。
引用返信 編集キー/
■85468 / inTopicNo.2)  Re[1]: VB6からGPIB制御を行いたい
□投稿者/ 魔界の仮面弁士 (1442回)-(2017/10/24(Tue) 16:43:14)
No85467 (プログラム勉強中 さん) に返信
> REX-USB220はActiveXを用いるとのことですので、
一口に「ActiveX」といっても、
 拡張子 .ocx などの「ActiveX コントロール」
 拡張子 .vbd などの「ActiveX ドキュメント」
 拡張子 .dll などの「ActiveX DLL」
 拡張子 .exe などの「ActiveX EXE」
などといった幾つかの種類があり、それぞれで使い方や振る舞いが異なります。
今回のケースでは『ActiveX コントロール』ですね。


> "U2GPIBAX"オブジェクトをフォームに貼り付け記述しています。
> フォームでは正常に動作するのですが、このオブジェクトを標準モジュールから呼び出す方法がわかりません。
一部の例外を除き、ActiveX コントロールは基本的に
フォーム等に貼って使うことを前提に設計されています。

(案1) フォームに貼ったコントロールのインスタンスを標準モジュール等に渡し、それを利用する。
(案2) 標準モジュールの中から、コントロールを貼ったフォームをロードし、それを利用する。

そもそも VB6 の標準モジュールでは「イベント」を受け取れないので、
いずれにしてもフォームは必要でしょう。


> 具体的には、標準モジュールに、
> 「Dim U2GPIBAX_OBJ As U2GPIBAX」という宣言文を使い、U2GPIBAXオブジェクトの各機能を使用したいです。
Dim textBox1 As TextBox
とだけ書いても、TextBox の機能を使えるわけではないのと同じことです。

変数を宣言しただけでは、中身は Nothing の状態なので、
使う前にオブジェクトの実態を Set しておく必要があります。
引用返信 編集キー/
■85497 / inTopicNo.3)  Re[2]: VB6からGPIB制御を行いたい
□投稿者/ プログラム勉強中 (3回)-(2017/10/30(Mon) 16:12:57)
2017/10/31(Tue) 08:49:12 編集(投稿者)

魔界の仮面弁士様

ご返信ありがとうございます。お礼が遅れまして、申し訳ございません。
本日、ご指摘のあった方法で、[(案2) 標準モジュールの中から、コントロールを貼ったフォームをロードし、それを利用する。]
というものを試してみました。そのおかげで、コンパイルすら通らなかった状態から、コンパイルはとおり、アプリケーションを実行するというところまでは進みました。
しかしその中で、

" error -1"

というエラーが出るようになりました。この-1というのは[ライブラリDeviceIoControl()リクエストエラー]というものだそうで、
ネットや本で調べてみたのですがよくわからずまたご質問に伺った次第です。エラーが出たと思しきプログラムは下記です。

Load Form1
gerr = Form1.U2GPIBAX.gpinit(UseGPIBAdrs, 0, 0)   '( UseGPIBAdrs,はUSB220のGPIB機器アドレス)
                         '(この関数の機能として USB220のGPIBアドレスをセットし、GPIBコントローラの初期化を行う。
                          また、各パラメータの初期値を設定する) 
SlotNo = CInt(Sno)
UseIOAdrs = Cint(to)
IrqNo = CInt(Ir)

If Gerr <> 0 then
If GpibErrorMsg Then
MsgBox ("error" & gerr)
End If
Gpinit = False
Exit Function
End If

質問は2点です。@上記プログラムの解決法と、AGPIBアドレスとは、接続する計測器の固有のアドレスのことでしょうか。
以上ご教示の程宜しくお願い致します。

引用返信 編集キー/
■85499 / inTopicNo.4)  Re[3]: VB6からGPIB制御を行いたい
□投稿者/ 魔界の仮面弁士 (1445回)-(2017/10/30(Mon) 16:59:32)
# 全文引用はお控えください。

No85497 (プログラム勉強中 さん) に返信
> SlotNo = CInt(Sno)
> UseIOAdrs = Cint(to)
> IrqNo = CInt(Ir)

to は Visual Basic では「予約語」となっていますので、
上記のような記述はできません。

言語仕様的には、エスケープ表現を用いて
 UseIOAdrs = CInt([to])
といった記述はできますが、そもそも to という変数は
宣言すらできないはずです。もう一度、コードを見直してみてください。


> gerr = Form1.U2GPIBAX.gpinit(UseGPIBAdrs, 0, 0)
TextBox に対して "Text1" という名前を与えるのと同様、
U2GPIBAX に対しても、何らかの名前を与えるはずです。

コントロールの型名と完全に同一の名前を
付けてしまうのは混乱の元かと思いますよ。
(同じ名前でも間違いというわけではないですが…)


> この-1というのは[ライブラリDeviceIoControl()リクエストエラー]というものだそうで、

DeviceIoControl というのは、デバイスドライバに対して
制御コードを直接送信するための Win32 API の名前ですね。

それが失敗したという事は、パラメーターの指定が間違っているとか、
機器接続がうまくいっていないということになるのですが、
今回の場合、Form に書けば動くということから、個人的には
コーディング上のミスではあるように予想しています。


(1) 各ファイルの先頭に「Option Explicit」を宣言してあるかどうかを
 確認してみてください。これが付いていない場合、変数の宣言漏れや
 スペルミスなどにより、空の変数が自動生成されてしまいます。

(2) Form で動いたのに、Module で動かないという場合、
  (a)フォームが非表示だと動作しないコントロールを使っている
  (b)変数の有効範囲(スコープ)を勘違いしている
  (c)同じフォームの別のインスタンスを操作している
 などといったケースが考えられます。怪しいのは b ですが…。


> MsgBox ("error" & gerr)
本題とは関係ありませんが、VB6 という言語においては、
戻り値を受け取らない呼び出しにおいては、引数を括弧で括らない仕様です。


『MsgBox ("error" & gerr)』ではなく
『MsgBox "error" & gerr』と書くべき、ということです。

括弧を付ける場合には、Call ステートメントを併用するか、
『Call MsgBox("error" & gerr)』
もしくは戻り値を受け取るようなスタイルにします。
『msgResult = MsgBox("error" & gerr)』


> Gpinit = False
False をセットしている箇所はありますが、
True をセットしている箇所がどこにも無いような。
引用返信 編集キー/
■85501 / inTopicNo.5)  Re[1]: VB6からGPIB制御を行いたい
□投稿者/ PANG2 (195回)-(2017/10/30(Mon) 17:36:06)
No85467 (プログラム勉強中 さん) に返信
> "U2GPIBAX"オブジェクトをフォームに貼り付け記述しています。
> フォームでは正常に動作するのですが、このオブジェクトを標準モジュールから呼び出す方法がわかりません。

Form単体で、GPIB制御をすべて実装し単体テストする。
Form側で、GPIB制御するPublic Functionを用意する。
標準モジュールから、Formをロードして、FormのFunctionを呼び出す。

# FormはGPIBのラッパークラスという考えです。



引用返信 編集キー/
■85562 / inTopicNo.6)  Re[4]: VB6からGPIB制御を行いたい
□投稿者/ プログラム勉強中 (4回)-(2017/11/06(Mon) 09:19:48)
魔界の仮面弁士様

返信が遅れました。そのようにプログラムを修正し、取り組んでみます。

trueがないのは私の引用ミスでした。申し訳ございません。
引用返信 編集キー/
■85563 / inTopicNo.7)  Re[2]: VB6からGPIB制御を行いたい
□投稿者/ プログラム勉強中 (5回)-(2017/11/06(Mon) 09:21:10)
PANG2様

返信が遅くなり申し訳ありません。ありがとうございます。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ