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(),若返回值与当前状态不同,则先执行退出动作(如断开接触器、顺桨),再执行进入动作(如使能转矩、投入限功率)。这种“先退后进”的顺序能避免两个状态的动作同时生效。

限功率状态建议单独设置功率斜率限制器,例如从 2 MW 降至 1 MW 时按 0.2 MW/s 下降,约 5 s 完成,避免对电网造成冲击。

四、状态迁移关系图

下图给出六类状态之间的主要迁移路径与触发条件,便于对照代码检查逻辑完整性。

停机 Stop 启动 Startup 并网 GridConnected 发电 Generating 限功率 PowerLimit 故障 Fault 风速≥3.5m/s 无故障 转速/电压/频率 满足并网窗口 功率≥20kW 限功率指令 指令撤销 风速<2.5m/s 风速低于切入值,正常停机 安全链断开 / 超速 / 振动超限 故障触发 故障触发 故障清除+复位 正常迁移 恢复/复位迁移 故障迁移

对照上图检查代码时,重点确认三件事:每个状态是否都有明确的退出条件;故障是否可以从任意状态进入;限功率与发电之间是否形成闭环而非单向。实际调试中,可先在 PLC 或仿真环境中强制注入风速、转速、电网参数,观察状态跳转是否符合预期,再接入真实机组。

状态机实现时,务必保证“故障”状态的优先级最高。若在并网过程中检测到安全链断开,应立即从启动或并网状态直接跳转故障,而不是先回停机再报故障,否则会延误安全动作。