I/O変数を使用する(Real-Time、Windows)



LabVIEW 2018ヘルプ


発行年月: 2018年3月
製品番号: 371361R-0112
製品情報を参照

ダウンロード (Windowsのみ)


LabVIEW 2016ヘルプ
LabVIEW 2017ヘルプ
LabVIEW 2018ヘルプ
LabVIEW 2019ヘルプ
LabVIEW 2020ヘルプ

I/O変数は、I/Oデータを転送するシェア変数の一種です。I/O変数は、ローカルアクセスすると、シングルポイントI/OデータへのアクセスにNIスキャンエンジンを使用します。リモートアクセスすると、シングルポイントまたはバッファ型I/OデータへのアクセスにNI Publish-Subscribe-Protocol(NI-PSP)を使用します。I/O変数は、物理I/Oチャンネルと直接データの受け渡しをしたり、同じターゲットで実行するFPGA VIとReal-Time(RT)VIの間でカスタムI/Oデータを転送することができます。

注意  NIスキャンエンジンは、データをバッファしません。I/O変数にローカルアクセスする際にデータの損失を防ぐには、各データポイントを次のポイントが書き込まれる前に読み取り、NIスキャンエンジン周期よりも速くデータを書き込まないようにする必要があります。

以下の表は、I/O変数の使用方法の概要を示します。

用途 I/O変数タイプ
I/OハードウェアとLabVIEW VI間で、LabVIEW FPGAモジュールを使用せずにスケール済みのI/Oデータを転送 スケール済みI/Oデータを扱うI/O変数
同じハードウェアデバイスで実行するLabVIEW FPGA VIとLabVIEW Real-Time VI間で、FPGAでカスタム処理したI/Oデータを転送 カスタムFPGA I/Oデータを扱うI/O変数
メモ  NIスキャンエンジンサポートの詳細については、各ハードウェアのデバイスドキュメントを参照してください。

スケール済みI/Oデータを扱うI/O変数

スケール済みI/Oデータを扱うI/O変数を使用するには、サポートされるI/OデバイスをNIスキャンエンジンがインストールされたターゲットに接続し、LabVIEWプロジェクトでターゲットにI/Oデバイスを追加します。

プロジェクトエクスプローラウィンドウで、サポートされるI/Oデバイスをサポートされるターゲットに追加すると、各I/OチャンネルのI/O変数が自動的に追加されます。すでにLabVIEWプロジェクトに存在するターゲットにI/Oデバイスを物理的に追加した場合は、その新しいI/Oデバイスをプロジェクトに追加し、対応するI/O変数をデプロイする必要があります。

LabVIEWプロジェクトに存在するターゲットからI/Oデバイスを物理的に削除した場合、プロジェクトからそのI/Oデバイスを削除し、そのI/Oデバイスを含むターゲットを再度デプロイする必要があります。ターゲットを再度デプロイすることで、ターゲットの構成がプロジェクトの構成を反映します。プロジェクト&システム比較ダイアログボックスを使用して、プロジェクトとターゲットの構成を確認します。

カスタムFPGA I/Oデータを扱うI/O変数(FPGAモジュールまたはReal-Timeモジュール)

プロジェクトにNIスキャンエンジンをサポートするFPGAターゲットが含まれている場合は、ユーザ定義I/O変数を作成して同じハードウェアデバイスで実行されているFPGA VIとRT VIの間でカスタムI/Oデータを転送することができます。

ユーザ定義I/O変数は、それらのユーザ定義I/O変数をホストするシャーシで実行するFPGA VIおよびRT VIのブロックダイアグラムに追加できます。すべてのI/O変数は単方向であるため、各ユーザ定義I/O変数の方向をFPGAからホストまたはホストからFPGAのどちらかに指定する必要があります。たとえば、アナログI/Oデータを集録してFPGA VIでFFTを実行するには、FPGAからホストで構成したI/O変数を使用して処理済みデータをRT VIの制御ループに送信し、さらにホストからFPGAで構成したI/O変数を使用して出力データをRT制御ループからFPGAの物理I/Oチャンネルに返します。

ユーザ定義I/O変数を作成するには、LabVIEW FPGAモジュールをインストールする必要があります。しかし、Real-Timeモジュールしかない場合は、LabVIEW FPGAモジュールをインストールしていなくても、RT VIからユーザ定義I/O変数にアクセスできます。たとえば、LabVIEW FPGAモジュールの開発者は、ユーザ定義I/O変数を作成して、その変数にアクセスするFPGAビットファイルをコンパイルすることができます。そして、開発者はビットファイルとユーザ定義I/O変数が含まれるLabVIEWプロジェクトをFPGAモジュールを持たない別の開発者に配布して、その開発はそのプロジェクトを使用してCompactRIOシャーシでビットファイルを実行することができます。この場合、2番目の開発者は新しいユーザ定義I/O変数を作成できませんが、Real-Timeモジュールを使用して最初の開発者が作成したユーザ定義I/O変数にアクセスできます。

(Windows)ユーザ定義I/O変数のネットワーク共有を有効にすると、この変数を同じLabVIEWプロジェクト内のRT VIまたはWindowsベースのVIで使用できます。たとえば、ネットワーク共有I/O変数を使用して、Windowsで実行できるユーザインタフェースを作成できます。

メモ  ユーザ定義I/O変数は、スキャンアクセスのみをサポートします。ユーザ定義I/O変数ではダイレクトアクセスを使用できません。

I/O変数を構成する

I/O変数は、編集時や実行時に対話式に、または実行時にプログラム的に構成できます。また、これらの方法を組み合わせて構成することもできます。以下の表には、各方法の利点と欠点の概要が記載されています。

方法 使用例 利点 欠点
対話式 プロジェクトエクスプローラウィンドウにアクセスできる時にI/O変数の設定を構成する場合。 プログラミングに時間がかからない。
  • 構成設定をブロックダイアグラム上で見ることができない。
  • I/O変数をホストするターゲット上でのみ、設定の構成が可能。
プログラム的
  • プロジェクトエクスプローラウィンドウにアクセスできない時にI/O変数の設定を構成する場合。たとえば、I/O変数を使用するスタンドアロンアプリケーションを作成する際に、アプリケーション実行中にI/O変数の構成設定を変更する必要がある場合は、I/O変数をプログラム的に構成。
  • I/O変数をホストするターゲット以外のコンピュータから設定を構成する場合。たとえば、ホストコンピュータからCompactRIO上のI/O変数を構成する必要がある場合は、I/O変数をプログラム的に構成。
  • 構成設定をブロックダイアグラム上で見ることができる。
  • I/O変数をリモートで構成できる。
プログラミングに時間がかかる。

I/O変数を対話式に構成する

1つのI/O変数の構成にはシェア変数プロパティダイアログボックス、複数のI/O変数を同時に構成する場合には複数変数エディタウィンドウを使用します。

I/O変数を使用するVIの実行中にもI/O変数の説明、ネットワーク、およびスケールオプションを更新できます。ただし、I/O変数の名前とデータタイプは実行時に変更できません。

メモ  新規I/O変数を追加、またはI/O変数の構成を変数する場合は、変数をデプロイして新規構成を適用する必要があります。

I/O変数をプログラム的に構成する

変数プロパティを使用してI/O変数をプログラム的に構成するには、次の手順を実行します。

  1. ブロックダイアグラムに変数プロパティノードを追加します。 

  2. リファレンス入力を右クリックして、ショートカットメニューから作成→定数を選択します。
  3. シェア変数refnum定数の右側の矢印ボタンをクリックし、参照を選択します。
  4. 変数オブジェクトを参照ダイアログボックスを使用して、構成するI/O変数を選択します。
  5. シェア変数refnum定数を右クリックし、使用するプロパティのクラスを変数クラスを選択ショートカットメニューから選択します。
  6. 変数プロパティノードの白い部分をクリックし、使用するプロパティを選択します。
  7. (オプション)位置決めツールを使用して変数プロパティノードをサイズ変更すると、一度に複数のプロパティを表示できます。

次の図は、リモートターゲット上のI/O変数をプログラム的に構成する例を示します。

この例では、CompactRIOモジュールのチャネルに対応するI/O変数を構成することにより、そのチャネルの電流制限を指定しています。

