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

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

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

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


(過去ログ 50 を表示中)

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

■27011 / inTopicNo.1)  (GPIB)波形取り込み
  
□投稿者/ 初心者 (170回)-(2008/10/24(Fri) 20:15:47)

分類:[C#] 

波形取得データ取得プログラムを作成しているのですが、エラーの原因がわかりません。 


実行すると、プログラムではエラーの原因が出ず、オシロスコープに 
「送信できる応答がありません。」 
と出ます。 


このオシロによると、「このメッセージは送受信の順序を確認してください。」 
とのとこなので、送受信のプログラムを見ていただきたいのですが。。。 


GPIBボードはインターフェイス社のものを使っています。 

わかる方、ちょっとした意見のある方、よろしくお願いします! 








        private void CommandWaveTranStart_Click(object sender, EventArgs e)  //波形取り込みボタンクリック
        {

            
			int  nRet1, nRet2, nRet3, nRet4 = 0;
			string szData1 = "WAVeform:FORMat ASCii";
            string szData2 = "WAVEform:TRACe 1";     //オシロのコマンドで、対象波形を問い合わせる
            string szData3 = "WAVEform:STARt 0";      //上記のものの開始点
            string szData4 = "WAVEform:END 2000";     //最後のデータの指定
            uint nLen1, nLen2, nLen3, nLen4; 
            int[] DevAdrsTbl = new int[2];



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

			// データ送信

				nLen1 = (uint)szData1.Length;
				if(nLen1 != 0)
				{
					nRet1 = IFCGPIB.GpibSend(nBoardNo, DevAdrsTbl ,nLen1, szData1);
					if(nRet1 != 0)
					{
						return;
					}
				}


				nLen2 = (uint)szData2.Length;
				if(nLen2 != 0)
				{
					nRet2 = IFCGPIB.GpibSend(nBoardNo, DevAdrsTbl,nLen2, szData2);
					if(nRet2 != 0)
					{
                        return;
					}
				}


				nLen3 = (uint)szData3.Length;
				if(nLen3 != 0)
				{
					nRet3 = IFCGPIB.GpibSend(nBoardNo, DevAdrsTbl,nLen3, szData3);
					if(nRet3 != 0)
					{
                        return;
					}
				}


				nLen4 = (uint)szData4.Length;
				if(nLen4 != 0)
				{
					nRet4 = IFCGPIB.GpibSend(nBoardNo, DevAdrsTbl,nLen4, szData4);
					if(nRet4 != 0)
					{
                        return;
					}
				}


            // データ受信

            int nRet = 0;
            string RecvBuffer = "";
            
            uint RecvLen;

			RecvLen = 64;

			nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);
		
			if(nRet != 0)
			{
				Form1.DsplyErrMessage(nRet);
				return;
			}
		
			Form1.DsplyErrMessage(nRet);
			textBoxData.Text = RecvBuffer;
		}





**********************************


GpibSendとGpibReceiveの使い方。


●C言語 

#include "GPC43042.H" 
int GpibSend( 
ULONG nBoardNo, // ボード番号 
PLONG lAdrsTbl, // アドレステーブルへのポインタ 
ULONG ulLength, // 送信バッファサイズ 
PVOID vpBuffer // 送信バッファへのポインタ 
); 

  
●C言語 

#include "GPC43042.H" 
int GpibReceive( 
ULONG nBoardNo, // ボード番号 
PLONG lAdrsTbl, // アドレステーブルへのポインタ 
PULONG ulpLength, // 受信バッファサイズ格納変数へのポインタ 
PVOID vpBuffer // 受信バッファへのポインタ 
); 

