NI製品ディスカッション

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

バイトカウント(VISA読み取り)をワイルドカードにする方法

基礎的なご質問で恐縮です。
VISA読み取りのバイトカウントをワイルドカードにする方法が
ありましたらお教え願います。
数値表記がU32になっているためどのようにすればいいのか分かりません。
お分かりの方、お教えいただきたいと思います。
0 件の賞賛
メッセージ1/8
8,332件の閲覧回数

kiyo <x@no.email> wrote:
>基礎的なご質問で恐縮です。VISA読み取りのバイトカウントを
>ワイルドカードにする方法がありましたらお教え願います。
>数値表記がU32になっているためどのようにすればいいのか
>分かりません。お分かりの方、お教えいただきたいと思います。

ワイルドカードにする、というのは、今バッファにあるデータが
何バイトであれ全部読み取りたい、という意味で良いでしょうか?

であれば、普通は、想定されるよりも大きな数値をつないでおけば、
バッファにある分だけ読まれて、そのバイト数もリターンで
返ってくると思われますが、それではダメでしょうか。

自分で使用するときも、数バイトしか返答しない計測器の場合は
100とかつないでいますが、特に問題はありません。

なお、VISAアクセスの対象がRS-232Cである場合には、
別途シリアルバッファに何バイト入っているかを知ることが
できるので、その数値を直接つなぐと、今あるバイト数きっちり
読み込んだり、ゼロだったときはReadしないといったことも
できます(エラーストラクチャに「指定のバイト数と読み込んだ
バイト数が同じ」とかいうワーニングが入るようですが)。


0 件の賞賛
メッセージ2/8
8,326件の閲覧回数
ご回答いただきありがとうございます。
 
確かに、ご指摘頂いたようにバッファを大きめにとれば
DATAはすべて取れますが、設定したByte数と読込まれるByte数と異なると
ワーニングが出てしまい処理をしなければいけないため、
ワイルドカードに出来ればそれに越したことはないと思ったためです。
 
いま、制御しようとしている対象物のReadされるコマンドの
Byte数は、最大255Byteという規定しかないため、
最大の255Byteで設定してしまうとほとんどのReadされるコマンドは
設定したByteカウントからはずれてしまいます。
結果的に外れるたびにエラー処理をしないといけないためです。
個人的に面倒くさいというのが本音なんですけど・・・
 
 
0 件の賞賛
メッセージ3/8
8,320件の閲覧回数

kiyo <x@no.email> wrote:
>ご回答いただきありがとうございます。
>&nbsp;
>確かに、ご指摘頂いたようにバッファを大きめにとれば
>DATAはすべて取れますが、設定したByte数と読込まれるByte数と異なると
>ワーニングが出てしまい処理をしなければいけないため、

そうなんでしたっけ?
これまでVISAでGPIPやシリアルを相手にいくつか組んだ中では、
設定したbyte数と読み込んだbyte数が異なっていても何かが
起きたことはありませんです。(普通、異なっています)

むしろ、同じだったときに「同じだった」というワーニングが
セットされますが、それもエラーではなくワーニングであり、
エラークラスタはFalseのままコードがセットされるだけで、
放っておいても問題はなく、何か処理が必要なことは無いと思います。

相手の実態がシリアルの場合には、今バッファに何バイトあるか
知ることができますが、他は知ることが出来なかったような・・
(技巧的な方法はあるかも知れませんが)

従って、普通は、同じbyte数をはじめから与えて・・というのは
難しいように思いますし、違っていても普通は問題ないはずなのですが、
なぜエラーになるのでしょう・・? ちょっと考えにくいのですが・・・・

ちなみに、たまたま設定byte数と読み込んだbyte数が同じだったときは
エラーにならないで済んでいるのでしょうか?

0 件の賞賛
メッセージ4/8
8,316件の閲覧回数
スレッドありがとうございます。
 
確かに、設定したByte数と読んだByte数が違っていても
普通に使っている分には実害はありません。
 
実は今回制御したいのは、シリアル通信(RS232CでBSC方式)で、
帰ってくるコマンドのByte数をチェックしてカウントした数によって
次の処理を決定する必要があるためです。
 
もう少し噛み砕きますと、コマンド送信をして返事を待つのですが、
ACKのみが帰ってくるか、返信コマンド+ACKが帰ってくるのかによって
次の処理を変える必要があります。
なおかつ、返信コマンド+ACKは、返信コマンドによって、
Byte数が異なりますのでByte数ごとで処理を変える必要があります。
そのためワーニングが出た時点でエラー処理をしておいたほうが、
いつまでもワーニングを引きずったままよりはいいのかと思いました。
 
