C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

テキストボックスの値の更新

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■92732 / inTopicNo.1)  テキストボックスの値の更新
  
□投稿者/ じょこびっち (5回)-(2019/10/26(Sat) 13:58:19)

分類:[C#] 

2019/10/26(Sat) 16:20:07 編集(投稿者)

ボタンを押した時にオシロスコープへコマンドを送信して
受け取った値をテキストボックスに表示させています。

しかし、測定値が変更され、再度ボタンを押した時に値が更新されず最初の値を保持したままになります。
どうすれば値が更新されるのでしょうか?

ResourceManager rm = new ResourceManager();
FormattedIO488 inst = new FormattedIO488();
private void button1_Click(object sender, EventArgs e)
{

// 通信開始
inst.IO = rm.Open("引数") as IMessage;

// 測定器のID確認
inst.WriteString("*IDN?"); // IDクエリ
textBox1.Text = inst.ReadString();
}
private void button2_Click(object sender, EventArgs e)
{
inst.WriteString("MEASUrement:MEAS1:MAXimum?");
textBox2.Text = inst.ReadString();

}

下記のように単純に文字列を変更するだけならRefresh();を使用することもなく表示が変わりました。
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "STEP1";
}
private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = "STEP2";

}

よろしくお願いします。
引用返信 編集キー/
■92733 / inTopicNo.2)  Re[1]: テキストボックスの値の更新
□投稿者/ 774RR (743回)-(2019/10/26(Sat) 16:37:39)
詳しいことを言い出すといろいろ難しい話が出てくるんだけど、

> inst.WriteString("MEASUrement:MEAS1:MAXimum?");
> textBox2.Text = inst.ReadString();

1. これがどういう文字列を得ているかをデバッガに表示する、を試してみよう

using System.Diagnostics; // をファイル先頭付近に書いたうえで

string result = inst.ReadString();
Debug.WriteLine(result); // とすると Visual Studio の「出力」パネルに表示される
Debug.WriteLine("Max=<" + result + ">"); // とすればヘッダやトレーラも一緒に表示される
textBox2.Text = result; // で画面上 TextBox の更新が予約される

画面の更新は予約されるだけで後回しになるのに対して
Debug.Write() Debug.WriteLine() は即時デバッガ画面に表示されるので、こっちのほうが便利。

2. この WriteString()/ReadString() にどれくらい時間がかかるのかマニュアルを確認/実測
これらの処理中はあなたのプログラムは「応答なし」になってしまう。
表示が変わるのは WriteString()/ReadString() の両方が終わった後になるので
1秒かかるなら1秒後、10秒かかるなら10秒後に画面が更新されることになる。
時間がかかる、かつ、画面更新の遅れが気になるのなら、プログラムの構造自体から見直しが必要。

3. オイラの使ったとあるデジマルは Measure:DCV? の後に改行が必要だったんだけど
WriteString() という関数名からは改行を出力しないように読み取れ (WriteLine() なら改行出力あり)
与えている文字列にも改行がないように読み取れる。
「改行が必要」かどうかは、あなたの測定器のマニュアルに書かれているはずなのでその辺の確認。
もし必要なら改行を追加。必要なければ無視してください。

オイラのデジマルの場合、
PC が改行コードのないコマンドを送る→
DM が改行コードを約2秒待つ(待ちきれなくてタイムアウトする)→
PC 側 ReadString() が2秒後でないと戻ってこない→
画面更新が毎回2秒後(エラー表示のみとなる)で、その間ボタンが反応しない
なんてことがあったのでちょいと気になった。

引用返信 編集キー/
■92734 / inTopicNo.3)  Re[2]: テキストボックスの値の更新
□投稿者/ じょこびっち (6回)-(2019/10/26(Sat) 20:37:31)
No92733 (774RR さん) に返信
> 詳しいことを言い出すといろいろ難しい話が出てくるんだけど、
>
>>inst.WriteString("MEASUrement:MEAS1:MAXimum?");
>>textBox2.Text = inst.ReadString();
>
> 1. これがどういう文字列を得ているかをデバッガに表示する、を試してみよう

教えていただいた方法で確認してみましたがinst.ReadString()で得ている文字列はtextBox2に表示されてる値と同じでした。
ただし、その値はオシロで計測したMAXの値とも違います。
何度やっても同じ値しか取得していない(取得できていない?)ようです。

> 2. この WriteString()/ReadString() にどれくらい時間がかかるのかマニュアルを確認/実測

WriteString()/ReadString()について測定器のマニュアルには記載がありませんでした。
数秒待って見ましたが画面が更新されることもなかったです。

> 3. オイラの使ったとあるデジマルは Measure:DCV? の後に改行が必要だったんだけど
> WriteString() という関数名からは改行を出力しないように読み取れ (WriteLine() なら改行出力あり)
> 与えている文字列にも改行がないように読み取れる。
> 「改行が必要」かどうかは、あなたの測定器のマニュアルに書かれているはずなのでその辺の確認。
> もし必要なら改行を追加。必要なければ無視してください。

改行についても記載はありませんでした。
念のためinst.WriteString("MEASUrement:MEAS1:MAXimum?\r\n");でコマンドを送ってみましたが
変化はありませんでした。

引用返信 編集キー/
■92739 / inTopicNo.4)  Re[3]: テキストボックスの値の更新
□投稿者/ kiku (137回)-(2019/10/28(Mon) 09:28:57)
2019/10/28(Mon) 09:37:38 編集(投稿者)
2019/10/28(Mon) 09:30:19 編集(投稿者)

コマンドが正しいのかどうかをまずは確認した方が良いと思います。

質問者さんの利用機器とは違うかもしれませんが、
コマンド体系が同じようでしたので
下記の資料の4ページから8ページまでを実践してみてはどうでしょうか?

https://www.texio.co.jp/uploads/GDS-300_200_pm_ver1_03.pdf

この資料には、LF(改行コード)が必要と記述されています。


オシロスコープの正確な機種を明示できるのであるならば
明示した方が良いと思います。
利用したことがある方から返答あるかもしれませんし、
こちらからも資料を調べられるかもしれないので。
引用返信 編集キー/
■92740 / inTopicNo.5)  Re[4]: テキストボックスの値の更新
□投稿者/ 774RR (744回)-(2019/10/28(Mon) 10:07:57)
もしこの機種であるとして「LFが必要」と記述されているのはコマンド解説の前のページのみ、
このマニュアルであればページ10に解説がちょろっとあるだけで、
各コマンドそれぞれの解説ページ20以後には無い(わざわざ書くと冗長なので)
この手のマニュアルを読む際には各コマンド解説の直前直後の注釈がものすごく大事っす。

フツーに USB/COM 変換機能が入っている計測器なら System.IO.Ports.SerialPort で制御する。
SerialPort に ReadString() や WriteString() というメソッドはないので、
提示 ReadString() / WriteString() は(ライブラリ作者の)自作関数だろうと推測できる。

んで .NET なプログラムの内部コードは Unicode/UTF-16LE であるが
GDS のオシロやデジマルが受け渡すコードは ASCII/8bit なので

SerailPort.Write(Char[] buffer, int offset, int count);
は符号化方式を面倒見てくれるがテキストしか送信できないし事前に変換が必要

SerialPort.Write(byte[] buffer, int offset, int count);
はバイナリ用(テキストを送信するには符号化方式を自分で面倒見る必要がある)

SerialPort.Write(String str);
だと *これだけでは* 改行が含まれない(追加送信する必要がある)

ということでこの手の計測器には SerialPort のメソッドそのままではうまくいかないわけだ。
ReadString() / WriteString() の実装や XML comment を見て、
符号化方式は?
改行が送られるのか否か
タイムアウトがどのくらいなのか
あたりの確認を行うべきだろう。

# 過去に得られた値がそのまま取得される(現在値でもなく null でもなく)ってことは
# その ReadString() は過去に受信した値をそのまま返すのだろうか?ちと不思議。

引用返信 編集キー/
■92748 / inTopicNo.6)  Re[5]: テキストボックスの値の更新
□投稿者/ じょこびっち (7回)-(2019/10/28(Mon) 13:03:04)
kikuさん、774RRさんのおっしゃる通り最初の方にちょろっと改行コード(LF)の記載がありました。
ご指摘ありがとうございます。
しかし、問題はこれではなかったようです。

キーサイトのConnection ExpertツールのIO Monitorで確認したところ
コマンドの送受信はちゃんとされていました。
改行コードが抜けていた場合も勝手に\nを付けて送っていてくれたようです。

再度動作を確認してみてわかった事。
1、オシロスコープを起動、測定せずに値を取得⇒指数を表示
2、測定してから値を取得⇒最大値を表示
3、再度測定して最大値を変更⇒上で取得した最大値を超えた場合のみ取得。
例えば最初の測定した最大値が20Vだった場合、次に測定した値が21Vなら取得するが、
19Vなら初めの値の20Vを返してることがわかりました。

そのことからMeasureで設定してオシロの画面に表示されている最大値ではなく、
オシロで保持(?)している起動時からの最大値を取得していたようです。
inst.WriteString("MEASUrement:MEAS1:VALue?\n");
というValueコマンドを送ったところ問題なく測定された最大値が取得できるようになりました。
単純にコマンドが違うだけでした。

色々教えてくださりありがとうございました。
またよろしくお願いします。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