引用返信 編集キー/
■27013 / inTopicNo.2)  Re[1]: (GPIB)波形取り込み
□投稿者/ オショウ (41回)-(2008/10/24(Fri) 20:33:25)
> 実行すると、プログラムではエラーの原因が出ず、オシロスコープに
> 「送信できる応答がありません。」
> と出ます。
> // データ受信
>
> int nRet = 0;
> string RecvBuffer = "";
>
> uint RecvLen;
>
> RecvLen = 64;
>
> nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);
>
> if(nRet != 0)
> {
> Form1.DsplyErrMessage(nRet);
> return;
> }
>
> Form1.DsplyErrMessage(nRet);
> textBoxData.Text = RecvBuffer;
> }

  ここの受信時にそのエラーが出るのだと思いますが・・・
  インターフェース社のGP−IBボードは、PCI-4304ですか?ドライバーは最新?
  尚、GpibSend後、即、GpibReceiveすると、機器側がトーカモードに移行していなく
  データが来ない・・・という『クセ』があります。

  私は、アドバンテストのマルチメータを5台接続してサンプリングしデータ受信し
  ていますが、GpibSend後、即、GpibReceiveすると、タイムアウトまで待ってデー
  タ無しや、ハングアップしたかのような症状が出て苦労しました。

  シリアルポールして、データ送信準備を待ち合わせるか、若干Sleepさせて待って
  からデータ受信してみて下さい。

※ 機器の相性がありますので、この方法でダメな場合・・・いろいろ実験してみない
  ことには・・・

  因みに、標準版DLLの方を使っておられるみたいですが・・・機器によっては
  高機能版の方がよい場合もあります。しかしながら高機能版は難しくて・・・

  それと受信データ長ですが、64バイトで間に合うのでしょか?

以上。
引用返信 編集キー/
■27015 / inTopicNo.3)  Re[2]: (GPIB)波形取り込み
□投稿者/ 初心者 (171回)-(2008/10/24(Fri) 21:00:58)
2008/10/24(Fri) 21:01:53 編集(投稿者)
2008/10/24(Fri) 21:01:51 編集(投稿者)
2008/10/24(Fri) 21:01:48 編集(投稿者)

お返事ありがとうございます!
困っていたので感謝いたします。



>   インターフェース社のGP−IBボードは、PCI-4304ですか?ドライバーは最新?

GPIBボードは古くて、PCI4302を使用しています。
ドライバーはインストールしたばかりなので、最新だと思うのですが。。。
そのせいで標準版DLLしか使用できなかったと思います。



>   尚、GpibSend後、即、GpibReceiveすると、機器側がトーカモードに移行していなく
>   データが来ない・・・という『クセ』があります。

そうなのですか!知りませんでした!
ありがとうございます!
シリアルポールを扱ったことがないので、勉強してみます。


私はこれまたとても古く、YOKOGAWAのDL4200というオシロを使用しています。
古くて反応が鈍そうなので、ありえそうですね。





>それと受信データ長ですが、64バイトで間に合うのでしょか?

気づいていませんでした。
いくつくらいが適任になりそうですか…?
引用返信 編集キー/
■27017 / inTopicNo.4)  Re[3]: (GPIB)波形取り込み
□投稿者/ オショウ (42回)-(2008/10/24(Fri) 21:16:49)
> GPIBボードは古くて、PCI4302を使用しています。
> ドライバーはインストールしたばかりなので、最新だと思うのですが。。。
> そのせいで標準版DLLしか使用できなかったと思います。

  余談ですが、私は、PCI-4301 です・・・
  もう何年も(多分、5年以上)使ってますが、壊れない・・・

> シリアルポールを扱ったことがないので、勉強してみます。

  機器の方のマニュアル調べてみて下さい。
  SRQ割り込み関係にあります。

  シリアルポールして、サンプリングデータが発生したらとある
  ビットがオンするので、それからGpibSendして、GpibReceive

  間違わないように・・・
  1. サンプリング開始
  2. シリアルポールでサンプリング完待ち
  3. GpibSend => GpibReceive

> 私はこれまたとても古く、YOKOGAWAのDL4200というオシロを使用しています。
> 古くて反応が鈍そうなので、ありえそうですね。

  GP-IB では、GpibSendで命令を受け取ってから、トーカーモードに移行し
  それからGpibReceiveでトーカー機器から送信されたデータを受信します。
  PC側が先にGpibReceiveになってしまった場合、トーカー機器がない、
  もしくは、送信データが準備できていないので、タイムアウトエラーと
  なったりします。

  一概に言えないのですが、シリアルポールして機器側の状態を監視して
  同期をとるようにするのが得策。

