我目前正在寻找通过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通信吗?
顺便说一句:如何在代码片段中创建新行?既不输入也不 Shift + 输入,\ r,\ n,\对我有用...
答案 0 :(得分:0)
您可以使用.NET SerialPort和Socket(不使用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
&amp; WriteLine
正在使用指定的SerialPort的NewLine
属性