2008-01-17

VBAUSBIO.DLLのベータ版(Ver0.51) USB-An命令修正 

VBAUSBIO.DLLにUSB-An命令を追加したベータ版を作成中です。
アナログ入力で255までの値しか取り込めないBUGがあり対応させました。
ダウンロードは以下のアドレスです。
http://bake-san.com/download/vbausbio/beta/vbausbio_v051.lzh

参考までに追加されたUSB-An命令の簡単な説明です

【新機能】
USBで電子制御(Km2Net様著者)のサンプルソースで使われている
USB-An用の関数と互換命令を追加しました。

・openUsbIo
関数 :USB-IOオープン
概要 :接続中のUSB-IOを全てオープン
戻り値:発見したUSB-IO数 存在しない場合は 0

・closeUsbIo
関数 :USB-IOクローズ
概要 :オープン中のハンドルクローズ
戻り値:なし

・outputUsbIo
関数 :USB-IO 出力
引数 :int iUsbioNo オープンしたUsbIo 0~
  :int iPort 出力ポート 0 or 1
:int iData 出力データ
概要 :USB-IO の指定ポートを出力
戻り値:0 出力成功 その他エラー

・inputUsbIo
関数 :USB-IO リード
引数 :int iUsbioNo オープンしたUsbIo 0~
:int iPort 入力ポート 0 or 1
概要 :USB-IOの指定ポートを読取
戻り値:0 以上 入力値 0 未満 エラー

・setUsbAnChannel
関数 :USB-An チャンネルセット
引数 :int iUsbioNo オープンしたUsbIo 0~
:int iCh チャンネル
: 8: 8Bit変換 4Ch 2DIO
: 10:10Bit変換 4Ch DIOなし
概要 :USB-Anの読み取りチャンネル設定
戻り値:0 設定成功 その他エラー

・setUsbAnMode
関数 :USB-An モードセット
引数 :int iUsbioNo オープンしたUsbIo 0~
:int iAnModeParam
: 8: 8Bit変換 4Ch 2DIO
: 10:10Bit変換 4Ch DIOなし
概要 :USB-Anの読み取りモードを設定
戻り値:0 設定成功 その他エラー

・inputUsbAn
関数 :USB-An 入力
引数 :int iUsbioNo オープンしたUsbIo 0~
:int iCh 読み込みチャンネル
概要 :指定チャンネルのアナログ値読み取り
戻り値:0 以上 入力値 0 未満 エラー

・outputUsbAnD
関数 :USB-An デジタル出力
引数 :int iUsbioNo オープンしたUsbIo 0~
:int iData 出力データ
概要 :USB-An 出力
戻り値:0 以上 入力値 0 未満 エラー

・inputUsbAnD
関数 :USB-An デジタル入力
引数 :int iUsbioNo オープンしたUsbIo 0~
概要 :USB-An デジタル入力
戻り値:0 以上 入力値 0 未満 エラー

6 件のコメント:

匿名 さんのコメント...

はじめまして、chibi6と申します。
VBAUSBIO.DLLのベータ版(Ver0.51) 公開いただきありがとうございます。現在、本DLLを使用しプログラム作成中なのですが、質問させていただきたくコメントいたしました。

setUsbAnMode(0, 10)
inputUsbAn(0, 0)
として、ごく単純に0chのデータを読み込んでいます。これは期待通り動くのですが、inputUsbAn(0, 1)などとして他のチャンネルを読み込むことができません(デタラメな値が入ります)。
関数のなかにsetUsbAnChannelというものがありますが、なにか関係があるでしょうか?
パラメータをいろいろ変えてみましたがダメでした。

お暇なときで結構です。なにかアドバイスいただけると助かります。宜しくお願いいたします。

バケさん さんのコメント...

GWに入ってコメントが遅くなりました、すみません。

自分でもアナログ3点を読み込むテストをしています。
私の環境では正しく読めています。
参考までにソースの抜粋を載せておきます。

Dim ret As Long
ret = openUsbIo
ret = setUsbAnMode(0, 10)
ret = inputUsbAn(0, 0)
Debug.Print "inputUsbAn0=" + Str(ret)
ret = inputUsbAn(0, 1)
Debug.Print "inputUsbAn1=" + Str(ret)
ret = inputUsbAn(0, 2)
Debug.Print "inputUsbAn2=" + Str(ret)
closeUsbIo

setUsbAnChannelはsetUsbAnModeの命令の中で呼ばれている関数です、通常は使いません。

ハード側とも関連しているかも知れません。
0chにつなげているものをそのまま1chにつなげても駄目なのでしょうか?
具体的なソースとハードの情報があるとこちらでも試して見れると思います。
情報をもう少しいただければと思います。

匿名 さんのコメント...

ご回答ありがとうございます。
ハード的には、ごく単純に可変抵抗をつけているだけで、動作する0chのものをそのまま1chにつけて試しています。また、0ch、1chを短絡させて同じ入力が入るようにもしてみました。
現在(5月7日)回路が手元にないため実験できませんが、早急にご呈示いただいたプログラムで試して、再度ご報告させていただきます。

匿名 さんのコメント...

お世話になります。動作確認しましたのでご報告させていただきます。ご呈示いただいたプログラムは期待した動作をしました。

ところが....
下記のプログラムは、1ch(もしくは0ch)のデータを連続して取り込み表示するものです。実行して取り付けた可変抵抗を回すと、0chの場合は表示もグリグリと変わりますが、1chでは数値が変わりません。
Option Explicit
Dim st As Integer
Private Sub CommandButton1_Click()

Range("A2").Value = openUsbIo
Range("A3").Value = setUsbAnMode(0, 10)
st = 0
Do
Range("A1").Value = inputUsbAn(0, 1)
DoEvents
Loop While (st = 0)

End Sub

Private Sub CommandButton2_Click()
st = 1
End Sub

そこで、0chと1chのみですが、次のようなプログラムで関数ごとに実行して、動作を確認してみました。

Option Explicit
Private Sub CommandButton1_Click()
Range("A2").Value = openUsbIo
End Sub
Private Sub CommandButton2_Click()
Range("A3").Value = setUsbAnMode(0, 10)
End Sub
Private Sub CommandButton3_Click()
Range("A1").Value = inputUsbAn(0, 0)
End Sub
Private Sub CommandButton4_Click()
closeUsbIo
End Sub
Private Sub CommandButton5_Click()
Range("A1").Value = inputUsbAn(0, 1)
End Sub

0chはモード設定後、
inputUsbAn(0, 0)
を実行するたびに入力値が更新されますが、

1chは、「モード設定」もしくは「0chの読み込み」の、どちらかを実行した直後には、正しく読み込めるようですが、
inputUsbAn(0, 1)
だけを連続して実行すると、2回目からは1回目のデータと同じものが返されるようです。


最初のコメントの時は、「1chは読見込めない」という書き方でしたが間違っていたようです。正しくは、「連続で読み込むことが出来ない」と言うところでしょうか。

なんだか、せっかく公開していただいているDLLに「ケチ」をつけているようで恐縮ですが、どうぞご理解ください。
時間があるときにでもご確認いただければと思います。

バケさん さんのコメント...

なんか、デバッグをしていただいている感じで恐縮です。

HSP用のソースを元にUsbAn対応をする時に、不明な処理があり、その辺りのBUGっぽいです。

もう一度見直してみます、解決できない時にはKm2netさんにも問合せをしてみます。

対応には時間がかかりそうです。
気長にお待ちいただければと思います。

急ぐようであれば、
本来はUSB-IO用の命令だけでもUsb-Anは読めるのでどうしてもうまくいかないときには、そちらのサンプルも考えてみます。

匿名 さんのコメント...

恐縮だなんてとんでもありません。デバッグに協力できたのなら喜ばしい限りです(まだバグと決まったわけではありませんが)。

当面はOchしか使う予定はありませんし、仮に他のチャンネルを使うにしても、モード設定とペアで使えば問題なわけですから、お急ぎいただく必要はありません。
田植えも大変でしょうから、どうぞお暇なときにでもお願いします。