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

外部プログラム連携

エッジが対応していない設備も、エッジのデータモデルに取り込むことができます。

HTTP接続画面 — 外部からプッシュされた値を受け取る場所

外部で作成したプログラムが値を読み取り、HTTPでプッシュすると、その値はエッジが直接収集した タグとまったく同じように扱われます。プラットフォーム転送・履歴・アラーム・フローがすべてそのまま適用されます。ドライバを 新しく作る必要はありません。

いつ使うか
  • エッジにドライバがないプロトコルの設備
  • すでに値を読み取っている既存システム(MES・SCADA・自社収集プログラム)
  • 計算・加工を経た値を送りたいとき

どのように動作するか​

HTTP接続は収集しません。 値を受け取って保持するキャッシュです。

외부 프로그램 ──HTTP──▶ 엣지의 값 캐시 ──timecycle 주기로 샘플링──▶ 태그 이력 · 플랫폼

プッシュしているのに、なぜ値が消えるのか​

外側はプッシュでも、エッジの内側は依然としてポーリングだからです。

他のドライバはエッジが設備を直接ポーリングします。HTTPは、その«設備»の位置にキャッシュが置かれた だけで、キャッシュを読み取る側は同じくポーリングです。そのため、プッシュする側と読み取る側のタイミングが ずれると、値がずれます。

外側 → エッジエッジ → 履歴
方式プッシュ (外部が任意のタイミングで)ポーリング (timecycle 周期)
取りこぼした場合—周期間の値は最後の1つだけが残ります
MQTT・Kafka・WebSocket も同じです

メッセージを受け取るドライバはすべて同じ構造です。ブローカーから届いたメッセージを«最後の値» 1つで上書きし、収集スケジューラがそれを周期で読み取っていきます。

ドライバ値が入ってくる場所
HTTP外部プログラムのリクエスト
MQTT Client購読したトピック
Kafkaコンシューマが受信したレコード
WebSocket受信フレーム

そのため、「ブローカーに発行した件数より収集された件数がはるかに少ない」というのは正常です。ブローカーの LAG が 0 なら、エッジはすべて受け取っています — ただし履歴に残るのは周期ごとに1つです。これを 消失と誤解して長時間調査した事例があります (現場事例集)。

この構造に起因する性質があります。まず理解してから始めてください。

性質意味
プッシュした値が即座に保存されません接続の timecycle 周期でサンプリングされます
周期より速くプッシュすると中間値が消えます最後の値だけが残ります
周期より遅くプッシュすると同じ値が繰り返し保存されますキャッシュに残った値を読み続けます

すぐに反映させたい場合は timecycle を減らしてください。 この値がそのまま反映遅延です。 1000(1秒)なら最大1秒後に残り、200に減らすと最大0.2秒後に残ります。最小値は 100(0.1秒)です。

目的timecycle
ほぼ即時反映100 ~ 200
一般的なリアルタイム監視1000
ゆっくり変化する値(温度・水位)5000 以上
周期を減らしても«全数»ではありません

周期を減らすと遅延は減りますが、最後の値1つだけを読み取るという性質はそのままです。周期の間に 値が3回変わったら、最後の1つだけが残ります。

すべてのイベントを1つも漏らさず残す必要があるなら、この方式は適していません。周期をどれだけ 細かくしても同じです。

周期を減らすと負荷が増えます

その接続に紐づくすべてのタグをその周期で読み取ります。タグが多い接続の周期を100に 下げると、負荷がその分大きくなります。速くすべきタグだけを別のHTTP接続を作って、その接続だけ 周期を下げる方が良いです。


ステップ1 — HTTP接続を作成します​

画面で接続 → 追加 → HTTP に進みます。

https://<엣지 주소>/ui/connect/http

HTTP接続にはドライバオプションが一切ありません。 IPとポートの欄はありますが、ドライバは 読み取りません — 形式上の入力なので、どの値を入れても動作に影響はありません。

RESTで作成することもできます。8つのフィールドがすべて必須です。

curl -X POST https://<엣지 주소>/api/v1/opc \
-H 'X-API-Key: <API 키>' \
-H 'Content-Type: application/json' \
-d '{
"opc_id": "OPC_EXTERNAL_01",
"opc_name": "외부 수집기",
"opc_type": "HTTP",
"site_id": "SITE_00001",
"opc_agent_ip": "127.0.0.1",
"opc_agent_port": 80,
"timecycle": 1000,
"async": false
}'
フィールドルール
opc_idOPC_ で始まり、大文字・数字・アンダースコア1~60文字
site_idSITE_ で始まる
opc_type正確に HTTP である必要があります。異なる場合、値のプッシュが拒否されます
opc_agent_port1~65535
timecycle100以上(ミリ秒)。この値がそのままサンプリング周期です
1つでも欠けると画面とは異なる動作をします

画面で作成すると、欠けた値を画面が補います。そのため、RESTで作成するときだけフィールド欠落により 接続が作成されても動作しないことが起こります。


ステップ2 — タグを登録して tag_id を受け取ります​

その接続の下にタグを作成します。値1つがタグ1つです。

データタイプを値の性質に合わせて選んでください。 値が文字列で来ても、宣言したタイプが合っていれば正確に パースされます。逆にタイプが間違っていると、格納段階で例外が発生します。

値タイプ
電流・温度・電圧・重量・速度・座標Double
バッテリー・エラーコード・カウンタInteger
アラーム・状態・エリア・方向・色String

プッシュ時に使用する**tag_id** は、タグ一覧画面またはタグ照会APIで確認します。


ステップ3 — 値をプッシュします​

curl -X POST https://<엣지 주소>/api/v1/tag/<tag_id>/value \
-H 'X-API-Key: <API 키>' \
-H 'Content-Type: application/json' \
-d '{"value":"1500"}'

値は文字列で送っても構いません。 タグに宣言したタイプにパースされます。

認証​

/api/ 以下はすべて認証がかかります。キーがないとブロックされます — 設定が抜けていても 開きません。

方法形式
ヘッダー (推奨)X-API-Key: <key>
ヘッダーAuthorization: Bearer <key>
ブラウザセッションログイン状態ならキーなしで通過
クエリパラメータは使用できません

?api_key=… はv1で削除されました。 使用すると401です。古い例をそのまま移さないでください。

HTTPSで呼び出してください​

デフォルトがHTTPS専用です。http:// で呼ぶと403が返ります。


値が入ってこないとき​

順番に絞り込みます。

  1. 接続が起動中か — 停止状態だと値を受け取らず拒否します。画面でその接続を 開始してください。
  2. opc_type が HTTP か — 他のタイプの接続にはプッシュできません。
  3. HTTPSで呼び出したか — http:// は403です。
  4. キーをヘッダーで送ったか — クエリパラメータは401です。
  5. tag_id が正しいか — タグ一覧で再確認します。
  6. 周期を待ったか — プッシュした直後には保存されません。timecycle 待ってから 履歴を確認します。

知っておくべきこと​

一度に1つずつです。 複数のタグを1つのリクエストでプッシュするエンドポイントはありません。タグごとに 個別に呼び出します。

冗長構成でも受け取ります。 書き込み権限がないエッジでも、HTTPでプッシュされる値は継続して 受け取ります。外部連携が冗長切り替えで途切れないように、意図的にそうなっています。

旧エンドポイントがあります。 POST /api/http は opc_id と plc_address で対象を指定する 従来の方式です。2026年12月31日に廃止されます。 レート制限と重複防止も適用されないため、 新しく作る連携は上記の /api/v1/tag/{tag_id}/value を使用してください。


関連ドキュメント​