> 気づいていませんでした。
> いくつくらいが適任になりそうですか…?

  ええ〜と・・・
  波形サンプリングされているのですから、その波形データ分の領域が必要
  になります。要は1個のデータ長とサンプリング個数を掛け合わせた数に
  なります。因みに、1個のデータ長+2バイト余計に必要ですヨ!
  意味は、GP-IBのマニュアル読めば書いてあります。

  頑張って下さい!

以上。
引用返信 編集キー/
■27019 / inTopicNo.5)  Re[4]: (GPIB)波形取り込み
□投稿者/ オショウ (43回)-(2008/10/24(Fri) 22:21:37)
1点確認・・・

GP-IBをオープンし、初期化したらそのオシロはリモートモード
になっていますか?

なっていない場合、そのアドレスにどんなコマンドを送信しても
無反応です。

以上。
引用返信 編集キー/
■27034 / inTopicNo.6)  Re[5]: (GPIB)波形取り込み
□投稿者/ 初心者 (172回)-(2008/10/25(Sat) 13:04:07)
2008/10/25(Sat) 13:04:36 編集(投稿者)

わざわざありがとうございます!
リモートインジケータが点灯するので大丈夫だと思います!

プログラム上ではフォームのロードにREN設定を行っていますが、波形転送をクリックした時に点灯しますが。。。


これからシリアルポール試してみたいと思います。




No27019 (オショウ さん) に返信
> 1点確認・・・
>
> GP-IBをオープンし、初期化したらそのオシロはリモートモード
> になっていますか?
>
> なっていない場合、そのアドレスにどんなコマンドを送信しても
> 無反応です。
>
> 以上。





引用返信 編集キー/
■27041 / inTopicNo.7)  Re[6]: (GPIB)波形取り込み
□投稿者/ オショウ (45回)-(2008/10/25(Sat) 15:55:58)
> リモートインジケータが点灯するので大丈夫だと思います!
> プログラム上ではフォームのロードにREN設定を行っていますが、波形転送をクリックした時に点灯しますが。。。

  インジケータが点灯するなら大丈夫でしょう。

  次にRENのみでは、不足と言うか・・・
  デリミタが、ボード側と機器側で合っていないと、機器側は
  またもや無反応となります。

  通信の為の各種設定をボードと機器間で合わせた後に初めて
  計測と言うか、制御が成り立ちます。

  ある意味、その辺の設定が合っているものとして思ってまし
  たが、不安なので、通信の設定を見直して下さい。

  シリアルポールがらみで、SRQ割り込みは使わないように!
  SRQ割り込みがオンになりますと、ちょっと厄介なことに
  なってしまう可能性があります。ご注意下さい。

以上。
引用返信 編集キー/
■27043 / inTopicNo.8)  Re[7]: (GPIB)波形取り込み
□投稿者/ 初心者 (173回)-(2008/10/25(Sat) 20:38:19)
No27041 (オショウ さん) に返信
>>リモートインジケータが点灯するので大丈夫だと思います!
>>プログラム上ではフォームのロードにREN設定を行っていますが、波形転送をクリックした時に点灯しますが。。。
>
>   インジケータが点灯するなら大丈夫でしょう。
>
>   次にRENのみでは、不足と言うか・・・
>   デリミタが、ボード側と機器側で合っていないと、機器側は
>   またもや無反応となります。
>
>   通信の為の各種設定をボードと機器間で合わせた後に初めて
>   計測と言うか、制御が成り立ちます。
>
>   ある意味、その辺の設定が合っているものとして思ってまし
>   たが、不安なので、通信の設定を見直して下さい。
>
>   シリアルポールがらみで、SRQ割り込みは使わないように!
>   SRQ割り込みがオンになりますと、ちょっと厄介なことに
>   なってしまう可能性があります。ご注意下さい。
>
> 以上。
引用返信 編集キー/
■27047 / inTopicNo.9)  Re[8]: (GPIB)波形取り込み
□投稿者/ オショウ (46回)-(2008/10/26(Sun) 06:21:38)
動作確認として・・・

  http://www.yokogawa.co.jp/tm/F-SOFT/dtviewer/welcome.htm