メモ  変数プロパティノードがリモートのI/O変数に5秒間接続されないと、構成呼び出しはタイムアウトします。このタイムアウト時間を変更するには、次のステップを実行します。
  1. labview\LabVIEW.iniファイルをテキストファイルとして開きます。
  2. 新規行に、RemoteIOVConfigurationTimeout=の後に新しいタイムアウト時間(秒単位)を入力します。たとえば、タイムアウト時間を10秒に延ばしたい場合は、RemoteIOVConfigurationTimeout=10と入力します。
  3. ファイルを保存して閉じます。

I/O変数をデプロイする

I/O変数をデプロイするには、プロジェクトエクスプローラウィンドウでI/O変数を含むプロジェクト項目を右クリックし、ショートカットメニューからデプロイを選択します。

I/O変数ノードを使用するVIを実行すると、I/O変数コンテナが自動的にそれらのI/O変数が所属する場所にデプロイされます。この操作では、コンテナ内のI/O変数がすべてデプロイされます。

メモ  I/Oドライバが初期化に失敗すると、プロジェクトのすべてのI/O変数のロードが中断されます。この場合、I/O変数がプロジェクト内に表示される可能性がありますが、アプリケーションがその変数にアクセスを試みるとランタイムエラーが発生します。I/Oドライバエラーのデバッグ方法の詳細については、ターゲットI/Oドライバのドキュメントを参照してください。

I/O変数値をスケールする

I/O変数またはI/Oエイリアスの線形スケールは、シェア変数プロパティダイアログボックスのスケールページで有効にすることができます。しかし、I/O変数は非線形スケールをサポートしません。

メモ  I/Oバスの中には、ハードウェアスケールを実装するものがあります。この場合、通常のI/O変数スケール処理に、もう1つのスケール処理が追加されます。LabVIEWは、ハードウェアスケールを上書きしません。LabVIEWは、I/Oバスからのハードウェアスケール値を未処理値として解釈してソフトウェアスケール値を計算します。

I/Oエイリアスを作成する

I/O変数のエイリアスを作成し、状況により異なる方法でI/Oデータの名前を作成したり、変数のスケールを行うことができます。たとえば、熱電対入力に接続されたI/O変数の場合、摂氏エイリアスと華氏エイリアスを作成できます。さらに、それぞれのエイリアスをスケールして両方の単位で温度を表示できます。

I/Oエイリアスの値は、親の値に双方向的にリンク付けされ、親の値を更新するとI/Oエイリアスの値が更新されます。同様に、I/Oエイリアスの値を更新すると親の値が更新されます。また、I/Oエイリアスのチェーンのどのリンク(エイリアス)を更新しても、他のすべてのリンクが更新されます。

1つのI/Oエイリアスを作成する

I/Oエイリアスを作成するには、プロジェクトエクスプローラウィンドウでI/O変数を含むターゲットを右クリックして、ショートカットメニューから新規→変数を選択してシェア変数プロパティダイアログボックスを開きます。I/Oエイリアスの名前を入力して、変数タイププルダウンメニューからI/Oエイリアスを選択します。参照ボタンをクリックして、新しいI/Oエイリアスに関連付ける既存のI/O変数またはI/Oエイリアスを選択します。

メモ  エイリアスをI/O変数に関連付ける際は、必ずエイリアスのデータタイプが関連付けるI/O変数のデータタイプに一致することを確認してください。

I/Oエイリアスの名前、説明、ネットワーク共有の設定、スケールは、プロジェクトエクスプローラウィンドウで変更できます。また、複数変数エディタウィンドウを使用して、複数のI/Oエイリアスを同時に編集することもできます。

メモ  I/Oエイリアスとその他の種類のシェア変数を両方含むライブラリはデプロイできません。I/Oエイリアスは、別のライブラリでデプロイする必要があります。

複数のI/Oエイリアスを同時に作成する

まとめて変数を作成ダイアログボックスを使用して、複数のI/Oエイリアスを同時に作成できます。I/Oエイリアスを一括作成するには、以下の手順に従ってください。

  1. 一括作成の処理を行うためのテンプレートとなるI/Oエイリアスを1つ作成します。
  2. I/Oエイリアスを含む変数ライブラリを右クリックして、ショートカットメニューから変数を作成を選択してまとめて変数を作成ダイアログボックスを開きます。
  3. プロパティをコピーを選択して、参照ボタンをクリックし、テンプレートとして使用するI/Oエイリアスを選択します。
  4. 作成するI/Oエイリアスの数を作成する数フィールドに入力し、OKボタンをクリックして新しいI/Oエイリアスを作成します。

