跳转到内容

DFF 报表配置文件规则知识库

本文档为 AI 自动生成 MEMS 系统 DFF(DataFrame Flow)报表配置文件的专用知识库。所有配置规则、枚举值、字段含义均已结构化整理,供 AI 直接检索和使用。


DFF 报表配置使用 Excel (.xlsx) 文件,包含三个工作表(Sheet),按顺序为:

Sheet 序号Sheet 名称作用行含义
1DFF详情定义声明 DFF 的元信息一行 = 一个 DFF 的声明
2DFF节点定义定义 DFF 中的计算节点一行 = 一个节点
3DFF边定义定义节点间的数据流转边一行 = 一条边
  • DFF ID:<u64> 类型,唯一标识一个 DFF。规则:必须从 65536 开始编号。
  • 节点 (Node):数据获取或计算的基本单元,通过 “节点ID” 编号。
  • 边 (Edge):连接两个节点,实现数据从一个节点流向另一个节点。
  • 首尾节点格式:边的 “首尾节点” 字段格式为 <尾节点ID>;<首节点ID>,表示数据流向:尾节点 → 首节点。

DataFrame 是 DFF 中数据的标准格式,张量列名采用 名称_维度1_维度2 格式:

示例:
| NodeId_3 | V_3 | I_3 | Type_3 |
|----------|-----|-----|--------|
| 1 | 750 | 0 | Slack |
| 2 | / | -30 | PQ |
| 3 | / | -22 | PQ |
  • V_3 表示长度为 3 的电压列
  • 多个维度用下划线分隔:matrix_3_3 表示 3×3 矩阵

| DFF ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 存储模式 | 目标AOE | AOE变量名称 |
|--------|---------|------|---------|-------------|---------|--------|------------|
| u64 | Bool | String | 枚举 | String | 枚举 | u64 | String |
字段类型必填规则
DFF IDu64✅必须 ≥ 65536,同一文件内唯一
是否启用Bool✅true 或 false
名称String✅可读的中文/英文描述,如”潮流计算”
触发条件枚举✅见下表
触发条件参数String⚠️随触发条件类型变化,见下表
存储模式枚举✅见下表
目标AOEu64❌关联的 AOE ID,不需要留空
AOE变量名称String❌DFF 输出写入 AOE 的变量名,不需要留空
枚举值中文名参数格式示例
SimpleRepeat周期驱动<u64> 毫秒数60000(每60秒)
TimeDrive时间驱动Cron 表达式0 0 8 * *(每天8点)
EventDrive事件驱动事件判断表达式事件规则字符串
DataSource数据源驱动空 或 用;分隔的节点编号1;2(节点1和2都收到数据后触发)
Manual手动驱动空字符串

注意:历史文档中可能出现 Simple_Repeat / Time_Drive / Event_Drive / Data_Source 等带下划线的写法,实际系统使用驼峰式:SimpleRepeat / TimeDrive / EventDrive / DataSource。

枚举值中文名说明
EveryTime每次每次执行都保存结果(使用开始时间为唯一标识)
Once单次只保存一条记录(固定 t=0),后续覆盖
Memory内存仅存内存,不写数据库,系统重启丢失
Never从不不保存任何结果

选择建议:

  • 需保留历史 → EveryTime
  • 只需最新结果 → Once
  • 追求执行速度 → Memory
  • 不需要持久化结果 → Never

