05-27-2019
02:45 AM
- 最終編集日:
08-23-2022
12:24 PM
、編集者:
NI_Community_Su
こんにちは!日本NIの阿部です。
LabVIEWは現場での計測に非常に協力なツールですが、独学されるユーザー様からは日本語の参考書等が少なく、自習がしづらいとの声をいただくこともあります。そんな中、我々としてもこのブログを通じて定期的にお役立ちできる情報をお届けできれば・・と考えています。今回は第一弾としてLabVIEWアーキテクチャのお話をさせて頂きます。
誰もが通る道ですが、とにかく時間重視でプログラムを完成させなければならず、手っ取り早くコードの断片をつなぎ合わせてしまうことがあります。(私もよくあります)その場はとりあえずそれで満足するのですが、このやり方では、後々コードを読んだり、機能を改変することが難しい、いわゆるスパゲッティコードになってしまいます。
作成したコードが上のような見た目をしていたら、他のプログラマがコードを使用したり修正したりすることを考え、アーキテクチャにも気を配るのが吉と言えます。大規模かつ安定して動くプログラムを作成されたい方、実際に手を動かす前に「型」を決めるのが大切です。
例えば弊社で開催しております(数日間しっかり学習いただくタイプ)、LabVIEW実践集中コース等でご紹介する基本的なプログラムの組み方として、ステートマシンがあります。(ステートマシンの詳細は添付の資料を御覧ください!)いわゆるプログラムの型にステップを追加していきます。ステップを追加し自由に操作することでシーケンスを持ったアプリケーションをすばやく作成することができます。
ところがステートマシンは並列処理がニガテです。例えば高いサンプリングレートの集録と解析、保存のループを同一にすると処理速度の遅いファイル保存機能に引っ張られ、収録側でタイムアウトエラーが発生するなどの問題が生じてしまいます。(一つのループで並列して処理をするのは難しい)そこで生産者/消費者デザインパターンでそういった問題を解決可能です。
生産者/消費者デザインパターンでは複数のループを異なる速度で実行し、ループ間のデータやりとりが可能になります。(以下の図を参照)また集録と解析でループ処理を分ける事でマルチスレッド処理が可能になります。
図1:生産者/消費者のデザインパターン
生産者/消費者ではデータを生成するループ、そして生成されたデータを受け取り、解析や保存をするループがあります。そのループ間のデータのやりとりにはキューと呼ばれる関数が使用されます。これらのキューには、バッファ機能があるため、仮に処理がもたつき、解析が間に合わない場合も、一旦キューのバッファに処理待ちデータを保存することで、データを消失しないという利点があります。
2.生産者/消費者パターンを採用したプログラミング
LabVIEWの関数パレットにキューの関数群があります。これらのVIは、advance>>同期>>キュー操作の下の関数パレットにあります。キューは先入れ先出し(FIFO)に基づいています。生産者/消費者デザインパターンでは、
1. 生産者ループは/消費者用のデータを生成するため、キューにデータを追加します(キューにデータを追加することを「エンキュー」と呼びます)
2.消費者ループはそのキューからデータを受け取り、バッファ内のデータを削除します(キューからデータを受け取り、削除することを「デキュー」と呼びます)
キューはFIFOであるため、生産者ループよってキューに入れられたのと同じ順序で費者ループ側で解析することになります。図2は、LabVIEWで生産者/消費者デザインパターンを採用し、キュー関数を使用した例になります。
図2:生産者/消費者のデザインパターン(キュー関数使用例)
3.生産者/消費者パターンを採用したサンプル
上で紹介しました、キューを用いた生産者/消費者デザインパターンを利用したサンプルになります。DAQmxドライバを使用する弊社のデータ収集デバイスを利用し、データ集録を行うループ (生産者ループ) とファイルへの書き込みを行うループ (消費者ループ) を分離し、それぞれを並列実行可能にしています。これにより、ファイル書き込み処理の遅延がデータ集録ループのレートに悪影響を及ぼさないようにしています。実用的なサンプルですのでぜひご覧ください。
DAQmx アナログ集録で集録したデータをCSV形式で保存
4.その他参考資料
「文面だけではなかなかイメージしづらいな・・・」と思った方。
今回ご案内した内容が動画でまとまっております。ぜひ御覧ください。
脱初心者シリーズベストプラクティス - YouTube
https://www.youtube.com/playlist?list=PLzy_sxz_5sf-4GxerlfXQl75oYfyfPU4A
さらに上のレベルとしてキューメッセージハンドラ(QMH)というアーキテクチャもあります。弊社よりニーズに合わせて、なかなか外では見つからない情報提供もさせて頂きます。ぜひお気軽にご相談ください。
この記事を書いた人
阿部 敏朗
熊本県熊本市生まれ。茨城育ち。
日本ナショナルインスツルメンツ(NI)にて九州、中四国地方を担当。
LabVIEWや製品が日に日に新しくなるので日々勉強しつつ活動しています。
趣味は毎日の食事、AI関連の記事をよむこと、温泉、ロングウォーキング。