NI製品ディスカッション

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

シリアル通信(VISA)のタイムアウトについて[LabView]

解決済み
解決策を見る

投稿失礼いたします。

 

現在VISAを使用したシリアル通信(無手順)で、PLC⇔LabViewの間で解析トリガ送信およびデータのやり取りをしたいと考えております。

 

実現したいフローは、下記の通りです。

①PLCからトリガとなる固定の文字列を送信する〈LabView側はVISA読み取り〉

②LabViewが固定の文字列を受信すると、解析を開始する

③解析が終わるとLabViewから解析後の数値データ(ASCII形式)をPLCに送信する〈LabViewではVISA書込み〉

 

サンプルプログラムを活用し、通信も出来、データも送受信できているのですが、

VIを連続実行をさせて任意のタイミングでPLCからトリガとなる固定の文字列を送信することを実現したいです。

 

現状は、連続実行をさせてしばらくトリガを送信しないと下記タイムアウトエラーになってしまいます。

エラー - 1073807339 VISA読み取り/書き込みでタイムアウトが発生しました。

 

解決策としては下記2点が考えられると思っています。

①VIを連続実行して、VISA読み取りで待機する(タイムアウトを無効化?)

②VIを外部のトリガで実行できるようにする

 

LabView2020 SP1(32bit)を使用しています。

 

最近LabViewを触り始めて、まだ知識が浅いため、知見のある方に解決策をご教授いただけますと幸いです。

よろしくお願いいたします。

0 件の賞賛
メッセージ1/6
1,597件の閲覧回数

「トリガが送信されないとタイムアウトが発生する」こと自体は、正常なのだろうと思いました。

この場合、いくつか案は考えられます。

 

  • タイムアウト時間を設定する
    NI-VISA関数のプロパティノードで、タイムアウト時間を設定できます。 VISAセッションのタイムアウトを構成する
    U32データの入力なので、"-1"を入れて無限待ち、はできないようです。システムとしても-1はハングの原因となるので推奨されません。
    想定されるだけ長く設定する方法が考えられます
  • エラーを無視して再トライ
    エラー自体は悪いものではなく、トリガが来なかったことを教えてくれています。Whileループ内で繰り返し読み取り関数を呼び出し、
    エラーがあれば継続、エラーがなければ次の処理へ進むなんて方法が考えられます。この場合のメリットは、Whileループを使っているので、
    停止ボタンなどでWhileループを止めることができ、処理の中断ができます

システムの作り方として、トリガが届く予定になってから待ちに入る、という処理も一案かと思います。

 

 

 

Certified LabVIEW Developer
There are only two ways to tell somebody thanks: Kudos and Marked Solutions

GCentral
メッセージ2/6
1,545件の閲覧回数

Emboar_Dymax様

 

ご回答ありがとうございます。

 

>タイムアウト時間を設定する

1度はこの方法で試みたところエラー発生を遅らせることはできましたが、無限待ちができないため断念しました。

 

>エラーを無視して再トライ

こちらの方法はやりたいことが実現できそうな気がします。

まずは試しにトライしてみたいと思います。

 

>システムの作り方として、トリガが届く予定になってから待ちに入る、という処理も一案かと思います。

こちらも考えたのですが、今回シリアル通信のみで通信しており、

「トリガが届く予定」をLabViewに伝えるためにも読み取り関数を使わなければいけないと考えたため断念しました。

他に入力信号を入れられるシステムのほうが綺麗な流れかもしれませんが・・・。

 

とても参考になる情報をありがとうございました。

0 件の賞賛
メッセージ3/6
1,534件の閲覧回数
解決策
トピック作成者kawamuが受理

こんにちは。

VISA Read.viはバイトカウントで指定したバイト数を読み込みますが、VISAシリアルポート構成で設定したタイムアウト以内に読み込みが完了しないとタイムアウトエラーになります。
ここでVISAシリアルポートバイトプロパティを使う手をご紹介します。
VISA Read.viで読み取る前にVISAシリアルポートバイトプロパティで読み取りバッファにデータがあるか確認し、ゼロなら(データが無い)ならちょっと待ってから再度確認(ループ)。ゼロ以外(もしくは予定するバイト数のデータが入っていたらら)VISA Read.viで読み取る。

いかがでしょうか?

メッセージ4/6
1,517件の閲覧回数

SuuuSan様

 

こんにちは。

 

ご回答ありがとうございます。

 

>VISA Read.viで読み取る前にVISAシリアルポートバイトプロパティで読み取りバッファにデータがあるか確認し、ゼロなら(データが無い)な>らちょっと待ってから再度確認(ループ)。ゼロ以外(もしくは予定するバイト数のデータが入っていたらら)VISA Read.viで読み取る。

VISAシリアルポートプロパティという機能もあるのですね、確かにこの方法で出来れば、エラーは出さずに実現できそうです。

試してみたいと思います。ありがとうございます。

0 件の賞賛
メッセージ5/6
1,482件の閲覧回数

Emboar_Dymax様、SuuuSan様

 

こんにちは。

 

様々なアドバイスをいただきまして、希望していた処理を実現することができました。

最終的にはVISAプロパティでデータが入ってきたら読み取り動作を開始する処理を採用させていただきました。

 

お二方とも、短期間で的確なアドバイスをいただき、ありがとうございました。

0 件の賞賛
メッセージ6/6
1,477件の閲覧回数