Nigelコード生成【DAQ入門】

その他

スポンサーリンク

この記事では、LabVIEW2026Q3バージョンから可能になった、Nigelによるコード生成機能について、ハードウェア、特にDAQの制御を行うプログラムを生成させた例を紹介しています。

なお、Nigelによるコード生成の基本的な使い方については以下の記事を参考にしてみてください。

また、今回の記事で扱っている内容の実際の操作の様子は以下のビデオでも紹介しています。

スポンサーリンク

扱うレベル

今回の記事で紹介していくのは、ハードウェア制御をテーマにした、Nigelによるコード生成です。

ハードウェアと言っても多種多様なので、NI社のDAQハードウェアに限定しています。

LabVIEWは、プログラミングが得意ではない人でも扱いやすい言語であること、ハードウェア制御を得意とすること等はこれまで何度もこのブログでも表現してきた話ですが、自分がやりたいことに合うように機能を組み入れる場合に多かれ少なかれプログラミングをする必要があり、扱いやすいとはいえプログラミングが苦手だとそこに手こずってしまう、ということも往々にしてあると思います。

それでも、他のテキスト言語と比べれば考えた通りにプログラムを組みやすいとは思いますが、せっかくならNigel、AIの力を使って、「サンプルに少し機能を追加した」程度のプログラムを生成出来れば効率は上がるので、そのようなハードウェア絡みのコード生成ができるかを見てみました。

複数のハードウェアが絡んでいて、トリガーやクロックを設定して同期する、というプログラムを組むというより、比較的単純な測定の部類であるものの、プラスアルファで測定以外の部分で単なるサンプル以上の機能を追加した、というレベルの話にしています。

DAQによる測定絡みのコード生成指示例

では、ハードウェア絡みのコード生成の指示の例を紹介していきます。

長時間測定を前提とした、測定データ保存プログラム

最初は、長時間の測定を行うことを前提とした、測定データ保存プログラムの生成です。

測定を長時間行うことそのものは単に測定処理を続けるだけかもしれませんが、その間のデータを保存するとなると、あとでそのデータを扱いやすいように方針を決めておくのがいいです。

もっとも単純なのは、「どれくらいの時間分のデータごとに一つのファイルにするか」、あるいは「どれくらいのサイズ分のデータごとに一つのファイルにするか」といった分け方です。

一つのファイルに延々とデータを保存し続けるのは、プログラムが万一変な部分で異常終了(クラッシュなど)した際に適切にファイルを残しておけるかに不安が残ったり、あとでそのファイルを開く、処理する等の段階で不便が生じやすいので、特定の基準を元にファイルを分けることを考えます。

今回試したプロンプトの例は以下の通りです。

DAQmxで Dev1/ai0:3 を連続取得し、24時間以上の長時間監視を想定したロガーを作成してください。TDMSファイルは10分ごと、または1 GBを超えた時点で自動的に新規ファイルへ切り替えてください。ファイル名には日時と連番を含めてください。画面には現在のファイル名、累積保存時間、直近の波形、ディスク書き込み状態を表示してください。保存処理はConsumerループに分離し、停止時には最後のファイルを確実にクローズしてください。

結果、最終的には以下のようなプログラムを生成してくれました。

プロンプトの中で、明示的に生産者消費者という書き方はしていないものの、Consumerループ、つまり消費者ループについて言及していたので、全体のデザインも生産者消費者で書いてくれました。

生産者側はシンプルに測定データを消費者側に送っているだけ・・ではなく、ブールとのクラスタにしています。

消費者側を見ればわかりますが、このブールは消費者側ループを止めるための仕組みのようです。

ただしこの生産者側の書き方だとブールはうまく機能しないので、書きかけみたいな状態になってしまっています。

消費者側は以下のようになっていました。

時間経過やファイルサイズによって保存するファイルを変更する、という処理は指示通り実装されているようです。

閾値を越えた分だけフロントパネルに表示

比較的サンプリングレートが高くなくてもいい測定、例えば温度測定において、毎回の測定であるしきい値を越えたら、そのときの時間情報(タイムスタンプ)と測定値を表示させる、ということをプログラム終了まで繰り返すことで、異常がいつ何回発生したかをリアルタイムに確認することができます。

