Script
AdvancedFührt benutzerdefinierte JavaScript- oder Python-Logik direkt innerhalb der Simulationsschleife aus. Definieren Sie eigene Eingangs- und Ausgangsports — diese stehen als Variablen im Skript zur Verfügung.
🚦 Einsatzbereich: Für nichtlineare Regelgesetze, Beobachter (Observer), Fuzzy-Logik, Aufschwing-Regler (Swing-up) oder komplexe Mathematik. Verwenden Sie für lineare Dynamik und Streckenmodelle Standardblöcke (Sum, Integrator, Gain usw.) — diese rechnen schneller und sind im Schaltplan intuitiver zu debuggen.
Laufzeitvariablen
Jeder Berechnungsschritt erhält:
| Name | Typ | Beschreibung |
|---|---|---|
t | number | Aktuelle Simulationszeit (Sekunden). |
dt | number | Abtastschrittweite dieses Zeitschritts (Sekunden). |
propar | object | Hardware-Bridge — siehe _Hardwaresteuerung_ unten. |
| number | Eine Variable pro deklariertem Eingangsport im Interface-Tab. |
Weisen Sie Ihren Ausgangsport-Namen Werte wie gewöhnlichen Variablen zu — die Laufzeitumgebung liest diese nach jedem Zeitschritt aus. Ausgänge werden vor jedem Schritt auf 0 initialisiert; nicht-endliche Werte werden auf 0 zurückgesetzt.
Beispiel — JavaScript
// Eingänge: setpoint, measurement
// Ausgänge: torque
const error = setpoint - measurement;
torque = 0.5 * error;
Beispiel — Python (Pyodide)
# Eingänge: setpoint, measurement
# Ausgänge: torque
error = setpoint - measurement
torque = 0.5 * error
if t % 1 < dt:
print(f"[ctrl] t={t:.2f}s | err={error:+.3f}")
numpy ist vorinstalliert (np). scipy wird bei Bedarf automatisch nachgeladen, sobald das Skript import scipy oder from scipy … enthält. Weitere Pakete: über import micropip; await micropip.install("…") innerhalb eines async-Blocks installierbar.
Port-Regeln
Port-Bezeichner müssen gültige JavaScript-/Python-Bezeichner sein und dürfen nicht kollidieren mit:
- Den injizierten Systemvariablen
t,dt,propar. - Schlüsselwörtern der jeweiligen Sprache (
for,while,class,def,import, …). - Anderen deklarierten Port-IDs desselben Blocks.
Hardwaresteuerung über ProPar
Wenn Ihre Simulation mit einem Bronkhorst Massendurchflussregler (oder einem anderen ProPar-Gerät) kommuniziert:
JavaScript:
propar.write(/* node */ 1, /* procNr */ 1, /* paramNr */ 21, 50.0); // Sollwert
Python:
propar.instrument(1).fSetpoint = 50.0
# oder
propar.write(1, 206, 50.0) # 206 = DDE-Nummer
Externe Skript-URL — Sicherheitshinweis
Das Feld External Script URL wird niemals automatisch geladen. Sie müssen explizit auf Pull... klicken und bestätigen. Geladener Code wird mit vollen Worker-Rechten ausgeführt. Laden Sie Code nur aus vertrauenswürdigen Quellen.
Hot-Reload
Während eine Simulation läuft oder pausiert ist, bewirkt das Speichern des Skripts (Strg+S oder Klick auf Speichern) einen sofortigen Hot-Reload der Funktion im Worker — kein Neustart erforderlich.
Konsole & Fehleranzeige
Der Tab Konsole zeigt Ausgaben des Workers in Echtzeit — inklusive print() / console.log(), Compiler- und Laufzeitfehlern. Bei Fehlern färbt sich die Blockoberfläche rot und visualisiert die letzte Fehlermeldung.
Mathematisches Modell
Parameter
| Parameter | Label | Typ | Standardwert | Beschreibung |
|---|---|---|---|---|
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. |
Anwendungsbeispiele
- Nichtlineare Mehrgrößenregelung oder Zustandsschätzer.
- Siehe die integrierten Beispiele im Handbuch für eine Demonstration dieses Blocks.
Hinweise & Best Practices
- JavaScript vs. Python: JS läuft nativ und extrem schnell; Python läuft via Pyodide (~2–4 s Kaltstartzeit).
- Hot-Reload: Ermöglicht schnelles interaktives Entwickeln und Parameteranpassen zur Laufzeit.
- Hardware-Zugriff: Ermöglicht direkte Anbindung von ProPar-Geräten im Regelkreis.
Verwandte Blöcke
- Constant: Einfache Signalquelle
- Gain: Lineare Skalierung
- MathFunction: Elementare mathematische Funktionen