Script
AdvancedExé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 :
| Nom | Type | Description |
|---|---|---|
t | number | Temps de simulation actuel (en secondes). |
dt | number | Pas d'échantillonnage de ce calcul (en secondes). |
propar | object | Passerelle matérielle — voir _Contrôle matériel_ ci-dessous. |
| number | Une 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.
Modèle Mathématique
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