これらの手順の実行後に、新しい変数を編集するための複数変数エディタウィンドウが自動的に開きます。たとえば、各I/Oエイリアスのエイリアスパスを編集して固有のI/O変数にバインドすることができます。

I/O変数値を強制する

I/O変数値は、対話的またはプログラム的に強制することができます。I/O変数を強制すると、関連するI/Oデータは、強制が解除されるまで、またはターゲットが再起動されるまで、または変数が別の値に強制されるまで、指定された値を取ります。I/O変数の強制を解除すると、I/O値はNIスキャンエンジンに制御されるようになります。

メモ  強制されているI/O変数へのアクセスは強制されていない変数へのアクセスより若干時間がかかるため、このオーバーヘッド時間より周期が短いループは実行が遅れる可能性があります。

I/O変数値を対話的に強制する

I/O変数の値は、デバッグ中またはI/Oチャンネルの手動制御中にNI分散システムマネージャを使用して強制または強制解除することができます。NI分散システムマネージャを起動するには、LabVIEWでツール→分散システムマネージャを選択します。分散システムマネージャは、プロジェクトエクスプローラウィンドウでRTターゲットを右クリックしてユーティリティ→システムマネージャで表示を選択して起動することもできます。

メモ  NI分散システムマネージャのセキュリティ設定を使用して、ユーザがNI分散システムマネージャでI/O変数を強制できないよう設定することもできます。

I/O変数値をプログラム的に強制する

強制VIを使用して、プログラム的にI/O変数を強制または強制解除します。

I/Oエイリアスを強制する

強制は、標準I/O変数だけでなくエイリアスにも適用されます。I/O変数を強制すると、すべての関連するエイリアスも強制されます。エイリアスを強制すると、親I/O変数と関連するすべてのエイリアスも強制されます。

メモ  強制された値にも、I/Oチャンネルの実際の値と同様にスケーリングが適用されます。したがって、エイリアスチェーンの1つのリンク(エイリアス)を強制すると、チェーンのすべてのリンクが適切にスケールされます。

ターゲットですべてのI/O変数を同時に強制/強制解除する

ターゲットのグローバル強制状態を使用して、ターゲットですべてのI/O変数を同時に強制および強制解除できます。ターゲットでグローバル強制を対話的またはプログラム的に有効および無効にできます。

NI分散システムマネージャの強制を有効化および強制を無効化ボタンを使用して、ターゲットで対話的にグローバル強制を有効および無効にします。「変数の強制を有効化」または「変数の強制を無効化」VIを使用して、ターゲットでプログラム的にグローバル強制を有効および無効にします。

以下の手順に従って、ターゲットのすべてのI/O変数を同時に強制します。

  1. ターゲットの強制を無効にして、I/O変数を強制することなく、I/O変数の希望する強制値を個々に設定できるようにします。
  2. ターゲットのすべてのI/O変数の強制値を設定します。
  3. ターゲットの強制を有効にして、ターゲット上のすべてのI/O変数を同時に強制します。

I/O変数にリモートからアクセスする

I/O変数のネットワーク共有が有効にされている場合、I/O変数をホストするターゲットと同じネットワークに接続されているリモートコンピュータからI/O変数にアクセスできます。NI分散システムマネージャのI/O変数プローブビューを使用して、リモートのI/O変数に対話的にアクセスできます。VI内でリモートのI/O変数にプログラム的にアクセスすることもできます。

シェア変数プロパティダイアログボックスを使用して、I/O変数のネットワークでの共有を有効または無効にできます。ホストコンピュータのI/O値を監視したり、リモートターゲットからI/O値にアクセスするには、ネットワーク共有を有効にします。ターゲットのすべてのI/O変数のグローバルネットワーク共有レートは、スキャンエンジンページで設定します。

メモ  I/O変数にリモートアクセスしない場合は、CPUオーバーヘッドを最小化するためにネットワーク共有を無効にしてください。I/O変数またはI/Oエイリアスのネットワーク共有を無効にすると、別のコンピュータで実行中のVIからその変数にアクセスできなくなります。ただし、NI分散システムマネージャで変数を強制することはできます。ユーザによるI/O変数の強制を禁止するには、システムマネージャのセキュリティ設定を使用します。

