C# - последовательная связь с Agilent 34970A - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь связаться с RS-232 Agilent 34970A throw с C#.

Пока я пробовал этот код, но я не могу стабильно sh связь

using System;
using System.Collections.Generic;
using System.Text;

using Ivi.Visa;
using Ivi.Visa.FormattedIO;

//using SerialInterface;
//using SerialInterface.RS232;
using System.IO.Ports;


namespace Serial_Example
{
    class Program
    {
        static void Main(string[] args)
        {
            // Set address
            string VISA_ADDRESS = "ASRL9::INSTR";

            // Create a connection (session) to the RS-232 device.                                 
            IMessageBasedSession session = GlobalResourceManager.Open(VISA_ADDRESS) as IMessageBasedSession;

            // Enable the Termination Character.                
            session.TerminationCharacterEnabled = true;


            // Connection parameters
            ISerialSession serial = session as ISerialSession;
            serial.BaudRate = 9600;
            serial.DataBits = 8;
            serial.Parity = SerialParity.None;
            serial.FlowControl = SerialFlowControlModes.DtrDsr;

            // Send the *IDN? and read the response as strings
            MessageBasedFormattedIO formattedIO = new MessageBasedFormattedIO(session);
            formattedIO.WriteLine("*IDN?");
            string idnResponse = formattedIO.ReadLine();

            Console.WriteLine("*IDN? returned: {0}", idnResponse);

            // Close the connection to the instrument
            session.Dispose();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Я получаю исключение, говорящее "Не удалось проанализировать ASRL9 :: INSTR в Ivi.Visa.GlobalResourceManager.Parse (...)" Таким образом, это означает, что проблема связана со следующей строкой кода: IMessageBasedSession session = GlobalResourceManager.Open ( VISA_ADDRESS) как IMessageBasedSession;

Я не знаю, как решить эту проблему. Есть ли другой способ подключения к Agilent через последовательный порт и отправки команд SCPI?

1 Ответ

0 голосов
/ 11 февраля 2020

я работал с этим пространством имен

using Ivi.Visa.Interop;

я создаю 2 свойства

//Open up a new resource manager
    private static ResourceManager _rm;

    //Open a new Formatted IO 488 session 
    private static FormattedIO488 _instr;

и затем я открываю инструмент

public string OpenInstrument()
    {
        try
        {
            //Open up a handle to the instrument with a iTimeOut second timeout
            _instr.IO = (IMessage)_rm.Open(instrumentAdress, AccessMode.NO_LOCK, iTimeOut, "");


            //Reset the device
            _instr.WriteString("*RST", true);

            //Check if any error exist 
            return CheckPSError(_instr) ? "true" : "false";

        }
        catch (Exception ex)
        {
            return "Open Instrument exception : " + ex.Message;
        }
    }

для каждой команды i проверьте, есть ли ошибки, сообщенные прибором

private bool CheckPSError(FormattedIO488 instr)
    {
        instr.WriteString("SYST:ERR?", true);
        string errStr = instr.ReadString();

        if (errStr.Contains("No error"))
            //If no error, then return
            return true;
        //If there is an error, read out all of the errors and return them in an exception
        else
        {
            string errStr2 = "";
            do
            {
                instr.WriteString("SYST:ERR?", true);
                errStr2 = instr.ReadString();
                if (!errStr2.Contains("No error")) errStr = errStr + "\n" + errStr2;

            } while (!errStr2.Contains("No error"));
            throw new Exception("Exception: Encountered system error(s)\n" + errStr);
        }

    }
...