0

我目前正在寻找通过 C# 与SCPI兼容设备进行通信的不同可能性。我已经通过 COM 接口在 LabWindows/CVI(语言:C)中编写了我的第一个代码,并且正如我所说的那样“手动”完成了它:

ComOpen(ComId, "Com1",....);
ComWrite("SYST:...\r");
ComRead(&value)`

像这样的东西。对我来说,问题是我不喜欢纯 C,而且缺乏 OOP 只是愚蠢的,因为我有想要交流的真实对象。亲爱的 National Instruments,为什么不使用 OOP 来控制对象呢?

现在有人给了我提示,我应该查看全局 SCPI 文档,因为信息比设备手册中的要多。而且我发现了一组与 .NET 兼容的命令。例如,

IIviDCPwr Ivi.DCPwr.Create(String resourceName,
                           Boolean idQuery,
                           Boolean reset,
                           LockType lockType,
                           String accessKey,
                           String options);

与 SCPI 设备建立面向对象的通信。因为我真的很喜欢 C#,所以我想在接下来的几周内尝试一下。

但我真的看不到连接设置,因为 resourceName 似乎只是之后释放所考虑设备的名称,而其他设置在连接已设置时使用。IIviDCPwr 的实例如何知道应该使用哪个连接(TCP/IP、COM 或 GPIB)?

我只看到了使用套接字的 TCP/IP 解决方案。但我认为这不适用于 COM 和 GPIB?

另一种解决方案是使用 National Instruments VISA 包。但是我不喜欢使用 NI 提供的专有包的想法(我认为使用 CVI 后我觉得新开发的对 NI 的排斥)。

你能提供代码片段或文档来处理这个问题吗?你有使用VISA的经验吗?我可以使用套接字进行 COM/GPIB 通信吗?

顺便说一句:如何在代码片段中创建新行?enter 和Shift+ Enter, \r, \n, \ 都不适合我...

4

1 回答 1

0

您可以使用 .NET SerialPortSocket(不使用 VISA)通过它们的读/写方法与您的设备进行通信。关于 GPIB,您的硬件应该有一个 .NET 驱动程序,使用类似的方法。

如何使用 SerialPort 与设备通信的一些示例(带有一些伪 SCPI)

        SerialPort port = new SerialPort("COM1", 9600);
        port.Open();
        port.WriteLine(":DEVICE:OUT 1"); //turn on
        port.WriteLine(":DEVICE:MEAS:VOLT?"); //measure voltage
        float v = float.Parse(port.ReadLine()); //reading from device
        Console.WriteLine("The measured voltage is " + v );

现在您可以创建设备类,其中每个实例都有自己的协议(SerialPort、Socket、GPIB)和方法

public class SomeDevice
{
    private SerialPort _port;
    public SomeDevice(string  serialPortName)
    {
        // do the connection work...
    }
    public void SetVoltage(float voltage)
    {
        port.WriteLine(":VOLT " + voltage.ToSring("N2"));
    }
    public float GetVoltage()
    {
        port.WriteLine(":DEVICE:MEAS:VOLT?");
        return float.Parse(port.ReadLine()); //reading from device
    }

}

您甚至可以通过创建通用连接的接口(比如说 - GenConnection)(使用常见的读/写方法)来改进您的类以使用任何类型的连接(SerialPort、Socket、GPIB ...),并且然后创建实现此接口的连接类型的子节点 - 然后您的每个设备将只有 GenConnection 实例,而不“知道”它实际上是哪种连接(只需重载每种连接的构造函数)

需要记住的几点:

  • 编程手册有助于避免常见错误
  • 连接配置(波特率、奇偶校验...)
  • 行尾字符,您应该记住使用设备行尾发送和分隔读数 - 通常<CR><CR><LF>(C# 中的“\r”或“\r\n”)。

    SerialPort 的ReadLine&WriteLine正在使用指定的 SerialPortNewLine属性为您执行此操作

  • 您可以使用TeraTerm使用您的端口和套接字来按预期查看所有内容
于 2016-06-24T12:28:25.580 回答