式エンジン
式エンジンは Edge-EMS Builder の「計算」機能の中核です。集約ポイントの値、トリガープランの判定条件、MQTT メッセージの組立ては、いずれも式エンジンがスクリプトを実行した結果です。スクリプトの構文は Lua です。
1. 変数参照の規則
Section titled “1. 変数参照の規則”式スクリプトを実行する前に、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 * icreturn s3. 組み込み関数とモジュール
Section titled “3. 組み込み関数とモジュール”標準 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} で計算結果を直接参照できます。同じ計算ロジックを繰り返す必要がなく、これが「ロジックの再利用」です。
5. 試算機能
Section titled “5. 試算機能”集約ポイントの式を追加・変更したら、保存前に試算で構文と計算結果が期待どおりか確認できます。稼働後にスクリプトの誤りが判明することを防ぎます。
次のステップ
Section titled “次のステップ”- 組み込み関数のシグネチャ、モジュール一覧、その他の例:Lua スクリプト完全リファレンス
- トリガープランで計算結果を実際のアクションへ変える方法:トリガープラン