リアルタイムアプリケーションでLabVIEW MathScriptを使用する際のガイドライン(MathScript RTモジュール)

LabVIEW 2012 MathScript RTモジュールヘルプ

発行日時: June 2012

製品番号: 373123C-0112

»製品情報を参照
ヘルプをダウンロード(Windowsのみ)

LabVIEW MathScriptノードを含むVIは、ユーザ定義関数および特定の標準MathScript関数とRTターゲットにデプロイすることができます。ただし、使用する関数、データタイプ、および構文によっては、LabVIEWがラインタイム時にコードを実行し、その結果、ジッタおよび制限なしの実行時間がリアルタイムアプリケーションで増加する場合があります。確定性がアプリケーションで重要な場合、ナショナルインスツルメンツによるテストに基づく以下のセクションのガイドラインを使用して、MathScriptノードを含むリアルタイムアプリケーションでジッタを減らし、制限付きの実行時間を確立します。

以下のこれらのMathScriptのガイドラインの他に、LabVIEWアプリケーションでジッタを減らす方法を実行してください。また、MathScript関数のrtクラスのメンバーを使用して、RTターゲットでデバッグを行い、ジッタのソースを絶縁します。

MathScriptノードをセットアップする

タイムクリティカルVIまたはタイミングストラクチャにMathScriptノードを配置します。

詳細

MathScriptノードが適切な優先順位で実行することを確認するには、MathScriptノードをタイムクリティカルVI、タイミングループ、またはタイミングシーケンスストラクチャに配置する必要があります。タイムクリティカルに設定されたVIは、他の優先度のVIよりも先に実行されます。同様に、タイミングストラクチャでは、ブロックダイアグラム上のその他のタイミングストラクチャに相対して実行するMathScriptノードの優先度を制御することができます。MathScriptノードが含まれるサブVIをタイミングストラクチャに配置することもできます。

MathScriptノードをタイミングストラクチャに配置する場合は、ストラクチャ内で呼び出すMathScriptノードのインスタンスに対してクローンを事前に割り当てるためにストラクチャを構成する必要があります。タイミングストラクチャを右クリックして、ショートカットメニューから共有クローン割り当て→事前割り当てを選択し、クローンの事前割当を有効にします。タイミングループまたはタイミングシーケンスストラクチャにアイコンが表示され、LabVIEWがストラクチャ内の再入可能VIのすべてに対してクローンを事前に割り当てていることを示します。MathScriptノードを含むサブVIをタイミングストラクチャに配置する場合、サブVIおよび階層内のその他すべてのVIをVIプロパティダイアログボックスの実行ページで再入可能に構成する必要があります。たとえば、サブVIをタイミングストラクチャに配置し、そのサブVIがMathScriptノードを含むサブVIを呼び出す場合は、両方のVIを再入可能に構成する必要があります。

MathScriptノードを含むVIで、デバッグなどの不要なオプションを無効にします。

詳細

MathScriptノードを含むVIで、ファイル→VIプロパティを選択してVIプロパティダイアログボックスを表示し、カテゴリプルダウンメニューから実行を選択します。デバッグを許可および起動時にメニューを自動処理チェックボックスをオフにします。また、プロジェクトエクスプローラウィンドウでVIを右クリックし、ショートカットメニューからプロパティを選択してVIプロパティダイアログボックスを表示することもできます。これらのオプションを無効にすると、メモリの使用量、コンパイル時間、ジッタを少なくすることができます。

MathScriptノードの出力端子では、強制ドットの使用を避けてください。

詳細

LabVIEWは、編集時にMathScriptノードで変数のデータタイプを決定します。LabVIEWが決定したデータタイプと異なるデータタイプを使用して手動で変数の出力端子を構成すると、LabVIEWは可能であれば選択したデータタイプに値を強制変換し、出力端子に強制ドットを配置します。強制ドットは、コードでより多くのメモリが使用され、実行時間が長くなるポイントを示すことが可能です。

強制ドットを除去するには、出力端子を右クリックして、ショートカットメニューからデータタイプを選択→自動でタイプを選択を選択し、LabVIEWが決定するデータタイプで端子を構成します。LabVIEWがランタイム時のみに変数のデータタイプを決定できる場合は、自動でタイプを選択オプションは淡色表示され、変数のデータタイプが確定的アプリケーションに適していないことを示します。

MathScriptsを書き込む

スクリプトの各ラインの後にセミコロンを配置します。

詳細

スクリプトのラインの後にセミコロンを配置すると、MathScriptはそのコマンドの出力を表示しません。セミコロンを使用しないと、スクリプトの制限なしの実行時間の原因となります。

メモ メモ  ForおよびWhileループまたはcase-switchおよびif-elseステートメントの最初のラインの後、もしくはこれらのコンストラクト内のelseおよびendの後にセミコロンを配置する必要はありません。
使用するスクリプトおよびユーザ定義関数は、推奨される構文を使用して、タイムクリティカルVIおよびタイミングストラクチャ内で書き込みます。

詳細

ナショナルインスツルメンツで行列演算およびループなどのMathScriptで可能な構文のサブセットをテストした結果、このトピックのガイドラインに従って使用された場合、これらの構文は制限時間内に実行されました。その他の構文を使用すると、アプリケーションでジッタや制限なしの実行時間が増加する原因になる場合があります。

演算子の入力が最小のデータタイプであることを確認してください。また、ベクトルまたは行列の一部を別の値に置換する場合、値が最小の形状であることも確認します。

詳細

LabVIEWは、一部の演算で最小データタイプを返さない場合があります。たとえば、行ベクトルと列ベクトルを乗算する場合、2つのベクトルを乗算した結果は通常行列であるため、LabVIEWはスカラ数値ではなく1要素の行列を返します以下のサンプルに示されるように、行列からのスカラ結果を指標付けします。

a = ones(1, 3);
b = ones(3, 1);
c = a * b;
d = c(1) + 1.5;

変数のデータタイプを表示するには、データタイプハイライトを有効にするか、MathScriptノードを外側をクリックした後にカーソルをスクリプト内の変数に移動して、詳細ヘルプウィンドウでデータタイプを表示します。

ループで定義した配列を事前に割り当て、ループの内側で配列のサイズを変更することは避けます。

詳細

ForおよびWhileループの内側で配列のサイズを変更しないでください。たとえば、以下のサンプルのように、ループが反復するたびにサイズが変更する構文の使用は避けてください。

a = [];
for i = 1:5
     a = [a, i];
end

ループ内で配列を作成する代わりに、onesまたはzeros関数を使用して、必要となる最大要素数を事前に割り当て、以下のサンプルに示されるように要素を置換します。

a = zeros(1, 5);
for i = 1:5
     a(i) = i;
end

ループの内側で配列を作成する場合は、ループの後続の反復中またはループの外側で配列を使用しないでください。たとえば、以下のスクリプトでは、tempがForループの最初の反復で定義された後に、2番目と3番目の反復で使用されます。

a = zeros(2, 5);
for i = 1:3
     if i == 1
          temp = [2; 2];
     else
          temp = 2 * temp;
          a(:, i) = temp;
     end
end

ただし、tempがループの各反復で定義および使用され、同じ配列が複数の反復で使用されない以下のサンプルと同様の構文を使用することができます。

a = zeros(2, 5);
for i = 1:3
     temp = [i; i + 1];
     a(:, i) = temp;
end

行列はスカラ要素のみで定義してください。ベクトルやその他の行列を使用して行列を定義しないでください。

詳細

たとえば、行列で列の順序をシフトする場合は、以下のサンプルに示されるように元の行列の列ベクトルで行列を再定義しないでください。

a = [1, 4, 7; 2, 5, 8; 3, 6, 9];
a = [a(:, 2:3), a(:, 1)];

代わりに、以下のサンプルに示されるように、元の行列から列を指標付けして、行列を再形成できます。

a = [1, 4, 7; 2, 5, 8; 3, 6, 9];
temp = a(:, 1);
a(:, 1:2) = a(:, 2:3);
a(:, 3) = temp;

ベクトルまたは行列を指標付けするためにstart:stop範囲を指定する場合は、変数で範囲を定義せずに明示的に範囲を定義します。

詳細

たとえば、以下の構文を使用して、ベクトルの2番目~4番目の要素を返さないでください。

a = [1, 4, 8, 3, 9, 12];
b = 2:4;
a(b);

代わりに、a(2:4);か以下のサンプルのような構文を使用して、ベクトルから3つの要素の同じ範囲を返します。

a = [1, 4, 8, 3, 9, 12];
b = 2;
a(b:b + 2);

論理指標付け処理を避けてください。

詳細

たとえば、行列内で5未満の値を1に置換する以下の構文は使用しないでください。

a = [1, 4, 8; 3, 9, 12];
a(a < 5) = 1;

代わりに、以下の構文を使用して、論理指標付けを行わずに同じ処理を実行します。

a = [1, 4, 8; 3, 9, 12];
[n, m] = size(a);
for(i = 1:(n * m))
     if(a(i) < 5)
          a(i) = 1;
     end
end

置換指標付け処理中に行列のサイズを変更しないでください。

詳細

行列のサイズを超えて指標付けを行い、行列のサイズを増加させないでください。たとえば、既存の3x3行列に4番目の列を追加する以下のような構文は避けてください。

a = zeros(3, 3);
a(:, 4) = 0;

また、[]演算子を使用して行列を縮小しないでください。既存の行列の2番目の行を削除する以下のような構文は避けてください。

b = [4, 2; 7, 3];
b(2, :) = [];

標準MathScript関数を使用する

タイムクリティカルVIおよびタイミングストラクチャ内では、確定的アプリケーションに適したMathScript関数のみを呼び出し、適切なデータタイプの値を関数の入力として使用します。

詳細

ナショナルインスツルメンツでMathScript関数のサブセットをテストした結果、このトピックのガイドラインに従って使用される場合、関数は制限時間内に実行されました。これらの関数の入力が、各関数のヘルプトピックで推奨されるデータタイプであり、LabVIEWによって強制変換されないことを確認してください。

RTターゲットで実行時間に制限がなくなる原因となる関数の使用を避けてください。

詳細

特定の関数は、RTターゲットにデプロイできても、リアルタイムアプリケーション実行時にジッタを増加させる原因となったり、実行時間に制限がなくなる原因となる場合があります。MathScriptsノードおよびユーザ定義関数ではこれらの関数の使用を避けてください。



この記事は役に立ちましたか。

役に立たなかった