フリーで配布されている上記のDataViewerですが、これでデータ取れてますか?
取れるならば、ハード的設定は問題ないので・・・ご確認下さい。

以上。
引用返信 編集キー/
■27055 / inTopicNo.10)  Re[7]: (GPIB)波形取り込み
□投稿者/ 初心者 (174回)-(2008/10/26(Sun) 22:35:04)
あ、なぜか自分のコメントが入っていませんでした!
せっかく返事いただいてたのに、無言でたちが悪い…すみません…><


>   次にRENのみでは、不足と言うか・・・
>   デリミタが、ボード側と機器側で合っていないと、機器側は
>   またもや無反応となります。


デリミタ設定は、送信側のデリミタがちょっとよくわかんなくて、CRLF+EOIにしちゃってます…
明日ボードの説明書見直してみますね!




>   シリアルポールがらみで、SRQ割り込みは使わないように!
>   SRQ割り込みがオンになりますと、ちょっと厄介なことに
>   なってしまう可能性があります。ご注意下さい。



SRQ割り込み使っちゃいけないのですかっ!?

シリアルポールはSRQが検出された時に行うとあったので、てっきりこれを使うものだと…
SRQを使わないでシリアルポールって使えるんですか??




DataViewerありがとうございます!
明日チェックしてみます!

何からなにまで本当にありがとうございます><
引用返信 編集キー/
■27059 / inTopicNo.11)  Re[8]: (GPIB)波形取り込み
□投稿者/ オショウ (47回)-(2008/10/27(Mon) 00:09:58)
> デリミタ設定は、送信側のデリミタがちょっとよくわかんなくて、CRLF+EOIにしちゃってます…
> 明日ボードの説明書見直してみますね!

  一般的な設定のままですので、オシロ側がどうかで決まります。

> SRQ割り込み使っちゃいけないのですかっ!?
> シリアルポールはSRQが検出された時に行うとあったので、てっきりこれを使うものだと…
> SRQを使わないでシリアルポールって使えるんですか??

  SRQ割り込みを使うと、結果的にGpibExecSpollを呼んで割り込み
  要因を読み出すことになります。

  が、SRQ割り込み使わなくても、自分でDo〜Loopなりで一定時間
  間隔でGpibExecSpollし、オシロ側の状態監視して、サンプリン
  グ終了後のデータ有りとなった時点でループを抜け、GpibSendで
  データ送信させ、GpibReceiveでそのデータを受信する。

  と言う流れになるはずです。

  C言語でSRQ割り込みの受信ルーチンを書けるならば、その応答
  性の性能で追いつくのですが・・・.NETだと、アンマネージ・
  マネージの橋渡しに時間を要し、CPU負荷が100%になったり
  する場合もあります。

  因みに、インターフェース社ではSRQ割り込みを可能とする.NET
  のコードは公開していません。私は自作しましたが・・・この折
  いろいろ問題があることが解り、結果的にSRQ割り込みを使う事
  は止めました。

  原因は・・・インターフェース社のドライバーと言うかDLLに問
  題があり、GpibExecSpollで要因を読み込まない限り、ほぼ連続
  で割り込みが発生し続けます。多重割り込みになろうが関係なく
  発生して、デバッグモードでブレークポイントを置いていれば、
  最悪ドライバー側でブットンで、OS再起動しました。
  インターフェース社に報告していますが、対応してくれないの
  で諦めた次第です。

※ 因みに、相手側の機器のSRQ割り込みの信号の相性にもよるよう
  なので、そうならない場合もあります。
  業界では、NI社のGP-IBボードを薦めてました。情報と言う事
  で・・・

  なにはともあれ、頑張って下さい!

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


