5

別のLabviewプログラムから生成された整数の瞬時値にCコードが定期的にアクセスできるようにするための最良の方法は何ですか?

科学実験を制御し、20ミリ秒ごとにデータを記録するタイムクリティカルなCコードがあります。また、別の計測器を操作し、100ミリ秒ごとに整数値を出力するLabVIEWコードもあります。Cコードでlabviewからの値を記録できるようにしたいと思います。これを行うための最良の方法は何ですか?

1つのアイデアは、Labviewにループ内のファイルに整数を書き込み、Cコードにループ内のファイルの値を読み取らせることです。(必要に応じて、Cコードに2番目のスレッドを追加できます。)LabviewはCdllにリンクすることもできます。したがって、2つのプログラム間の共有を何らかの形で容易にするDLLをCで記述できる可能性があります。それはお勧めですか?どうすればいいですか?

4

3 に答える 3

4

私はここに同様のアプリケーションを持っており、TCP_NO_DELAYオプションが設定されたTCPソケットを使用しています(ある種のパケットバッファリングを行うNagleアルゴリズムを無効にします)。実際のネットワーク遅延は常に不明な変数のままですが、ソケットは問題なく100ミリ秒の更新レートを可能にする必要があります。私のアプリケーションでは、特定の制限を下回っている限り、これは問題ではありません(これは、タイムスタンプのデルタが大きくなりすぎた場合に、各パケットと大きな赤いダイアログボックスでタイムスタンプを送信することによってもチェックされます:])。アプリケーションにとって重要ですか?つまり、LV機器が新しいサンプルを取得するたびに、その値がx mSec以内にCアプリに到達する必要があることが重要ですか?

dllアプローチを機能させることもできますが、ソケットほど単純ではなく、2つのアプリケーションの相互依存性が高まります。ただし、可変アクセスはほとんど瞬時に行われます。少なくとも2つの可能性があります。

  • Cアプリ全体をdllに入れ(最初は奇妙なアプローチに見えるかもしれませんが、機能します)、LVにロードしてメソッドを呼び出します。たとえば、アプリを起動するには、LVがdllのStart()メソッドを呼び出し、ループでLVがサンプルを取得して、dllのNewSampleValue(0メソッドなどを呼び出します。また、別のホストプロセスを記述しない限り、アプリをスタンドアロンで実行することはできません。
  • 共有プロセスメモリを調べて、Cアプリと別のdllに共通メモリを共有させます。LVはそのdllをロードし、そのdllのメソッドを呼び出して共有メモリに値を書き込みます。その後、Cアプリはフラグをポーリングした後にそれを読み取ることができます(ロックが必要です!)。
  • Cアプリにdll/activeX /を使用してLVプログラムを呼び出させることも可能かもしれませんか?電話をかけますが、そのシステムがどのように機能するのかわかりません。

私は間違いなくファイルアプローチを避けたいと思います。ディスクI/Oは本当のボトルネックになる可能性があり、ファイルで解決するのが面倒なロックの問題もあります。Cアプリは、LVがファイルを書き込んでいる間はファイルを読み取ることができず、その逆も同様であり、余分な遅延が発生する可能性があります。

補足として、上記の各アプローチはプッシュモデルまたはプルモデルのいずれかを使用していることがわかります(TCPモデルは両方の方法で実装できます)。これは、どちらの方向に進むかの最終決定に影響を与える可能性があります。プッシュ=LVはCアプリを直接、プル= Cアプリはフラグをポーリングするか、LVに値を要求する必要があります。

于 2011-01-04T19:41:21.900 に答える
3

私はNationalInstrumentsの従業員ですが、NationalInstrumentsC開発環境であるLabWindows/CVIで提供されるNetworkVariableAPIを見逃さないようにしたいと思いました。ネットワーク変数APIを使用すると、共有変数(http://zone.ni.com/devzone/cda/tut/p/id/4679)を介してLabVIEWプログラムと簡単に通信できます。これらのリンクを読んでいる間、ネットワーク変数と共有変数は同じものであることに注意してください-異なる名前は残念です...

ネットワーク変数APIの優れている点は、LabVIEWとの相互運用が容易であり、強く型付けされた通信メカニズムを提供し、ネットワーク/共有変数のプロパティ(値など)が変更されたときに通知するためのコールバックモデルを提供することです。

このAPIは、LabWindows / CVIをインストールすることで入手できますが、LabWindows/CVI環境を使用する必要はありません。ヘッダーファイルはC:\ Program Files \ National Instruments \ CVI2010 \ include \ cvinetv.hにあり、 C:\ Program Files \ National Instruments \ CVI2010 \ extlib \ msvc\cvinetv.libにある.libファイルは次のようになります。使用しているC開発ツールとリンクしています。

于 2011-01-04T20:14:31.597 に答える
3

@stijnの理想の1つをフォローアップしました:

Cアプリと別のdllに共通のメモリを共有させます。LVはそのdllをロードし、そのdllのメソッドを呼び出して共有メモリに値を書き込みます。その後、Cアプリはフラグをポーリングした後にそれを読み取ることができます(ロックが必要です!)。

ここで利用可能なInterProcessライブラリを作成しました:http://github.com/samuellab/InterProcess

CreateFileMapping()InterProcessは、とを使用してWindows共有メモリを設定するコンパクトな汎用ライブラリですMapViewOfFile()。これにより、ユーザーは任意のタイプの値(int、char、構造体など)を任意の数の名前付きフィールドにシームレスに格納できます。また、衝突や競合状態を回避するためにMutexオブジェクトを実装し、これらすべてをクリーンでシンプルなインターフェイスに抽象化します。WindowsXPでテスト済み。最新のWindowsで動作するはずです。

既存のCコードとLabVIEWをインターフェースするために、InterProcessの上に配置され、CコードまたはLabVIEWがアクセスする必要のある特定の関数のみを公開する小さなラッパーDLLを作成しました。このようにして、すべての共有メモリが完全に抽象化されます。

うまくいけば、他の誰かがこのコードが役立つと思うでしょう。

于 2011-02-10T16:47:02.633 に答える