• 締切済み

Ni-VISAによるRS232C制御プログラム

Ni-VISA+VB.NETでRS232C付きの計測器の制御プログラムを作成したいと考えています。 現在まで、USBTMCとGPIB接続での制御プログラム作成経験がありますが、RS232C接続での制御プログラム作成は初めてです。 Ni-MAXで動作確認できていますので計測器とPCはRS232Cで正常に接続できています。 しかしながら、下記プログラムコードでうまく動作しません。 プログラムの修正点などアドバイス頂けないでしょうか? Public Function DcOutput_P4305(DcValue As Double) ' リソースの宣言 Dim RM As New Ivi.Visa.Interop.ResourceManager ' VISA COM リソースマネージャ Dim VCG As New Ivi.Visa.Interop.FormattedIO488 ' VISA COM フォーマッテッドIO ' 通信の開始 VCG.IO = RM.Open("ASRL1::INSTR") ' 処理待機時間を設定 System.Threading.Thread.Sleep(500) ' DC出力値設定(例:VOLT 10 ・・・10V出力) VCG.WriteString("VOLT" & " " & DcValue.ToString() & vbLf) ' 処理待機時間を設定 System.Threading.Thread.Sleep(500) ' 通信の終了処理 VCG.IO.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(VCG) System.Runtime.InteropServices.Marshal.ReleaseComObject(RM) '処理待機時間を設定 System.Threading.Thread.Sleep(500) Return 0 End Function

みんなの回答

noname#252332
noname#252332
回答No.1

Ni-VISAとやらを存じませんが通信手順が無くただ改行で終わるテキストを送るだけの通信なのでしょう。RS232cは負論理なので相手の電源が落ちていると1を連続受信中と読みます。つまり計器がON、PCがOFFから始まるとエラー文字の受信から始まってしまいます。これを避けるために電源ONの最初の通信は無意味な通信、たとえばただ改行を送ってエラーメッセージを受け取るとか・・・計器の仕様を知りませんが、ということが必要じゃないですか。空想ですが。

TomstMayu
質問者

お礼

