コンテンツにスキップ
JelinaJelina Documentation技術ドキュメント
公式サイトに戻る

式エンジン

式エンジンは Edge-EMS Builder の「計算」機能の中核です。集約ポイントの値、トリガープランの判定条件、MQTT メッセージの組立ては、いずれも式エンジンがスクリプトを実行した結果です。スクリプトの構文は Lua です。

式スクリプトを実行する前に、Edge-EMS Builder は ${...} 形式のプレースホルダーを実際のデータ値へ置き換え、その後スクリプト本体を実行します。次の記法に対応し、組み合わせて使用できます。

記法 説明 例
${dataKey} ポイントの現在値を参照 ${PCS1_有功功率}
${dataKey[-NTimeUnit]} N 時間単位前の履歴値を参照 ${PCS1_有功功率[-5s]} は 5 秒前の値
${dataKey[#N]} 最新から数えて N 番目の履歴サンプル値を参照 ${PCS1_有功功率[#3]} は最新から 3 番目の値
${dataKey[raw]} 自動型変換せず、そのまま挿入します。数値 1000 と 2 進数 1000 などを区別しにくい場合、raw で元の値を強制挿入します。必ず末尾に配置します ${设备状态[raw]}
${[deviceCode]dataKey} 共有デバイス(Share)のポイントの最新値を参照 ${[DeviceA]PCS1_有功功率}
組合せ 上記の規則を自由に組合せ可能 ${[DeviceA]PCS1_有功功率[-1s][#3]}

欠損値:対象ポイントに値がない場合、エンジンは文字列 __Null__ を挿入します。明示的に比較するか、isNull / isNotNull を使用してください。数値計算では先に tonumber で変換し、or 0 でこの文字列を判定しないでください。

時間オフセットに使用できる単位:

単位 使用可能な表記
ミリ秒 ms / millisecond
秒 s / sec / second / seconds
分 m / min / minute / minutes
時間 h / hour / hours
日 d / day / days
週 w / week / weeks
月 M / month

2. スクリプト本体:標準 Lua 構文

Section titled “2. スクリプト本体:標準 Lua 構文”

プレースホルダー置換後、スクリプト本体は標準 Lua 5.1 構文で実行され、最後に return で計算結果を返します。Lua の変数、条件分岐、ループ、関数などを利用できます。

-- 総皮相電力を計算(簡略例)
local ua, ub, uc = tonumber(${Meter1_Ua}), tonumber(${Meter1_Ub}), tonumber(${Meter1_Uc})
local ia, ib, ic = tonumber(${Meter1_Ia}), tonumber(${Meter1_Ib}), tonumber(${Meter1_Ic})
if not (ua and ub and uc and ia and ib and ic) then return "__Null__" end
local s = ua * ia + ub * ib + uc * ic
return s

標準 Lua 構文(標準の string / table / math ライブラリーを含む)に加え、Edge-EMS Builder はグローバル関数と require で読み込めるモジュールを用意しています。データ読み取り、書き込みアクションの構築、文字列・時刻・正規表現の処理などを利用し、低レベルのコードを書かずに複雑なロジックを実装できます。

分類 説明 例
データ読み取り(グローバル関数) getLatestDataValue、getHistoryData、getDeviceShareValue、およびプレフィックス/サフィックス/あいまい一致による一括照会関数群 共通の命名規則を持つポイントを動的に走査(トリガープラン の動的デバイス検出例を参照)
書き込みの構築(グローバル関数) buildCommonWriteMap、buildCustomizationWriteMap、buildDailyRepeatWriteMap、buildCommonAlarmMap、buildMqttAlarmMap、buildAlarmObservationMap、buildSlaveWriteMap 書き込み対象のデータ構造を構築し、トリガー/MQTT アクションで統一的に実行
時刻変換 cp56Time2aToOffsetDateTime、offsetDateTimeToCP56Time2a。AB/BA に対応 IEC の時刻レジスターとの連携
時刻モジュール require("OffsetDateTime")、require("LocalTime") 現在のタイムスタンプ取得(頻度制限の判定)、時間範囲の比較
汎用ユーティリティモジュール require("Logger")、require("JSON")、require("Regex")、require("String")、require("Math")、require("TableUtils") ログ出力、JSON の深い階層の操作、正規表現、文字列・数値・テーブル処理
JSON 変換(グローバル関数) jsonToMap、jsonToList、toJsonString 外部システムとの構造化データ交換(MQTT メッセージでよく使用)
HTTP require("http") スクリプトから HTTP 要求を直接送信し、外部 API と連携。頻度とタイムアウトは呼び出し側で管理

関数シグネチャとモジュールメソッドの一覧は Lua スクリプト完全リファレンス、変数参照の詳細は データ変数の解析規則 を参照してください。

集約ポイントの式は、return で単一の値(数値、文字列など)を返し、それが集約ポイントの最新値になります。buildCommonWriteMap などの書き込み記述配列は返さないでください。これらはトリガーアクションや MQTT アクションなどの戻り値形式です。Lua スクリプト完全リファレンス:戻り値の規約 を参照してください。

4. 設定例:残りの利用可能容量を計算

Section titled “4. 設定例:残りの利用可能容量を計算”

負荷分散でよく使用する「残りの利用可能電力」を例に説明します。

-- 定格電流 × 電圧 = 定格電力上限(kW)
local rated_kw = tonumber(${Grid_current} or 0) * tonumber(${Grid_voltage} or 0) * 0.001
-- 使用中の電力(系統側の実測総電力、kW)
local used_kw = tonumber(${Grid_total_power} or 0)
-- 10% の安全余裕を確保
local avail_kw = (rated_kw - used_kw) * 0.9
return avail_kw

このスクリプトを集約ポイント avail_kw の式として設定すると、トリガープランや他の集約ポイントは ${avail_kw} で計算結果を直接参照できます。同じ計算ロジックを繰り返す必要がなく、これが「ロジックの再利用」です。

集約ポイントの式を追加・変更したら、保存前に試算で構文と計算結果が期待どおりか確認できます。稼働後にスクリプトの誤りが判明することを防ぎます。