MAB(Mathworks Advisory Board,Mathworks咨询委员会)针对MATLAB、Simulink、Stateflow规定了建模重要基本规则,这些建模指南的总体目的是让模型的建模者和使用者能够形成简单、统一的理解,本文章主要针对2020年3月发布的5.0版本进行逐条解读。
众所周知,编码规范可以在命名、缩进、注释、格式上统一代码风格,别人一看就懂,降低了沟通成本,并且规范的代码结构也使得代码的可读性、可维护性极大提升,同样,建模规范也有异曲同工之妙,遵守建模规范是实现以下目标的重要前提主要目标是:
- 提高图形的可理解性
- 提高功能分析的可读性
- 防止连接错误
- 注释等
- 提高代码生成效率
- 确保生成代码的健壮性
目录
- Stateflow建模规范(共54条)
-
- [Stateflow模块 / 数据 / 事件(7 条)](#Stateflow模块 / 数据 / 事件(7 条))
- 详细解读
-
- [db_0122: Stateflow 与 Simulink 接口信号和参数规范](#db_0122: Stateflow 与 Simulink 接口信号和参数规范)
- [db_0123: Stateflow端口名规范](#db_0123: Stateflow端口名规范)
- [db_0125: Stateflow 本地数据规范](#db_0125: Stateflow 本地数据规范)
- [db_0126: Stateflow 事件定义规范](#db_0126: Stateflow 事件定义规范)
- [jc_0701: 首索引可用数值规范](#jc_0701: 首索引可用数值规范)
- [jc_0712: 默认转换路径执行时序规范](#jc_0712: 默认转换路径执行时序规范)
- [jc_0722: 并行状态中本地数据定义规范](#jc_0722: 并行状态中本地数据定义规范)
- 其他Stateflow规范
-
- Stateflow图
- [条件转移 / 动作](#条件转移 / 动作)
- 标签描述
- 其他
- 声明
MAB 5.0共151条规范,分为命名规范、Simulink建模规范、Stateflow建模规范、MATLAB规范四类。
Stateflow规范共54条,分以下5部分进行解读
- 第1部分:Stateflow模块 / 数据 / 事件
- 第2部分:Stateflow图
- 第3部分:条件转移 / 动作
- 第4部分:标签描述
- 第5部分:其他
本文章解读第1部分 Stateflow模块 / 数据 / 事件
MAB 5.0最全规范见 MATLAB MAB 5.0建模规范解读(最全)
Stateflow建模规范(共54条)
Stateflow模块 / 数据 / 事件(7 条)
| 序号 | 规范 ID | 规范名称 | 核心要求简述 |
|---|---|---|---|
| 1 | db_0122 | Stateflow and Simulink interface signals and parameters Stateflow 与 Simulink 接口信号和参数规范 | Chart 启用 "与 Simulink I/O 强类型匹配"(动作语言为 C 时) |
| 2 | db_0123 | Stateflow port names Stateflow端口名规范 | Stateflow 输入 / 输出端口名与对应信号名一致(复用块除外) |
| 3 | db_0125 | Stateflow local data Stateflow 本地数据规范 | 状态机级不定义 Local/Constant/Parameter 类型本地数据;父子关系块中本地数据名不重复 |
| 4 | db_0126 | Defining Stateflow events Stateflow 事件定义规范 | Stateflow 事件按最小作用域定义 |
| 5 | jc_0701 | Usable number for first index 首索引可用数值规范 | 动作语言为 C 时,Stateflow 数据首索引统一设为 0 或 1 |
| 6 | jc_0712 | Execution timing for default transition path 默认转换路径执行时序规范 | Chart 不启用 "初始化时执行(进入)图表" |
| 7 | jc_0722 | Local data definition in parallel states 并行状态中本地数据定义规范 | 并行状态中,仅在一个状态中完成的局部变量需在该状态中定义 |
详细解读
db_0122: Stateflow 与 Simulink 接口信号和参数规范
规范描述
Chart\](Stateflow 图块)的参数 {Use Strong Data Typing with Simulink I/O}(启用与 Simulink I/O 的强数据类型)必须勾选启用。(仅当{Action Languages}设置为C时)
核心目的
- 避免隐式类型转换风险:禁用强数据类型时,Simulink 信号默认以 double 类型与 Stateflow 交互,易因类型不匹配导致隐含转换,引发精度丢失或数值异常;强类型配置可强制显式匹配,杜绝此类风险。
- 提升模型可读性与可维护性:明确的接口数据类型定义,让开发人员直观知晓 Stateflow 与 Simulink 的信号交互类型,无需额外追溯类型适配逻辑,降低跨工具协作理解成本。
- 保障代码生成一致性:强数据类型配置确保生成代码中接口数据类型与模型设计完全一致,避免因隐式转换导致的代码逻辑偏差,符合嵌入式控制器对类型确定性的要求。
- 简化错误排查:类型不匹配时会直接触发模型诊断错误,而非在仿真或运行阶段隐性暴露问题,便于早期定位接口配置失误。
示例说明
| 正确示例 |
|---|
当{Action Languages}设置为C时,[Chart](Stateflow 图块)的参数 {Use Strong Data Typing with Simulink I/O}勾选。 ![]() |
| 错误示例 |
|---|
当{Action Languages}设置为C时,[Chart](Stateflow 图块)的参数 {Use Strong Data Typing with Simulink I/O}未勾选。 ![]() |
db_0123: Stateflow端口名规范
规范描述
- Stateflow 图块的输入 / 输出端口名称,必须与对应连接的 Simulink 信号名称保持一致。
例外:可复用的 Stateflow 模块(如库链接的 Stateflow 块),允许端口名称与信号线名称不同。
核心目的
- 避免信号连接混淆:统一端口与信号线名称,让开发人员直观关联 Stateflow 的输入输出来源与去向,防止跨工具(Simulink 与 Stateflow)协作时的连接错误。
- 提升模型可读性与维护性:标准化的命名对应关系,减少信号追溯成本,无需额外查阅关联逻辑即可明确信号流向,降低跨团队协作理解难度。
- 保障代码生成可靠性:避免因命名不一致导致生成代码中信号标识混乱,确保 Stateflow 逻辑与 Simulink 信号在代码层面的映射准确性。
示例说明
| 正确示例 |
|---|
Stateflow 图块的输入 / 输出端口名称与对应连接的 Simulink 信号名称一致。 ![]() |
| 错误示例 |
|---|
Stateflow 图块的输入 / 输出端口名称与对应连接的 Simulink 信号名称不一致。 ![]() |
db_0125: Stateflow 本地数据规范
规范描述
- 禁止在 Stateflow 的 "状态机级(machine level)" 定义以下类型的局部数据:
- "Local"(本地)类型数据;
- "Constant"(常量)类型数据;
- "Parameter"(参数)类型数据。
- 存在父子关系的 Stateflow 块中,局部数据名称不得重复。
核心目的
- 避免数据共享风险:禁止机器级定义局部数据,防止数据被模型中所有块共享,确保局部数据仅服务于特定层级的逻辑,避免非预期的修改或干扰。
- 提升逻辑清晰度:明确局部数据的作用域边界,让开发人员快速定位数据的适用范围,降低跨层级协作时的理解成本。
- 防止命名冲突:父子级 Stateflow 块中数据名称唯一,避免因名称重复导致的数据引用歧义,确保代码生成时的变量映射准确性。
- 保障模型可维护性:标准化局部数据的定义规则,简化后期数据修改、删除等维护操作,避免因数据作用域或命名问题引发的连锁错误。
示例说明
| 正确示例 |
|---|
数据对象未在状态机级上将作用域定义为 Local。 ![]() |
具有父子关系的 Stateflow 模块不包含同名的状态流数据。 ![]() |
| 错误示例 |
|---|
在状态机级上将作用域设置为 Local 局部数据。 ![]() |
具有父子关系的 Stateflow 模块包含同名的状态流数据。 ![]() |
db_0126: Stateflow 事件定义规范
规范描述
- Stateflow 事件(含触发事件、内部事件等)必须在最小适用作用域级别定义,即事件的作用域需严格匹配其使用范围,禁止过度扩大作用域(如全局作用域)。
核心目的
- 避免事件触发混淆:限制事件作用域可防止跨层级、跨模块的无规则事件触发,明确事件的触发源与响应范围,降低事件流向的追溯难度。
- 提升模型可读性与可维护性:最小化作用域让开发人员快速定位事件的使用场景,无需全局检索事件关联,清晰区分不同模块的事件逻辑,降低跨团队协作成本。
- 减少仿真与代码生成风险:避免因全局事件重名导致的触发冲突,或子系统独立执行时引发的事件不匹配问题,保障仿真稳定性与代码生成的准确性。
示例说明
| 正确示例 |
|---|
Stateflow 事件(含触发事件、内部事件等)在最小适用作用域级别定义。 ![]() ![]() |
| 错误示例 |
|---|
Stateflow 事件(含触发事件、内部事件等)未在最小适用作用域级别定义。 ![]() |
jc_0701: 首索引可用数值规范
规范描述
- 当 [Chart](Stateflow 图块)的 {Action Language}(动作语言)设置为 "C" 时,Stateflow 数据的 {First index}(首索引)需统一配置为以下两种模式之一,禁止混合使用:
- 模式 1:首索引统一设为 "0"(0-based 索引);
- 模式 2:首索引统一设为 "1"(1-based 索引)。
核心目的
- 避免索引逻辑混淆:统一首索引模式,防止因混合 0/1-based 索引导致的数据访问错误(如数组越界、索引对应关系错乱)。
- 提升模型可读性与维护性:标准化的索引配置让开发人员快速理解数据的访问规则,无需额外区分不同数据的索引起点,降低跨团队协作成本。
- 保障代码生成一致性:C 语言默认采用 0-based 索引,统一索引模式可减少生成代码中的索引转换逻辑,避免因索引不匹配导致的代码执行异常。
示例说明
| 正确示例 |
|---|
当 Stateflow Chart的属性{Action Languages} 设置为 C 时,Stateflow 的数据属性第一个索引均设置为 0。 ![]() |
当 Stateflow Chart的属性{Action Languages} 设置为 C 时,Stateflow 的数据属性第一个索引均设置为1。![]() |
| 错误示例 |
|---|
第一个索引设置为 0、1 和 2 的组合。 ![]() |
jc_0712: 默认转换路径执行时序规范
规范描述
Chart\]的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)必须设置为 "未勾选" 状态。
核心目的
- 避免逻辑误解:统一默认转移的执行时机,防止因部分 Chart 启用初始化执行、部分未启用导致的行为不一致,确保所有 Chart 的默认转移逻辑遵循相同触发规则。
- 保障信号有效性:模型初始化阶段,Chart 的输入信号可能尚未完成初始化(如传感器信号、外部输入参数),禁止初始化时执行默认转移,可避免使用无效信号触发转移逻辑,防止非预期行为。
- 提升模型一致性:标准化默认转移的执行机制,降低跨团队协作时对转移时机的理解偏差,简化模型评审与调试流程。
示例说明
| 正确示例 |
|---|
[Chart]的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)设置为 "未勾选" 状态。 ![]() |
| 错误示例 |
|---|
[Chart]的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)设置为 "勾选" 状态。 ![]() |
jc_0722: 并行状态中本地数据定义规范
规范描述
- 在并行状态(Parallel States)中,仅在单个状态内完成逻辑运算的局部变量,必须在该状态内部定义,禁止在父状态或更高层级定义后跨并行状态共享。
核心目的
- 避免数据竞争风险:并行状态为同步执行逻辑,跨状态共享局部数据可能导致多个并行状态同时读写数据,引发数值冲突或非预期覆盖。
- 提升逻辑清晰度:数据定义在使用它的并行状态内部,让开发人员直观知晓数据的专属场景,无需跨状态追溯数据流向,降低理解成本。
- 保障模型可维护性:明确的数据作用域边界,便于后期修改单个并行状态的逻辑时,不影响其他并行状态的运行,减少连锁错误。
示例说明
| 正确示例 |
|---|
局部变量已在其所在的并行状态中定义。 ![]() |
| 错误示例 |
|---|
局部变量未在其所在的并行状态中定义。 ![]() |
其他Stateflow规范
Stateflow图
Stateflow图规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第2部分(详细)
条件转移 / 动作
条件转移 / 动作规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第3部分(详细)
标签描述
标签描述规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第4部分(详细)
其他
其他规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第5部分(详细)
声明
此文章基于Mathworks官方MAB 5.0规范进行解读,部分图形会有引用,而非另起炉灶撰写。
感谢阅读,如有错误恳请指正,如对您有帮助,动手点个赞吧^ - ^

















