IIoT サンプル集
以下のサンプルは 現場で実際によく作られるパターン です。いずれも Hello World と同じように、ノードをドラッグ/接続/Deploy するだけで動作します。コードブロックは function ノード内にそのまま貼り付けられる JavaScript です。
1. しきい値アラーム (Threshold Alert)
目的: 温度タグが 80℃ 以上になったら Slack へ通知。
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: 条件 msg.over is true → 通過。
slack out (または email/telegram) のメッセージに 🔥 온도 경보 ${msg.temp}℃。
しきい値付近でのばたつき(80↔80.1)を防ぐには、上昇 時点だけアラームを送り、解消 後に再度上昇したときのみ再送するのが望ましいです。flow.set('lastAlert', true) で状態を保持し、トグル時点だけをトリガーしてください。
2. 複数タグを合算して新しいタグに書き込む(計算値)
目的: TAG_LINE1_QTY + TAG_LINE2_QTY + TAG_LINE3_QTY → TAG_PLANT_TOTAL_QTY に 1 秒ごとに更新。
inject (1s) ─▶ 태그값 읽기 ×3 (병렬) ─▶ join ─▶ function (sum) ─▶ 태그값 쓰기
join: mode manual、combine array、key msg.topic、count 3。
各 タグ値読み取り の出力に change ノードを付けて、msg.topic を 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 自体に 計算式タグ 機能があります。単純な四則演算 はそちらで処理するほうが高速かつ安定です。Node-RED は 外部 API/MQTT/時間条件/条件分岐 が混在する場合により強力です。
3. CSV ロギング(分単位)
目的: 1 分ごとに主要タグ 5 点の値を CSV 1 行としてローカルディスクに蓄積。
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 ノード: Action append to file、Add newline off。
Node-RED の userDir は /data1/pp-data/node-red です。CSV もその配下に置けば、ゲートウェイのバックアップポリシーに一緒に含まれます。
4. MQTT で外部 SCADA へリアルタイム発行
(詳細な設定は MQTT を参照)。手早い 1 行パターン:
inject (1s) ─▶ 태그값 읽기 ─▶ change (topic=plant/${tag_id}/value) ─▶ mqtt out
5. 外部 REST API の値をタグとして取り込む(逆方向統合)
目的: 外部気象 API の外気温度を 5 分ごとに → 仮想タグ TAG_OUTDOOR_TEMP へ記録。
inject (5m) ─▶ http request (GET https://api.example.com/weather?...) ─▶ function ─▶ 태그값 쓰기
function:
return { tagId: 'TAG_OUTDOOR_TEMP', payload: String(msg.payload.main.temp) };
この値は、すべての PlantPulse 画面/チャート/外部 SCADA で通常のタグと同様に使用できます。
6. 業務開始時の日次レポートメール
目的: 毎朝 7 時に、前日 24 時間の平均/最大/最小をメールで送信。
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. アラーム発生時に Slack と DB へ同時分岐
inject (1s) ─▶ 태그값 읽기 ─▶ switch (정상/비정상) ─▶┬─▶ slack out
└─▶ http request (POST /alerts)
異常分岐の末端にある 2 つのノード(slack out、http request)が同じメッセージを同時に受け取ります。
8. 単位/スケール変換 (4-20mA → 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. ゲートウェイ自身のヘルスチェック → Telegram
OPC-UA ビューア (/ui/opcua) に表示される EDGE システムタグ をそのままポーリングします。
inject (30s) ─▶ 태그값 읽기 (TAG_EDGE_..._OPC_CONNECTED_COUNT) ─▶ function ─▶ telegram
値が 0 に落ちた場合は PLC がすべて切断された状態 → 即時通知。
10. OPC-UA Subscribe によるポーリング不要のリアルタイム (Edge → Edge)
inject (once) ─▶ OpcUa-Item ×N ─▶ join ─▶ OpcUa-Subscribe ─▶ function (정규화) ─▶ 태그값 쓰기
他社の OPC-UA サーバーから変更イベントのみを受け取り、自社ゲートウェイのタグへそのままミラー (mirror) — リアルタイムゲートウェイのブリッジです。
OPC-UA ノードの詳細設定は OPC-UA ノード ページを参照してください。
11. Sparkplug B でクラウドへ送信
inject (5s) ─▶ 태그값 읽기 ×N ─▶ function (metrics 배열 만들기) ─▶ sparkplug device out
PlantPulse は単体でも Sparkplug 送信を行えます (고급 / 통합 파트너용 → Sparkplug B)。Node-RED からの直接送信は Sparkplug 動作のカスタマイズが必要な場合 のみ使用してください。詳細な設定は Sparkplug B ノード を参照してください。
12. アラームメッセージに添付するチャート画像を作る
Node-RED の node-red-contrib-image-output + chart.js、または外部の QuickChart API を組み合わせることで、Slack に「直近 1 時間の推移」グラフをアラームと一緒に送れます — 運用者がその場で判断できます。
次のステップ
- トラブルシューティング — よく陥る落とし穴