BlockWerk Documentación
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="7 8 3 12 7 16"/><polyline points="17 8 21 12 17 16"/><line x1="14" y1="5" x2="10" y2="19"/></svg>

Script

Advanced

Ejecute 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:

NombreTipoDescripción
tnumberTiempo actual de la simulación (segundos).
dtnumberPaso de muestreo de este cálculo (segundos).
proparobjectPuente hardware — consulte _Control de hardware_ más abajo.
numberUna 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.

Simular en BlockWerk

Simulador interactivo en tu navegador — sin instalación, motor WebAssembly.

Simular en BlockWerk →

Modelo Matemático

y(t)=fscript(u(t),t)y(t) = f_{\text{script}}(u(t), t)

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