EMS 知识库
首页 / knowledge/代码解析/logic

csip_aus.h

源文件路径:logic/csip_aus.h 所属模块:logic(能量调度核心 —— 澳大利亚 CSIP-AUS v1.2 DER 控制) 代码行数:188

1. 文件职责

本文件是 logic/csip_aus.c 的对外契约,定义澳大利亚 CSIP-AUS v1.2 标准下 DER(分布式能源)远程控制的全部数据结构与接口:DER 控制参数表 CSIP_AUS_DER_CONTROL_T、斜坡运行数据 CSIP_AUS_RUN_DATA_T、四态状态机枚举 CSIP_AUS_STATE_E、八类事件枚举 CSIP_AUS_EVENT_E,以及 18 个公开函数原型(csip_aus.h:155-186)与 3 个全局变量。DER 控制的作用是把电网运营商通过 SunSpec/CSIP 下发的四类功率限制(馈网 Export、发电 Gen、输入 Import、负载 Load)落地到 EMS 的输出限制上,并按标准要求的斜坡速率(ramp rate)平滑过渡,在通信超时或电网丢失时回落到安全默认值。它处在调度链的最外层:logic/logic.c:1035 在 dnsp_ramp_control_handle() 中每控制周期调用 csip_aus_der_control_process(),其输出的限制值再被 logic.c:1054-1100、logic/logic.c:757/865-871/1094-1095、midware/inverter/inverter.c:2312/2387 读取以约束充放电。注意:csip_aus.c 里的 14 个 static 函数由该 .c 自己的前置声明块(csip_aus.c:33-45)登记,本头文件不涉及。

2. 关键数据结构与宏