| DFF ID | 节点ID | 名称 | 节点类型 | 参数1 | 参数2 |
|--------|--------|------|---------|-------|-------|
| u64 | u64 | String | 枚举 | String | String |
字段类型必填规则
DFF IDu64✅必须与 Sheet 1 中的某条 DFF ID 对应
节点IDu64✅在同一 DFF 内唯一,从 1 开始递增
名称String✅节点功能简要描述,如”获取测点数据”
节点类型枚举✅见 3.3 完整节点类型表
参数1String⚠️部分类型需要,见具体类型
参数2String⚠️部分类型需要,见具体类型
节点类型中文名参数1参数2用途
None无动作--透传数据,不做处理
Source数据请求见 3.4 Source子类型见 3.4读取数据
Transform数据变换RustScript 变换表达式-排序、拼接、过滤等
TensorEval张量计算RustScript 计算脚本模式数字 0-15复杂张量运算
SqlSQL查询SQL 语句-对入边 DataFrame 执行 SQL
Solve线性方程组动作名称(变量引用名)-求解 Ax=b
NLSolve非线性方程组动作名称-求解非线性方程组
MILP混合整数线性规划动作名称,分号分隔-目标函数 + 约束条件
NLP非线性规划动作名称,分号分隔-变量 + 目标函数 + 约束
WasmWasm 脚本Wasm 文件路径/URL-执行自定义 Wasm 计算

Source 节点的类型写法为 Source_子类型,参数规则因子类型而异:

规则:参数1 以 ? 开头 → 历史量测查询;否则为实时量测查询。

历史量测查询(参数1以?开头,参数2留空):

参数1格式:?id=测点ID列表&start=时间戳&end=时间戳
参数键说明示例
id测点ID,多个用逗号分隔id=1000001,1000002
start / end13位毫秒时间戳start=1775654400000&end=1775655100000
date日期 yyyy-MM-dddate=2024-01-15
last相对时间 7d/24h/30mlast=7d
source数据源编号source=1
last_only只返回最新值last_only=true

示例:

参数1: ?id=1000001,1000002&start=1775654400000&end=1775655100000
参数2: (空)

实时量测查询(参数2有SQL,参数1可选):

参数1: (空 或 数据源ID数字)
参数2: select * from meas where id between 1000001 and 1001000

返回列:id | value | timestamp

参数1:SQL 语句,参数2 留空。

参数1: select * from points where id = 1000001

可用列:id | name | alias | is_discrete | is_computing | data_uni | upper_limit | lower_limit | is_realtime | is_soe | is_remote | timestamp | value

参数1:文件路径(支持 xlsx、csv),参数2 留空。

参数1: C:\Users\Desktop\data.xlsx

文件表头将作为 DataFrame 的列名。未指定完整路径时,相对于 mems.exe 所在目录。

参数1:URL 地址,参数2 留空。

参数1: https://example.com/data.csv

与 Source_File/Source_Url 格式相同,区别是加载时将文件内容内嵌到报表对象中(适合静态数据)。

参数1:SQL 语句,格式为 select 属性列 from 设备类型。

参数1: select `101`,`102`,`103` from Bus order by `101`
  • 设备类型包括:Bus | Branch | Gen | ESS | Load | ...(见附录 A)
  • 属性列使用反引号包裹属性ID,如 `101`
  • 用 * 表示全部属性

参数1:其他 DFF 的 ID(同一 MEMS)或 0(其他 MEMS)。

参数1: 65539

前置条件:本 DFF 的触发条件必须设置为 DataSource。

参数1:计划 ID,参数2 留空。

返回列:timestamp | value

TensorEval 是最常用的复杂计算节点,使用 RustScript 语法。

参数2 模式数字:

数字复数运算矩阵运算Polars运算多返回值
空/0❌❌❌❌
1✅❌❌❌
2❌✅❌❌
3✅✅❌❌
4❌❌✅❌
5✅❌✅❌
6❌✅✅❌
7✅✅✅❌
8❌❌❌✅
9-15对应组合对应组合对应组合✅

⚠️ 重要提示:Polars 模式(参数2 值包含 4 的场景)语法规则尚不完整,暂缓使用。当前请仅使用下方 RustScript 纯张量语法(参数2 取值:0 / 1 / 2 / 3 / 8 / 9 / 10 / 11)。