プロンプトは以下のものとしてみました。

DAQによる熱電対温度測定を行うプログラムで、ユーザーが決めた閾値を超えた測定値になった場合に、その時の温度の値と、閾値を超えた時間のタイムスタンプをフロントパネル上の表表示機に表示するプログラムを作成して下さい。閾値を超えた場合の表示は、ユーザーがフロントパネル上の停止ボタンを押すまで、閾値を超えるたびに追加されるものとし、新しく追加された結果ほど、表の上の行に追加されるような形式としてください。

今回は単にしきい値を越えたら表示するだけにしていますが、他の処理を行ってもよく、例えばそのときのデータを保存するようなプログラムへの応用が効きやすいと思います。

生成されたプログラムは以下の通りです。

どうやら表表示器はNigelがまだ扱えなかったようで、表形式で表してくれと指示をしても文字列表示器(配列)でしか表示されませんでした。

異なる測定種を混ぜた測定

LabVIEWでDAQ制御するためのプログラムを組むときの概念として、タスクというものがあります。

一つのタスクには、測定種(電圧なのか温度なのか加速度なのか、等)、サンプリングの種類(有限か連続か)、サンプリングレート、トリガの情報などを含めておいて、それらのタスクを「実行」することでハードウェア制御が行えます。

そんなタスクには、複数の測定種を入れることができる場合があり、

プロンプトとしては以下のようにしています。

DAQでアナログ電圧測定と熱電対による温度測定を一つのタスクの中に任意のチャンネルの個数分の測定として入れ、フロントパネル上の表示としては、電圧測定と温度測定の結果をそれぞれ別の波形グラフに表示するようにしてください。

生成されたプログラムでは、波形グラフが二つ配置されていて、それぞれの測定種で別々にグラフ表示するという目的は達成されています。

電圧測定と温度測定のそれぞれのチャンネル数をプログラム的に取得できていたらよかったのですが、生成されたプログラムはそうはなっていないため、電圧測定用のチャンネルを何個指定したかは正しく入力しておく必要があります。

指定した時間に測定を始める

最後は、複数の指定した時間それぞれで、指定したパラメータの元測定を行う、というプログラムを作らせてみました。

一回プログラムを実行すれば、複数回の測定をまとめて行ってくれる、という感じですね。

プロンプトとして以下のようなものをNigelに渡しました。

DAQによるアナログ電圧測定プログラムを、指定した時間に開始するようなプログラムを作ってください。フロントパネルでは、各測定を開始する時間を指定するためのタイムスタンプ制御器と、その時間に開始する測定のサンプリングレートとサンプル数、そしてデータ保存先のtdmsファイル名を指定できるための制御器があり、このクラスタを配列にしていることで、複数の測定を指定できるものとしてください。なお、すべてのアナログ電圧測定は、連続収録ではなく有限収録にしてください。

生成されたプログラムは、フロントパネル上に、必要なクラスタ(タイムスタンプと測定用のパラメータを指定できる)が配列となって指定できるようになっています。

生成されたVIでは、時間指定のためのタイムスタンプ制御器をはじめ、各測定で指定するパラメータを指示通りクラスタにまとめこれを配列化して、Forループに自動指標付け有効の状態で渡すことにより、指定したとおりのプログラムができました。

本記事では、Nigelによるコード生成についてDAQハードウェアを使用することを前提としたプログラム生成のためのプロンプトの例をいくつか紹介しました。

比較的初心者の方が、短期間で何か測定、ハードウェア制御を行おうとして、「プログラミングが苦手でも扱いやすい」と聞いてLabVIEW触ってみたはいいものの結局すぐにできないじゃん、となってしまわないように、Nigelによってちょっとしたことでもプログラムを生成してもらい負担を軽減できる可能性があります。

コードの生成をAIだよりにするのではなく、生成されたコードを一度動かして意図したとおりの動作をすることが分かったら、そのコードの仕組みを学ぶようにすると、具体例をもって学べるので習熟を早くするのにも役立つと思います。

今回紹介したような内容以外に活用方法もあるとは思いますが、まずはどんなことができるのかというイメージをつけるのに今回の記事が役に立てばと思います。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました