NI製品ディスカッション

cancel
Showing results for 
Search instead for 
Did you mean: 

NI-VISAでASCIIコードを送信する方法

Solved!
Go to solution

ご確認ありがとうございます。ひとまず一部ですが、通信できているようなのでハードウェア側に問題なく安心しました。

 

Q1. READモジュールが読み取り終了する条件は何でしょうか?

A1. エラーが発生した場合、もしくはフロントパネルで停止ボタンが押された場合です。

 

Q2.ダブルクォーテーションをループごとに挟むのはなぜでしょうか?

A2. 「ダブルクォーテーション」というのは空文字列定数のことかと思いますが、これはシフトレジスタの初期化に使用しています。シフトレジスタは、実行終了時に最後のデータをメモリに保持したままですので、これがない場合は前回の実行で最後のデータが次の実行時に使われるようになります。

 

Q3. 1とCRを送信した場合にうまくいかない。

A3. 16進表示で「310D」は¥コード表示で「1\r」となりますので、送信データが10進数の1でしたら文字列定数での指定は問題なさそうです。

前回と同じデータを受信するということなので、\rだけが認識されていそうな感じがします。

Tera Termでは、文字列ではなく文字として1文字ずつ送受信すると聞いたことがございますので、1とCRを別々のVISA書き込み関数に分けて送信してみては如何でしょうか?

 

 

0 Kudos
Message 11 of 20
(883 Views)

ありがとうございます。

 

31と0Dを送信するWriteモジュールを分けて作りました。

 

310DをTERATERMで送ったときに返ってくる文字列が見えましたが、

1回目の実行で見えず、2回目で見えましたが、1という文字が読み取りバッファに余計についていたり、

想定外の文字が読み取りバッファに見えたので、動作を詳しく見ていこうと思います。

0 Kudos
Message 12 of 20
(879 Views)

1文字ずつ送信することでTera Termでの動作に近づいたようですが、読み取りの挙動がおかしいようですので、もう少しで修正が必要ということですね。

 

接続する機器の説明書を確認することで、改善のヒントが得られる可能性がございますので、再度ご確認ください。もし共有可能でしたら私のほうでも確認致します。

0 Kudos
Message 13 of 20
(874 Views)

お世話になっております。

 

試行錯誤したところ1文字ずつ送る際に間に1秒のウエイトを入れたところ正常に受信データが返ってきました。

(ウエイトを500msにすると動かなくなるので、かなりウエイト時間が長い印象でした。)

 

接続機器の説明書は元々TERATERMで動かす前提となっているようで、タイミングについては何も書いていませんでした。

製造元には問い合わせはできるので聞いてみようと思います。

 

ウエイトの必要性から今構築していたVIファイルを修正する必要が出てきました。

その中で今までForループのストラクチャで、配列を使ってループごとに文字数の異なる文字を書くようにしていたのですが、ウエイトを入れる必要から1文字ずつ分割して送る修正が出てきました。

ループごとに文字数が異なり、少ない文字数の場合、空の配列を作るとそのまま何も書かずにスルーしてくれるのでしょうか?

0 Kudos
Message 14 of 20
(863 Views)

1文字ずつ送信する際の待機時間が関連していたのですね。

 

空の配列を作るとそのまま何も書かずにスルーしてくれるのでしょうか?」という部分はコードを見てみないと何ともいません。

 

ちなみに、1文字ずつ書き込むサンプルプログラムでしたら、下記にございます。このページの画面右側にあるDownloadsの項目から入手可能です。

 

ここでは、添付のサブVIが使われており、コマンドの文字列を1文字ずつ送信するように作成されており、この中で待機関数も使われておりますので、参考になるのではないかと思います。

 

0 Kudos
Message 15 of 20
(860 Views)

お世話になっております。

ありがとうございます。

 

>Q1. READモジュールが読み取り終了する条件は何でしょうか?

>A1. エラーが発生した場合、もしくはフロントパネルで停止ボタンが押された場合です。

 

Whileループの停止条件はフロントパネルで停止ボタンかと思うのですが、

READモジュールそのものが抜けるのは改行文字があったらなどなのでしょうか?

 

実際の動作ではWhileループを自動で抜けるようにしたいと思いますが、コマンドによって文字数が異なり、バイト数などで抜けれるようにはできない状態です。

応答文字が数秒間来なかったら抜けるタイムアウトのような動作は可能でしょうか?

 

>Q2.ダブルクォーテーションをループごとに挟むのはなぜでしょうか?

>A2. 「ダブルクォーテーション」というのは空文字列定数のことかと思いますが、これはシフトレジスタの初期化に使用しています。シフトレジスタは、実行終了時に最後のデータをメモリに保持したままですので、これがない場合は前回の実行で最後のデータが次の実行時に使われるようになります。

 

空文字列定数を抜かしてREADのデータを直接表示器に入れたところ、1行目をループごとに更新している動作に見えました。空文字列定数はループ毎に文字列を溜め込み、改行を認識させているイメージでしょうか?

 

>Q3. 1とCRを送信した場合にうまくいかない。

>A3. 16進表示で「310D」は¥コード表示で「1\r」となりますので、送信データが10進数の1でしたら文字列定数での指定は問題なさそうです。

前回と同じデータを受信するということなので、\rだけが認識されていそうな感じがします。

Tera Termでは、文字列ではなく文字として1文字ずつ送受信すると聞いたことがございますので、1とCRを別々のVISA書き込み関数に分けて送信してみては如何でしょうか?

 

1文字ずつで動作するようになりました。

0 Kudos
Message 16 of 20
(828 Views)

1文字ずつ送信することで動作するようになったようで安心しました。

いくつか追加のご質問が記載されておりましたので下記に回答致します。

 

VISA読み取り関数が出力を返す(抜ける)条件は、以下のとおりです。

  • 終端文字を受信した場合
  • バイトカウントに入力したバイト数を受信した場合
  • タイムアウトが発生した場合

 

 

計測器I/O>>VISA>>VISA上級サブパレットにあるVISAタイムアウト設定で任意のタイムアウト時間を設定可能です。通信が始まる前に設定してください。

 

 

空文字列定数を使用したシフトレジスタの初期化ですが、添付ファイルを開いて複数回実行することで違いが分かるかと思います。

ループの左側にあるシフトレジスタに初期値を配線することで実行する毎にその値で初期化されます。初期値がない場合は、前回実行した際の最後の値を引き継ぎます。

 

0 Kudos
Message 17 of 20
(816 Views)

ありがとうございます。

 

>計測器I/O>>VISA>>VISA上級サブパレットにあるVISAタイムアウト設定で任意のタイムアウト時間を設定可能です。通信が始まる前に設定してください。

 

READが終端文字を受信して抜けたか、タイムアウトで抜けたか識別はできるのでしょうか?

識別ができれば、比較器を通してタイムアウトで抜けた条件だけ、Whileループを抜けるようにすれば目的を果たせると考えております。

0 Kudos
Message 18 of 20
(808 Views)

タイムアウトで抜ける場合はエラー-1073807339が発生しますので、エラー配線を確認することでタイムアウトが発生したことはすぐ判断できます。

0 Kudos
Message 19 of 20
(797 Views)

ありがとうございます。

 

VIをいじりながら見てみると、入力バイト数と現在のバイト数を比較して、等しくなったら抜けるとしたらうまくいきました。

Message 20 of 20
(788 Views)