I/O変数にローカルでアクセスする

I/O変数は、スキャンエンジンのグローバルメモリマップに追加され、すべてのI/O変数の値は同時に更新されます。ただし、I/O変数をホストするローカルターゲットのI/O変数にアクセスする場合、各ノードでスキャンアクセスまたはダイレクトアクセスを使用するように設定できます。

以下の手順に従って、I/O変数ノードのローカルアクセスモードを選択します。

  1. ブロックダイアグラムでI/O変数ノードを右クリックします。
  2. ショートカットメニューからローカルアクセスモードを選択します。
  3. ノードで使用したいアクセスモードを選択します。
メモ  I/O変数は、設定されたアクセスモードに関係なくすべてのスキャンエンジングローバルメモリマップに追加されます。

ローカルアクセスモードを選択する

一般に、スキャンアクセスはアップデートレートがほぼ等しいチャンネルのグループに適し、ダイレクトアクセスはスキャン周期に非同期でアップデートする個々のI/Oチャンネルに適しています。以下の表は、各I/Oアクセス方法の用途を示しています。

一般的用途 アクセス方法
共通のアップデートレートを共有するI/Oチャンネルへのシングルポイントアクセス スキャン
緊急停止出力への単一の書き込みなど、NIスキャンエンジンの周期と非同期なローカルI/Oチャンネルへのシングルポイントアクセス(ユーザ定義I/O変数ではサポートされていません) ダイレクト
メモ  NIスキャンエンジンの周期よりアップデートレートの遅いI/Oチャンネルには、ダイレクトアクセスを使用できます。ただし、その場合は、一般的にスキャンアクセスの方がダイレクトアクセスよりも同じI/O動作を効率よく行います。

スキャンアクセス

デフォルトでは、I/O変数ノードではスキャンアクセスが使用されます。スキャンアクセスは、単一レートで更新されるI/Oチャンネルのセットや、拡張I/Oチャンネルに使用します。スキャンアクセスでは、以下の図で示すように、スキャンエンジンメモリマップによって非ブロックI/O読み取り/書き込みが実行されます。

スキャンアクセスでは、I/O変数から値を読み取るたびに、NIスキャンエンジンはブロックまたは新規値を待機せずにメモリマップの最新値を即座に返します。各スキャン処理では、LabVIEWは最新のI/O値を読み取り、その値をNIスキャンエンジンのメモリマップに書き込みます。

スキャンアクセスでは、I/O変数に値を書き込むたびに、スキャンエンジンメモリマップに格納されていた以前の値が上書きされます。各スキャン処理では、メモリマップの値を物理I/Oチャンネルにプッシュします。すべてのI/O変数の書き込み操作は、データの損失を回避するためにスキャン周期に同期する必要があります。

ダイレクトアクセス

ダイレクトアクセスは、スキャン周期と非同期のシングルポイントローカルI/Oチャンネルの読み取りまたは書き込みに使用します。アプリケーションが可能な限り速く値を書き込む必要がある場合にダイレクトアクセスを使用します。ダイレクトアクセスは、以下の図で示すとおり、スキャンエンジンメモリマップをバイパスしてI/Oデバイスドライバと直接通信し、ブロックなしのI/O読み取り/書き込みを行います。

メモ  ユーザ定義I/O変数はダイレクトアクセスをサポートしていません。

メモ  NIスキャンエンジンとRIOスキャンインタフェースをあわせて使用した場合、ハードウェアスキャン信号がI/Oへのアップデートを制御します。ハードウェアスキャン信号が待機状態のときにダイレクトアクセスで値を書き込むと、その値は、ハードウェアスキャン信号の待機状態が終了してからハードウェアに渡されます。
メモ  ダイレクトアクセスの速度は、コントローラ、I/Oモジュール、通信プロトコルに応じて異なります。I/Oアクセス速度については、各ハードウェアのドキュメントを参照してください。

I/O変数ノードアイコンの意味

ブロックダイアグラムの各I/O変数ノードには、以下のアクセス方法を示すグリフが表示されます。

アクセス方法 ノードの外観
NI-PSP

スキャン

ダイレクト

「データ通信方法」ホーム



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

役に立たなかった