>   一般的な設定のままですので、オシロ側がどうかで決まります。

オシロ側はLF+EOIなので、
szSetPrm = "/SDELIM=CRLF+EOI /RDELIM=LF+EOI";
としています。



SRQ駄目DLL的に駄目なんですね。。。
早めに教えていただけて、助かりました。
危うく底なし沼に入ってしまうところでした…(苦笑





>   SRQ割り込みを使うと、結果的にGpibExecSpollを呼んで割り込み
>   要因を読み出すことになります。
> 
>   が、SRQ割り込み使わなくても、自分でDo〜Loopなりで一定時間
>   間隔でGpibExecSpollし、オシロ側の状態監視して、サンプリン
>   グ終了後のデータ有りとなった時点でループを抜け、GpibSendで
>   データ送信させ、GpibReceiveでそのデータを受信する。


シリアルポールについてお聞きしたいのですが、
試しに作成してみたのですが、PCが固まるか、「送信できる応答がありません」のどちらかでさっぱり進みません。。



            byte sPoll;
            int[] lStbTbl = new int[2];
            int[] lStbAdrsTbl = new int[2];


            // シリアルポーリングを実行

            do
            {
                sPoll = (Byte)IFCGPIB.GpibExecSpoll(nBoardNo, DevAdrsTbl, lStbTbl, lStbAdrsTbl);
            } while (sPoll == 1);



というプログラムのGpibSendが行われる前に追加してみました。
sPollがステータスバイトとすると1ではできないような気がしますが、&演算子を用いて、「(sPoll & 16)==16 」と使っているマルチメータの例がありましたが、使っている機種の性能がわからず、数値の意味がわかりませんでした。



引用返信 編集キー/
■27084 / inTopicNo.13)  Re[10]: (GPIB)波形取り込み
□投稿者/ オショウ (48回)-(2008/10/27(Mon) 18:26:16)
> オシロ側はLF+EOIなので、
> szSetPrm = "/SDELIM=CRLF+EOI /RDELIM=LF+EOI";
> としています。

  デリミタが違ったようですネ!〜

> シリアルポールについてお聞きしたいのですが、
> 試しに作成してみたのですが、PCが固まるか、「送信できる応答がありません」のどちらかでさっぱり進みません。。

  ええ〜と・・・
  1. サンプリング開始命令を、GpibSendで送信されていますか?
  2. またサンプリングの際のデータ数は、オシロに設定できるのでしょうか?
    できない場合は、何を以ってサンプリング終了なのでしょうか。
  3. SRQバイトのビットの意味は、オシロのGP-IBコマンド関係に記載があるはず
    ですが、一般的にサンプリング開始し、1個でもデータ取得されれば・・・
    (SRQ && 1) == 1 になりますので、データ取得の為のGpibSend / GpibReceive
    となります。

    (SRQ && 16) == 16 は、もしかしたら、サンプリング完了?ではないでしょうか
    その辺は全てマニュアル見てもらわないと解らないです。

  機器によっては、ExecSPollしたら、データが合っても、2度と(SRQ && 1) == 1 に
  ならない場合があります。それはメーカーや機器のクセとなりますので・・・注意が
  必要です。

  GpibSPoll の使い方は・・・
  あくまでデータ受信の為の非同期待ち合わせですので、予めGoibSendでサンプリング
  開始できていないと、何もしていないのに、データ受信の待ち合わせはでいないです。

  で、先のフリーソフトのDataViewで正常に動作するならば、GP-IBの機器制御は正常
  と言うことになります。それが動かない場合・・・機器の設定やGP-IBボードの設定
  が間違っていることになり、いくらプログラムで頑張っても徒労です。

  まず、DataViewで正しく動作するのを確認して下さい。

以上。


>
>
>
> byte sPoll;
> int[] lStbTbl = new int[2];
> int[] lStbAdrsTbl = new int[2];
>
>
> // シリアルポーリングを実行
>
> do
> {
> sPoll = (Byte)IFCGPIB.GpibExecSpoll(nBoardNo, DevAdrsTbl, lStbTbl, lStbAdrsTbl);
> } while (sPoll == 1);
>
>
>
> というプログラムのGpibSendが行われる前に追加してみました。
> sPollがステータスバイトとすると1ではできないような気がしますが、&演算子を用いて、「(sPoll & 16)==16 」と使っているマルチメータの例がありましたが、使っている機種の性能がわからず、数値の意味がわかりませんでした。
>
>
>
引用返信 編集キー/
■27086 / inTopicNo.14)  Re[11]: (GPIB)波形取り込み
□投稿者/ 初心者 (177回)-(2008/10/27(Mon) 20:27:19)
No27084 (オショウ さん) に返信
>>オシロ側はLF+EOIなので、
>>szSetPrm = "/SDELIM=CRLF+EOI /RDELIM=LF+EOI";
>>としています。
>
>   デリミタが違ったようですネ!〜
>


うわわっ!
デリミタ違ってましたか><
オシロがLF+EOIの場合、両方ともLF+EOIにするのが正解ですか??;




>   ええ〜と・・・
>   1. サンプリング開始命令を、GpibSendで送信されていますか?
>   2. またサンプリングの際のデータ数は、オシロに設定できるのでしょうか?
>     できない場合は、何を以ってサンプリング終了なのでしょうか。
>   3. SRQバイトのビットの意味は、オシロのGP-IBコマンド関係に記載があるはず
>     ですが、一般的にサンプリング開始し、1個でもデータ取得されれば・・・
>     (SRQ && 1) == 1 になりますので、データ取得の為のGpibSend / GpibReceive
>     となります。
>
>     (SRQ && 16) == 16 は、もしかしたら、サンプリング完了?ではないでしょうか
>     その辺は全てマニュアル見てもらわないと解らないです。


すみません。
基礎的なことだと思いますが、サンプリングについてまったく理解してませんでした…
オシロのマニュアルを読んでいても出てきませんでしたので、普通にC#であるのですね…また勉強しなおしです…><





>   で、先のフリーソフトのDataViewで正常に動作するならば、GP-IBの機器制御は正常
>   と言うことになります。それが動かない場合・・・機器の設定やGP-IBボードの設定
>   が間違っていることになり、いくらプログラムで頑張っても徒労です。
>
>   まず、DataViewで正しく動作するのを確認して下さい。




やってみましたが動きませんでした!
でもこれって、NI社ので、インターフェイス社のには対応してない…とかはないのですか?
根本が駄目と言われると落ち込みます…(涙
引用返信 編集キー/
■27088 / inTopicNo.15)  Re[12]: (GPIB)波形取り込み
□投稿者/ オショウ (49回)-(2008/10/27(Mon) 21:22:13)
> うわわっ!
> デリミタ違ってましたか><
> オシロがLF+EOIの場合、両方ともLF+EOIにするのが正解ですか??;

  送受信するコマンド文字列の区切りというか・・・
  同じでないとコマンドを送信しても、オシロ側が何???・・・
  と知らん顔します。(多分)

> すみません。
> 基礎的なことだと思いますが、サンプリングについてまったく理解してませんでした…
> オシロのマニュアルを読んでいても出てきませんでしたので、普通にC#であるのですね…また勉強しなおしです…><

  通常、リモートモードに移行しますと、前面パネル?での操作は一切
  できなかったと思います。最低限のキー操作は受け付けますが。

  で、アナリグ入力の開始(トリガ)命令があるはずなんですが。
  尚、搭載メモリの都合で何秒か、もしくはサンプリング数の設定が
  あるはずなんですが。

  もしくは開始命令に対する終了条件の設定。

