メインコンテンツまでスキップ

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_QTYTAG_PLANT_TOTAL_QTY に 1 秒ごとに更新。

inject (1s) ─▶ 태그값 읽기 ×3 (병렬) ─▶ join ─▶ function (sum) ─▶ 태그값 쓰기

join: mode manual、combine array、key msg.topic、count 3。 各 タグ値読み取り の出力に change ノードを付けて、msg.topicline1/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) };
公式(formula) 機能との違い

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 時間の推移」グラフをアラームと一緒に送れます — 運用者がその場で判断できます。


次のステップ