RustScript 纯张量语法(参数2 的 Polars 位关闭时,即值为 0/1/2/3/8/9/10/11)—— 当前唯一可用的 TensorEval 语法

  • 标识符:[A-Za-z_$][A-Za-z0-9_]*
  • 数值统一为 f64,支持小数和科学计数法;负号是前缀,应写 0.5 不写 .5
  • 字符串(传给 VM 原生函数)使用反引号:`text`;双/单引号会被当作名称
  • 单行注释 //,块注释 /* */(不可嵌套)
  • 变量声明、函数调用必须用分号结尾,解析器也接受 : 但统一用 =
  • 无 const/let/mut/类型注解
名称含义
pi, PI圆周率
e自然常数
epsf64::EPSILON
NAN, INF, NEG_INF非数、无穷
i, j虚数单位(未被变量覆盖时)
empty = [];
vector = [1, 2, 3];
row = [[1, 2, 3]];
column = [[1], [2], [3]];
matrix = [[1, 2], [3, 4]];
cube = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]];

同层元素必须形成一致形状;出现复数元素时整个值提升到复数域。

s = sparse([0, 1, 2], [1, 0, 1], [2, 3, 6], 3, 2);
dense = full(s);

sparse(rows, columns, values, row_count, column_count) —— 零基坐标;full(x) 转稠密;issparse(x) 返回 1 或 0。

声明不使用 let/mut;VM 中再次赋值会更新绑定。函数使用 fn,声明会提升(可先调用后声明):

value = square(4);
fn square(x) {
return x * x;
}

多返回值需用 [name1, name2, ...] 接收(参数2 需含多返回值标志):

fn split(s) {
return (s * 0.95, s * 0.20);
}
[active, reactive] = split(100);

条件(实数标量 >0 为真,零/负数/非标量为假;复数比较用实部):

if voltage > 1.05 {
state = 1;
} else if voltage < 0.95 {
state = -1;
} else {
state = 0;
}

循环(范围循环步长固定为 1;.. 半开,..= 含终点;降序用 while):

i = 0;
sum_value = 0;
while i < 4 {
sum_value = sum_value + i;
i = i + 1;
}
for i in 0..4 {
println(i);
}
for i in 0..=3 {
println(i);
}
类别运算符语义
前缀+x, -x正号、负号
前缀!x标量阶乘(x! 不合法)
前缀~~x, ~x逻辑非、位取反
后缀x'转置(不共轭)
幂^, .^矩阵/标量幂、逐元素幂
乘除*, /, \, %乘法、右除、左除、余数
逐元素.*, ./逐元素乘、除
算术+, -加、减
移位<<, >>标量整数移位
比较<, >, <=, >=, ==, !=逐元素比较
位运算&, ^^, |标量整数位与、异或、位或
位读取@按从 1 开始的位序号读取一位
逻辑&&, ||逐元素逻辑与、或

优先级说明:

  • 幂右结合,其余二元运算符左结合
  • 前缀正负号优先级低于幂,-x^2 = -(x^2)
  • * 两个非标量间为矩阵乘法,标量参与时为缩放
  • / 标量参与时为普通除法;矩阵间求解 X * right = left
  • \ 求解 left * X = right
  • 矩阵求逆写成 a ^ -1,没有 inv(a) 函数
  • 矩阵除法、矩阵负一次幂需 MKL 或 MUMPS/OpenBLAS 构建
z1 = 2 + 3i;
z2 = c(2, 3); // 实部 + 虚部
z3 = c1(5, pi/4); // 极坐标:模 + 弧度
z4 = c2(5, 45); // 极坐标:模 + 角度
re = real(z1); // 实部
im = imag(z1); // 虚部
conj_z = conj(z1); // 共轭
ang = angle(z1); // 相位角(弧度)
ct = ctranspose(A); // 共轭转置

注意:复数运算需参数2 含复数标志(值包含 1)才能正常工作。

基础一元:abs, sqrt, exp, ln, log10, floor, ceil, round, signum

三角:sin, cos, tan, asin, acos, atan, atan2

双曲:sinh, cosh, tanh, asinh, acosh, atanh

角度:deg2rad, rad2deg

极值与幂:max, min, power(逐元素)

复数:c, c1, c2, real, imag, conj, angle, rad, ctranspose, max_im, min_im, max_abs, min_abs

张量创建与拼接:

函数行为
zeros(d1, ...), ones(d1, ...)创建指定形状的全零/全一张量
eye(n)单位矩阵
range(start, end[, step])左闭右开序列,默认步长 1
horzcat(a, b, ...)水平拼接
vertcat(a, b, ...)垂直拼接
blockcat(block_rows, block_cols, blocks...)按块网格拼接块矩阵
ndim(x)维数(标量为 1,稀疏为 2)
size(x) / size(x, dim)形状向量 / 指定零基维度长度
length(x)最大维度长度

张量索引与更新(所有索引从零开始,不支持 a[0,1] 写法):

函数行为
get(x, i, ...)按每维索引取单个元素
get_multi(x, indices)按行主序扁平索引取多个元素
slice(x, spec1, ...)连续切片(标量→选一个并移除该维;[]→插入新维;[start]→从起点到末尾;[start,end]→左闭右开;[start,end,step]→加步长)
select(x, rows[, cols])按显式行列集合选取二维矩阵
select_assign(x, value, rows, cols)返回替换显式行列后的矩阵
set(x, indices, values)按扁平索引覆盖,返回新值
set2(x, indices, values)按扁平索引累加,返回新值

更新函数返回新值,不原地修改。应写 a = assign(a, ...) 而不是 assign(a, ...)。

归约与查找:

函数行为
sum(x[, dim_or_dims]), sum_all(x)按维/全部求和
any(x[, dim])检查非零元素
find(x)非零元素位置
find_nearest, find_nearest_pos最近值、最近值位置
is_empty, is_inf检查空值、逐元素检查无穷
diag提取对角或从向量创建对角矩阵
transpose, ctranspose转置、共轭转置

条件性线性代数函数(需 MKL 或 MUMPS/OpenBLAS 构建):trace, norm_l1, norm_l2, norm_max, det, svd, rank, eig, linsolve, linsolve_t, linsolve_h。后端未启用时这些名称作为未知函数失败。

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
z = zeros(2, 3);
identity = eye(3);
indices = range(0, 3);
shape = size(a); // [3, 3]
one_value = get(a, 1, 2); // 6(零基)
one_column = slice(a, [0], 1); // [2, 5, 8]
corners = select(a, [0, 2], [0, 2]);
b = select_assign(a, -1, [0, 2], [1]);
cumulative = set2(zeros(3), [0, 0, 2], [1, 2, 4]); // [3, 0, 4]
blocks = blockcat(2, 2, eye(2), zeros(2, 1), ones(1, 2), [[2]]);
column_sum = sum(a, 0);
total = sum_all(a); // 45
s = sparse([0, 1, 2], [0, 1, 2], [1, 5, 9], 3, 3);
dense = full(s);
// 从边获取数据(边名称即变量名)
bus_data = bus_points;
baseMVA = get(baseMVA_mat, 0, 0); // 取出张量中的标量
// 导入外部脚本
#include_url https://example.com/lib.txt
return res; // 单返回值
return (bus, gen, branch); // 多返回值(参数2 需含多返回值标志)

求解器原生函数(需 with_allsolvers)

Section titled “求解器原生函数(需 with_allsolvers)”
函数调用协议返回值
sp_linsolvesp_linsolve(equations, b, initial, names)[x..., status]
fsolvefsolve(equations, names) 或 fsolve(equations, initial, names)[x..., status]
intlinprogintlinprog(objective, constraints, types, names)[x..., objective, status]
fminconfmincon(objective, constraints, c_lower, c_upper, v_lower, v_upper, names[, initial])[x..., objective, status]
linear = sp_linsolve(
[`x1` + `x2`, `x1` - `x2`],
[3, 1], [], [`x1`, `x2`]
);
nonlinear = fsolve(
[`x1`^2 - 4, `x2` - `x1`],
[1, 1], [`x1`, `x2`]
);
result = intlinprog(
max(5*`x1` + 3*`x2`),
[2*`x1` + `x2` <= 4],
[1, 3], [`x1`, `x2`]
);

变量类型:1=0/1二进制, 2=整数, 3=连续实数。intlinprog 支持 min(...) 或 max(...) 目标。成功状态码为 0,失败为 1。

println(`message`); debug(x); info(x); warn(x); error(x);
ms = monotonic_ms(); // 进程内相对毫秒,非 Unix 时间戳
input = read_tensor(`data.csv`); // 支持 xls/xlsx/parquet/csv
write_tensor(scaled, `out.csv`); // 支持 parquet/xlsx/csv/txt
assert_eq(a, b);
assert_relative_eq(a, b, 1e-8);
assert_abs_diff_eq(a, b, 1e-6);
MATLABRustScript
一基索引零基索引
A(i,j)get(A, i, j)
A(i,j)=vassign / select_assign / set 并接收返回值
A .* B, A ./ B, A .^ B相同
A'仅转置;共轭转置用 ctranspose(A)
A\b相同(需线性代数后端)
inv(A)A ^ -1(无 inv 函数)
1:nrange(1, n+1)
'text'反引号 `text`

未实现的函数/特性(AI 生成时切勿使用)

Section titled “未实现的函数/特性(AI 生成时切勿使用)”

旧文档可能提到但当前不存在的:

  • 函数:all, chol, cond, inv, linspace, mean, median, nnz, numel, qr, repmat, reshape, spy, std, tril, triu, var
  • 语法:const, let, mut, 直接下标 a[i] / a[i,j], 结构体字段访问, 异常处理, mod/import 模块系统

DataFrame 操作(Polars模式,参数2 的 Polars 位开启时,值包含 4)

Section titled “DataFrame 操作(Polars模式,参数2 的 Polars 位开启时,值包含 4)”

⚠️ 暂缓使用:Polars 语法规则尚不完整,AI 生成配置时请勿使用 Polars 模式(参数2 不要设置为 4/5/6/7/12/13/14/15)。以下示例代码仅作开发参考。

// join 拼接
joined = join(table1, table2, ["key_col"], ["key_col"], inner);
// filter 过滤
filtered = filter(col1, col2, col(value) > 100);
// select 选择列
cols = select(col(name), col(alias), col(value));
// concat 拼接
combined = concat(horizontal, df1, df2);
// drop_nans 删除含 NaN 的行
cleaned = drop_nans();
// alias 重命名列
renamed = alias(col(old_name), new_name);
// cast 类型转换
casted = cast(col(value), f32);

参数1 格式:动作名称分号分隔,至少需要 2 个(目标函数 + 约束条件)。

参数1: obj;constraint;

目标函数数据格式(来自入边):

x(变量名)type(类型)lower(下限)upper(上限)c(系数)
x1205
x2303
  • type: 1=0-1二进制, 2=整型, 3=实数
  • 默认求解 最大值 (max)

约束条件数据格式:

x1x2…xib(常量)type
2-8…510-1
  • type: 1=表示表达式 ≥ 0, -1=表示表达式 ≤ 0

参数1 格式:动作名称分号分隔,至少需要 2 个(变量 + 表达式)。

参数1: nlp_x;nlp_obj_cons;

变量数据格式:

x_namelowerupperinit
x15

表达式数据格式:

equationslowerupper
x1x4(x1+x2+x3)+x3
x1x2x3*x4252e19
x1^2+x2^2+x3^2+x4^24040
  • 第一行是目标函数(默认计算最小值)
  • 第二行起是约束条件(可为空表示无约束)

参数1:动作名称(引用系数矩阵的变量名)。

参数1: function;

输入数据格式:

x1x2x3b
1521
03012
0317

最后一列为常数项 b,前面各列为系数矩阵。

3.9 NLSolve 节点(非线性方程组)

Section titled “3.9 NLSolve 节点(非线性方程组)”

参数1:动作名称。

参数1: function;

输入数据格式:

x_nameinitequation
x11x1^2 + x2^2 + x3^2 - 5
x2-1x1x2 + x2x3 + 2
x30x1^3 + x2 + x3 - 7

参数1:Wasm 文件路径或 URL。

参数1: http://127.0.0.1:80/forecast/model.wasm

| DFF ID | 首尾节点 | 边名称 | 描述 | 边类型 | 参数1 | 参数2 |
|--------|---------|--------|------|--------|-------|-------|
| u64 | n1;n2 | String | String | 枚举 | String | String |
字段类型必填规则
DFF IDu64✅与 Sheet 1 中的某条 DFF ID 对应
首尾节点n1;n2✅格式:尾节点ID;首节点ID,数据从 n1 流向 n2
边名称String✅英文变量名,下游节点通过此名称引用 DataFrame
描述String❌边动作说明,AI 生成时可留空或写简短描述
边类型枚举✅见 4.3 完整边类型表
参数1String⚠️除 WriteSQL 外,其他类型只需要参数1
参数2String⚠️仅 WriteSQL 类型需要
边类型中文名参数1参数2用途
None透传--直接传递 DataFrame 不做处理
Eval张量计算RustScript 表达式-轻量级张量/DataFrame 操作
SqlSQL查询SQL 语句-对边输出 DataFrame 执行 SQL
OnnxONNX模型ONNX 文件路径-执行本地 ONNX 神经网络模型
OnnxUrlONNX远程ONNX 模型 URL-从 URL 下载并执行 ONNX 模型
NnefNNEF模型NNEF 文件路径-执行本地 NNEF 神经网络模型
NnefUrlNNEF远程NNEF 模型 URL-从 URL 下载并执行 NNEF 模型
WriteFile写文件/量测文件路径 或 meas://ID-输出数据到文件或写入量测
WriteSql写数据库数据库连接 URL操作类型写入/更新数据库

Eval 边用于对 DataFrame 做轻量级变换,使用 RustScript 表达式。

参数1: select(alias(cast(col(value),f32),r_1_1_672));

常用 Eval 表达式:

功能表达式
类型转换并重命名select(alias(cast(col(value),f32),new_name))
过滤行filter(col(dev), col(terminal), col(point), col(value), col(data_unit)==条件)
删除含 NaN 的行drop_nans()
选择特定列select(col(col1_name), col(col2_name))
排除含 NaN 行(仅保留部分列)select(drop_nans(), col(name))

两种模式:

模式1:写文件

参数1: output.csv # 输出到 csv
参数1: result.xlsx # 输出到 xlsx
参数1: C:\path\output.csv # 指定路径

模式2:写量测数据

参数1: meas://0 # 写入数据源 ID 为 0 的量测
参数1: meas://1 # 写入数据源 ID 为 1 的量测

写量测模式前置条件: 输入 DataFrame 必须 包含以下列:

  • point:测点点号
  • analog 或 discrete:二选一,分别表示模拟量或离散量

注意事项:

  • meas://0 可设置数据源为 0 的本地测点
  • 不能设置数据源为 0 的远方测点(需通过 AOE 间接设置)
  • 写量测是异步操作,后续节点不能保证读到更新后的值

参数1:数据库连接 URL

数据库类型URL 格式
MySQLmysql://user:password@host:port/database
SQLitesqlite:///path/to/database.db
PostgreSQLpostgres://user:password@host:port/database

参数2:操作类型

前缀作用依赖 DataFrame示例
sql://执行原生 SQL否sql://TRUNCATE TABLE table_in_db
insert://按行插入表是insert://table_in_db
UPDATE://按主键更新表是UPDATE://table_in_db?key=key1,key2
无前缀默认 insert是table_in_db

用途:执行 ONNX 神经网络模型。

