2. Stateflow 建模环境快速上手
Stateflow 是 Simulink 中用于描述事件驱动逻辑、状态机与流程控制的图形化建模环境。在汽车功能安全模型开发中,它常被用来表达模式管理、故障降级、上电时序、诊断仲裁等“按条件切换行为”的逻辑。本节的目标不是把 Stateflow 的所有功能讲完,而是让你能独立完成一个最小可运行的状态机:认识编辑器界面,创建状态、转移、默认转移、事件与动作,并把它正确嵌入 Simulink 模型。
一、Stateflow 编辑器界面构成
在 Simulink 中新建一个 Stateflow Chart(可通过 Simulink 库浏览器拖入 Chart 模块,或在已有模型中双击 Chart 模块进入),编辑器主要由以下区域组成:
- 对象选项板(Palette):提供 State、Default Transition、History Junction、Connective Junction、Graphical Function、Simulink Function 等绘图对象。
- 绘图画布(Canvas):状态、转移、节点等图形元素的绘制区域,支持网格对齐与自动布线。
- 符号窗格(Symbols):列出当前 Chart 的输入、输出、局部数据、参数、事件,是数据与事件管理的入口。
- 对象属性(Properties):选中状态或转移后,可编辑名称、动作、执行优先级、断点等属性。
- Model Explorer:集中管理 Chart 的 Data、Event、Message 等对象,是配置作用域(Scope)与类型的关键工具。
对功能安全项目而言,界面中最需要优先掌握的是 Symbol 窗格与 Model Explorer,因为状态机的输入输出、事件触发条件、数据类型与范围,都直接决定后续的 MISRA 检查、覆盖率统计与代码生成结果。
二、状态、转移与默认转移
状态(State)是 Stateflow 的基本行为单元,用圆角矩形表示。一个状态可以包含 entry、during、exit 三类动作,分别在该状态被激活时、处于激活期间、被退出时执行。例如一个“初始化”状态可以写成:
entry: InitFlag = 1;
during: InitTimer = InitTimer + 1;
exit: InitFlag = 0;
转移(Transition)用带箭头的连线表示,连接两个状态或节点。转移上可以标注触发事件、条件与动作,格式通常为:
EventName[Condition]{Action}
其中 EventName 是触发事件,Condition 是布尔条件,Action 是转移发生时执行的动作。例如:
PowerOn[Voltage > 9.0]{Mode = NORMAL;}
表示当事件 PowerOn 发生且电压大于 9.0V 时,切换到目标状态并执行 Mode = NORMAL。
默认转移(Default Transition)是状态机的入口,用带箭头的短线段表示,指向系统启动时首先进入的状态。一个 Chart 或一个父状态必须有且仅有一个默认转移,否则模型在初始化时无法确定初始状态,会报错或产生不确定行为。在功能安全语境下,默认转移应指向“安全状态”或“初始化状态”,例如上电后先进入 Init,再根据条件进入 Normal 或 Safe。
三、事件与动作
事件(Event)是驱动状态切换的外部或内部信号。在 Model Explorer 中新建 Event,可设置其作用域:Input from Simulink、Local、Output to Simulink 等。汽车功能安全模型中,常见事件包括:点火信号 KL15、故障标志 FaultActive、诊断请求 DiagRequest、超时事件 Timeout 等。
动作(Action)是状态或转移上执行的具体语句,可以是赋值、函数调用、条件判断等。动作语言支持 C 风格语法,但需注意:在功能安全项目中应避免动态内存、递归、未初始化变量等不安全用法。动作中引用的数据必须先在 Model Explorer 中定义,并明确其类型、范围与初始值。
下面这张图展示了一个典型的“上电—初始化—正常/安全”状态机结构,包含默认转移、事件触发转移与状态动作,可作为本节的最小示例骨架。
四、与 Simulink 模型的集成方式
Stateflow Chart 在 Simulink 中表现为一个模块,其输入输出端口由 Chart 内部的 Input/Output 数据决定。集成时需注意以下几点:
- 端口映射:在 Model Explorer 中把数据 Scope 设为 Input from Simulink 或 Output to Simulink,Chart 模块上会自动出现对应端口,再与外部信号线连接。
- 采样时间:Chart 的采样时间可继承 Simulink 求解器,也可单独设置。功能安全模型中建议与所在子系统保持一致,避免多速率交互引入不可预期的时序。
- 事件触发:若使用 Input from Simulink 事件,需在 Simulink 侧提供触发信号;若使用 Local 事件,则由 Chart 内部逻辑产生。
- 代码生成:Chart 可直接生成 C 代码,配合 Embedded Coder 可配置函数名、文件划分与数据接口,便于后续与 AUTOSAR 或手写安全代码集成。
一个常见的集成做法是:把 Stateflow Chart 封装在一个 Simulink Subsystem 内,Subsystem 的输入端口对应整车信号(如 KL15、电压、故障标志),输出端口对应模式字与执行指令。这样既保持了状态机逻辑的内聚性,也便于在 Simulink 层面做信号路由与测试激励。
五、最小可运行示例的搭建顺序
建议按以下顺序完成第一个可运行状态机,避免在配置与绘图之间反复切换:
- 在 Simulink 中新建模型,拖入 Chart 模块并双击进入编辑器。
- 在 Model Explorer 中定义输入数据 V(double,范围 0~16)、输入事件 PowerOn、FaultActive、FaultClear,输出数据 Mode(枚举或 int8)。
- 在画布上放置 Init、Normal、Safe 三个状态,并填写各自的 entry/during/exit 动作。
- 从对象选项板拖出 Default Transition,指向 Init。
- 绘制 Init→Normal、Init→Safe、Normal→Safe、Safe→Normal 四条转移,并标注事件、条件与动作。
- 返回 Simulink,连接输入信号与输出信号,设置仿真时间与求解器,运行并观察 Mode 输出是否符合预期。