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

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

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

Re[19]: (GPIB)波形取り込み [1]


(過去ログ 50 を表示中)

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

■27176 / inTopicNo.21)  Re[16]: (GPIB)波形取り込み
  
□投稿者/ 渋木宏明(ひどり) (934回)-(2008/10/29(Wed) 22:24:52)
渋木宏明(ひどり) さんの Web サイト
>   インターフェース社のGP-IBの仕様で、受信バッファになる文字列変数は、予めその容量を
>   確保しておかないといけないので、RecvBuffer = ""; は、バッファなしになってしまい、
>   最悪、保護違反してプログラム、ぶっ飛びます。

そうなんですか?

>>nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);

では、out が指定されているので、RecvBuffer には何も値を代入しないまま GpibRecieve() を呼び出しても問題なさそうですが。

P/INVOKE の宣言自体が間違っている、とかなら別ですが。
引用返信 編集キー/
■27177 / inTopicNo.22)  Re[17]: (GPIB)波形取り込み
□投稿者/ オショウ (54回)-(2008/10/29(Wed) 22:41:27)
> では、out が指定されているので、RecvBuffer には何も値を代入しないまま GpibRecieve() を呼び出しても問題なさそうですが。
>
> P/INVOKE の宣言自体が間違っている、とかなら別ですが。

  GP-IBのVB関連マニュアルには・・・

データ受信においては受信用の配列変数を用意します。配列のサイズですが、必ず「受信データ
長」+「デリミタ」を考慮したバイトサイズを指定します。受信データ長が 16バイト,デリミタ
が「CR+LF」の場合には、16+2の18バイト以上の領域を確保する必要があります。

  と記載があります。

チュートリアル
Visual BasicによるGP-IB入門書 より引用。

● Microsft Visual Studio .NET移行ガイド には・・・

[DllImport("gpc43042.dll")]
public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, ref
byte pvBuffer);
[DllImport("gpc43042.dll")]
public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, byte[ ]
pvBuffer);
[DllImport("gpc43042.dll")]
public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, IntPtr
pvBuffer);

  と記載されています。

  と言うことは、間違ってる?

以上。
引用返信 編集キー/
■27179 / inTopicNo.23)  Re[16]: (GPIB)波形取り込み
□投稿者/ 初心者 (182回)-(2008/10/29(Wed) 23:12:23)
お返事ありがとうございます!


>   大有りです!
>   インターフェース社のGP-IBの仕様で、受信バッファになる文字列変数は、予めその容量を
>   確保しておかないといけないので、RecvBuffer = ""; は、バッファなしになってしまい、
>   最悪、保護違反してプログラム、ぶっ飛びます。


すみません。よくわからないのですが、

string RecvBuffer = "";
を行うことによって、文字列変数を確保している…というつもりだったのですが…

ちなみにインターフェイス社のサンプルプログラムをそう解釈した感じです。




>
>   RecvLen = 2000 とされているのですが、オシロからのデータ1個が、何バイトになるのか
>   で、実際に文字列変数に割り当てる容量が変化します。
>
>   アドバンテスト社のマルチメータでは、電圧測定の場合、データ+デリミタ=18バイト
>   でした。で、データ数が、1000個なら・・・
>
>   バッファ容量=18バイト×1000
>


RecvLenはそのように定めるのですね…
デリミタはLFなので1バイトでいいとして、データはオシロのマニュアルに書いてあるものですか??
先ほどから探していますが、見つかりません。。。

引用返信 編集キー/
■27180 / inTopicNo.24)  Re[17]: (GPIB)波形取り込み
□投稿者/ 初心者 (183回)-(2008/10/29(Wed) 23:20:32)
2008/10/29(Wed) 23:24:53 編集(投稿者)
2008/10/29(Wed) 23:24:50 編集(投稿者)

<pre><pre>インターフェイス社
PCI-4302標準に対応しているサンプルプログラムです。

この時も大丈夫で、自分の時に駄目という理由がいまひとつわかりません。。
ASCIIコードにしたから形式が違うのかな…?とか思ってたくらいです…


なお、下記のプログラムはフォームの1つで、実行すると、機器に「*IDN?」などのコマンドを送った際に、文字列の受信が出来ます。




private void buttonReceive_Click(object sender, System.EventArgs e)
{
int nRet;
string RecvBuffer = "";
int[] DevAdrsTbl = new int [2];
uint RecvLen;

// 機器アドレステーブル設定
DevAdrsTbl[0] = DevAdrs;
DevAdrsTbl[1] = -1;

// データ受信
RecvLen = 64;

nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);