コメントありがとうございます。 もう少し調べてみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スリープ中に割り込んで中止させたい

    VB2010で次の様なSleepを使ったプログラムなんですが途中で中断させることはできるでしょうか。 For I=1 to 100 System.Threading.Thread.Sleep(1000) Next

  • C#で、ある条件でFormが自動で閉じるプログラム

    C#で、例えばForm2をForm1から開き、ある問題があってForm2のボタンを押すとForm2のラベルに正解と表示されます。 その文字が表示されたら数秒後に自動でForm2が閉じられるプログラムを書きたいのですがうまくいきません。 現在、こう書いています。3秒後とします。 using System.Threading;は宣言しています。 private void Form2_FormClosing(object sender, FormClosingEventArgs e) { if(label1.Text=="正解です。") { Thread.Sleep(3000); e.Cancel= false; } こうするといつまでも閉じてくれません。 ボタンクリックプログラムに、if文で、~ならば正解です、~ならば間違いです、などとふり分けている中、正解のところに label1.Text="正解です。"; Thread.Sleep(3000); this.Close(); などとすると、ボタンを押したら、ラベルには何も表示されずに3秒後に閉じます。 どうすればいいでしょうか?

  • C#でExcelを起動したい

    http://jeanne.wankuma.com/tips/csharp/excel/execute.html を参考に C#コードに // Excel.Application の新しいインスタンスを生成する Excel.Application xlApplication = new Excel.Application(); // Excel を表示する xlApplication.Visible = true; // 1000 ミリ秒 (1秒) 待機する System.Threading.Thread.Sleep(1000); // Excel を終了する xlApplication.Quit(); // COM オブジェクトの参照カウントを解放する (正しくは COM オブジェクトの参照カウントを解放する を参照) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication); を追加したのですが エラー CS0246: 型または名前空間名 'Excel' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 が出てしまいます。 以下の様にしているのですが、何のusingを追加すればよいのでしょうか? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace testproject { public partial class testproject: Form { public testproject() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Excel.Application の新しいインスタンスを生成する Excel.Application xlApplication = new Excel.Application(); // Excel を表示する xlApplication.Visible = true; // 1000 ミリ秒 (1秒) 待機する System.Threading.Thread.Sleep(1000); // Excel を終了する xlApplication.Quit(); // COM オブジェクトの参照カウントを解放する (正しくは COM オブジェクトの参照カウントを解放する を参照) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication); ImageViewer imgViewer = new ImageViewer(); imgViewer.Show();

  • C++ Thread::Sleep()について

    RunTimer = gcnew Timer(); RunTimer->Interval = 50; RunTimer->Tick += gcnew EventHandler(this, &RunTick); RunTimer->Enabled = true; ・・・処理・・・ RunTimer->Enabled = false; System::Threading::Thread::Sleep(1000); としているのですが、数コマ動いてしまいます。 処理は3枚の画像を差し替えて動かしているのですが、即座にスリープがかからず、 画像が少し歪んでしまいます。 ソースが長く、どこを記載すれば良いのか解らず、かなり抜粋しましたが、 TimerのTickで画像を入れ替えて、歩いている様にみせかけています。 一時停止後、改めて処理を始めようと思っているのですが、 なぜだか、少し動いてしまします。 Sleepを削除すると、うまく止まるのですが、即座に次の処理に移行してしまう為、数秒停止させたいと考えています。 System::Threading::Thread::Sleep(1000); だけでは、即座に止める事はできないものでしょうか? また、TimerのTickを数秒止める事はできるものでしょうか? ご存じの方、アドバイスよろしくお願いいたします。

  • VB2008で

    VB2008で System.Threading.Thread.Sleepを使って5秒後にテキストボックスにaと表示させるプログラムを作ろうとしましたが、うまくいなないため、タイマーコントロールを使用したいと思ったのですが、どのようにしたらいいでしょうか?

  • Visual c# スレッド

    プログラム初心者です。 Visual c#にてスレッド関数を使ったプログラムを見よう見まねで 作りました。 スタートボタンを押すとピクチャーボックスの位置が 左から右へ移動し、ストップボタンを押すと止まる。 ピクチャーボックスの位置をテキストボックスに表示する。 というプログラムのつもりです。 デバックの状態でスタートボタンを押すとエラーメッセージが出て テキストボックスに位置を書き込むの関数のところが緑色にハイライトされます。エラーの内容は「有効でないスレッド間の操作」とありますが、どうしたら良いのか分かりません。 エラーの直し方を教えてください。 プログラムコードは以下です。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace bit_map_08._1._ { public partial class Form1 : Form { private Thread thread; static private int Position = 0; static private int i; static bool BtnOnFig; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { thread = new System.Threading.Thread(newSystem.Threading.ThreadStart(MainThread)); thread.Start(); } private void PointMove() { if (i < 300) { i = i + 1; Position = Position + i; textBox1.Text = Convert.ToString(Position); pictureBox1.Left = (Position); } if (i == 300) { i = 0; } } private void MainThread() { while( true ) { Thread.Sleep(100); if (BtnOnFig == true) { PointMove(); } } } private void button1_Click(object sender, EventArgs e) { BtnOnFig = true; } private void button2_Click(object sender, EventArgs e) { BtnOnFig = false; } } }

  • VB2005でのEXCELマクロ操作

    お世話になっております。 VB2005から指定したEXCELファイルを開き、標準モジュールにあるマクロを起動したいと考えております。 調べたところ、Runメソッドを使用するようですが、マクロファイルを開くところで停止してしまいます。 以下にソースを書きましたので、アドバイス頂きたいと思います。 Dim n As Short Dim xlApp As Excel.Application = Nothing Dim xlBooks As Excel.Workbooks = Nothing Dim xlBook As Excel.Workbook = Nothing Dim xlSheets As Excel.Sheets = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim Fname As String = "C:\Documents and Settings\hoge\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS" '読み込むファイル Try xlApp = New Excel.Application() xlBooks = xlApp.Workbooks For n = 0 To fil.Length - 1 xlBook = xlBooks.Open(fil(n)) xlSheets = xlBook.Worksheets xlApp.Run("'" & Fname & "'!module2.DB処理", fil(n)) '引数をもつ処理の呼び出し方法 '1000ミリ秒(1秒)待機する System.Threading.Thread.Sleep(1000) ' Excel ブックを保存する xlApp.DisplayAlerts = False xlBook.Save() Next ' Microsoft Excel を終了する xlApp.Quit() Finally If Not xlSheet Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) End If If Not xlSheets Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) End If If Not xlBook Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) End If If Not xlBooks Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) End If If Not xlApp Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) End If End Try

  • Threading.Thread.Sleep()の前後の処理

    初めて質問します。(VB2008始めたばかりの初心者です) 昔のBASICでwaitやdelay、sleepなどといったプログラムの実行を一時止めることの出来るコマンドがあったと思いますが、 VB2008上で同じようなことさせてラベルの色を一定時間で変化させたいと思い、色々調べて Threading.Thread.Sleep()  というものを見つけました。実際使ってみるとThreading.Thread.Sleep()の前に書いた処理がうまく動作しません。 (下記のような簡単なコードですが) Private Sub Buttonstart_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles Buttonstart.Click    Label1.BackColor = Color.White     Threading.Thread.Sleep(2000)     Label1.BackColor = Color.Blue End Sub スタートボタンを押せばlabel1が白色になり2秒後に青にしたいのですが白色にならずに2秒後にいきなり青になってしまいます。 とても初歩的な間違いをしていると思うのですが解決できません。恥ずかしいと思いながらも質問させていただきます。アドバイスをお願いします。

  • Visual Basic 2005でRS-232Cを用いて機器を制御する際のエラーについて

    現在,ディジタルマルチメータをPCで制御するため,PCとディジタルマルチメータをRS-232Cケーブルで接続し,Visual Basic 2005を用いて制御しようとプログラムを作成しています. 以前は,Visual Basic 6.0で制御していたのですが,今後の為を考え,2005へ移行することにしました. そこで,VB6のプログラムと同様の設定を用いて,同じ命令をマルチメータ側に送信しようとするのですが,マルチメータ側で命令を受信した後に,マルチメータがエラーを出してしまいます. 全ての命令に対してエラーを出すのではなく,マルチメータ側から返信を伴う命令に対してのみエラーが出るようです. 環境は,PC:Windows XP (Home),マルチメータ:Agilent 34401Aです. 以下がソースの一部です. [VB6] With SerialPort .CommPort = 4 .Settings = "9600,n,8,1" .Handshaking = comNone .RThreshold = 1 .SThreshold = 1 .InputLen = 0 .PortOpen = True End With SerialPort.Output = ":SYST:REM" & vbCrLf 'マルチメータをリモートにする SerialPort.Output = "MEAS:VOLT:DC? 10V,0.003V" & vbCrLf '直流電圧を測定 [VB2005] With SerialPort .PortName = "COM4" .BaudRate = 9600 .DataBits = 8 .Parity = IO.Ports.Parity.None .Handshake = IO.Ports.Handshake.None .Open() End With SerialPort.WriteLine("SYST:REM" & vbCrLf) 'マルチメータをリモートにする(エラーは出ない) SerialPort.WriteLine("MEAS:VOLT:DC? 10V, 0.003V" & vbCrLf) '直流電圧を測定(エラーが出る) 原因などが分かれば,教えてください. よろしくお願いします.

  • パイプを用いた通信 C#とMATLAB

    パイプを使用しC#から送信したデータをMATLABで受信することは可能でしょうか?   もし可能であるならばどのようにすればよいのでしょうか。 以下のプログラムで行っているのですがMATLAB側で受信ができず -1がかえってきてしまいます C言語で受信する場合はうまくいくのですがMATLABを使用するとファイルのopneができません。 以下C#・MATLABプログラム C# <プログラム> 送信側 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; namespace PipeTest { class Program { static void Main(string[] args){ Console.WriteLine("パイプ接続待ち..."); NamedPipeServerStream pipe = new NamedPipeServerStream("test"); pipe.WaitForConnection(); Console.WriteLine("送信(キーを押すと終了)"); StreamWriter stw = new StreamWriter(pipe); stw.AutoFlush = true; while(Console.KeyAvailable == false) { stw.WriteLine("This is a test"); System.Threading.Thread.Sleep(500); } Console.WriteLine("終了"); pipe.Close(); } } } MATLAB <プログラム> 受信側 fp = fopen('C:\\\\.\\pipe\\test');