Labviewプログラミング覚書
by K.I
2013/09/xx〜
Index
概要
いろいろ接続
DAQの信号出力
DAQの信号入力
DAQのデジタル出力
ファイル操作
カレントパス
DAQデータをLogファイル保存
表形式の文字列を配列に
実行制御
最初に1回だけ実行
ボタンを押すと一回実行
シーケンス実行
1回実行の別案(パネルの変化で動く)
1回実行の改良案
その他
コメント
デフォルト値に初期化
リファレンスで、変数を初期化
DAQMXのバージョン
行列演算
エラーキャンセル
エラー
別のPCにインストールするとエラー
device memory overflow
参考
概要
Labviewのプログラム覚書
Labviewのプログラムを作った時に、悩んだ事を備忘録として記録したもの。
図は、ほとんどはVIスニペットになってるので、LabView9以降を使っている場合は、
図をブロックダイアグラムにドラッグアンドドロップすれば、プログラムを確認する
1
ことができる。
でも、IE10になってから、直接ドラッグアンドドロップ出来なくなった。
一旦、デスクトップとかにドロップして、ファイル化した後、改めてドラッグアンドドロップすれば
2
良い。
1
NIのサイトでは何でサンプルにスニペット使わないんだろう?
2
FireFoxとかChromeとかも同様にする必要がある。
[top]
いろいろ接続
LabViewのデータの型チェックは結構厳しくて、合っていないとすぐに配線の接続が切れる。
データ型がいろいろありすぎて、良く分からん状態。
DAQの信号出力
DAQのボード等の複数の出力データは、ダイナミックデータという奴になっているが、
これから、一部のデータを取り出すのに、結構苦労したので。。
また別解として、配列の指標で取り出す方法は
「ダイナミックデータから変換」というモジュールを使うのがミソかな。
XY Graphのために、ダイナミックデータってやつを、クラスタにするだけのことでかなり悩んだ。
DAQの信号入力
DAQの複数のデータ入力の例として、
2つの配列データを作って、1つに合成して入力する例
この例は、配列を作るところも含んでるので、ちょっと複雑に見えるが、
要は、配列をダイナミックデータに変換してから、信号を結合で1つにすれば良い。
DAQのデジタル出力
DAQのボードで、COMBOボックスからデジタル出力しようとしたら、接続できない。
結局、以下のように2回変換したら接続できた。
一度、ダイナミックデータに変換してから戻してるので、ちょっと冗長な感じがする。
本当はもっと簡単な方法があるのかもしれないけど、まぁ出来たから良いや。。
[top]
ファイル操作
カレントパス
現在のVIのパスから、VIの名前を除けばカレントパスが求められるが、
exe化した場合、exeファイル名がパスとして付加されるので、さらに削る必要がある。
この例はNIのサイトにあったもの。ちょっとメンドイなぁ。
これぐらい、やってくれれば良いのに。。
DAQデータをLogファイル保存
Logファイルに保存するVIを作ってみた
DAQのデータを、CSV形式で保存する
保存ボタンを押すと、Logファイル名を聞いてきて、保存を開始
再度、保存ボタンを押してOFF状態にすると、保存を停止
ファイルは上書きされる
シフトレジスタを使ってファイル名を保存、2回目以降のループではファイルダイアログは表示されない
空のパスに初期化されるので、最初の実行時にはファイルダイアログが表示される
ケースストラクチャが、Falseの場合も空のパスに設定されるので、
再度、保存ボタンをONにした場合も、またダイアログが表示される
表形式の文字列を配列に
Excel等の表をコピーした文字列から、配列を作る
この例では配列を指標を使って、2つに分けている
ダイナミックデータを分岐するだけでも、2つに分けることができる
この方が、簡単かな。
[top]
実行制御
最初に1回だけ実行
このVIを実行すると、1回だけ処理が実行される。
NIのサイトに、例があったので、ちょっとマネして作ってみた。
確かに、1回だけ実行出来るんだけど、起動時のみ1回実行するだけ
これだと、起動シーケンスを別に書いて、ワイヤで繋いだ方が簡単じゃないかな。
ボタンを押すと一回実行
最初に1回だけ実行を、ちょっと改造して、
ボタンを押した時に、シフトレジスタの値を初期化するようにしてみた。
起動時には実行しないように、シフトレジスタの初期値はFalseにした。
ついでに連続実行も出来るようにしてみた。
これで一応は動くんだけど。。ちょっと複雑すぎる。。。
もっと良い方法はないのかなぁ。。。。
シーケンス実行
データフローによる、シーケンス実行
単に、順番に実行するだけならば、データフローが簡単
1回実行の別案(パネルの変化で動く)
「フロントパネルアクティビティを待機」を置いて、ボタンの状態の変化で1回だけ実行させるようにした。
この方法は簡単で良いんだけど、ボタンがONになる時も、OFFになる時も両方とも動くので、変な感じ
それに、スクロールバーを動かすだけでも動いてしまうので、これはちょっとマズイ。
別の制御器があれば、それでも動いてしまうだろう。。
1回実行の改良案
ボタンの機械的動作を「押されたらラッチ」にすれば、自然な感じになるが、2回づつ動いてしまう
それで、ケースストラクチャで実行ボタンがONの時だけ実行するようにした。
シフトレジスタとカウントアップの回路は、実行回数の確認のために入れたもので、実際は不要。
実は、「フロントパネルアクティビティを待機」が無くても、良いのかもしれない。
[top]
その他
コメント
ブロックダイアグラムに、コメントを書くには、フリーラベルを使う
場所が分かりづらい→プログラミング→ストラクチャ→装飾体→フリーラベル
ちょっと地味な感じだ。まぁ、コメントを派手にしても仕方がないけど。
後から気がついたけど、単に空きスペースでダブルクリックしても、フリーラベルを入れることが出来る。
デフォルト値に初期化
実行開始時に、デフォルト状態に初期化する
Logファイル保存の例に、初期化を追加してみた
プログラム→アプリケーション制御→VIサーバリファレンスで、「このVIのリファレンス」を配置して、
作成→VIクラスのメソッド→デフォルト値→現在の設定をデフォルト設定にするで、インボークノードを生成
このVIのリファレンスをインボークノードのリファレンスに接続することで、メソッドを実行できる
また、エラーワイヤを接続して、データフローにより初期化後にループが実行されるようにした
リファレンスというのは、ポインタとかハンドルのようなもの
インボークノードというのは、クラスのメソッドを実行する
プロパティノードは、クラスのプロパティを参照・設定できる
リファレンスで、変数を初期化
リファレンスやローカル変数を使って、デフォルト値に初期化というのも出来るんだけど、
VIスニペットにすると、リファレンスが切れてしまう。(保存のリファレンスが切れて、保存2になってしまう)
どうしてだろう?とりあえず、貼り付けたあと、保存のリファレンスを作り直して、
保存2のリファレンスと入れ替えれば動くけど。。
スニペットは便利なんだけど、いろいろ問題もあるのかもしれないなぁ。。。
DAQMXのバージョン
MAX(Measurement & Automation Explorer)を起動して、
構成のソフトウェアを展開すると、各モジュールのバージョンが確認出来る。
行列演算
行列演算の記述方法がわからなくて、結構悩んだ。分かってしまえば、なんてこと無いんだけど。。
例えば、こんな行列演算を記述する場合、
まず、横方向を纏めてから、縦方向を纏めれば良いみたい
掛け算のアイコンが判りづらい。。これって、Labviewのバージョンによって違うのかな?
エラーキャンセル
スプレッドシートファイルに書き込むviを使って、データを保存している時、
ファイル名を指定するダイアログをキャンセルすると、エラー43が出る
このエラーをキャンセルする方法として、
こちら
を参考にしてエラーキャンセルしようとしたが、
エラー処理がVI内部にあるので、VI内部にこの記述を付け加えた。
エラーは出なくなったんだけど、そのまま保存したらオリジナルのVIが変更されてしまったっぽい。
これはちょっとまずいのかなぁ。。
[top]
エラー
別のPCにインストールするとエラー
DAQmxを使ったデータ入出力プログラムを、別のPCにインストールするとエラーになる。
DAQmxアシスタントを一旦削除して、新規作成して設定し直せば治るんだけど、面倒だ。
多分、
これと同じエラー
だと思う。(-10401)
MAX(Measurement & Automation Explorer)で、表示→更新すれば良いらしい。(未確認)
device memory overflow
USB-6251を使った測定。サンプリング速度は十分余裕があるはずなんだけど、
少し多めのサンプル数にすると、時々このエラーになる(2〜30回に1回ぐらい?)
記録しとかなかったので、エラーメッセージはうろ覚え
一度、エラーになるとLabViewを再起動しても、次回からは必ずこのエラーになってしまう。
Windows7を再起動すると、動作するようになるんだけど、これは効率が悪すぎる
USB-6009で、同様の現象と思われるQ&Aがあった
USB-6009のデータ集録プログラミング
回答は、Windows7 EHCIドライバの不具合の可能性があって、回避策としてUSB transfer requestの数を制限するというもの
但し、まずDAQmxドライバを9.4以降にする必要があるらしい
早速、最新のDAQmxドライバをダウンロード、DAQmxチャネルのプロパティを設定しようとしたが、項目がほとんど表示されない
ちょっと悩んだけど、これは単にプロパティノードを右クリックして、フィルタの設定で全て表示すれば良いだけだった
以下のようにDAQmxチャネルのプロパティを設定
ブロックダイアグラム上に、プログラミング→アプリケーション制御→プロパティノードを選択して、プロパティノードを配置
Analog_input→General_Properties→Advanced→Data_Transfer_and_Memory→USB_Transfer_Request_count
で、値を1に設定して、リファレンスをDAQMXのデータ集録しているVIに接続
結果としては、それ以降エラーが発生していない。
そんなに回数は試していないが、対策になっている様だ。
参考
NI-DAQmxに関する一般的なエラーコードと解決法:-200000〜-200299と-50103
NI-DAQmxに関する一般的なエラーコードと解決法:-200300〜-200999
[top]
[電子工作関連に戻る]
コメント欄の表示/非表示
⇒ Disqusの広告がうるさすぎるので基本は非表示にしました
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus