3. 风机运行状态与主控状态机设计
主控系统的核心职责之一,是把风电机组从“静止待风”到“满发并网”的全过程管理成一组边界清晰、迁移可控的状态。状态定义不清,现场就会出现“明明已停机却报并网”“限功率时误触发安全链”等难以复现的问题。本节围绕停机、启动、并网、发电、限功率、故障六类基本状态,说明其定义、迁移条件,并给出可落地的状态机代码结构。
一、状态定义与边界
状态不是简单的运行标志,而是“一组允许的动作 + 一组禁止的动作 + 一组进入/退出条件”的集合。工程上通常按以下方式定义:
- 停机(Stop):叶轮转速低于切入阈值,变桨系统处于顺桨位置(约 88°~90°),主接触器断开,机组不向电网输出功率。此状态允许偏航对风、液压建压、加热除湿等辅助动作。
- 启动(Startup):已满足启动条件,正在执行“解缆检查→偏航对风→变桨至启动角→转速爬升”的过程。此时尚未并网,发电机可能处于空转或软启励磁阶段。
- 并网(GridConnected):发电机转速、电压、频率、相位满足并网窗口,主接触器闭合,但功率尚未达到设定值,处于“已连接、待加载”的过渡状态。
- 发电(Generating):转矩给定投入,功率随风速上升,处于最大功率跟踪(MPPT)或额定功率运行区间。
- 限功率(PowerLimit):因调度指令、电网约束或机组自身降载需求,将输出功率限制在设定值以下。此状态仍并网,但转矩/桨距控制目标被限幅。
- 故障(Fault):检测到不可继续运行的条件,立即执行安全停机逻辑,禁止自动重启,等待人工复位或故障清除。
需要强调的是,限功率不是故障,它是有序降载;而故障停机与正常停机的差别在于:前者触发安全链、记录故障码并锁定重启,后者可由运行条件恢复后自动重新启动。
二、状态迁移条件
迁移条件应尽量用可测量的物理量与逻辑量表达,避免“感觉风速够了”这类模糊判断。以下为示例参数(属于教学假设,实际项目需按机型标定):
| 迁移 | 关键条件(示例) |
|---|---|
| 停机 → 启动 | 风速 10 min 均值 ≥ 3.5 m/s;无未复位故障;液压压力 ≥ 120 bar;偏航已对风;变桨系统就绪 |
| 启动 → 并网 | 发电机转速 ≥ 1050 rpm;机端电压在 690 V ±10%;频率 50 Hz ±0.5 Hz;相位差 < 5°;持续 3 s 稳定 |
| 并网 → 发电 | 主接触器闭合反馈有效;转矩给定使能;功率在 5 s 内上升至 ≥ 20 kW |
| 发电 → 限功率 | 收到调度限功率指令,或电网频率 > 50.2 Hz,或机组振动/温度接近降载阈值 |
| 限功率 → 发电 | 限功率指令撤销,且风速与机组状态允许恢复;恢复过程按斜率限幅,避免功率突变 |
| 任意 → 故障 | 安全链断开、超速(> 120% 额定)、振动超限、变桨失电、主接触器粘连等 |
| 故障 → 停机 | 故障已清除且人工复位;执行安全停机流程后进入停机待命 |
迁移条件中,并网窗口和限功率斜率是最容易出问题的两处。并网窗口过宽会导致冲击电流,过窄则频繁并网失败;限功率斜率过大则功率骤降,可能引发电网考核不合格。
三、状态机代码实现
推荐采用“状态枚举 + 迁移表 + 周期扫描”的结构,而不是把判断散落在各个功能块中。以下为 C 语言示例,运行周期设为 100 ms:
typedef enum {
ST_STOP = 0,
ST_STARTUP,
ST_GRID_CONNECTED,
ST_GENERATING,
ST_POWER_LIMIT,
ST_FAULT
} TurbineState;
typedef struct {
TurbineState cur;
float windSpeed10min;
float genSpeed;
float gridVoltage;
float gridFreq;
float activePower;
float powerLimit;
int faultActive;
int faultReset;
int startCmd;
} TurbineCtx;
static TurbineState next_state(TurbineCtx *c)
{
switch (c->cur) {
case ST_STOP:
if (c->faultActive) return ST_FAULT;
if (c->startCmd && c->windSpeed10min >= 3.5f)
return ST_STARTUP;
return ST_STOP;
case ST_STARTUP:
if (c->faultActive) return ST_FAULT;
if (c->genSpeed >= 1050.0f &&
fabsf(c->gridVoltage - 690.0f) <= 69.0f &&
fabsf(c->gridFreq - 50.0f) <= 0.5f)
return ST_GRID_CONNECTED;
if (c->windSpeed10min < 2.5f) return ST_STOP;
return ST_STARTUP;
case ST_GRID_CONNECTED:
if (c->faultActive) return ST_FAULT;
if (c->activePower >= 20.0f) return ST_GENERATING;
return ST_GRID_CONNECTED;
case ST_GENERATING:
if (c->faultActive) return ST_FAULT;
if (c->powerLimit < 0.95f * c->activePower)
return ST_POWER_LIMIT;
if (c->windSpeed10min < 2.5f) return ST_STOP;
return ST_GENERATING;
case ST_POWER_LIMIT:
if (c->faultActive) return ST_FAULT;
if (c->powerLimit >= 0.98f * c->activePower)
return ST_GENERATING;
return ST_POWER_LIMIT;
case ST_FAULT:
if (!c->faultActive && c->faultReset)
return ST_STOP;
return ST_FAULT;
}
return ST_FAULT;
}
主循环中每 100 ms 调用一次 next_state(),若返回值与当前状态不同,则先执行退出动作(如断开接触器、顺桨),再执行进入动作(如使能转矩、投入限功率)。这种“先退后进”的顺序能避免两个状态的动作同时生效。
四、状态迁移关系图
下图给出六类状态之间的主要迁移路径与触发条件,便于对照代码检查逻辑完整性。
对照上图检查代码时,重点确认三件事:每个状态是否都有明确的退出条件;故障是否可以从任意状态进入;限功率与发电之间是否形成闭环而非单向。实际调试中,可先在 PLC 或仿真环境中强制注入风速、转速、电网参数,观察状态跳转是否符合预期,再接入真实机组。