if(nRet != 0)
{
CtrlCs2Form.DsplyErrMessage(nRet);
return;
}

CtrlCs2Form.DsplyErrMessage(nRet);
textBoxData.Text = RecvBuffer;
}

private void buttonClear_Click(object sender, System.EventArgs e)
{
textBoxData.Text = "";
}

private void buttonCancel_Click(object sender, System.EventArgs e)
{
DialogResult = DialogResult.Cancel;
}

private void buttonContinu_Click(object sender, System.EventArgs e)
{
timerReceive.Enabled = true;
}

private void buttonStop_Click(object sender, System.EventArgs e)
{
timerReceive.Enabled = false;
}

private void timerReceive_Tick(object sender, System.EventArgs e)
{
int nRet;
string RecvBuffer = "";
int[] DevAdrsTbl = new int [2];
uint RecvLen;

// 機器アドレステーブル設定
DevAdrsTbl[0] = DevAdrs;
DevAdrsTbl[1] = -1;

// データ送信
RecvLen = 64;

nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);

textBoxData.Text = RecvBuffer;
}
}</pre></pre>
引用返信 編集キー/
■27181 / inTopicNo.25)  Re[18]: (GPIB)波形取り込み
□投稿者/ れい (818回)-(2008/10/30(Thu) 02:45:14)
No27177 (オショウ さん) に返信
>   と言うことは、間違ってる?

なにがどう間違ってるのが何なのかわかりませんが、
Interface社のラッパーが、ということでしたら微妙なところです。

> [DllImport("gpc43042.dll")]
> public static extern int GpibReceive(int ulBoardNo, int[] lpAdrsTbl, ref uint dwpLength, out byte pvBuffer);

こんな風に定義されていますので、これを使うならdwpLength=1にして呼び出さないといけません。
当然、最大1バイトしか取得できません。
殆ど役にはたちませんので、宣言する必要がわかりませんが、一応動きます。

> public static extern int GpibReceive(int ulBoardNo, int[] lpAdrsTbl, ref uint dwpLength, byte[] pvBuffer);

こっちはoutもrefも着いていませんが、動作します。
byte[]はBlittableの配列なので、呼び出し時にはpvBufferは固定されます。
固定されたバッファがgpc43042.dll内部で変更されているので、
.Net側で見ると変更されてるように見えます。
Inパラメーターなのに値が帰ってきていいのか、という問題はありますが、動くことは動きます。

で、最後に、今回問題になっている
> public static int GpibReceive(int ulBoardNo, int[] lpAdrsTbl, ref uint dwpLength, out string pvBuffer)
これはIFCGPIB.csで定義されている関数で、dll内の関数ではありません。
GpibReceive( ... , Byte[] pvBuffer)の単純なラッパーで、
エラー処理とか文字コードの問題を除けば、まぁ動きます。

なので、Interface社のラッパーにも難点はありますが、
今回の問題はそれが原因である、というわけではありません。

No27167 (初心者 さん) に返信
> nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);
>
> この部分にミスありそうですかね…
> 何度にらめっこしてもわかりません…

この部分に直接のミスはないと思います。
前述のようにIFCGPIB内部のGpibReceive( ... , out String pvBuffer)の定義も、
細かい点を除けば問題ありません。

> 「if(nRet != 0) 」
> で途切れてしまっています。

まずはnRetが何を返しているのか、それが何を示すのかを調べるのがよいと思います。
バグがあったらまずエラーコードを見るというのは基本ですし。
引用返信 編集キー/
■27184 / inTopicNo.26)  Re[19]: (GPIB)波形取り込み
□投稿者/ オショウ (55回)-(2008/10/30(Thu) 07:31:27)
2008/11/05(Wed) 07:40:01 編集(投稿者)

いろいろ突っ込みありがとうございます。
しかしながら、マニュアルに記載の文言については、一切なしですか?

宣言について、どうのこうのと指摘がありますが・・・

VB6とActiveX(インターフェース社の)で7年
.NETと、DLL(インターフェース社の)で丸4年
1年365日中355日/24時間、GP-IBボード使って、機器制御して
データ収集させているもので。

後は、GP-IBと言うものを理解して、『動くように作る』しかないかと。

以上。
引用返信 編集キー/
■27186 / inTopicNo.27)  Re[20]: (GPIB)波形取り込み
□投稿者/ オショウ (56回)-(2008/10/30(Thu) 08:17:11)
2008/11/05(Wed) 07:39:28 編集(投稿者)

初心者さんへ

一度、YOKOGAWAのサポートへでも電話して、何がしかの
サンプルコードがあったらもらえないか、交渉してみたら

.NETの導入は横河も遅れていましたが、もう対応している
と思うのですが。

DL4200は、GPーIBのみだったようで、シリアル通信があれば
もう少し簡単にできたかと思いますが・・・

以上。
引用返信 編集キー/
■27187 / inTopicNo.28)  Re[17]: (GPIB)波形取り込み
□投稿者/ 渋木宏明(ひどり) (935回)-(2008/10/30(Thu) 08:43:51)
渋木宏明(ひどり) さんの Web サイト
> string RecvBuffer = "";
> を行うことによって、文字列変数を確保している…というつもりだったのですが…

それはそれで間違いです。

問題の本筋とは違うようなので細かいことには言及しませんが、要お勉強です。
引用返信 編集キー/
■27200 / inTopicNo.29)  Re[19]: (GPIB)波形取り込み
□投稿者/ 初心者 (184回)-(2008/10/30(Thu) 11:33:49)
2008/10/30(Thu) 11:35:40 編集(投稿者)

NO27181れいさん
お返事ありがとうございます!


> この部分に直接のミスはないと思います。
> 前述のようにIFCGPIB内部のGpibReceive( ... , out String pvBuffer)の定義も、
> 細かい点を除けば問題ありません。
>
>>「if(nRet != 0) 」
>>で途切れてしまっています。
>
> まずはnRetが何を返しているのか、それが何を示すのかを調べるのがよいと思います。
> バグがあったらまずエラーコードを見るというのは基本ですし。




nRetは「nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);」GpibReceiveが正常だった場合、0を返すものです。

そして、この時点でForm1.DsplyErrMessage(nRet);のエラーに引っかかるものはありません。



バグがあったと言ったのは、ブレークポイントを各行に設置した場合です。


https://www.microsoft.com/japan/msdn/vs/debug/vberrDebuggingWindowsFormsControlsCreatedWithVisualBasicNETOrVisualCNET.aspx

より引用。

>エラー位置でのブレーク
>コントロールのデバッグ時にエラーが発生すると、エラーを発生した行でコードの実行が中断します。これは、コール スタックの最も深いポイントで発生します。つまり、ホスト アプリケーションから呼び出されたコントロール メソッドでエラーが発生した場合、そのコントロール メソッドの行で実行が中断します。

引用返信 編集キー/
■27201 / inTopicNo.30)  Re[21]: (GPIB)波形取り込み
□投稿者/ 初心者 (185回)-(2008/10/30(Thu) 11:40:09)
No27186 (オショウ さん) に返信
> 初心者さんへ
>
> 一度、YOKOGAWAのサポートへでも電話して、何がしかの
> サンプルコードがあったらもらえないか、交渉してみたら
>
> .NETの導入は横河も遅れていましたが、もう対応している
> と思うのですが。
>
> DL4200は、GPーIBのみだったようで、シリアル通信があれば
> もう少し簡単にできたかと思いますが・・・
>
> 以上。



電話ですか…たしかに、VB5のサンプルのみでは不足かな?と思っていましたが、電話すれば貰えるものなのですかね…
とりあえずはメールをしてみたいと思います。

オショウさんの言っている通り、動くものを作らないと意味がないので、前に言っていただいたこともふまえて色々試してみたいと思います!
引用返信 編集キー/
■27202 / inTopicNo.31)  Re[18]: (GPIB)波形取り込み
□投稿者/ 初心者 (186回)-(2008/10/30(Thu) 11:41:51)
No27187 (渋木宏明(ひどり) さん) に返信
>>string RecvBuffer = "";
>>を行うことによって、文字列変数を確保している…というつもりだったのですが…
>
> それはそれで間違いです。
>
> 問題の本筋とは違うようなので細かいことには言及しませんが、要お勉強です。




あ、違いましたか。。。
また考えなおしてみます。

ありがとうございます。

些細な事でも勘違いが無くなれば見えてくるかもしれないので歓迎します。
引用返信 編集キー/
■27241 / inTopicNo.32)  Re[20]: (GPIB)波形取り込み
□投稿者/ れい (820回)-(2008/10/31(Fri) 00:55:42)
あれ?あれれ?
なんか全然理解できない発言がならんでます。
私の発言変、変でしたかねぇ?酔ってはいなかったはずなんですが。

No27184 (オショウ さん) に返信
> いろいろ突っ込みありがとうございます。
> しかしながら、マニュアルに記載の文言については、一切なしですか?

えっと、これは私に対しての返信でしょうか?
文意がつかめませんでした。

マニュアルとは「Microsft Visual Studio .NET移行ガイド」のことですか?
どこかそのへんに転がってたような気もしますが、いま参照できる環境にいませんし、
Interface社も配布を終了してるので、突っ込みはなしです。
オショウさん引用部分についても、
前投稿で十分説明していますので、突っ込む必要もないかと思います。

> 宣言について、どうのこうのと指摘がありますが・・・
>
> VB6とActiveX(インターフェース社の)で7年
> .NETと、DLL(インターフェース社の)で丸4年
> 1年365日中355日/24時間、GP-IBボード使って、機器制御して
> データ収集させているもので。

こちらも何をいっているのかさっぱりわかりません。

がんばって想像してみると、
私の、
> 動くことは動きます。
> 一応動きます。
> まぁ動きます。
これらの明言を避けた曖昧な発言を「信頼性に問題がある」と解釈して、
1年中うごかしているので信頼性に問題があるわけがない、
ということを言いたいのでしょうか?

明言をさけたのは細かい突っ込みを避けたかっただけで、
#「GCで固定すればref byteでも複数点のデータ送れるじゃん!」とか、そういった類の細かいツッコミ。
動いたり動かなかったりする、という意味を含めたものでは在りません。

> 後は、GP-IBと言うものを理解して、『動くように作る』しかないかと。

ええもちろん。
GPIBでもなんでも、きちんと動けば問題ないですよね。
で、動かないので初心者さんは困ってるんだと思うのですが、違う話をしてるのでしょうか?

No27200 (初心者 さん) に返信
> >>「if(nRet != 0) 」
> >>で途切れてしまっています。
>>
>>まずはnRetが何を返しているのか、それが何を示すのかを調べるのがよいと思います。
>>バグがあったらまずエラーコードを見るというのは基本ですし。
>
> nRetは「nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);」GpibReceiveが正常だった場合、0を返すものです。
>
> そして、この時点でForm1.DsplyErrMessage(nRet);のエラーに引っかかるものはありません。

ブレークポイントとか、そういった話をしてるので、
「途切れる」というのを、「エラーが返っている」と解釈したのですが、違うようですね。

「途切れる」とは、
> そうしたら……なんとオシロのエラーが
> 「応答の送信が中断されました」
オシロがGPIB送信でエラーを出すと言うことでしょうか?

> バグがあったと言ったのは、ブレークポイントを各行に設置した場合です。
これも全く意味がわからないです。
ブレークポイントを各行に設置するとバグがあったのでしょうか?

送信要求してからブレークして長いこと放置してたらGPIBがエラーになるということですか?
でもそれは当たり前ですし、普通バグとは言いませんよね。

ブレークポイントを設置するだけでバグが発生するのだとしたらVSか.Netにとって致命的で、
そういった問題にも思えません。

と、いうわけで、初心者さんもオショウさんも、何を言ってるのかさっぱりわかりませんでした。

私はDL-4200をもってはいませんし、
ソースを提示されても眺める程度で、YOKOGAWAの他機種で実機テストとかする気はないので、
〜が間違ってる、と一発で指摘はできませんが、
どこで何がどんなエラー/例外を吐くのか、きちんとした説明があればわかるかもしれませんし、
私がわからなくてもオショウさんや他の誰かエライ人がわかるかもしれません。

今のところ私がわかるのは、
IFCGPIB.GpibReceive( ... , out String pvBuffer);
はPInvokeじゃないのでクラッシュしたりはしません、ということだけです。

アドバイスは…
「*IDN?」コマンドの動作確認はしましたか?
話の流れ的には、受信ができないかと思うのですが。
WAVeformとかSTATusとか、シリアルポールとか言う前に、
とりあえず送受信できなきゃ話にならないので、
そこからやってみたらよいと思います。

引用返信 編集キー/
■27266 / inTopicNo.33)  Re[19]: (GPIB)波形取り込み
□投稿者/ 初心者 (187回)-(2008/10/31(Fri) 18:43:54)
YOKOGAWAにサンプルプログラムを貰い解決することが出来ました!
今まで色々なアドバイスありがとうございました!

GpibReceiveの箇所はあのままで大丈夫でしたが、データの量や指定などを設定し、いらないものをきることで通信が出来ました。


回答をいただいた皆様に感謝していますが、特にオショウさんには多くの相談に乗ってもらい、本当に感謝しています。

これをベースに色々な制御をしてみたいと思います!
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -