SCPI: Acerca de cómo enseñar a sus dispositivos el idioma francés de los laboratorios

A veces se puede excusar la idea de que el concepto de conectar dispositivos con otros dispositivos con fines de automatización es una invención bastante reciente. Sin embargo, a lo largo de la locura (relativamente) reciente de Internet de las cosas y el "hogar inteligente", los laboratorios están conectando sus equipos para ejecutar mediciones complicadas y secuencias de prueba durante muchas décadas, junto con las fábricas que hacen lo mismo para automatizar la producción. Procesos.

Al igual que el universo caótico de los dispositivos de IoT, los equipos de laboratorio de diferentes fabricantes presentan una gran cantidad de protocolos y estándares de interfaz incompatibles. Finalmente, estos se fusionarían en IEEE-488.1 (GPIB) como la capa física y en 1990 se publicó el primer estándar de Comandos estándar para instrumentos programables (SCPI), que se construyó además de IEEE-488.

SCPI define (como sugiere el nombre) comandos estándar para interactuar con instrumentos. Durante las últimas décadas, ha continuado proporcionando capacidades de interacción remota para todo, desde osciloscopios y fuentes de alimentación hasta equipos científicos exóticos. Muchos de los dispositivos de estantería que un aficionado puede comprar hoy en día tienen una interfaz SCPI a través de sus puertos Ethernet, USB o RS-232C que, combinados con el software, pueden usarse para automatizar su laboratorio doméstico.

Aún mejor es que también es relativamente simple agregar la funcionalidad SCPI a sus propios dispositivos, siempre que tenga al menos una MCU y algún tipo de forma de comunicarse con el mundo exterior.

Reinventar la rueda no es divertido

Por más divertido que sea crear un estándar de comunicación personalizado para un widget personalizado, hay mucho que decir acerca de cumplir con los estándares existentes, en lugar de agregar otro "estándar" al montón. Una buena razón es el tiempo que dedicará a crear un protocolo que funcione, cubra todos los casos extremos y deje suficiente espacio para futuras expansiones cuando se agreguen nuevas funciones.

Otra razón es la compatibilidad con el software existente, que también afecta por qué es probable que los usuarios finales estén entusiasmados con este nuevo y sorprendente protocolo. Cuando se usa SCPI, se puede integrar sin problemas en el software de automatización existente (laboratorio), ya que todo el concepto detrás de SCPI es que cada instrumento implementará su propia gama de comandos personalizados además de algunos requeridos.

Para los usuarios de software como LabVIEW o Sigrok, el escenario ideal es que el dispositivo hable SCPI, y que en el peor de los casos uno debería escribir un decodificador personalizado para los comandos SCPI habituales cuando aún no está disponible. Lo que nunca cambiará aquí es la sintaxis básica de SCPI, que permite el inicio rápido de nuevos dispositivos, la prevención de errores (ningún analizador es perfecto) y la reutilización del código. La línea de comandos básica de SCPI también habilita la funcionalidad como dispositivos de sincronización de forma predeterminada.

Aun así, cuando realmente mira la pila actual de medidores y fuentes de alimentación programables almacenadas en el laboratorio doméstico, no todos están hablando de SCPI. El osciloscopio Rigol DS1104Z lo hace con su puerto Ethernet. El hermano pequeño del DMM Owon XDM2041 (XDM1041) habla SCPI a través de su puerto USB. Hasta ahora todo va bien, pero luego la carga electrónica (Arachnid Labs Reload Pro) habla un protocolo personalizado a través de USB, que podría ser SCPI.

La fuente de alimentación programable Manson HCS-3304 hace lo mismo con otro protocolo personalizado, y los comandos enumerados en las revisiones del manual aparentemente también suelen ser incorrectos. Con solo algunos de estos dispositivos compatibles con Sigrok en este momento, la automatización de las pruebas implicaría piratear mi propio decodificador en conjunto, en lugar de un poco de juego de alta gama con comandos de dispositivo SCPI personalizados.

Usar los estándares correctamente puede ahorrar mucho tiempo, prudencia y canas. Lo que lleva a la siguiente pregunta: ¿qué tan fácil es agregar SCPI a su propio Awesome Widget?

Ingrese LibSCPI

Nadie quiere escribir su propio analizador SCPI desde cero, por lo que la biblioteca de analizadores SCPI v2, o simplemente "libscpi" es un buen comienzo. Actualmente realiza el estándar SCPI 1999. Dado que nos interesaría utilizar SCPI en un dispositivo integrado, veremos el ejemplo de FreeRTOS con LwIP (netconn) proporcionado. Esto muestra la implementación de un servidor SCPI que se ejecuta en el hilo FreeRTOS.

El servidor SCPI configura un puerto de escucha TCP en el puerto SCPI estándar (5025), después de lo cual se pueden enviar comandos al dispositivo a través de cualquier cliente Telnet o similar en modo sin formato, es decir, texto sin formato. Tenga en cuenta que en este ejemplo de servidor, LwIP-netconn NETCONN_COPY se usa en su lugar NETCONN_NOCOPY. Esto es esencial para evitar la corrupción de datos (uso de datos de búfer después de la eliminación) cuando se utilizan comandos SCPI encadenados.

Para usar libscpi con USART u otra interfaz, lo primero que debe hacer es configurar la biblioteca llamando a. SCPI_Init. Los siguientes métodos también deben implementarse en su código:

  • SCPI_Write(scpi_t* context, const char* data, size_t len)
  • SCPI_Flush(scpi_t* context)
  • SCPI_Error(scpi_t* context, int_fast16_t err)
  • SCPI_Control(scpi_t* context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val)
  • SCPI_Reset(scpi_t* context)
  • Estas funciones se explican por sí mismas en gran medida. Como se puede ver en la implementación de muestra, SCPI_Write permite que libscpi escriba en la salida elegida, con SCPI_Flush usado para descartar cualquier búfer de salida que pueda existir. SCPI_Error imprime mensajes de error de libscpi, SCPI_Reset restablece el dispositivo y SCPI_Control se usa para escribir en el canal de control (característica opcional, aquí en el puerto TCP 5026).

    Para que libscpi analice cualquier cadena entrante reciente (siempre termina con una nueva línea, n, o rn), su código llama SCPI_Input, o en el caso de comandos únicos, SCPI_Parse también se puede utilizar directamente.

    En este repositorio de GitHub se puede encontrar una implementación de muestra de libscpi en STM32 con ST HAL junto con FreeRTOS y un servidor HTTP simple. Esto está dirigido a la placa de desarrollo Nucleo-F746ZG.

    Multímetro digital SCPI

    También se proporciona con el ejemplo libscpi la implementación de ejemplo de un dispositivo multímetro digital. Si abrimos las definiciones e implementaciones de comandos en scpi-def.c, nos da una buena idea de lo que requeriría la implementación de un dispositivo personalizado. Esto comienza con el tablero, llamado scpi_commands.

    Esta matriz define todos los comandos en el formato de una plantilla con una llamada relacionada (todos excepto los principales ejecutados en el mismo archivo), comenzando con los comandos de comando IEEE, p. Ej. * CLS (estado CLear):

    { .pattern = "*CLS", .callback = SCPI_CoreCls,}

    El '*' (asterisco) antes del comando significa que es un comando SCPI común y obligatorio que cada dispositivo debe ejecutar. Es importante *IDN?, que pregunta (observe el signo de interrogación) al dispositivo sobre su identidad, *RST ordenar al dispositivo que restaure y *WAI esto le dice al dispositivo que espere con la ejecución de nuevos comandos hasta que finalicen los comandos que preceden a este comando.

    Después de este bloque de comandos requeridos, obtenemos el bloque con las funciones DMM:

{.pattern = "MEASure:VOLTage:DC?", .callback = DMM_MeasureVoltageDcQ,},
{.pattern = "CONFigure:VOLTage:DC", .callback = DMM_ConfigureVoltageDc,},
{.pattern = "MEASure:VOLTage:DC:RATio?", .callback = SCPI_StubQ,},
{.pattern = "MEASure:VOLTage:AC?", .callback = DMM_MeasureVoltageAcQ,},
{.pattern = "MEASure:CURRent:DC?", .callback = SCPI_StubQ,},
{.pattern = "MEASure:CURRent:AC?", .callback = SCPI_StubQ,},
{.pattern = "MEASure:RESistance?", .callback = SCPI_StubQ,},
{.pattern = "MEASure:FRESistance?", .callback = SCPI_StubQ,},
{.pattern = "MEASure:FREQuency?", .callback = SCPI_StubQ,},
{.pattern = "MEASure:PERiod?", .callback = SCPI_StubQ,},

La razón del uso mixto de mayúsculas y minúsculas en los comandos se relaciona con el aspecto de "patrón": en SCPI solo se requiere la parte mayúscula de la plantilla, y la sección minúscula de un comando se puede omitir por brevedad. Como se señaló anteriormente, un comando seguido de un signo de interrogación es una pregunta. El uso de dos puntos es para separar los niveles de la jerarquía del árbol que define una interfaz SCPI.

Para usar esta jerarquía para medir voltaje y corriente para CC en una sola cadena, se usaría el siguiente comando:

MEASure:VOLTage:DC?;:MEASure:CURRent:AC?

El punto y coma separa los comandos individuales y los dos puntos principales restauran la jerarquía a la raíz del árbol de comandos. Esta última característica se puede utilizar para crear cadenas de comandos interconectadas muy cortas para, por ejemplo, mida el voltaje CA y CC:

MEASure:VOLTage:DC?;AC?

Desde que el primer comando nos dejó en el VOLTage nivel jerárquico, el comando subsiguiente activaría el AC? pregunta. Esto significa que una interfaz bien diseñada para un dispositivo puede hacer que controlarlo sea bastante eficiente incluso al escribir preguntas manualmente y evitar repeticiones innecesarias.

Características avanzadas

Todo esto simplemente raspa la superficie de lo que SCPI es capaz de hacer, por supuesto. Además de la salida de texto sin formato, las cadenas numéricas también se pueden marcar como hexadecimal (#H), como octal (#Q) o como binario (#B). Los argumentos se pueden proporcionar junto con los comandos separados por un espacio. Con libscpi, estos argumentos se pueden incorporar a la función de recuperación.

Las secuencias de comandos secuenciales y superpuestas complejas también se pueden configurar utilizando el *OPC y *WAI comandos, junto con el *OPC? pregunta. Estos se pueden usar en combinación con los comandos de registro de estado y cualquier comando específico del dispositivo para controlar secuencias específicamente cronometradas.

La mejor parte de SCPI es probablemente que escala junto con la complejidad del dispositivo, ya sea un esfigmomanómetro simple o un instrumento científico que lee perturbaciones de nivel cuántico, el protocolo subyacente no cambia. Al no tener que reinventar los mismos conceptos básicos cada vez, el desarrollador y el usuario del dispositivo pueden centrarse en las cosas que importan.

En el caso del usuario final, probablemente esta sea la experiencia de desembalar el dispositivo, encenderlo y programar en las secuencias SCPI que hacen que realice las funciones deseadas. Cuál es la ventaja más importante de seguir los estándares establecidos.

[Heading image: Back of Rigol DS1104Z oscilloscope with the Ethernet and USB ports visible. Credit: Rigol]

Alana Herrero
Alana Herrero

Deja una respuesta

Tu dirección de correo electrónico no será publicada.