09-30-2010 01:53 AM
Device: PCMCIA DAQ-1200
NI-DAQ:Version 6.9.1
Measurement studio6 (ComponetWorks3.0)
VB6 SP6
Windows Xp SP3
Note PC
の環境で問題なく動作していたApplicationですが、
もう一つ同じApplicationを用意する必要がでて
下記の環境を用意しました。
Device: USB-6341(Xシリーズ)
NI-DAQmx:Version 9.2
Measurement Studio 2009
VB.NET 2005 SP1
Windows 7
上記とは別のNotePC
USB-6341はMAXで動作確認済み。Dev1です。
VB6 で作成した プロジェクトを
VB2005で読み込むと、アップグレードウィザードで
下記のVB6のコードは自動で以下のように書き換えられました。
VB6
DIO.Device=1
DIO.Ports(0).Assignment = cwdioOutput
VB.NET
DIO.Device=1
DIO.Ports.Item(0).Assignment = CWDAQControlsLib.CWDIOAssignments.cwdioOutput
この部分について「アップグレードウィザード」では警告・エラーは出ませんが
実行させると、上記の2行目のコードでエラーになります。
実行時 Error : "Invarid index"
何が問題でしょうか。
また、新しいシステム(環境)で以前と同じ働きをするApplicationをつくるには
どうするのが、ベストでしょうか。
(移行、あるいは作成が短時間で、確実に動作するものを作るには )
----- Error の詳細 -------------------
System.Runtime.InteropServices.COMException はハンドルされませんでした。
ErrorCode=-2146828283
HelpLink="cwdaq.chm#8020"
Message="Invalid index"
Source="cwdaq"
StackTrace:
場所 System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
場所 CWDAQControlsLib.CWDIOPorts.Item(Object Item)
場所 Project1.frmFtest.frmFtest_Load(Object eventSender, EventArgs eventArgs) 場所 C:\Users\opcuser\Documents\Visual Studio 2005\Projects\My_VB_Prog\Digital_Output_Repeat\Project1.NET2\Digital_Output_Repeat2.vb:行 578
場所 System.EventHandler.Invoke(Object sender, EventArgs e)
場所 System.Windows.Forms.Form.OnLoad(EventArgs e)
場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
場所 System.Windows.Forms.Control.set_Visible(Boolean value)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.Run(ApplicationContext context)
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
場所 Project1.My.MyApplication.Main(String[] Args) 場所 17d14f5c-a337-4978-8281-53493378c1071.vb:行 81
場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()
----- Error詳細の終わり ------
10-02-2010 07:44 AM
出ているエラーは配列・列挙体の指数が無効であるというエラーですね。おそらくパラメータが違うものと思われます。
VBのアップグレードウィザードはあくまでVBの中でのアップグレードなので、従来型DAQからDAQmxへのアップグレードをアシストしてくれるのではないと思います。今クリアしなければならない最大の問題は、従来型DAQからDAQmxへ移行する部分かと思います。
XシリーズはDAQ-1200と比べると、まったく別次元のデバイスですので、過去のコードに囚われない方が良いかもしれません。例えば、Xシリーズのカウンタは、それぞれのカウンタが独立して有限パルストレインを出すことができます。(旧来のデバイスでは有限パルストレインには2つのカウンタが必要 ←よくこれに泣かされました。。。) また、トリガ動作を繰り返す際に旧来ではカウンタのリトリガブルを使用しなければならなかったのに対し、XシリーズはAI、AOに対しても再トリガさせることが可能です。
確実に動作するプログラムを短期間で作るためにどうすればよいか?これは制御・計測をしているならどんな場面でも問われるかと思います。
NI社の製品であればドライバをインストールすると同時にサンプルプログラムが各言語(LabVIEW、C言語、VB6など)に対してインストールされます。それらのサンプルを参考に作成していくのが近道ではあると思います。
LabVIEWを使えばさらに早くなるのはここで言うまでもないかも知れませんが。。。(ただしLabVIEWの習得に最低でも5日間のトレーニングを受ける必要があると思うので、その時間を確保できるかどうか、ですね。ちなみにLabVIEWの独学はあまりお勧めしません。)
ちなみにどのような内容のプログラムでしょうか?プロトタイプ作成のお手伝いぐらいはできるかも知れません。
10-03-2010 09:52 PM
返信ありがとうございます。
(すこし長文になります。申し訳ありません)。
私は、これまで、VB6を使い続けていて、VB.NETを使用するのは今回が初めてです。また、NIさんのデバイスもEシリーズ以前のものばかりで、ComponentWorks(これもVersion3 止まりです) を使い、プログラムを作ってきました。
新たに用意したシステムではすべてが初めてのことで、相当な手間がかかることを覚悟して取り掛かることにしました。この時点ではMeasurement StudioがNI-DAQmxでプログラムをつくることに対してどのようなサポートをしているのかもイメージがつかめていませんでした。従来のようなComponentWorksが使えないことは承知していましたが。
ただ、いろいろ調べているうちにVB6でもNI-DAQmxのデバイスドライバーを使う方法があることがわかり、一旦、この方法で進めようとしたのですが、VB6がインストールされているPCにNI-DAQmxのV9.2をインストールすると、レガシードライバーのNI-DAQ6.9.1が削除され、使えなくなってしまうことがわかり、やむを得ず、新しいPC(VB.NETインストール)に9.2を組み込み、最初の方針に戻りました。しかし一からすべてプログラムを作り直すのは手間ですので、とりあえず、旧プログラム(VB6)をVB.NETの環境に読み込ませまたところ、そこでVB.NETのアップグレードウィザードが働き、質問に書いたようなコード変換(生成)がされました。
この変換にはNIさんのMeasurement Studioの機能が作用しています。VBだけの作用ではありません。ComponentWorksの記述がほぼそのまま使えそうでしたので(dllは異なるが)、楽ができると思ったのですが、実行したところ、エラーとなったという次第です。コードは自動で生成されていますので私のタイプミスでもありませんし、NIさんのDllの中身もわかりませんし、手がでません。対処方法があれば知りたかったのと、なければ変換コードの使用はあきらめ、Measurment Studioについているサンプルプログラムを参考にコードを書き直すつもりではいます。ただ、NI-DAQmxはMeasument Studioが用意したクラスライブラリーを使うのと、使わずにAnsi C の関数呼び出しで使うのとどちらがいいのか(作りやすさ、機能を呼び出す際のオーバーヘッド の少なさ 等)、経験がないため、判断に迷っています。
また、MAXでタスクを作っておき、それを呼び出すような使い方もあるようですが、いろいろ手段があることが、逆にどのようなコードを書くのがよいか迷わされます。
そんなこんなで、プログラム開発環境を整える段階で時間を費やし、次にコード作成に取り掛かるところでいきなり躓き、どのような移行方法がよいのかという質問になりました。
LabVIEWを推奨してくださいましたが、私はだいぶ前にチャレンジしたことがありますが、挫折しました。テキストベースプログラミングが私にはあっているようです。せっかくの推奨に申し訳ありません。
デバイスの使い方は、複雑な使用ではありません。DIO(DOとして使用が2CH、かなり短時間でOn/Off)、AOが1CH(出力レベル変更、ON/OFFが頻繁)です。パルス出力、カウンターは使いません。サンプルコードを参考に何とかなりそうな使い方です。
気を使っていただきまして、ありがたく思います。
今後ともよろしくお願いいたします。