名称类型说明
__CSIP_AUS_H__宏include guard
UNUSED(x)宏(void)(x),标记未使用参数以消警告;本文件及 .c 中均无使用点
CSIP_AUS_VERSION_MAJOR / CSIP_AUS_VERSION_MINOR宏1 / 2,标准版本号;代码中无引用点,仅作标识
CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR宏12。注释写"最大超时倍数:1.2倍",实际用法是 estimated * 12 / 10
CSIP_AUS_RAMP_MIN_TIMEOUT_MS宏5000,斜坡超时下限 5 秒
CSIP_AUS_RAMP_MAX_TIMEOUT_MS宏400000,斜坡超时上限 400 秒
CSIP_AUS_DER_CONTROL_DISABLE / CSIP_AUS_DER_CONTROL_ENABLE宏0 / 1,DER 控制使能取值;代码中无引用点(u8_der_control_enable 直接赋 TRUE/FALSE)
CSIP_AUS_DER_MODE_NORMAL / _CONTROL / _DEFAULT宏0 / 1 / 2,三种 DER 控制模式。注意与 logic.h 的 DER_NORMAL=0/DER_CONTROL=1/DER_CONTROL_DEFAULT=2 数值一致但名字不同,两套枚举在 logic.c 与 csip_aus.c 之间互相赋值
CSIP_AUS_ENERGIZE_NORMAL / _STOP / _FORCE_STOP宏0 / 1 / 2,OpModEnergize 启停语义;代码中仅 u8_der_energize 字段存在,无赋值/判读点(只被 csip_aus_print_status() 打印)
CSIP_AUS_STATE_E枚举DER 控制状态机:CSIP_AUS_STATE_IDLE(0)、CSIP_AUS_STATE_CONTROL(1)、CSIP_AUS_STATE_DEFAULT(2)、CSIP_AUS_STATE_TRANSITION(3)
CSIP_AUS_EVENT_E枚举事件类型:CSIP_AUS_EVENT_NORMAL(0)、_DEFAULT_ENTER(1)、_DEFAULT_EXIT(2)、_CONTROL_ENTER(3)、_CONTROL_EXIT(4)、_TIMEOUT(5)、_GRID_LOSS(6)、_GRID_RESTORE(7)。其中 _DEFAULT_EXIT、_CONTROL_EXIT、_GRID_RESTORE 从未被触发或处理
CSIP_AUS_DER_CONTROL_T结构体(#pragma pack(1))DER 控制主参数表,字段分解见下
CSIP_AUS_RUN_DATA_T结构体(#pragma pack(1))斜坡运行数据:s32_ramp_target、s32_ramp_current、u8_ramp_active、u8_ramp_enable。四个字段中只有 u8_ramp_enable / u8_ramp_active 被真正使用,两个功率字段无任何读写点
g_t_csip_aus_der_control全局变量(extern)CSIP_AUS_DER_CONTROL_T 实例,定义于 csip_aus.c:23
g_t_csip_aus_run_data全局变量(extern)CSIP_AUS_RUN_DATA_T 实例,定义于 csip_aus.c:24
g_u8_csip_aus_ramp_rate_calculated全局变量(extern)斜坡速率已计算标志,定义于 csip_aus.c:25(初值 FALSE);用于避免同一周期重复计算

CSIP_AUS_DER_CONTROL_T 字段分解(按用途分组):

分组字段类型说明
基本参数u8_der_control_enableu8DER 控制使能,初值由 inverter_der_enable() 按逆变器型号判定
u8_der_control_modeu8当前模式,取值 CSIP_AUS_DER_MODE_*
u8_der_energizeu8OpModEnergize 启停;无赋值与判读点
u8_opmodconnectu8OpModConnect 并网许可;无赋值与判读点
四类限制(当前值 + 默认值)s32_opmod_explimw / s32_default_opmod_explimws32馈网输出限制(W 或 %)
s32_opmod_genlimw / s32_default_opmod_genlimws32逆变输出限制
s32_opmod_implimw / s32_default_opmod_implimws32输入(取电)限制,负值表示从电网取电
s32_opmod_loadlimw / s32_default_opmod_loadlimws32负载功率限制
斜坡速率u16_setgradwu16默认斜坡速率(0.01%/s),来自 logic.h 的 u16_setgradw
u16_setsoftgradwu16软启动斜坡速率(0.01%/s)
u8_setsoftgradw_set_flagu8软启动速率更新标志,置 TRUE 后由主循环下发一次给逆变器
u16_ramptmsu16过渡时间(1/100 秒),CSIP-AUS v1.2 新增
状态记录u8_current_stateu8当前状态,取值 CSIP_AUS_STATE_*
u8_previous_stateu8上一状态,仅由 csip_aus_der_control_mode_to_state() 写入
u32_state_enter_ticku32状态进入时间戳(ms)
u32_last_update_ticku32无任何读写点
斜坡控制s32_ramp_rate_w_per_secs32计算出的斜坡速率(W/s)
u32_ramp_timeout_msu32斜坡超时时间(ms)
旧值快照s32_old_opmod_explimw / _genlimw / _implimw / _loadlimws32过渡前生效值,用于算变化量与斜坡速率
超时控制u32_control_remainingu32CONTROL 模式剩余时间(秒)
u32_durationtimeu32控制总持续时长(秒),来自 logic.h
电网状态u8_grid_connectedu8电网连接(0 断开 / 1 连接)
u8_grid_status_changeu8状态变化标记;置 TRUE 后从不被清零
过渡保护u8_just_transitionedu8刚完成转换标志,2 秒内禁止重新触发
u32_transition_ticku32转换时间戳
斜坡使能延时u8_ramp_enable_pendingu8斜坡使能等待标志
u32_ramp_enable_set_ticku32使能设置时间戳
u8_pending_transition_typeu80 无 / 1 等切 CONTROL / 2 等切 DEFAULT

3. 函数清单

本文件为声明文件,共 18 个公开函数原型(csip_aus.h:155-186),全部对应 csip_aus.c 中的定义——除了 csip_aus_set_soft_ramp_rate,它在全工程没有定义。

函数名作用域说明
csip_aus_der_control_process全局(原型,csip_aus.h:155)DER 控制主处理入口(定义于 csip_aus.c:365)
csip_aus_state_machine_handle全局(原型,:156)事件驱动的状态机分派(csip_aus.c:474)
csip_aus_transition_to_default全局(原型,:159)过渡到 DEFAULT 安全态(csip_aus.c:736)
csip_aus_transition_to_control全局(原型,:160)过渡到 CONTROL 远程控制态(csip_aus.c:811)
csip_aus_transition_to_normal全局(原型,:161)回到 NORMAL/IDLE(csip_aus.c:864)
csip_aus_set_soft_ramp_rate全局(原型,:164)无实现,全工程无调用点(grep 只命中本行)
csip_aus_get_ramp_enable全局(原型,:167)读 g_t_csip_aus_run_data.u8_ramp_enable(csip_aus.c:1311)
csip_aus_get_ramp_rate全局(原型,:168)读 s32_ramp_rate_w_per_sec(csip_aus.c:1316)
csip_aus_get_exp_limit全局(原型,:169)读馈网限制(DEFAULT 模式下取默认值)(csip_aus.c:1321)
csip_aus_get_imp_limit全局(原型,:170)读输入限制,下限钳到 10,单相系统 ×3(csip_aus.c:1330)
csip_aus_get_gen_limit全局(原型,:171)读发电限制(csip_aus.c:1345)
csip_aus_get_load_limit全局(原型,:172)读负载限制,下限钳到 10(csip_aus.c:1354)
csip_aus_check_ramp_complete全局(原型,:175)斜坡完成/超时检查(csip_aus.c:970)
csip_aus_handle_grid_status_change全局(原型,:178)处理电网连接状态变化(csip_aus.c:1088)
csip_aus_handle_control_timeout全局(原型,:179)控制超时处理(csip_aus.c:1116)
csip_aus_update_grid_status全局(原型,:182)从 g_t_logic_info 刷新电网状态(csip_aus.c:1135)
csip_aus_print_status全局(原型,:185)打印状态(内容被 #if (CSIP_AUS_DEBUG) 门控)(csip_aus.c:1147)
csip_aus_print_run_data全局(原型,:186)无实现,全工程无调用点

共 18 个原型,无 static 声明、无函数指针类型、无回调。

另有 14 个 static 函数不在本头文件内,它们的前置声明位于 csip_aus.c:33-45(12 个)或直接定义在文件顶部故无需声明(2 个):

函数名声明位置定义位置
csip_aus_state_idle_handlecsip_aus.c:33csip_aus.c:570
csip_aus_state_default_handlecsip_aus.c:34csip_aus.c:601
csip_aus_state_control_handlecsip_aus.c:35csip_aus.c:641
csip_aus_state_transition_handlecsip_aus.c:36csip_aus.c:681
csip_aus_calculate_ramp_ratecsip_aus.c:38csip_aus.c:885
csip_aus_data_synccsip_aus.c:39csip_aus.c:154
csip_aus_check_and_trigger_eventscsip_aus.c:40csip_aus.c:510
csip_aus_update_control_timeoutcsip_aus.c:41csip_aus.c:1037
csip_aus_handle_mode_changecsip_aus.c:42csip_aus.c:119
csip_aus_der_control_mode_to_statecsip_aus.c:43csip_aus.c:1292
csip_aus_common_transition_setupcsip_aus.c:44csip_aus.c:1247
csip_aus_calculate_ramp_timeoutcsip_aus.c:45csip_aus.c:1191
inverter_set_softgradw无(定义在最前)csip_aus.c:58
inverter_der_enable无(定义在最前)csip_aus.c:91

因此 csip_aus.c 一共 30 个函数定义(14 个 static + 16 个全局),这 16 个全局函数全部在本头文件登记;头文件另有 2 个声明没有对应实现(csip_aus_set_soft_ramp_rate、csip_aus_print_run_data),故头文件共 18 个原型。

4. 核心逻辑解析

本文件不含可执行逻辑,但以下设计要点是与实现强耦合的契约。

4.1 两套 DER 模式枚举的数值对齐(隐式契约)

本文件定义 CSIP_AUS_DER_MODE_NORMAL/CONTROL/DEFAULT = 0/1/2,logic/logic.h:73-75 另有一套 DER_NORMAL=0、DER_CONTROL=1、DER_CONTROL_DEFAULT=2。二者在代码里互相直接赋值:

因为数值恰好相同,功能正确;但这个对齐关系只体现在数值上,任何一个枚举插入新成员都会静默破坏映射。头文件里没有任何注释提示这一约束。

同时 CSIP_AUS_DER_MODE_CONTROL 的头文件注释(csip_aus.h:35)写"使用远程下发的当前值作为限制",而 csip_aus.h:36 写 CSIP_AUS_DER_MODE_DEFAULT 为"使用 default 配置值作为安全限制",csip_aus.h:34 写 NORMAL 为"无远程控制限制"——但 csip_aus.h:71 又写 u8_der_control_mode 是 (0:Normal, 1:Default, 2:Control),与 :35/:36 的取值顺序相反(1 到底是 Default 还是 Control)。:71 的注释是错的。

4.2 #pragma pack(1) 的作用与风险

两个结构体都用 #pragma pack(1) 包裹(csip_aus.h:66、:134)。这会取消对齐填充:

4.3 四类限制的双缓冲设计

s32_opmod_*limw(当前生效值)与 s32_default_opmod_*limw(安全默认值)成对存在,加上 s32_old_opmod_*limw(过渡前快照)共三组。这是实现"远程控制超时 → 回落默认值"与"计算斜坡变化量"两个需求的必要设计:

三组值必须同时维护,遗漏任何一组都会导致斜坡速率算错(变化量取成 0 → 退化为 inv_rated_output_power / 100)。

4.4 事件枚举与状态转移矩阵

CSIP_AUS_EVENT_E 定义 8 个事件,实际被触发/处理的只有 5 个:

事件触发点被哪些状态处理
CSIP_AUS_EVENT_NORMALcsip_aus.c:132(模式变更)、:536(NORMAL 模式但状态非 IDLE)state_default_handle(csip_aus.c:613)
CSIP_AUS_EVENT_DEFAULT_ENTERcsip_aus.c:136(模式变更)、:544state_idle_handle、state_control_handle、state_transition_handle
CSIP_AUS_EVENT_CONTROL_ENTERcsip_aus.c:140(模式变更)、:558state_idle_handle、state_default_handle、state_control_handle、state_transition_handle
CSIP_AUS_EVENT_TIMEOUTcsip_aus.c:552(剩余时间为 0)、:1126(csip_aus_handle_control_timeout)state_default_handle、state_control_handle、state_transition_handle
CSIP_AUS_EVENT_GRID_LOSScsip_aus.c:1100(csip_aus_handle_grid_status_change)state_idle_handle(空实现)、state_default_handle、state_control_handle、state_transition_handle
CSIP_AUS_EVENT_DEFAULT_EXIT无触发点无处理分支
CSIP_AUS_EVENT_CONTROL_EXIT无触发点无处理分支
CSIP_AUS_EVENT_GRID_RESTOREcsip_aus.c:1105(电网恢复时发出)无处理分支(见 csip_aus.c.md 备注)

因此 _DEFAULT_EXIT、_CONTROL_EXIT、_GRID_RESTORE 是声明了但未接线的死枚举,而 _GRID_RESTORE 会被发出却无人处理。

4.5 定时与本文件相关的时间常量

常量值位置含义
CSIP_AUS_RAMP_MIN_TIMEOUT_MS5000csip_aus.h:26斜坡超时下限
CSIP_AUS_RAMP_MAX_TIMEOUT_MS400000csip_aus.h:27斜坡超时上限
CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR12csip_aus.h:25斜坡超时放大 1.2 倍。该宏在两处被用于不同单位基准:csip_aus.c:1231 输入已是毫秒,用 × 12 / 10;csip_aus.c:1272 输入是 1/100 秒,用 × 12(因为 1/100 秒 × 12 = 毫秒 × 1.2)。两处结果都以毫秒表示 1.2 倍斜坡时长,是一致的,但基准不同且无注释

对应实现里的三处时间使用:u16_ramptms 单位为 1/100 秒(csip_aus.c:939 用 (power_diff * 100) / ramp_tms 反推 W/s,与之一致);u32_durationtime、u32_control_remaining 单位为秒;u32_ramp_timeout_ms、u32_state_enter_tick、u32_transition_tick、u32_ramp_enable_set_tick 单位为毫秒(OSTimeGet(),OS_TICKS_PER_SEC = 1000)。

5. 对外接口

导出(供外部使用):

名称类型主要使用方
g_t_csip_aus_der_control全局变量定义在 csip_aus.c:23;外部无直接访问,均通过 csip_aus_get_*() 间接读取
g_t_csip_aus_run_data全局变量定义在 csip_aus.c:24;外部同样只经 csip_aus_get_ramp_enable() 读取
g_u8_csip_aus_ramp_rate_calculated全局变量仅 csip_aus.c 内部使用
csip_aus_der_control_process函数logic/logic.c:1035(dnsp_ramp_control_handle() 内)
csip_aus_get_ramp_enable函数logic/logic.c:757/871/924/1084/1086/2781/3126/3142/3158/3218/3234/3250、midware/inverter/inverter.c:2312/2387
csip_aus_get_exp_limit函数logic/logic.c:1065
csip_aus_get_gen_limit函数logic/logic.c:1070/1072
csip_aus_get_load_limit函数logic/logic.c:865/866
csip_aus_get_imp_limit函数logic/logic.c:1094/1095
csip_aus_get_ramp_rate函数logic/logic.c:1078/1080
其余 csip_aus_* 函数(transition_to_*、state_machine_handle、check_ramp_complete、handle_grid_status_change、handle_control_timeout、update_grid_status、print_status)函数仅 csip_aus.c 内部调用;外部无调用方
CSIP_AUS_STATE_E / CSIP_AUS_EVENT_E / CSIP_AUS_DER_CONTROL_T / CSIP_AUS_RUN_DATA_T类型仅 csip_aus.c 使用;无其他文件 include 本头文件
UNUSED / CSIP_AUS_VERSION_* / CSIP_AUS_DER_CONTROL_ENABLE 等宏宏无使用点

被调用(本文件引用的符号):仅 #include "includes.h"(csip_aus.h:14)。

6. 依赖关系

依赖:includes.h(提供 u8/u16/u32/s32、TRUE/FALSE)。

被依赖(全部 include 点):

值得注意的是:本文件虽只被 3 个文件 include,但 csip_aus.c 又 include 了 dispatch.h,因此 csip_aus 的编译单元同时依赖 logic.h、data.h、inverter.h、ems.h、ac_control.h 五层模块。

7. 备注与风险点

  1. 两个函数声明没有实现:csip_aus_set_soft_ramp_rate(csip_aus.h:164)与 csip_aus_print_run_data(csip_aus.h:186)在 csip_aus.c 中都不存在定义,工程内也无调用点(grep 只命中头文件那一行)。这是"声明了未实现、也没人用"的死接口——只要有人开始调用就会链接失败。
  2. csip_aus_set_soft_ramp_rate 的功能实际由另一条路径承担:软启动斜坡速率是通过 u8_setsoftgradw_set_flag 标志 + 主循环里调 inverter_set_softgradw() 下发的(csip_aus.c:428-432、:1259…),并没有走这个 setter。头文件保留这个声明具有误导性。
  3. u8_der_control_mode 的取值注释自相矛盾:csip_aus.h:71 写 (0:Normal, 1:Default, 2:Control),而同文件 :34-36 与 :76-85 的宏定义和注释明确是 1=CONTROL、2=DEFAULT。:71 的注释把 1 和 2 写反了。这是最容易导致按注释写代码出错的点。
  4. UNUSED(x) 宏定义了但从未使用:csip_aus.h:17。属遗留工具宏。
  5. CSIP_AUS_VERSION_MAJOR/MINOR 定义了但无人使用:没有版本上报或校验点。作为"标准版本标识"不参与任何逻辑,一旦协议版本升级(v1.2 → v1.3)这两个宏不会触发任何行为变化。
  6. CSIP_AUS_DER_CONTROL_ENABLE/DISABLE 与 energize 三宏都未被使用:u8_der_control_enable 直接赋 TRUE/FALSE;u8_der_energize 与 u8_opmodconnect 两个 OpModEnergize/OpModConnect 字段只在 csip_aus_print_status()(被 #if CSIP_AUS_DEBUG 关掉)里被打印,没有任何赋值点——也就是说这两个字段永远是初值(g_t_csip_aus_der_control 是未初始化的全局对象,按 C 标准为 0)。CSIP-AUS 规范的 OpModConnect 并网许可与 OpModEnergize 启停控制并未真正实现,只是占了字段位置。
  7. CSIP_AUS_EVENT_GRID_RESTORE 发得出但没人接:csip_aus.c:1105 会在电网恢复时发出该事件,但四个 state_*_handle 的 switch 都没有对应 case,全部落到 default。电网恢复后状态机不会自动离开 DEFAULT 态——只有等下一轮 check_and_trigger_events() 按 u8_der_control_mode 触发 CONTROL_ENTER 才能真正回 CONTROL。这使"电网恢复"的事件语义形同虚设。
  8. u8_grid_status_change 置位后从不清零:csip_aus.c:1095 置 TRUE,全文件无任何清零点。因为它没有消费者,功能上无害,但它是一个"永远为真"的状态位,后续维护者若基于它做判断会得到错误结论。
  9. u32_last_update_tick 与 s32_ramp_target/s32_ramp_current 三字段无任何读写点:CSIP_AUS_RUN_DATA_T 里的 s32_ramp_target、s32_ramp_current 属于"设计时打算由 EMS 自己算斜坡曲线"的遗留——实际实现改为把斜坡速率下发给逆变器,由逆变器内部执行斜率(inverter_set_softgradw/inverter_set_dnsp_regulation_rate),因此这两个字段被废弃但没删。u32_last_update_tick 同理。
  10. #pragma pack(1) 缺少尺寸静态断言:见 4.2。同工程的 logic.h 对配置结构体用了 STATIC_ASSERT,本文件应补一个 STATIC_ASSERT(sizeof(CSIP_AUS_DER_CONTROL_T) == N)。
  11. u16_ramptms 是同名双义字段,读代码时极易误判:csip_aus.h:95 注释写"过渡时间 (1/100 秒)",csip_aus.c:939 按 (power_diff * 100) / ramp_tms 反推速率(与 1/100 秒一致,正确),而 csip_aus.c:1272 的 ramp_tms_value * CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR 表面看是"把 1/100 秒当毫秒乘 12"——实际上因为 1/100 秒 × 12 = 毫秒 × 1.2,它也正确。问题在于同一个字段既被当 1/100 秒用、又被当"毫秒的 1/12"用,两处都没有单位转换注释。更麻烦的是 csip_aus_common_transition_setup() 在切到 DEFAULT 时会把本字段清 0(csip_aus.c:1263、:792),下一个周期 csip_aus_data_sync() 又从 g_t_logic_info.u16_ramptms 同步回来,两个方向来回覆盖,详见 csip_aus.c.md 备注 7。
  12. CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR 的用法基准不统一:同一宏在 csip_aus.c:1231 是 estimated_ms * 12 / 10(输入已是毫秒,表达 1.2 倍),在 csip_aus.c:1272 是 ramp_tms_value * 12(输入是 1/100 秒,×12 同时完成单位换算与 1.2 倍)。结果一致但形式不同,宏名 ..._FACTOR 与注释"最大超时倍数:1.2倍"只覆盖了前一种用法,后一种用法需要读者自行推导单位。建议拆成"单位换算"与"倍率"两个宏,或加注释。
  13. 头文件缺少 u8_previous_state 的消费者说明:该字段只被写、从不被读,属于为调试/上报预留的位置,但头文件没有标注"仅保留"。
  14. 文件头信息较完整(@file/@author/@version/@date/@brief 都填了,@date :2026-02-25),是全工程里少数填写规范的文件;但 @date 是未来日期,可能是预计交付日的占位。