NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

Win32API、memcpyを使用するとLabVIEWが強制終了

解決済み
解決策を見る

大川 様
いつもお世話になっております。
 
無事ダウンロードできました。
ダウンロードしたインストーラを使用して
LabVIEWのインストールされているマシンとインストールされていないマシンに
SharedとReceivedをインストールしました。

どちらのマシンも実行する前にWindowsファイアウォールをOFFにしましたが
どちらもシェア変数は機能しませんでした。

そこで、LabVIEWがインストールされているPCで実行した場合と
LabVIEWがインストールされていないPCで実行した場合のポート状態を比較してみました。
また、以前頂いたプロジェクトをビルドして作成したEXEはシェア変数が機能していましたので
こちらの場合のポート状態も見てみました。

【LabVIEWありのPC】
 TCP    Ryu1:4341           localhost:4342         ESTABLISHED
 TCP    Ryu1:4342           localhost:4341         ESTABLISHED
 TCP    Ryu1:4345           localhost:4346         ESTABLISHED
 TCP    Ryu1:4346           localhost:4345         ESTABLISHED

【LabVIEWなしのPC】
 TCP    PC:1069             localhost:1070         ESTABLISHED
 TCP    PC:1070             localhost:1069         ESTABLISHED
 TCP    PC:1072             localhost:1073         ESTABLISHED
 TCP    PC:1073             localhost:1072         ESTABLISHED

【シェア変数が機能するEXEを実行】
 TCP    Ryu1:4287           localhost:4288         ESTABLISHED
 TCP    Ryu1:4288           localhost:4287         ESTABLISHED
 TCP    Ryu1:4289           localhost:59110        ESTABLISHED
 TCP    Ryu1:4293           localhost:4294         ESTABLISHED
 TCP    Ryu1:4294           localhost:4293         ESTABLISHED
 TCP    Ryu1:4295           localhost:59110        ESTABLISHED
 TCP    Ryu1:59110          localhost:4289         ESTABLISHED
 TCP    Ryu1:59110          localhost:4295         ESTABLISHED


シェア変数が機能する場合と機能しない場合で、開放されるポートの数が異なっておりました。
機能する場合はSharedとReceivedの両方で共通のポートを開いているように見受けられます。
何かの手がかりになりますでしょうか。

お手数をお掛け致しますが
ご確認の程よろしくお願い致します。

0 件の賞賛
メッセージ21/27
3,891件の閲覧回数
Ruy1 様

ご連絡ありがとうございます。
送付いただきましたデータを拝見しました。

先日添付致しましたファイルが正常に動作しなかった理由は、ライブラリがターゲットの PC でデプロイされていなかったからだと考えられます。
当方ではライブラリを作成した PC とターゲットの PC がネットワークを通してつながっております。
プロジェクトを構成した PC とネットワーク上でつながっていない際は、ターゲット PC の IP アドレス、又は PC 名を設定し、クライアントライブラリをサーバライブラリにバインドして頂く必要がございます。

サンプルを添付いたしましたので、お手数ですが再度ご参照願います。

このサンプルはサーバとクライアントに分かれており、ライブラリファイルも二つございます。
この用にプロジェクトを設定しますと複数の EXE、又はネットワーク上の PC からシェア変数を制御することが可能になります。
複数の EXE、又はネットワーク上の PC からシェア変数を制御される際には、全てのクライアントライブラリをサーバライブラリにバインドして下さい。

添付サンプルではサーバ VI で変数を変更し、クライアント VI で読み取っておりますが、逆方向へのデータ転送も可能です。
添付サンプルをご確認していただく前にターゲット PC にクライアントライブラリをサーバライブラリにバインドし、クライアントを再度コンパイルして頂く必要がございます。

下記の手順をご参照願います。

