DFF 报表配置文件规则知识库
DFF 报表配置文件规则知识库
Section titled “DFF 报表配置文件规则知识库”本文档为 AI 自动生成 MEMS 系统 DFF(DataFrame Flow)报表配置文件的专用知识库。所有配置规则、枚举值、字段含义均已结构化整理,供 AI 直接检索和使用。
1. 文件总览
Section titled “1. 文件总览”1.1 配置文件格式
Section titled “1.1 配置文件格式”DFF 报表配置使用 Excel (.xlsx) 文件,包含三个工作表(Sheet),按顺序为:
| Sheet 序号 | Sheet 名称 | 作用 | 行含义 |
|---|---|---|---|
| 1 | DFF详情定义 | 声明 DFF 的元信息 | 一行 = 一个 DFF 的声明 |
| 2 | DFF节点定义 | 定义 DFF 中的计算节点 | 一行 = 一个节点 |
| 3 | DFF边定义 | 定义节点间的数据流转边 | 一行 = 一条边 |
1.2 DFF 核心概念
Section titled “1.2 DFF 核心概念”- DFF ID:
<u64>类型,唯一标识一个 DFF。规则:必须从 65536 开始编号。 - 节点 (Node):数据获取或计算的基本单元,通过 “节点ID” 编号。
- 边 (Edge):连接两个节点,实现数据从一个节点流向另一个节点。
- 首尾节点格式:边的 “首尾节点” 字段格式为
<尾节点ID>;<首节点ID>,表示数据流向:尾节点 → 首节点。
1.3 DataFrame 命名规范
Section titled “1.3 DataFrame 命名规范”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 矩阵
2. Sheet 1:DFF详情定义
Section titled “2. Sheet 1:DFF详情定义”2.1 表头结构
Section titled “2.1 表头结构”| DFF ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 存储模式 | 目标AOE | AOE变量名称 ||--------|---------|------|---------|-------------|---------|--------|------------|| u64 | Bool | String | 枚举 | String | 枚举 | u64 | String |2.2 字段详细规则
Section titled “2.2 字段详细规则”| 字段 | 类型 | 必填 | 规则 |
|---|---|---|---|
| DFF ID | u64 | ✅ | 必须 ≥ 65536,同一文件内唯一 |
| 是否启用 | Bool | ✅ | true 或 false |
| 名称 | String | ✅ | 可读的中文/英文描述,如”潮流计算” |
| 触发条件 | 枚举 | ✅ | 见下表 |
| 触发条件参数 | String | ⚠️ | 随触发条件类型变化,见下表 |
| 存储模式 | 枚举 | ✅ | 见下表 |
| 目标AOE | u64 | ❌ | 关联的 AOE ID,不需要留空 |
| AOE变量名称 | String | ❌ | DFF 输出写入 AOE 的变量名,不需要留空 |
2.3 触发条件枚举
Section titled “2.3 触发条件枚举”| 枚举值 | 中文名 | 参数格式 | 示例 |
|---|---|---|---|
| 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。
2.4 存储模式枚举
Section titled “2.4 存储模式枚举”| 枚举值 | 中文名 | 说明 |
|---|---|---|
| EveryTime | 每次 | 每次执行都保存结果(使用开始时间为唯一标识) |
| Once | 单次 | 只保存一条记录(固定 t=0),后续覆盖 |
| Memory | 内存 | 仅存内存,不写数据库,系统重启丢失 |
| Never | 从不 | 不保存任何结果 |
选择建议:
- 需保留历史 → EveryTime
- 只需最新结果 → Once
- 追求执行速度 → Memory
- 不需要持久化结果 → Never
3. Sheet 2:DFF节点定义
Section titled “3. Sheet 2:DFF节点定义”3.1 表头结构
Section titled “3.1 表头结构”| DFF ID | 节点ID | 名称 | 节点类型 | 参数1 | 参数2 ||--------|--------|------|---------|-------|-------|| u64 | u64 | String | 枚举 | String | String |3.2 字段详细规则
Section titled “3.2 字段详细规则”| 字段 | 类型 | 必填 | 规则 |
|---|---|---|---|
| DFF ID | u64 | ✅ | 必须与 Sheet 1 中的某条 DFF ID 对应 |
| 节点ID | u64 | ✅ | 在同一 DFF 内唯一,从 1 开始递增 |
| 名称 | String | ✅ | 节点功能简要描述,如”获取测点数据” |
| 节点类型 | 枚举 | ✅ | 见 3.3 完整节点类型表 |
| 参数1 | String | ⚠️ | 部分类型需要,见具体类型 |
| 参数2 | String | ⚠️ | 部分类型需要,见具体类型 |
3.3 完整节点类型表
Section titled “3.3 完整节点类型表”| 节点类型 | 中文名 | 参数1 | 参数2 | 用途 |
|---|---|---|---|---|
| None | 无动作 | - | - | 透传数据,不做处理 |
| Source | 数据请求 | 见 3.4 Source子类型 | 见 3.4 | 读取数据 |
| Transform | 数据变换 | RustScript 变换表达式 | - | 排序、拼接、过滤等 |
| TensorEval | 张量计算 | RustScript 计算脚本 | 模式数字 0-15 | 复杂张量运算 |
| Sql | SQL查询 | SQL 语句 | - | 对入边 DataFrame 执行 SQL |
| Solve | 线性方程组 | 动作名称(变量引用名) | - | 求解 Ax=b |
| NLSolve | 非线性方程组 | 动作名称 | - | 求解非线性方程组 |
| MILP | 混合整数线性规划 | 动作名称,分号分隔 | - | 目标函数 + 约束条件 |
| NLP | 非线性规划 | 动作名称,分号分隔 | - | 变量 + 目标函数 + 约束 |
| Wasm | Wasm 脚本 | Wasm 文件路径/URL | - | 执行自定义 Wasm 计算 |
3.4 Source 节点子类型
Section titled “3.4 Source 节点子类型”Source 节点的类型写法为 Source_子类型,参数规则因子类型而异:
Source_Meas(量测数据)
Section titled “Source_Meas(量测数据)”规则:参数1 以 ? 开头 → 历史量测查询;否则为实时量测查询。
历史量测查询(参数1以?开头,参数2留空):
参数1格式:?id=测点ID列表&start=时间戳&end=时间戳| 参数键 | 说明 | 示例 |
|---|---|---|
id | 测点ID,多个用逗号分隔 | id=1000001,1000002 |
start / end | 13位毫秒时间戳 | start=1775654400000&end=1775655100000 |
date | 日期 yyyy-MM-dd | date=2024-01-15 |
last | 相对时间 7d/24h/30m | last=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
Source_Points(测点配置)
Section titled “Source_Points(测点配置)”参数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
Source_File(文件)
Section titled “Source_File(文件)”参数1:文件路径(支持 xlsx、csv),参数2 留空。
参数1: C:\Users\Desktop\data.xlsx文件表头将作为 DataFrame 的列名。未指定完整路径时,相对于 mems.exe 所在目录。
Source_Url(网络链接)
Section titled “Source_Url(网络链接)”参数1:URL 地址,参数2 留空。
参数1: https://example.com/data.csvSource_Data(内嵌数据)
Section titled “Source_Data(内嵌数据)”与 Source_File/Source_Url 格式相同,区别是加载时将文件内容内嵌到报表对象中(适合静态数据)。
Source_Dev(设备数据)
Section titled “Source_Dev(设备数据)”参数1:SQL 语句,格式为 select 属性列 from 设备类型。
参数1: select `101`,`102`,`103` from Bus order by `101`- 设备类型包括:
Bus | Branch | Gen | ESS | Load | ...(见附录 A) - 属性列使用反引号包裹属性ID,如
`101` - 用
*表示全部属性
Source_Other(其他 DFF 数据)
Section titled “Source_Other(其他 DFF 数据)”参数1:其他 DFF 的 ID(同一 MEMS)或 0(其他 MEMS)。
参数1: 65539前置条件:本 DFF 的触发条件必须设置为 DataSource。
Source_Plan(计划数据)
Section titled “Source_Plan(计划数据)”参数1:计划 ID,参数2 留空。
返回列:timestamp | value
3.5 TensorEval 节点
Section titled “3.5 TensorEval 节点”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 | 自然常数 |
eps | f64::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)才能正常工作。
内置数值函数
Section titled “内置数值函数”基础一元: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。后端未启用时这些名称作为未知函数失败。
典型张量操作组合示例
Section titled “典型张量操作组合示例”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_linsolve | sp_linsolve(equations, b, initial, names) | [x..., status] |
fsolve | fsolve(equations, names) 或 fsolve(equations, initial, names) | [x..., status] |
intlinprog | intlinprog(objective, constraints, types, names) | [x..., objective, status] |
fmincon | fmincon(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。
输出与文件 I/O
Section titled “输出与文件 I/O”println(`message`); debug(x); info(x); warn(x); error(x);ms = monotonic_ms(); // 进程内相对毫秒,非 Unix 时间戳
input = read_tensor(`data.csv`); // 支持 xls/xlsx/parquet/csvwrite_tensor(scaled, `out.csv`); // 支持 parquet/xlsx/csv/txtassert_eq(a, b);assert_relative_eq(a, b, 1e-8);assert_abs_diff_eq(a, b, 1e-6);MATLAB 迁移对照表
Section titled “MATLAB 迁移对照表”| MATLAB | RustScript |
|---|---|
| 一基索引 | 零基索引 |
A(i,j) | get(A, i, j) |
A(i,j)=v | assign / select_assign / set 并接收返回值 |
A .* B, A ./ B, A .^ B | 相同 |
A' | 仅转置;共轭转置用 ctranspose(A) |
A\b | 相同(需线性代数后端) |
inv(A) | A ^ -1(无 inv 函数) |
1:n | range(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);3.6 MILP 节点
Section titled “3.6 MILP 节点”参数1 格式:动作名称分号分隔,至少需要 2 个(目标函数 + 约束条件)。
参数1: obj;constraint;目标函数数据格式(来自入边):
| x(变量名) | type(类型) | lower(下限) | upper(上限) | c(系数) |
|---|---|---|---|---|
| x1 | 2 | 0 | 5 | |
| x2 | 3 | 0 | 3 |
- type: 1=0-1二进制, 2=整型, 3=实数
- 默认求解 最大值 (max)
约束条件数据格式:
| x1 | x2 | … | xi | b(常量) | type |
|---|---|---|---|---|---|
| 2 | -8 | … | 5 | 10 | -1 |
- type: 1=表示表达式 ≥ 0, -1=表示表达式 ≤ 0
3.7 NLP 节点
Section titled “3.7 NLP 节点”参数1 格式:动作名称分号分隔,至少需要 2 个(变量 + 表达式)。
参数1: nlp_x;nlp_obj_cons;变量数据格式:
| x_name | lower | upper | init |
|---|---|---|---|
| x1 | 5 |
表达式数据格式:
| equations | lower | upper |
|---|---|---|
| x1x4(x1+x2+x3)+x3 | ||
| x1x2x3*x4 | 25 | 2e19 |
| x1^2+x2^2+x3^2+x4^2 | 40 | 40 |
- 第一行是目标函数(默认计算最小值)
- 第二行起是约束条件(可为空表示无约束)
3.8 Solve 节点(线性方程组)
Section titled “3.8 Solve 节点(线性方程组)”参数1:动作名称(引用系数矩阵的变量名)。
参数1: function;输入数据格式:
| x1 | x2 | x3 | b |
|---|---|---|---|
| 1 | 5 | 2 | 1 |
| 0 | 3 | 0 | 12 |
| 0 | 3 | 1 | 7 |
最后一列为常数项 b,前面各列为系数矩阵。
3.9 NLSolve 节点(非线性方程组)
Section titled “3.9 NLSolve 节点(非线性方程组)”参数1:动作名称。
参数1: function;输入数据格式:
| x_name | init | equation |
|---|---|---|
| x1 | 1 | x1^2 + x2^2 + x3^2 - 5 |
| x2 | -1 | x1x2 + x2x3 + 2 |
| x3 | 0 | x1^3 + x2 + x3 - 7 |
3.10 Wasm 节点
Section titled “3.10 Wasm 节点”参数1:Wasm 文件路径或 URL。
参数1: http://127.0.0.1:80/forecast/model.wasm4. Sheet 3:DFF边定义
Section titled “4. Sheet 3:DFF边定义”4.1 表头结构
Section titled “4.1 表头结构”| DFF ID | 首尾节点 | 边名称 | 描述 | 边类型 | 参数1 | 参数2 ||--------|---------|--------|------|--------|-------|-------|| u64 | n1;n2 | String | String | 枚举 | String | String |4.2 字段详细规则
Section titled “4.2 字段详细规则”| 字段 | 类型 | 必填 | 规则 |
|---|---|---|---|
| DFF ID | u64 | ✅ | 与 Sheet 1 中的某条 DFF ID 对应 |
| 首尾节点 | n1;n2 | ✅ | 格式:尾节点ID;首节点ID,数据从 n1 流向 n2 |
| 边名称 | String | ✅ | 英文变量名,下游节点通过此名称引用 DataFrame |
| 描述 | String | ❌ | 边动作说明,AI 生成时可留空或写简短描述 |
| 边类型 | 枚举 | ✅ | 见 4.3 完整边类型表 |
| 参数1 | String | ⚠️ | 除 WriteSQL 外,其他类型只需要参数1 |
| 参数2 | String | ⚠️ | 仅 WriteSQL 类型需要 |
4.3 完整边类型表
Section titled “4.3 完整边类型表”| 边类型 | 中文名 | 参数1 | 参数2 | 用途 |
|---|---|---|---|---|
| None | 透传 | - | - | 直接传递 DataFrame 不做处理 |
| Eval | 张量计算 | RustScript 表达式 | - | 轻量级张量/DataFrame 操作 |
| Sql | SQL查询 | SQL 语句 | - | 对边输出 DataFrame 执行 SQL |
| Onnx | ONNX模型 | ONNX 文件路径 | - | 执行本地 ONNX 神经网络模型 |
| OnnxUrl | ONNX远程 | ONNX 模型 URL | - | 从 URL 下载并执行 ONNX 模型 |
| Nnef | NNEF模型 | NNEF 文件路径 | - | 执行本地 NNEF 神经网络模型 |
| NnefUrl | NNEF远程 | NNEF 模型 URL | - | 从 URL 下载并执行 NNEF 模型 |
| WriteFile | 写文件/量测 | 文件路径 或 meas://ID | - | 输出数据到文件或写入量测 |
| WriteSql | 写数据库 | 数据库连接 URL | 操作类型 | 写入/更新数据库 |
4.4 Eval 边
Section titled “4.4 Eval 边”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)) |
4.5 WriteFile 边
Section titled “4.5 WriteFile 边”两种模式:
模式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 间接设置)
- 写量测是异步操作,后续节点不能保证读到更新后的值
4.6 WriteSql 边
Section titled “4.6 WriteSql 边”参数1:数据库连接 URL
| 数据库类型 | URL 格式 |
|---|---|
| MySQL | mysql://user:password@host:port/database |
| SQLite | sqlite:///path/to/database.db |
| PostgreSQL | postgres://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 |
4.7 Onnx / OnnxUrl 边
Section titled “4.7 Onnx / OnnxUrl 边”用途:执行 ONNX 神经网络模型。
参数要求:
- 输入 DataFrame 维度必须与 ONNX 模型输入维度匹配
- 本地模型:放在
mems.exe所在目录或 www/forecast 目录下
示例:
参数1: model.onnx参数1: http://127.0.0.1:80/forecast/model_96_96.onnx5. 内置 SQL 表参考
Section titled “5. 内置 SQL 表参考”Source 节点和 TensorEval/Sql 节点中可使用以下内置表:
5.1 测点表 (points)
Section titled “5.1 测点表 (points)”| 列名 | 类型 | 说明 |
|---|---|---|
| id | u64 | 测点 ID |
| name | String | 测点名称 |
| alias | String | 测点别名 |
| is_discrete | Bool | 是否离散量 |
| is_computing | Bool | 是否计算量 |
| data_uni | String | 数据单位 |
| upper_limit | f64 | 上限 |
| lower_limit | f64 | 下限 |
| is_realtime | Bool | 是否实时 |
| is_soe | Bool | 是否 SOE |
| is_remote | Bool | 是否远方 |
| timestamp | u64 | 时间戳 |
| value | f64 | 默认值/当前值 |
5.2 量测表 (meas)
Section titled “5.2 量测表 (meas)”| 列名 | 类型 | 说明 |
|---|---|---|
| id | u64 | 测点 ID |
| value | f64 | 量测值 |
| timestamp | u64 | 时间戳 |
5.3 设备拓扑表 (topo)
Section titled “5.3 设备拓扑表 (topo)”| 列名 | 类型 | 说明 |
|---|---|---|
| dev | u64 | 设备 ID |
| terminal | u64 | 端子 ID |
5.4 量测定义表 (measdef)
Section titled “5.4 量测定义表 (measdef)”| 列名 | 类型 | 说明 |
|---|---|---|
| point | u64 | 测点 ID |
| terminal | u64 | 端子 ID |
5.5 设备表(动态)
Section titled “5.5 设备表(动态)”SQL 格式:select 属性列 from 设备类型
常用设备类型:Bus | Branch | Gen | ESS | Load | PCS | Transformer | Winding | ShuntCompensator | SyncGenerator | Switch | Breaker | Disconnector
6. 配置示例模板
Section titled “6. 配置示例模板”6.1 简单数据采集示例
Section titled “6.1 简单数据采集示例”场景:定时采集实时量测,保存为报表。
Sheet 1 - DFF详情定义:
| DFF ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 存储模式 | 目标AOE | AOE变量名称 |
|---|---|---|---|---|---|---|---|
| 65536 | true | 实时量测采集 | SimpleRepeat | 60000 | EveryTime |
Sheet 2 - DFF节点定义:
| DFF ID | 节点ID | 名称 | 节点类型 | 参数1 | 参数2 |
|---|---|---|---|---|---|
| 65536 | 1 | 获取量测 | Source_Meas | select * from meas order by id |
Sheet 3 - DFF边定义:
| DFF ID | 首尾节点 | 边名称 | 描述 | 边类型 | 参数1 | 参数2 |
|---|---|---|---|---|---|---|
| 65536 | 1;2 | 量测数据 | None |
注:最后一个节点之后可以没有边,DFF 运行结果就是最后节点的输出。
6.2 潮流计算示例
Section titled “6.2 潮流计算示例”Sheet 1 - DFF详情定义:
| DFF ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 存储模式 | 目标AOE | AOE变量名称 |
|---|---|---|---|---|---|---|---|
| 65536 | true | 潮流计算 | SimpleRepeat | 60000 | EveryTime |
Sheet 2 - DFF节点定义:
| DFF ID | 节点ID | 名称 | 节点类型 | 参数1 | 参数2 |
|---|---|---|---|---|---|
| 65536 | 1 | 获取母线信息 | Source_Dev | select 101,102,103,104,105,106,107,108,109,110,111,112,113 from Bus order by 101 | |
| 65536 | 2 | 获取支路信息 | Source_Dev | select * from Branch | |
| 65536 | 3 | 获取发电机信息 | Source_Dev | select * from Gen | |
| 65536 | 4 | 获取基准容量 | Source_Points | select value from points where id=500001 | |
| 65536 | 5 | 潮流计算 | 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.txtr = runpf();return r;Sheet 3 - DFF边定义:
| DFF ID | 首尾节点 | 边名称 | 描述 | 边类型 | 参数1 | 参数2 |
|---|---|---|---|---|---|---|
| 65536 | 1;5 | bus | None | |||
| 65536 | 2;5 | branch | None | |||
| 65536 | 3;5 | gen | None | |||
| 65536 | 4;5 | baseMVA_mat | None |
6.3 负荷预测示例(ONNX)
Section titled “6.3 负荷预测示例(ONNX)”Sheet 2 - DFF节点定义:
| DFF ID | 节点ID | 名称 | 节点类型 | 参数1 | 参数2 |
|---|---|---|---|---|---|
| 65536 | 1 | 获取历史负荷 | Source_Meas | select value from meas where id between 100001 and 100096 order by id asc | |
| 65536 | 2 | 获取目标测点 | Source_Meas | select id from meas where id between 200001 and 200096 order by id asc | |
| 65536 | 3 | 数据拼接 | TensorEval | prediction_meas = concat(horizontal, output_pointID, prediction_value); | 4 |
| 65536 | 4 | 准备输出 | None | ||
| 65536 | 5 | 写量测 | None |
Sheet 3 - DFF边定义:
| DFF ID | 首尾节点 | 边名称 | 描述 | 边类型 | 参数1 | 参数2 |
|---|---|---|---|---|---|---|
| 65536 | 1;2 | 预处理数据 | Eval | select(alias(cast(col(value),f32),value_1_1_96)); | ||
| 65536 | 2;3 | 负荷预测 | Onnx | http://127.0.0.1:80/forecast/model_96_96.onnx | ||
| 65536 | 4;4 | 目标测点ID | Eval | select(alias(col(id), point)); | ||
| 65536 | 3;4 | 预测结果 | Eval | select(alias(col(mat_1_1_96), analog)); | ||
| 65536 | 4;5 | 结果写入 | WriteFile | meas://0 |
7. 跨 DFF 数据传递
Section titled “7. 跨 DFF 数据传递”7.1 接收方配置
Section titled “7.1 接收方配置”- Sheet 1 触发条件:必须设置为
DataSource - Sheet 2 节点类型:使用
Source_Other,参数为发送方 DFF ID
Source_Other 节点参数1: 65539 (接收 DFF 65539 的输出)Source_Other 节点参数1: 0 (接收其他 MEMS 的 DFF 输出)- 如需多个数据源同时到达才触发,在触发条件参数填写节点编号(分号分隔):
触发条件参数: 1;2 (节点1和2都收到数据后才运行)7.2 发送方配置
Section titled “7.2 发送方配置”在 Sheet 3 边定义中使用 WriteFile 边:
边类型: WriteFile参数1: mems://beeId/DFF_id/node_id示例:
参数1: mems://node2/65536/1表示将数据发送到 beeId 为 node2 的 MEMS 中 DFF 65536 的节点 1。
8. 常见错误与注意事项
Section titled “8. 常见错误与注意事项”8.1 配置规则
Section titled “8.1 配置规则”| 规则 | 说明 |
|---|---|
| DFF ID 起始值 | 必须从 65536 开始,不能使用更小的值 |
| 节点 ID | 在同一 DFF 内必须唯一,建议从 1 开始递增 |
| 边方向 | 尾节点ID;首节点ID,数据从尾节点流向首节点 |
| 最后节点 | DFF 的运行结果是最后一个节点的输出,可以没有出边 |
| 重置生效 | DFF 修改后需要 reset 才能生效 |
| 多入边节点 | Solve/NLSolve/MILP/NLP/TensorEval/MILP/NLP 等节点可以有多个入边 |
| TensorEval 变量引用 | 边名称就是下游节点中引用的变量名 |
| SQL 关键字 | SQL 中列名/属性名如果是数字或以数字开头,需用反引号包裹 `101` |
8.2 数据类型注意
Section titled “8.2 数据类型注意”| 场景 | 注意事项 |
|---|---|
| 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,语法规则尚不完整 |
8.3 ONNX/NNEF 模型注意
Section titled “8.3 ONNX/NNEF 模型注意”| 场景 | 注意事项 |
|---|---|
| 模型文件放置 | 本地模型放在 www/forecast 目录或 mems.exe 同级目录 |
| 输入维度 | DataFrame 输入维度必须与模型匹配 |
| 输出格式 | ONNX/NNEF 输出 DataFrame 命名格式为 mat_维度... |
附录 A:完整设备类型列表
Section titled “附录 A:完整设备类型列表”可用于 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附录 B:数据类型说明
Section titled “附录 B:数据类型说明”| 标记 | 类型 | 说明 |
|---|---|---|
<u64> | 64位无符号整数 | 范围 0 ~ 18446744073709551615 |
<Bool> | 布尔值 | true 或 false |
<String> | 字符串 | UTF-8 编码 |
<Int> | 整数 | 有符号整数 |
<f32> | 32位浮点数 | 单精度浮点 |
<f64> | 64位浮点数 | 双精度浮点 |
附录 C:Cron 表达式参考
Section titled “附录 C:Cron 表达式参考”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