SCPI 장치 제어를 위한 순수 .NET 라이브러리인 Scpi.NET에 오신 것을 환영합니다. 컴퓨터에서 오실로스코프나 디지털 멀티미터를 제어하려고 시도한 적이 있다면 아마도 그러한 장치를 제어할 수 있는 SCPI 명령을 접했을 것입니다.
이 표준은 단순한 텍스트 통신처럼 보이지만 이러한 텍스트 명령은 장치가 이해하는 TCP/IP 또는 USBTMC와 같은 하위 수준 통신 프로토콜로 래핑되어야 하기 때문에 실제 사용은 그리 쉽지 않습니다. 대부분의 제조업체는 Tektronix의 TekVISA 또는 National Instruments의 NI-VISA와 같은 자체 라이브러리를 제공합니다. 불행하게도 내 생각에는 이러한 라이브러리는 너무 무거워서 원치 않는 소프트웨어 종속성을 생성하고 설치 패키지를 더 크게 만들고 일반적으로 한 제조업체의 하드웨어에만 초점을 맞추고 결국 SCPI 명령을 전송할 수 있는 "파이프"만 제공합니다. 이 프로젝트의 목표는 USB 또는 이더넷을 통해 모든 SCPI 장치와 통신할 수 있는 간단하고 가벼우며 제조업체에 독립적인 라이브러리를 만드는 것입니다.
이것은 라이브러리의 쉬운 부분이며 USB 및 이더넷 장치 모두에 동일한 제어 인터페이스를 제공하기 위해서만 구현했습니다. 장치는 TCP 포트 4000
을 수신하며 SCPI 명령은 헤더 없이 페이로드로 직접 전송됩니다.
이것이 도서관의 어려운 부분이다. 이 장치는 매우 낮은 수준의 USB 통신이 필요한 USB 테스트 및 측정 클래스(TMC)를 구현합니다. 읽기 및 쓰기 요청 모두 자체 헤더를 갖고 있어 복잡성이 더욱 높아집니다. TMC에 대한 여러 문서를 읽었지만 여전히 오실로스코프가 작동하도록 하려면 통신을 리버스 엔지니어링해야 했습니다. 또 다른 유용한 코드가 Linux 커널 드라이버에서 발견되었습니다. 구현이 올바른지 확실하지 않은 부분이 여전히 있지만 라이브러리는 키사이트의 여러 Tektronix 오실로스코프 및 디지털 멀티미터와 잘 작동합니다.
내 USB TMC 드라이버는 Windows 운영 체제의 필수 부분인 kernel32.dll
및 SetupApi.dll
라이브러리에 대한 Windows API 호출을 사용하므로 추가 소프트웨어 종속성이 필요하지 않습니다.
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 명령을 기기에 보내고 싶을 것입니다. 애플리케이션 아키텍처를 깔끔하게 유지하려면 제어하는 계측기에 대해 별도의 클래스를 생성해야 합니다. 이는 Query()
와 같은 몇 가지 유용한 메서드를 이미 제공하는 ScpiDevice
클래스에서 상속하여 수행할 수 있습니다. 자세한 내용은 SampleApp
디렉터리를 참조하세요.
이 라이브러리는 SCPI 명령 및 응답의 전송에만 중점을 둡니다. 인스트루먼트 드라이버와 같은 더 높은 수준의 기능을 제공하지 않습니다. 그 이유는 이러한 드라이버를 구현하는 것이 매우 복잡한 작업이기 때문입니다.