Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Modelos: lo que el instrumento mide

Una consulta con respuesta: "{tension}" devuelve lo que se configuró. Una medida es otra cosa: la corriente que da una fuente depende de la tensión, de la carga y de si la salida está encendida. Eso es un modelo.

modelos:
  corriente_medida:
    tipo: formula
    cuando: { salida: true }
    expr: "min(tension / carga_ohm, limite_corriente) + gauss(0, 1e-5)"
    fallback: 0.0
    formato: fijo:5

Y la consulta que lo usa:

  - patron: "MEASure[:SCALar]:CURRent[:DC]"
    query: true
    modelo: corriente_medida

Campos

CampoQué es
tipoSiempre formula.
exprLa fórmula.
cuandoCondiciones sobre el estado. Si alguna no se cumple, se contesta fallback. Si hay varias, deben cumplirse todas.
fallbackLa respuesta cuando no se cumple cuando. Por defecto 0.0. Número o texto.
formatoCómo se escribe el número. Opcional.

Qué cabe en expr

  • Variables del estado, por su nombre: tension, carga_ohm.
  • Números: 10, 0.5, 1e-3, 2.5E+2.
  • + - * / con la precedencia de siempre, paréntesis y signo negativo.
  • Funciones:
FunciónResultado
gauss(media, sigma)Ruido gaussiano. Cambia en cada lectura, pero la serie se repite igual cada vez que arrancas Crucible, así que las pruebas automáticas son reproducibles.
abs(x)Valor absoluto.
sqrt(x)Raíz cuadrada.
min(a, b), max(a, b)Mínimo y máximo.

No hay condicionales dentro de la fórmula: cuando solo elige entre la fórmula y un fallback fijo.

El modelo de la fuente, en marcha

Contra el banco recién arrancado:

$ printf 'MEAS:CURR?\n' | nc -q1 127.0.0.1 5025
0.00000
$ printf 'OUTP?\n' | nc -q1 127.0.0.1 5025
0
$ printf 'VOLT 5;:OUTP ON;:MEAS:CURR?\n' | nc -q1 127.0.0.1 5025
0.50001
$ printf 'VOLT 20;:MEAS:CURR?;:OUTP?\n' | nc -q1 127.0.0.1 5025
0.99999;1
$ printf 'MEAS:VOLT?\n' | nc -q1 127.0.0.1 5026
+3.300139E+00

Paso a paso:

  1. Con la salida apagada no se cumple cuando, y la medida es el fallback, escrito con el formato del modelo: 0.00000.
  2. OUTP? contesta 0, no false: lo contesta el modelo salida_como_numero, con formato: entero, como un instrumento real.
  3. A 5 V sobre 10 Ω, medio amperio más ruido.
  4. A 20 V serían 2 A, pero min recorta al límite de 1 A: la fuente entra en corriente constante.
  5. El multímetro escribe en notación científica, como la mayoría.

formato

Tu software espera los números como los escribe el instrumento real:

formatoRespuesta de ejemploUso típico
(sin poner)1.0, 4.501385029307777—
entero1, 0, -3Estados (OUTP?) y contadores.
fijo:Nfijo:4 → 4.5014Fuentes que contestan con decimales fijos.
cientifico:Ncientifico:6 → +4.501385E+00Multímetros y la mayoría de medidas SCPI.

El formato también se aplica al fallback si es numérico.

Las consultas con respuesta: "{variable}" devuelven el valor tal cual (5.0). Si tu software espera otra forma, usa un modelo cuya expr sea la variable, con el formato que toque.

Errores en las fórmulas

Los de sintaxis —un paréntesis sin cerrar, una función que no existe— salen al validar o al arrancar, con la posición:

dispositivo:
  modelo: DMM-ABC
  idn: "ACME,DMM-ABC,SN12345,FW2.01"

protocolo: scpi

estado:
  tension_entrada: 0.0

comandos:
  - patron: "MEASure:VOLTage[:DC]"
    query: true
    modelo: lectura

modelos:
  lectura:
    tipo: formula
    expr: "tension_entrada + gaus(0, 0.0001)"
$ crucible --validar perfiles/formula_rota.yaml

error: perfiles/formula_rota.yaml: perfil inválido: modelo 'lectura': error de evaluación: fórmula 'tension_entrada + gaus(0, 0.0001)': función 'gaus' desconocida; existen: gauss, abs, sqrt, min, max (posición 23)

Una variable que no existe en el estado, en cambio, solo se detecta al hacer la consulta: no llega respuesta y SYST:ERR? devuelve -200,"Execution error;…la variable '…' no existe en el estado…". Declara en estado todas las variables que usen tus fórmulas.