> やってみましたが動きませんでした!
> でもこれって、NI社ので、インターフェイス社のには対応してない…とかはないのですか?
> 根本が駄目と言われると落ち込みます…(涙

  ・・・
  そのソフトはメーカー推奨と言うか・・・
  それが動かないとなれば、ボード側設定かオシロ側設定か、両方が
  合っていないと思います。

● DataViewの仕様でボードの指定を見落としていました。

> AT-GPIB以降のナショナルインスツルメンツ社製GPIBカ−ド
> (AT-GPIB/TNT、AT-GPIB/TNT plug and play、PCI-GPIB、PCMCIA-GPIB等のカ−ド。)

  やはり、NI社のGP-IBボードしか動作しません。

  よって・・・GP-IBのコマンドマニュアル片手に頑張ってみるしか
  なさそうです。

  相互の通信設定が合えば、動作するはずなんです。

  どこかに設定の相違や、開始トリガ・終了トリガ?のコマンドが
  あるはずですし、サンプリングの設定もあります。

  基本はマルチメータと同じで違うところは、画面に波形表示機能
  があるのがオシロかと。
  
以上。
引用返信 編集キー/
■27089 / inTopicNo.16)  Re[13]: (GPIB)波形取り込み
□投稿者/ オショウ (50回)-(2008/10/27(Mon) 21:33:17)
サンプルプログラムですが・・・

  http://www.yokogawa.co.jp/tm/F-SOFT/sample.htm

  ここに、VBで記述されたものがありました。
  型式が違いますが、そう大差ないと思います。

  ダウンロードして、中身を確認して下さい。

  コマンド文字列を送信して、設定・波形取得しているのが
  解かると思います。

  後は、そのVBで書かれた機能をC#に移植できれば最低
  限の動作は確認できると思います。

※ コマンド文字列は、マニュアル参照!
  横河では正規ユーザーでないとマニュアルダウンロードで
  きませんので、こちらでは確認できません・・・あしからず。

以上。
引用返信 編集キー/
■27136 / inTopicNo.17)  Re[13]: (GPIB)波形取り込み
□投稿者/ 初心者 (179回)-(2008/10/28(Tue) 20:22:36)
2つもお返事いただけて、とても感謝しています。
本当にありがとうございます。


>   送受信するコマンド文字列の区切りというか・・・
>   同じでないとコマンドを送信しても、オシロ側が何???・・・
>   と知らん顔します。(多分)


納得しました…w
てっきり送信側と受信側でデリミタが異なっていて、それぞれに合ったものを出力するものだと思っていました。


>   で、アナリグ入力の開始(トリガ)命令があるはずなんですが。
>   尚、搭載メモリの都合で何秒か、もしくはサンプリング数の設定が
>   あるはずなんですが。
>
>   もしくは開始命令に対する終了条件の設定。


トリガ命令で出来るのですか!
トリガ命令はあります。う〜んと悩んでいたのですが、命令が山ほどあって、どれを使っていいのかわからないくらいです…
トリガ命令の中にサンプリング数という言葉は出てこなかったので、もしかしたらないのかも…?




トリガ命令などを探している時に、波形取り込みの状態を見ることが出来るクエリを発見することが出来ました!

「STATUS:CONDITION?」

を使うことにより、コンディションレジスタのビット数1なら波形取り込み中、0なら取り込みストップとなるみたいです。

これをWAVEFORM:SEND?の前に置けばいけそうです!




YOKOGAWAのVBのサンプルも合わせてプログラム作り直してみます!

やっと久々に進みそうです。。。
引用返信 編集キー/
■27167 / inTopicNo.18)  Re[14]: (GPIB)波形取り込み
□投稿者/ 初心者 (181回)-(2008/10/29(Wed) 21:07:54)
また詰まってしまいました。
光が見えない感じです。。。






トレイス範囲の指定の後に、下記のコマンドを送信して、波形の取り込みが済むまで待つようにしました。 

string szData5 = "TRIGGER:MODE SINGLE;:START"; 
string szData6 = "STATUS:CONDITION?"; 
string szData7 = "WAVEFORM:SEND?"; 



そうしたら……なんとオシロのエラーが 
「応答の送信が中断されました」 
に変更されました。。。 
嬉しいのか嬉しくないのかって感じですが。。。 


オシロからの送信が中断されてるってことなので、受信(こっちからの命令の送信)は上手くいったのでは!!っと思っています。 
トリガもシングルモードに変更されますし… 