① 「Shared Variable Project.lvproj」 を開いて下さい。
② 「sv_lib_CLIENT.lvlib」 の 「ShareMe_Client」 を右クリック → 「プロパティ」
③ 「ソースに連結」 にチェックをつけ、パスにサーバのライブラリパスを指定。 例: 「\\ターゲットパソコン\sv_lib\Waveform」。 ターゲット PC はご使用される PC 名、又は IP アドレス。
④ 「sv_lib_CLIENT.lvlib」 の 「Waveform_Client」 も同様に設定をして下さい。
⑤ ビルド仕様の 「Client」 を再度コンパイルして下さい。
⑥ インストーラを再作成して下さい。インストーラを作成する際に、「インストーラプロパティ」 内の 「追加のインストーラ」 の 「ランタイムエンジン」、「NI 変数エンジン」 と 「NI 変数マネージャ」 にチェックをつけて下さい。一度上記の内容をインストールすれば、後日 LabVIEW でご構築されたプログラムをご使用される際に、EXE だけをコピーしてご使用いただけます。
⑦ ターゲット PC にインストールして頂き、動作確認願います。

添付サンプルはクライアントライブラリを次のフォルダから取得します → 「クライアントフォルダ¥data\sv_lib_CLIENT.lvlib」。
同じくサーバライブラリは「サーバフォルダ¥data\sv_lib.lvlib」 に取得します。
添付サンプルでは、もしライブラリが上記フォルダに無い場合、ポップアップウィンドウを立ち上げ、ユーザにライブラリのパスを問います。

現在 PC で使用できるライブラリご覧いただき、設定の変更をしていただくには Windows のスタートボタンをクリックしていただき → 「全てのプログラム」 → 「National Instruments」 → 「Variable Manager」 → 「Variable Manager」を使用願います。

上記内容をご確認の上、再度ご連絡願います。

日本ナショナルインスツルメンツ
技術部
大川エリキ

___________________________________________________________
Eric Matsumoto Okawa
___________________________________________________________
"Draw a picture of yourself. Are you smiling?"
0 件の賞賛
メッセージ22/27
3,864件の閲覧回数
大川 様
いつもお世話になっております。
ご回答ありがとうございます。
 
ご指示頂いたとおりの方法でインストーラを作成してみました。
LabVIEWがインストール済みのPCでは動作しましたが、
LabVIEWがインストールされていないPCでは以下のエラーが発生しました。
────────────────────────────────────────────────────
エラー -1950679035 が次の場所で発生しました: シェア変数:書き込み(SV_Server.vi
内)
考えられる理由:
LabVIEW:  (Hex 0x8BBB0005) シェア変数エンジンから変数を見つけることができません。この変数の配置に失敗したかもしれません。
この警告は書き込み中を\\マイ コンピュータ\sv_lib\Waveformに対して実行中に発生しました。(\\10.4.4.87\sv_lib\Waveform)
────────────────────────────────────────────────────
また、「Variable Manager」を起動したところ
「Local System」の下には「sv_lib」、「sv_lib_CLIENT.lvlib」があり
それぞれの下にシェア変数が存在しました。
「sv_lib_CLIENT.lvlib」 の 「ShareMe_Client」と「Waveform_Client」には
インストーラを作成する際に、マシン名「CAMERA」またはIPアドレス「10.4.4.189」と指定しましたが
どちらも「localhost」に自動的に変更されているみたいでした。
 
お手数をおかけいたしますが
ご確認の程よろしくお願い致します。
 
0 件の賞賛
メッセージ23/27
3,851件の閲覧回数
Ryu1 様

早々のご返信有難うございます。
ご連絡が遅くなりまして申し訳ございません。

Ruy1 様の PC で表示される -1950679035 エラーはシェア変数が見つからないという事ですので
シェア変数が正しく設定されていない、又は、ファイアーウォールなどでポートにアクセスが出来ないという事が考えられます。

大変申し訳ございませんが、先日お送りいたしましたシェア変数のアドレスの指定の手順に誤りがございましたので、設定の手順を再度お伝えさせて頂きます。

① 「Shared Variable Project.lvproj」 を開いて下さい。
② 「sv_lib_CLIENT.lvlib」 の 「ShareMe_Client」 を右クリック → 「プロパティ」
③ 「ソースに連結」 にチェックをつけ、パスにサーバのライブラリパスを指定。 例: 「\\ターゲットパソコン\sv_lib\ShareMe」。 ターゲット PC はご使用される PC 名、又は IP アドレス。
    前回この設定に誤りがあった可能性がございますので、ターゲット PC とネットワーク上で接続されている際は横の 「参照」 を押して頂き、「ネットワーク項目」 からターゲット PC のシェア変数ライブラリを手動で選択願います。
④ 「sv_lib_CLIENT.lvlib」 の 「Waveform_Client」 も同様に 「\\ターゲットパソコン\sv_lib\Waveform」 と設定をして下さい。
⑤ ビルド仕様の 「Client」 を右クリック → 「プロパティ」。 「ソースファイル設定」 の 「Sv_lib_CLIENT.lvlib」 が 「Support Directory」 になっている事をご確認ください。
    このように設定をして頂きますと、ライブラリファイルが 「...\Client\data\sv_lib_CLIENT.lvlib」 に保存されます。
    Clien.exe を実行した際に、パスを問うポップアップウィンドウが立ち上がらなくなると思いますので、ご確認ください。
⑥ ビルド仕様の 「Server」 も同じようにご確認ください。
⑦ 「Client」 と 「Server」 を再度コンパイルして下さい。
⑧  先日シェア変数エンジン、シェア変数マネージャをターゲット PC にインストールして頂きましたので、今回は実行ファイルをコピーして頂くだけで大丈夫です。
⑨ ターゲット PC にインストールして頂き、動作確認願います。

プロジェクトを再度添付させて頂きましたので、ご確認願います。
上記内容をご確認の上、同じような問題が発生している際は、大変お手数ですが LabVIEW がインストールされている PC でご確認ください。
その際には、③ と ④ をネットワーク上からご使用になられている PC の検索を願います。

問題が解決されないようでしたら、大変お手数ですが再度 Windows のファイアウォール設定をご確認願えますでしょうか。
Windows のファイアウォール設定を行うにはコントロールパネル → 「Windows ファイアウォール」

上記内容をご確認の上、再度ご連絡願います。
日本ナショナルインスツルメンツ技術部
大川エリキ


___________________________________________________________
Eric Matsumoto Okawa
___________________________________________________________
"Draw a picture of yourself. Are you smiling?"
0 件の賞賛
メッセージ24/27
3,811件の閲覧回数

大川 様

いつもお世話になっております。
ご回答ありがとうございます。

ご教授頂いたとおり試してみましたが前回と同様のエラーが出ました。

 

ターゲットマシンのマシン名を登録してシェア変数のプロパティで「参照」ボタンを押し
ご教授頂いたとおりに設定しましたが変わりませんでした。

Windowsファイアフォールも無効にして確認しましたがエラーが出ました。

シェア変数のプロパティで「参照」ボタンを押したときに表示されます
プロパティダイアログ上で、マシン名のツリーを展開するとシェア変数が表示されましたので
ターゲットマシンを参照は出来ていると思います。

 

お忙しいところ申し訳ありませんが
ご確認の程よろしくお願い致します。

0 件の賞賛
メッセージ25/27
3,802件の閲覧回数
解決策
トピック作成者Ryu1が受理

情報のシェアをする目的でアップデートしています。

 

あるお客様がLabVIEWではない言語で開発していたプログラムと今回LabVIEWで開発するプログラムとのデータ共有を共有メモリを使用して行いたいという依頼があり、このフォーラムの情報を知りました。

 

Ryu1さんは当初共有メモリを使用してアプリ間のデータ共有を行いたいがハングするということでComMem8.2_2.viをアップデートされていました。このプログラムを変更することでハングしないようになります。添付したプログラムがそれです。(LabVIEW8.6.1にて作成)

 

変更内容としては、
ローカル変数の呼び出し順番がシーケンスにそっていなかったので排除しました。
文字列長に関してはNULL文字分を追加しました。
コピー元、先のポインタ指定方法をC文字列ポインタに変更しました。
上記変更に伴い、2回目のコピー先のポインタに関して入力ワイヤがつながれていなかったのでワイヤをつなぎました。


ちなみにLabVIEWで作成したアプリケーション同士でデータ共有する場合は今までの紹介どおり共有メモリではなく、シェア変数を使用いただくのが簡単に行える方法になります。共有メモリはLabVIEWで作成されていないアプリケーションとデータ共有する場合にご使用ください。

 

National Instruments

Application Engineer

Teruhiko Udaka

メッセージ26/27
3,189件の閲覧回数
↑ すみません。添付ファイル忘れてました。
メッセージ27/27
3,188件の閲覧回数