Script
AdvancedEjecute lógica personalizada en JavaScript o Python dentro del bucle de simulación. Defina sus propios puertos de entrada y salida; estos se convierten en variables disponibles en su script.
🚦 Cuándo utilizarlo: Para leyes de control no lineales, observadores de estado, lógica difusa, controladores de swing-up o expresiones matemáticas a medida. Utilice bloques estándar (Sum, Integrator, Gain, etc.) para modelos de planta y dinámica lineal: son más rápidos y fáciles de depurar visualmente en el diagrama.
Variables en tiempo de ejecución
Cada paso de cálculo recibe:
| Nombre | Tipo | Descripción |
|---|---|---|
t | number | Tiempo actual de la simulación (segundos). |
dt | number | Paso de muestreo de este cálculo (segundos). |
propar | object | Puente hardware — consulte _Control de hardware_ más abajo. |
| number | Una variable por cada puerto de entrada configurado en la pestaña Interface. |
Asigne valores a sus nombres de puertos de salida como a cualquier variable ordinaria; el motor de simulación los leerá al finalizar cada paso. Las salidas se inicializan a 0 antes de cada iteración; cualquier valor que no sea un número finito se restablece a 0.
Ejemplo — JavaScript
// Entradas: setpoint, measurement
// Salidas: torque
const error = setpoint - measurement;
torque = 0.5 * error;
Ejemplo — Python (Pyodide)
# Entradas: setpoint, measurement
# Salidas: torque
error = setpoint - measurement
torque = 0.5 * error
if t % 1 < dt:
print(f"[ctrl] t={t:.2f}s | err={error:+.3f}")
numpy se encuentra precargado (np). scipy se instala automáticamente bajo demanda si el script contiene import scipy o from scipy …. Para otros paquetes: instale mediante import micropip; await micropip.install("…") dentro de un bloque async.
Reglas de los puertos
Los identificadores de puerto deben ser identificadores válidos en JavaScript / Python y no deben colisionar con:
- Las variables reservadas del sistema
t,dt,propar. - Palabras clave del lenguaje (
for,while,class,def,import, …). - Otros identificadores de puerto declarados en el mismo bloque.
Control de hardware mediante ProPar
Si su simulación interactúa con un controlador de flujo másico Bronkhorst (o cualquier dispositivo ProPar):
JavaScript:
propar.write(/* node */ 1, /* procNr */ 1, /* paramNr */ 21, 50.0); // consigna
Python:
propar.instrument(1).fSetpoint = 50.0
# o bien
propar.write(1, 206, 50.0) # 206 = número DDE
URL de script externo — nota de seguridad
El campo External Script URL nunca se descarga de forma automática. Debe pulsar Pull... y confirmar la operación. El código descargado se ejecuta con los permisos completos del worker. Cargue scripts únicamente desde fuentes fiables.
Recarga en caliente (Hot-reload)
Mientras la simulación está en curso o pausada, guardar el script (Ctrl+S o botón Guardar) recarga instantáneamente la función compilada en el worker sin necesidad de reiniciar la simulación.
Consola y gestión de errores
La pestaña Console muestra la salida en tiempo real del worker (print(), console.log()), errores de compilación y excepciones de ejecución. Si se produce un error, el bloque se vuelve rojo y muestra el mensaje correspondiente.
Modelo Matemático
Parámetros
| Parámetros | Label | Tipo | Por defecto | Descripción |
|---|---|---|---|---|
language |
Language | select | javascript |
Scripting language. Switching language replaces the default starter code if the editor is untouched. |
script |
Script | code | // Available variables: t, dt, propar, and your custom input names
// Assign values to your custom output names
out = input * 2; |
Script executed every simulation step. Use the dedicated Script editor (double-click the block) for syntax highlighting and live console output. |
customInputs |
Input Ports | text | [{"id":"input","label":"Input","dataType":"number"}] |
JSON array of input ports. Each entry: { id, label, dataType }. Edit via the Interface tab in the script editor. |
customOutputs |
Output Ports | text | [{"id":"out","label":"Output","dataType":"number"}] |
JSON array of output ports. Each entry: { id, label, dataType }. Edit via the Interface tab in the script editor. |
scriptUrl |
External Script URL | text | |
Optional URL. Click 'Pull' in the editor to fetch and replace the local script — never auto-fetched. |
Ejemplos de Uso
- Algoritmos de control adaptativo o estimación de parámetros en línea.
- Consulte los ejemplos integrados en el manual para ver una demostración de este bloque.
Observaciones y Buenas Prácticas
- JavaScript vs Python: JS se ejecuta de manera nativa (máxima velocidad); Python corre mediante Pyodide (~2–4 s en el arranque inicial).
- Hot-reload: Modifique el código y compruébelo en tiempo real sin reiniciar el estado de la simulación.
- Acceso a hardware: Comunicación directa en tiempo real con buses de campo ProPar.
Bloques Relacionados
- Constant: Fuente de señal constante
- Gain: Escalamiento de señal
- MathFunction: Funciones matemáticas habituales