Selamat datang di Scpi.NET, perpustakaan .NET murni untuk mengendalikan perangkat SCPI. Jika Anda pernah mencoba mengontrol osiloskop atau multimeter digital dari komputer, Anda mungkin menemukan perintah SCPI yang memungkinkan untuk mengontrol perangkat tersebut.
Meskipun standar ini tampak seperti komunikasi teks sederhana, penggunaan sebenarnya tidak begitu mudah karena perintah teks ini harus digabungkan ke dalam protokol komunikasi tingkat rendah seperti TCP/IP atau USBTMC yang dapat dipahami oleh perangkat. Sebagian besar produsen menyediakan perpustakaan mereka sendiri seperti TekVISA dari Tektronix atau NI-VISA dari National Instruments. Sayangnya menurut saya perpustakaan-perpustakaan ini terlalu berat, membuat ketergantungan perangkat lunak yang tidak diinginkan, membuat paket instalasi menjadi lebih besar, biasanya fokus pada satu produsen perangkat keras saja dan pada akhirnya hanya menyediakan “pipa” yang mampu mentransfer perintah SCPI. Tujuan dari proyek ini adalah untuk membuat perpustakaan yang sederhana, ringan, dan tidak bergantung pada pabrikan yang dapat berkomunikasi dengan perangkat SCPI apa pun melalui USB atau Ethernet.
Ini adalah bagian mudah dari perpustakaan dan saya telah menerapkannya hanya untuk memberikan antarmuka kontrol yang sama ke perangkat USB dan Ethernet. Perangkat mendengarkan port TCP 4000
dan perintah SCPI dikirim langsung dalam payload tanpa header apa pun.
Ini adalah bagian tersulit dari perpustakaan. Perangkat ini menerapkan USB Test & Measurement Class (TMC) yang memerlukan komunikasi USB tingkat rendah. Permintaan baca dan tulis memiliki headernya sendiri yang menciptakan tingkat kerumitan tambahan. Meskipun saya membaca beberapa dokumen tentang TMC, saya masih harus merekayasa balik komunikasi osiloskop saya agar dapat berfungsi. Potongan kode lain yang berguna ditemukan di driver kernel Linux. Meskipun masih ada beberapa tempat di mana saya tidak yakin apakah penerapannya benar, perpustakaan ini berfungsi dengan baik dengan beberapa osiloskop Tektronix dan multimeter digital dari Keysight.
Driver USB TMC saya mengandalkan panggilan API Windows ke pustaka kernel32.dll
dan SetupApi.dll
yang merupakan bagian integral dari sistem operasi Windows, sehingga tidak diperlukan ketergantungan perangkat lunak tambahan.
Agar perangkat USB TMC berfungsi, Anda perlu menginstal driver USB yang benar. Cukup sulit untuk mendapatkan driver karena biasanya merupakan bagian dari perpustakaan VISA dan tidak dapat diunduh secara terpisah. Saya tidak dapat membagikan driver yang saya gunakan karena batasan lisensi, tetapi sebagai titik awal, saya dapat merekomendasikan tautan di bawah ini di mana driver yang sama digunakan dan daftar periksa konektivitas benar-benar valid untuk semua perangkat USB TMC:
Daftar Periksa Konektivitas USB
Cukup instal paket NuGet atau kloning repositori dan tambahkan referensi ke sana. Kemudian Anda bisa mulai dengan contoh di bawah ini.
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 ( ) ;
.. .
}
Pembacaan ID instrumen baik-baik saja, tetapi Anda mungkin ingin mengirim lebih banyak perintah SCPI ke perangkat. Untuk menjaga arsitektur aplikasi tetap bersih, Anda harus membuat kelas terpisah untuk instrumen yang Anda kendalikan. Hal ini dapat dilakukan dengan mewarisi dari kelas ScpiDevice
yang telah menyediakan beberapa metode berguna seperti Query()
. Silakan lihat direktori SampleApp
untuk lebih jelasnya.
Perpustakaan ini hanya memfokuskan transmisi perintah dan respons SCPI. Itu tidak menyediakan fungsionalitas tingkat yang lebih tinggi seperti driver instrumen. Alasannya adalah penerapan driver tersebut merupakan tugas yang sangat kompleks: