欢迎使用 Scpi.NET,这是一个用于控制 SCPI 设备的纯 .NET 库。如果您曾经尝试通过计算机控制示波器或数字万用表,您可能会遇到过可以控制此类设备的 SCPI 命令。
虽然这个标准看起来像一个简单的文本通信,但真正的使用并不那么容易,因为这些文本命令必须被包装到设备可以理解的较低级别的通信协议中,例如 TCP/IP 或 USBTMC。大多数制造商都提供自己的库,例如 Tektronix 的 TekVISA 或 National Instruments 的 NI-VISA。不幸的是,在我看来,这些库太重了,会产生不需要的软件依赖性,使安装包变得更大,通常只关注一个制造商的硬件,最终它们只提供一个能够传输 SCPI 命令的“管道”。该项目的目标是创建一个简单、轻量级且独立于制造商的库,可以通过 USB 或以太网与任何 SCPI 设备通信。
这是库中最简单的部分,我实现它只是为了为 USB 和以太网设备提供相同的控制接口。设备侦听 TCP 端口4000
,并且 SCPI 命令直接在有效负载中发送,无需任何标头。
这是图书馆的难点。这些器件实现了 USB 测试和测量类 (TMC),该类需要相当低级的 USB 通信。读取和写入请求都有自己的标头,这会增加复杂性。尽管我阅读了一些有关 TMC 的文档,但我仍然必须对示波器的通信进行逆向工程才能使其正常工作。另一些有用的代码是在 Linux 内核驱动程序中发现的。尽管仍有一些地方我不确定实现是否正确,但该库与是德科技的几款泰克示波器和数字万用表配合得很好。
我的 USB TMC 驱动程序依赖于对kernel32.dll
和SetupApi.dll
库的 Windows API 调用,这些库是 Windows 操作系统的组成部分,因此不需要额外的软件依赖项。
为了使USB TMC设备正常工作,您需要安装正确的USB驱动程序。获取驱动程序相当棘手,因为它通常是 VISA 库的一部分,无法单独下载。由于许可证限制,我无法共享我使用的驱动程序,但作为起点,我可以推荐下面的链接,其中使用完全相同的驱动程序,并且连接检查表对于所有 USB TMC 设备都完全有效:
USB 连接检查表
只需安装 NuGet 包或克隆存储库并添加对此的引用。然后您可以从下面的示例开始。
using ScpiNet ;
.. .
// List available USB devices. We will get back USB identifiers which can be used to open the device.
List < string > devices = UsbScpiConnection . GetUsbDeviceList ( ) ;
// In order to get instrument name from the USB identifier, we need to open the device and ask it for
// the name. The connection implements IDisposable, so it's recommended to use it in the using block.
using ( IScpiConnection connection = new UsbScpiConnection ( devices [ 0 ] ) )
{
// Create the connection:
await connection . Open ( ) ;
// Get the instrument name:
string id = await connection . GetId ( ) ;
// Send some SCPI command:
await Connection . WriteString ( " My special SCPI command " , true ) ;
// Read the response:
string response = await Connection . ReadString ( ) ;
.. .
}
// Connecting the TCP/IP device is even easier because there is always one device listening
// on the port 4000:
using ( IScpiConnection connection = TcpScpiConnection ( " 192.168.1.100 " , 4000 ) )
{
// The rest is same as with the USB connection:
await connection . Open ( ) ;
string id = await connection . GetId ( ) ;
.. .
}
读取仪器 ID 没问题,但您可能需要向设备发送更多 SCPI 命令。为了保持应用程序架构的整洁,您应该为您正在控制的仪器创建一个单独的类。这可以通过继承ScpiDevice
类来完成,该类已经提供了一些有用的方法,例如Query()
。请参阅SampleApp
目录了解更多详细信息。
该库仅关注 SCPI 命令和响应的传输。它不提供任何更高级别的功能,如仪器驱动程序。原因是实现此类驱动程序是一项非常复杂的任务: