IIoT-Beispielsammlung
Die folgenden Beispiele sind Muster, die Vor-Ort tatsächlich häufig gebaut werden. Alle funktionieren genau wie Hello World, indem Sie Nodes ziehen, verbinden und deployen. Die Codeblöcke sind JavaScript, das Sie unverändert in den function-Node einfügen können.
1. Schwellwert-Alarm (Threshold Alert)
Ziel: Benachrichtigung per Slack, sobald ein Temperatur-Tag 80 ℃ oder mehr erreicht.
inject (5s) ─▶ 태그값 읽기 (TAG_TEMPERATURE) ─▶ function (임계값 체크) ─▶ switch ─▶ slack out
function:
const v = parseFloat(msg.payload.value);
msg.over = (v >= 80);
msg.temp = v;
return msg;
switch: Bedingung msg.over is true → durchlassen.
In der Nachricht von slack out (oder email/telegram) 🔥 온도 경보 ${msg.temp}℃.
Um Flattern nahe dem Schwellwert (80↔80,1) zu vermeiden, sollte der Alarm nur beim Überschreiten gesendet werden und erst nach Rückkehr unter den Wert beim erneuten Anstieg wieder. Merken Sie sich den Zustand mit flow.set('lastAlert', true) und triggern Sie nur beim Umschalten.
2. Mehrere Tags summieren und in ein neues Tag schreiben (Rechenwert)
Ziel: TAG_LINE1_QTY + TAG_LINE2_QTY + TAG_LINE3_QTY → TAG_PLANT_TOTAL_QTY, jede Sekunde aktualisiert.
inject (1s) ─▶ 태그값 읽기 ×3 (병렬) ─▶ join ─▶ function (sum) ─▶ 태그값 쓰기
join: mode manual, combine array, key msg.topic, count 3.
Hängen Sie an den Ausgang jedes Tag-Wert-Lesens einen change-Node an und vergeben Sie msg.topic unterschiedlich als line1/line2/line3.
function:
const sum = msg.payload.reduce(
(a, p) => a + (parseFloat(p.value) || 0), 0);
return { tagId: 'TAG_PLANT_TOTAL_QTY', payload: String(sum) };
PlantPulse besitzt selbst eine Funktion für Formel-Tags. Einfache Grundrechenarten lassen sich dort schneller und stabiler erledigen. Node-RED ist stärker, wenn externe APIs/MQTT/Zeitbedingungen/Verzweigungen zusammenkommen.
3. CSV-Logging (im Minutentakt)
Ziel: Jede Minute die Werte von 5 wichtigen Tags als eine CSV-Zeile auf die lokale Festplatte schreiben.
inject (1m) ─▶ 태그값 읽기 ×5 ─▶ join ─▶ function (CSV 한 줄) ─▶ file (append)
function:
const ts = new Date().toISOString();
const cols = msg.payload.map(p => (p.value || '').replace(/,/g, ''));
msg.payload = [ts, ...cols].join(',') + '\n';
msg.filename = '/data1/pp-data/node-red/log/tags-' + ts.slice(0, 10) + '.csv';
return msg;
file-Node: Action append to file, Add newline off.
Das Node-RED userDir ist /data1/pp-data/node-red. Wenn Sie die CSV-Datei ebenfalls dort ablegen, wird sie von der Backup-Richtlinie des Gateway mit erfasst.
4. Echtzeit-Publikation an ein externes SCADA über MQTT
(Details zur Konfiguration siehe MQTT). Schnelles Einzeiler-Muster:
inject (1s) ─▶ 태그값 읽기 ─▶ change (topic=plant/${tag_id}/value) ─▶ mqtt out
5. Werte einer externen REST API als Tag übernehmen (Rückwärts-Integration)
Ziel: Außentemperatur einer externen Wetter-API alle 5 Minuten abrufen → in das virtuelle Tag TAG_OUTDOOR_TEMP schreiben.
inject (5m) ─▶ http request (GET https://api.example.com/weather?...) ─▶ function ─▶ 태그값 쓰기
function:
return { tagId: 'TAG_OUTDOOR_TEMP', payload: String(msg.payload.main.temp) };
Dieser Wert lässt sich in allen PlantPulse-Ansichten / Charts / externen SCADA-Systemen wie ein normales Tag verwenden.
6. Tagesreport per E-Mail zum Schichtbeginn
Ziel: Täglich um 7 Uhr morgens Mittelwert/Maximum/Minimum der vergangenen 24 Stunden per E-Mail.
inject (cron: 0 7 * * *) ─▶ http request (GET /ui/opcua/history?...) ─▶ function (집계) ─▶ email
function:
const points = msg.payload.points || [];
const vs = points.map(p => parseFloat(p.value)).filter(v => !isNaN(v));
const avg = vs.reduce((a,b)=>a+b,0) / vs.length;
msg.topic = '[일일 리포트] 어제의 ' + msg.payload.tag_id;
msg.payload = '평균: ' + avg.toFixed(2)
+ '\n최대: ' + Math.max(...vs)
+ '\n최소: ' + Math.min(...vs);
return msg;
7. Bei Alarm gleichzeitig an Slack und DB verzweigen
inject (1s) ─▶ 태그값 읽기 ─▶ switch (정상/비정상) ─▶┬─▶ slack out
└─▶ http request (POST /alerts)
Die beiden Nodes am Ende des Fehlerzweigs (slack out, http request) erhalten dieselbe Nachricht gleichzeitig.
8. Einheiten-/Skalenumrechnung (4–20 mA → bar)
inject (1s) ─▶ 태그값 읽기 (TAG_RAW_MA) ─▶ function (스케일) ─▶ 태그값 쓰기 (TAG_PRESSURE_BAR)
function:
const raw = parseFloat(msg.payload.value);
const ma = (raw / 32767) * 20;
const bar = Math.max(0, ((ma - 4) / (20 - 4)) * 100);
return { tagId: 'TAG_PRESSURE_BAR', payload: bar.toFixed(2) };
9. Health-Check des Gateway selbst → Telegram
Die im OPC-UA-Viewer (/ui/opcua) sichtbaren EDGE-Systemtags direkt pollen.
inject (30s) ─▶ 태그값 읽기 (TAG_EDGE_..._OPC_CONNECTED_COUNT) ─▶ function ─▶ telegram
Fällt der Wert auf 0, sind alle PLCs getrennt → sofortige Benachrichtigung.
10. Echtzeit ohne Polling per OPC-UA Subscribe (Edge → Edge)
inject (once) ─▶ OpcUa-Item ×N ─▶ join ─▶ OpcUa-Subscribe ─▶ function (정규화) ─▶ 태그값 쓰기
Von einem OPC-UA-Server eines anderen Unternehmens nur Änderungsereignisse empfangen und unverändert auf die Tags unseres Gateway spiegeln (mirror) — eine Echtzeit-Gateway-Brücke.
Details zur Konfiguration der OPC-UA-Nodes finden Sie auf der Seite OPC-UA-Node.
11. Senden an die Cloud mit Sparkplug B
inject (5s) ─▶ 태그값 읽기 ×N ─▶ function (metrics 배열 만들기) ─▶ sparkplug device out
PlantPulse führt den Sparkplug-Versand auch selbst durch (고급 / 통합 파트너용 → Sparkplug B). Nutzen Sie den direkten Versand aus Node-RED nur, wenn Sie das Sparkplug-Verhalten anpassen müssen. Details zur Konfiguration siehe Sparkplug B-Node.
12. Chart-Bild für den Anhang einer Alarmmeldung erzeugen
Durch Kombination von node-red-contrib-image-output + chart.js in Node-RED oder der externen QuickChart-API können Sie zusammen mit dem Alarm eine Verlaufsgrafik „letzte Stunde“ an Slack senden — der Bediener kann sofort beurteilen.
Nächste Schritte
- Troubleshooting — häufige Fallstricke