3. 状态机理论基础
星务计算机的自主运行能力,本质上来自一套被严格定义的状态与切换规则。无论是整星在“安全模式—对日定向—正常任务”之间的切换,还是单个分系统在“待机—采集—下传”之间的流转,都可以用有限状态机(Finite State Machine,FSM)来精确描述。理解 FSM 的基本要素与表示方法,是后续设计星务软件模式管理逻辑的前提。
有限状态机的基本要素
有限状态机由五个核心要素构成:状态(State)、事件(Event)、迁移(Transition)、动作(Action)和初始状态。状态是系统在某一时刻所处的稳定情形,例如“待机”“加热中”“数据下传”;事件是触发状态改变的外部或内部信号,例如“收到遥控指令”“温度超过阈值”“定时器到期”;迁移描述“在某个状态下、当某事件发生、且满足守卫条件时,进入另一个状态”;动作则是迁移过程中或进入/退出状态时执行的具体操作,例如打开加热器、置标志位、发送遥测。
需要特别区分两个概念:事件是“发生了什么”,是瞬时的;动作是“系统做了什么”,是可执行的。一个迁移可以没有动作,但必须有明确的事件与目标状态。守卫条件(Guard)是迁移上的布尔表达式,只有为真时迁移才被允许,例如“温度 < 5℃ 且 加热允许标志 = 1”。
状态、迁移与动作的语义
在工程实现中,状态通常用枚举量表示,迁移用“当前状态 + 事件 + 守卫 → 目标状态 + 动作”的规则表描述。以星务计算机热控模式为例,可定义如下规则:
状态: STANDBY, HEATING, COOLING, SAFE
事件: EV_TEMP_LOW, EV_TEMP_HIGH, EV_TEMP_OK, EV_FAULT
迁移规则:
STANDBY + EV_TEMP_LOW [temp < 5] -> HEATING / 开加热器
HEATING + EV_TEMP_OK [temp >= 10] -> STANDBY / 关加热器
STANDBY + EV_TEMP_HIGH [temp > 35] -> COOLING / 开散热
COOLING + EV_TEMP_OK [temp <= 30] -> STANDBY / 关散热
任意状态 + EV_FAULT -> SAFE / 关负载、报遥测
这段规则表就是 FSM 的可执行描述。它明确了每个状态在何种事件下、满足何种条件时,迁移到哪个状态,并执行什么动作。星务软件的模式管理模块,通常就是把这样一张表翻译成代码中的 switch-case 或状态表驱动结构。
层次状态机
当状态数量增多、状态之间存在公共行为时,扁平 FSM 会出现大量重复迁移。层次状态机(Hierarchical State Machine,HSM)允许状态嵌套:父状态(超状态)可以包含若干子状态,子状态自动继承父状态的迁移与动作。例如“正常任务”作为父状态,其下包含“对日定向”“载荷观测”“数据下传”三个子状态;无论处于哪个子状态,只要收到“整星故障”事件,都迁移到“安全模式”。这条迁移只需在父状态上定义一次,子状态无需重复。
HSM 还支持进入动作与退出动作:进入父状态时执行一次公共初始化,进入子状态时再执行子状态特有动作;退出时按相反顺序执行。这种“由外到内进入、由内到外退出”的顺序,是 HSM 实现中必须严格遵守的语义,否则容易出现资源未释放或重复初始化的问题。
状态图表示方法
状态图(State Diagram)是 FSM 的标准图形表示。约定如下:圆角矩形表示状态,实心圆点表示初始状态,带箭头的有向边表示迁移,边上标注“事件 [守卫] / 动作”。状态内部可写“entry / 进入动作”和“exit / 退出动作”。嵌套状态用包含关系表示,父状态框住子状态。终止状态用带圆圈的实心圆表示。
下面这张状态图给出了星务计算机热控与安全模式的一个简化 FSM,包含四个状态、五条迁移以及一条故障迁移,可直接作为模式管理逻辑的设计草图。
从状态图到星务软件实现
状态图完成后,下一步是把它转化为可运行的模式管理代码。常见做法是“状态表驱动”:用一张二维表或一维规则数组保存“当前状态、事件、守卫、目标状态、动作函数指针”,主循环每次读取当前状态与最新事件,查表匹配第一条满足守卫的规则并执行迁移。这种实现方式与状态图一一对应,便于审查和修改。
在星务计算机中,事件来源包括遥控指令解析结果、遥测阈值判断结果、定时器到期、看门狗复位等;动作则对应具体的硬件操作或软件标志设置。设计时必须保证:同一状态下同一事件只匹配一条规则,避免迁移冲突;所有状态都必须有故障迁移出口;进入 SAFE 的动作要幂等,即重复执行不会造成额外副作用。