データ受信の 



// データ受信 

int nRet = 0; 
string RecvBuffer = ""; 

uint RecvLen; 

RecvLen = 2000; 


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

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

textBoxData.Text = RecvBuffer.ToString(); 
} 




この部分にミスありそうですかね… 
何度にらめっこしてもわかりません… 



ブレークポイントを各行に設置したところ、

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

の行まで進み、

「if(nRet != 0) 」

で途切れてしまっています。




ちなみに定義は下記のようになっています。 




 【機 能】 

指定番号のボードへ計測機器から受信を行います。 


 【書 式】 

●C言語 

#include "GPC43042.H" 
int GpibReceive( 
ULONG nBoardNo, // ボード番号 
PLONG lAdrsTbl, // アドレステーブルへのポインタ 
PULONG ulpLength, // 受信バッファサイズ格納変数へのポインタ 
PVOID vpBuffer // 受信バッファへのポインタ 
); 

  

引用返信 編集キー/
■27168 / inTopicNo.19)  Re[15]: (GPIB)波形取り込み
□投稿者/ オショウ (52回)-(2008/10/29(Wed) 21:31:17)
> // データ受信
>
> int nRet = 0;
> string RecvBuffer = "";
>
> uint RecvLen;
>
> RecvLen = 2000;
>
> nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);
>
> この部分にミスありそうですかね…
> 何度にらめっこしてもわかりません…

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

  RecvLen = 2000 とされているのですが、オシロからのデータ1個が、何バイトになるのか
  で、実際に文字列変数に割り当てる容量が変化します。

  アドバンテスト社のマルチメータでは、電圧測定の場合、データ+デリミタ=18バイト
  でした。で、データ数が、1000個なら・・・

  バッファ容量=18バイト×1000

  を、文字列変数に設定しておく必要がありました。

  尚、RecvLen には、実際にバッファに読み込んだデータ数が代入されるはずです。
  この場合のデータ数は・・・GP-IBの機器によって表現が異なります。
  1個のデータ長が固定な場合は、個数となる場合もありますが、往々にして文字列長に
  なったりもします。データ+デリミタで、データ部の中身の表現が、機器によってまち
  まちだからです。

  また、膨大なデータ数になるならば、何回かに分けて受信してやる必要があります。
  で、目安になるのが、ExecSPollで、(ステータスバイト AND 1)=1 の間、データが存在
  するので、取り込み続ける・・・という動作もOKなはずです。

  注意しなければならないのは、メーカー・機種によって、データが存在しても1回の、
  ExecSPollで、ステータスバイトがクリアされてしまう場合がある。ということです。

  取り敢えず、バッファの容量を文字列数に換算して、文字列変数に割り当て、受信して
  みて下さい。

以上。
引用返信 編集キー/
■27171 / inTopicNo.20)  Re[16]: (GPIB)波形取り込み
 
□投稿者/ オショウ (53回)-(2008/10/29(Wed) 21:50:50)
>   RecvLen = 2000 とされているのですが、オシロからのデータ1個が、何バイトになるのか
>   で、実際に文字列変数に割り当てる容量が変化します。
>
>   アドバンテスト社のマルチメータでは、電圧測定の場合、データ+デリミタ=18バイト
>   でした。で、データ数が、1000個なら・・・
>
>   バッファ容量=18バイト×1000
>
>   を、文字列変数に設定しておく必要がありました。
>
>   尚、RecvLen には、実際にバッファに読み込んだデータ数が代入されるはずです。

  横河のVBのサンプルを見てみました。
  私の書き込みに間違いがありますネ!〜

  RecvLenには、バッファ長を代入しておく必要がありますが、実際にGpibReceveを実行
  し終わった際には、実際に読み込まれたバイト数が代入されます。

  横河のサンプルでも・・・
qry = Space$(100)
  となっています。(RS-232Cの方は、違いますので、間違わないように!)
 
以上。
引用返信 編集キー/

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

管理者用

- Child Tree -