参数要求:

  • 输入 DataFrame 维度必须与 ONNX 模型输入维度匹配
  • 本地模型:放在 mems.exe 所在目录或 www/forecast 目录下

示例:

参数1: model.onnx
参数1: http://127.0.0.1:80/forecast/model_96_96.onnx

Source 节点和 TensorEval/Sql 节点中可使用以下内置表:

列名类型说明
idu64测点 ID
nameString测点名称
aliasString测点别名
is_discreteBool是否离散量
is_computingBool是否计算量
data_uniString数据单位
upper_limitf64上限
lower_limitf64下限
is_realtimeBool是否实时
is_soeBool是否 SOE
is_remoteBool是否远方
timestampu64时间戳
valuef64默认值/当前值
列名类型说明
idu64测点 ID
valuef64量测值
timestampu64时间戳
列名类型说明
devu64设备 ID
terminalu64端子 ID
列名类型说明
pointu64测点 ID
terminalu64端子 ID

SQL 格式:select 属性列 from 设备类型

常用设备类型:Bus | Branch | Gen | ESS | Load | PCS | Transformer | Winding | ShuntCompensator | SyncGenerator | Switch | Breaker | Disconnector


场景:定时采集实时量测,保存为报表。

Sheet 1 - DFF详情定义:

DFF ID是否启用名称触发条件触发条件参数存储模式目标AOEAOE变量名称
65536true实时量测采集SimpleRepeat60000EveryTime

Sheet 2 - DFF节点定义:

DFF ID节点ID名称节点类型参数1参数2
655361获取量测Source_Measselect * from meas order by id

Sheet 3 - DFF边定义:

DFF ID首尾节点边名称描述边类型参数1参数2
655361;2量测数据None

注:最后一个节点之后可以没有边,DFF 运行结果就是最后节点的输出。

Sheet 1 - DFF详情定义:

DFF ID是否启用名称触发条件触发条件参数存储模式目标AOEAOE变量名称
65536true潮流计算SimpleRepeat60000EveryTime

Sheet 2 - DFF节点定义:

DFF ID节点ID名称节点类型参数1参数2
655361获取母线信息Source_Devselect 101,102,103,104,105,106,107,108,109,110,111,112,113 from Bus order by 101
655362获取支路信息Source_Devselect * from Branch
655363获取发电机信息Source_Devselect * from Gen
655364获取基准容量Source_Pointsselect value from points where id=500001
655365潮流计算TensorEval(见下方脚本)3

TensorEval 节点脚本示例(参数1):

baseMVA = get(baseMVA_mat, 0, 0);
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/idx_gen.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/idx_bus.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/idx_brch.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/make_y_bus.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/dsbus_dv.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/make_sdzip.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/make_sbus.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/newtonpf.txt
#include_url https://shufengdong.github.io/sparrowzz/rspower/lib/runpf.txt
r = runpf();
return r;

Sheet 3 - DFF边定义:

DFF ID首尾节点边名称描述边类型参数1参数2
655361;5busNone
655362;5branchNone
655363;5genNone
655364;5baseMVA_matNone

Sheet 2 - DFF节点定义:

DFF ID节点ID名称节点类型参数1参数2
655361获取历史负荷Source_Measselect value from meas where id between 100001 and 100096 order by id asc
655362获取目标测点Source_Measselect id from meas where id between 200001 and 200096 order by id asc
655363数据拼接TensorEvalprediction_meas = concat(horizontal, output_pointID, prediction_value);4
655364准备输出None
655365写量测None

Sheet 3 - DFF边定义:

DFF ID首尾节点边名称描述边类型参数1参数2
655361;2预处理数据Evalselect(alias(cast(col(value),f32),value_1_1_96));
655362;3负荷预测Onnxhttp://127.0.0.1:80/forecast/model_96_96.onnx
655364;4目标测点IDEvalselect(alias(col(id), point));
655363;4预测结果Evalselect(alias(col(mat_1_1_96), analog));
655364;5结果写入WriteFilemeas://0

  1. Sheet 1 触发条件:必须设置为 DataSource
  2. Sheet 2 节点类型:使用 Source_Other,参数为发送方 DFF ID
Source_Other 节点参数1: 65539 (接收 DFF 65539 的输出)
Source_Other 节点参数1: 0 (接收其他 MEMS 的 DFF 输出)
  1. 如需多个数据源同时到达才触发,在触发条件参数填写节点编号(分号分隔):
触发条件参数: 1;2 (节点1和2都收到数据后才运行)

在 Sheet 3 边定义中使用 WriteFile 边:

边类型: WriteFile
参数1: mems://beeId/DFF_id/node_id

示例:

参数1: mems://node2/65536/1

表示将数据发送到 beeId 为 node2 的 MEMS 中 DFF 65536 的节点 1。


规则说明
DFF ID 起始值必须从 65536 开始,不能使用更小的值
节点 ID在同一 DFF 内必须唯一,建议从 1 开始递增
边方向尾节点ID;首节点ID,数据从尾节点流向首节点
最后节点DFF 的运行结果是最后一个节点的输出,可以没有出边
重置生效DFF 修改后需要 reset 才能生效
多入边节点Solve/NLSolve/MILP/NLP/TensorEval/MILP/NLP 等节点可以有多个入边
TensorEval 变量引用边名称就是下游节点中引用的变量名
SQL 关键字SQL 中列名/属性名如果是数字或以数字开头,需用反引号包裹 `101`
场景注意事项
TensorEval 标量获取张量数据需要用 get(tensor, row, col) 取出标量
WriteFile 写量测必须包含 point 列和 analog/discrete 列
复数计算TensorEval 参数2 需包含模式 1 或 3
NaN 过滤可用 drop_nans() 或 Eval 边的 drop_nans()
多返回值TensorEval 参数2 需包含模式 8-15
Polars 模式⚠️ 暂缓使用:参数2 不要设为 4/5/6/7/12/13/14/15,语法规则尚不完整
场景注意事项
模型文件放置本地模型放在 www/forecast 目录或 mems.exe 同级目录
输入维度DataFrame 输入维度必须与模型匹配
输出格式ONNX/NNEF 输出 DataFrame 命名格式为 mat_维度...

可用于 Source_Dev 节点的设备类型:

Busbar, ACline, DClin, Winding, SyncGenerator, ESS, PCS, Transformer,
Load, ShuntCompensator, SerialCompensator, Feeder, PWBusbar, Cable,
Regulator, Connector, Measurement, Company, SubIsland, LoadArea, Substation,
PowerPlant, VoltageLevel, BaseVoltage, HvdcSys, HvdcPoleSys, DCPole,
DCLineDot, TLineDot, Converter, Breaker, Disconnector, GroundDisconnector,
TLine, ACLineDot, TNode, Convergenceline, ShuntReactor, ShuntCapacitor,
SeriesReactor, SeriesCapacitor, SVC, SVG, SeriesPowerTransformer,
SeriesTransformerWinding, Acfilter, Synccondenser, DCBreaker,
DCDisconnector, Signal, Combined, Composite, Section, SectionType, Switch

标记类型说明
<u64>64位无符号整数范围 0 ~ 18446744073709551615
<Bool>布尔值true 或 false
<String>字符串UTF-8 编码
<Int>整数有符号整数
<f32>32位浮点数单精度浮点
<f64>64位浮点数双精度浮点

TimeDrive 触发条件的 Cron 表达式格式:

秒 分 时 日 月 周
表达式含义
0 0 8 * * *每天 08:00:00 触发
0 */5 * * * *每 5 分钟触发
0 0 0 * * 1每周一 00:00:00 触发
0 0 12 1 * *每月 1 号 12:00:00 触发

  • 基于 MEMS 配置文件模板 v2025 整理
  • 参考文档:4.5.1 ~ 4.5.5、2.1 ~ 2.4、5.1 ~ 5.6