といった理由で、出来ることであれば、
Byteカウントをワイルドカードにしてしまうことで、設定するByte数を不問にして
読んだByte数によって次の処理が出来ればいいと思ったしだいです。
ワーニングが出たら、エラークリアのviを使ってクリアしてしまい次の処理をすればいいかとも思います。
 
 
 
0 件の賞賛
メッセージ5/8
8,313件の閲覧回数

たまたまRS-232Cのようなので、例えば、添付の絵のようにすると
Readする前に、バッファのデータのbyte数が分かります。
(これがゼロならその間待つことも可)

これが、御所望の方式になるかどうか不明ですが、少なくとも
Readする前にbyte数が分かるので、それをVISA Readにつなぐことで
設定byte数と読み込むbyte数は必ず一致してくれます。

なお、この方式では必ず「設定byte数と読み込んだbyte数が同じだった」
というワーニングがセットされるので(番号は忘れてしまいました)、
その番号の時は当然の事象なので無視する(クリアする)という
ことになると思います。

予めカウント数を知っておいて、読む前に処理を分岐したいのであれば
これを使うことになるでしょうか・・・ ただ、いつかは読まないと
いけないので、先に読んでから分岐しても良いなら、VISA Readには
リターンカウント出力端子もありますし、読んだ文字列の文字数が
それになるのでそれを使っても良いのかな?と。
(・・なんてことは書かなくてもご存知ですよね・・)

当方、御所望の処理が微妙につかみきれていませんが、少なくとも
RS-232C相手の場合に限り、これで「不問にした」のと同じことに
なりそうですが、如何でしょうか?


kiyo <x@no.email> wrote:
>スレッドありがとうございます。
>&nbsp;
>確かに、設定したByte数と読んだByte数が違っていても
>普通に使っている分には実害はありません。
>&nbsp;
>実は今回制御したいのは、シリアル通信(RS232CでBSC方式)で、
>帰ってくるコマンドのByte数をチェックしてカウントした数によって
>次の処理を決定する必要があるためです。
>&nbsp;
>もう少し噛み砕きますと、コマンド送信をして返事を待つのですが、
>ACKのみが帰ってくるか、返信コマンド+ACKが帰ってくるのかによって
>次の処理を変える必要があります。
>なおかつ、返信コマンド+ACKは、返信コマンドによって、
>Byte数が異なりますのでByte数ごとで処理を変える必要があります。
>
>そのためワーニングが出た時点でエラー処理をしておいたほうが、
>いつまでもワーニングを引きずったままよりはいいのかと思いました。
>&nbsp;
>といった理由で、出来ることであれば、
>Byteカウントをワイルドカードにしてしまうことで、設定するByte数を不問にして
>読んだByte数によって次の処理が出来ればいいと思ったしだいです。
>ワーニングが出たら、エラークリアのviを使ってクリアしてしまい次の処理をすればいいかとも思います。
メッセージ6/8
8,311件の閲覧回数
こんにちは。佐山です。

# 全部シリアルと仮定します

> 確かに、ご指摘頂いたようにバッファを大きめにとれば
> DATAはすべて取れますが、設定したByte数と読込まれるByte数と異なると
> ワーニングが出てしまい処理をしなければいけないため、

私も出た記憶がないのですが・・・。
(Warningだから無視した可能性大・・・)

基本的にバイト数入力へ大きい数値を入れて、
リターンカウントで実際のバイト数を見るわけですが、
ワイルドカードにしたいのであればそのようなVIを作成する必要があります。

白石さんのサンプル・・・・
がなぜか添付されていないので、えいや!(勝手に流用)
(ニュースグループからは見れますが、
 WEBから見れない不思議な状態・・・)

の通りプロパティノードでバッファの数をみて取る方法もありますが、
例えばコマンドの戻りが256以上にならないのであれば、
256と入れてやれば取れるだけ取ってくるので話は済みます。

もしコマンド応答にデリミタがあるのであれば、
VISA Configure Serial Portで終了文字を有効にすれば、
可変長データに対するワイルドカードも実現可能です。

あるいは区切りの決定できない場合は、
1)コマンド分受信する
2)ACKかコマンドか判別する
3)コマンドなら残りを受信する。コマンドに応じて必要なバイト数だけ読む。
4)足りない場合は繰り返し読み込む
5)自分でバッファリングした応答が規定の長さになったら出力する
というVIを作成するのがよいでしょう。

以上ご参考になれば幸いです。
0 件の賞賛
メッセージ7/8
8,298件の閲覧回数
スレッド頂きありがとうございます。
ご検討いただいた内容でVIを作って試してみたいと思います。
 
ありがとうございました。
 
また、何かあるようでしたらよろしくお願いいたします。
0 件の賞賛
メッセージ8/8
8,287件の閲覧回数