BlockWerk Documentation
<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

Exécutez du code personnalisé en JavaScript ou en Python au cœur de la boucle de simulation. Définissez vos propres ports d'entrée et de sortie — ils deviennent directement des variables accessibles dans votre script.

🚦 Quand l'utiliser : pour implémenter des lois de commande non linéaires, des observateurs d'état, de la logique floue, des contrôleurs de swing-up ou des calculs mathématiques spécifiques. Privilégiez les blocs standards (Sum, Integrator, Gain, etc.) pour la modélisation des procédés physiques et la dynamique linéaire — ils s'exécutent plus vite et se déboguent visuellement.

Variables d'exécution

Chaque pas de simulation reçoit :

NomTypeDescription
tnumberTemps de simulation actuel (en secondes).
dtnumberPas d'échantillonnage de ce calcul (en secondes).
proparobjectPasserelle matérielle — voir _Contrôle matériel_ ci-dessous.
numberUne variable par port d'entrée déclaré dans l'onglet Interface.

Affectez des valeurs à vos noms de ports de sortie comme à de simples variables — le moteur les relit à l'issue de chaque pas. Les sorties sont remises à 0 avant chaque pas ; toute valeur qui n'est pas un nombre fini est ramenée à 0.

Exemple — JavaScript

// Entrées : setpoint, measurement
// Sorties : torque
const error = setpoint - measurement;
torque = 0.5 * error;

Exemple — Python (Pyodide)

# Entrées : setpoint, measurement
# Sorties : torque
error = setpoint - measurement
torque = 0.5 * error
if t % 1 < dt:
    print(f"[ctrl] t={t:.2f}s | err={error:+.3f}")

numpy est préchargé (np). scipy s'installe automatiquement à la demande si le script contient import scipy ou from scipy …. Pour d'autres bibliothèques : installez-les via import micropip; await micropip.install("…") dans un bloc async.

Règles relatives aux ports

Les identifiants de port doivent être des identifiants valides en JavaScript / Python et ne doivent pas entrer en collision avec :

  • Les noms injectés par le système (t, dt, propar).
  • Les mots-clés réservés du langage (for, while, class, def, import, …).
  • D'autres identifiants de port du même bloc.

Contrôle matériel via ProPar

Si votre modèle communique avec un régulateur de débit massique Bronkhorst (ou tout appareil ProPar) :

JavaScript :

propar.write(/* node */ 1, /* procNr */ 1, /* paramNr */ 21, 50.0); // consigne

Python :

propar.instrument(1).fSetpoint = 50.0
# ou
propar.write(1, 206, 50.0)   # 206 = numéro DDE

URL de script externe — avertissement de sécurité

Le champ External Script URL n'est jamais téléchargé automatiquement. Vous devez cliquer sur Pull... et confirmer. Le code importé s'exécute avec les pleins privilèges du worker. N'importez que du code provenant de sources de confiance.

Rechargement à chaud (Hot-reload)

Pendant qu'une simulation est en cours d'exécution ou en pause, l'enregistrement du script (Ctrl+S ou le bouton Sauvegarder) recharge instantanément la fonction compilée dans le worker sans nécessiter de redémarrage.

Console et diagnostic d'erreurs

L'onglet Console affiche en temps réel les messages du worker (print(), console.log()), les erreurs de compilation et les exceptions à l'exécution. En cas d'erreur, le bloc devient rouge et affiche le message d'erreur correspondant.

Simuler dans BlockWerk

Bac à sable interactif directement dans votre navigateur — aucune installation, moteur WebAssembly.

Simuler dans BlockWerk →

Modèle Mathématique

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

Paramètres

Paramètres Label Type Défaut Description
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.

Exemples d'Utilisation

  • Observateur d'état de Luenberger non linéaire ou filtre de Kalman étendu.
  • Voir les exemples intégrés dans le manuel pour une démonstration de ce bloc.

Remarques & Bonnes Pratiques

  • JavaScript vs Python : JS s'exécute nativement (performance maximale) ; Python s'exécute sous WebAssembly via Pyodide (~2 à 4 s au premier chargement).
  • Hot-reload : Mise à jour immédiate du code sans interrompre la session de simulation.
  • Accès matériel : Communication temps réel native avec l'instrumentation ProPar.

Composants Associés

  • Constant : Source de signal constante
  • Gain : Facteur de proportionnalité direct
  • MathFunction : Pour les opérations mathématiques courantes