歡迎使用 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 命令和回應的傳輸。它不提供任何更高級別的功能,如儀器驅動程式。原因是實現此類驅動程式是一項非常複雜的任務: