MATLAB MAB 5.0建模规范-Stateflow规范 第1部分(详细)

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规范
  • 声明

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 并行状态中本地数据定义规范 并行状态中,仅在一个状态中完成的局部变量需在该状态中定义

详细解读

规范描述

  1. 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端口名规范

规范描述

  1. Stateflow 图块的输入 / 输出端口名称,必须与对应连接的 Simulink 信号名称保持一致。
    例外:可复用的 Stateflow 模块(如库链接的 Stateflow 块),允许端口名称与信号线名称不同。

核心目的

  • 避免信号连接混淆:统一端口与信号线名称,让开发人员直观关联 Stateflow 的输入输出来源与去向,防止跨工具(Simulink 与 Stateflow)协作时的连接错误。
  • 提升模型可读性与维护性:标准化的命名对应关系,减少信号追溯成本,无需额外查阅关联逻辑即可明确信号流向,降低跨团队协作理解难度。
  • 保障代码生成可靠性:避免因命名不一致导致生成代码中信号标识混乱,确保 Stateflow 逻辑与 Simulink 信号在代码层面的映射准确性。

示例说明

正确示例
Stateflow 图块的输入 / 输出端口名称与对应连接的 Simulink 信号名称一致。
错误示例
Stateflow 图块的输入 / 输出端口名称与对应连接的 Simulink 信号名称不一致。

db_0125: Stateflow 本地数据规范

规范描述

  1. 禁止在 Stateflow 的 "状态机级(machine level)" 定义以下类型的局部数据:
    • "Local"(本地)类型数据;
    • "Constant"(常量)类型数据;
    • "Parameter"(参数)类型数据。
  2. 存在父子关系的 Stateflow 块中,局部数据名称不得重复。

核心目的

  • 避免数据共享风险:禁止机器级定义局部数据,防止数据被模型中所有块共享,确保局部数据仅服务于特定层级的逻辑,避免非预期的修改或干扰。
  • 提升逻辑清晰度:明确局部数据的作用域边界,让开发人员快速定位数据的适用范围,降低跨层级协作时的理解成本。
  • 防止命名冲突:父子级 Stateflow 块中数据名称唯一,避免因名称重复导致的数据引用歧义,确保代码生成时的变量映射准确性。
  • 保障模型可维护性:标准化局部数据的定义规则,简化后期数据修改、删除等维护操作,避免因数据作用域或命名问题引发的连锁错误。

示例说明

正确示例
数据对象未在状态机级上将作用域定义为 Local。
具有父子关系的 Stateflow 模块不包含同名的状态流数据。
错误示例
在状态机级上将作用域设置为 Local 局部数据。
具有父子关系的 Stateflow 模块包含同名的状态流数据。

db_0126: Stateflow 事件定义规范

规范描述

  1. Stateflow 事件(含触发事件、内部事件等)必须在最小适用作用域级别定义,即事件的作用域需严格匹配其使用范围,禁止过度扩大作用域(如全局作用域)。

核心目的

  • 避免事件触发混淆:限制事件作用域可防止跨层级、跨模块的无规则事件触发,明确事件的触发源与响应范围,降低事件流向的追溯难度。
  • 提升模型可读性与可维护性:最小化作用域让开发人员快速定位事件的使用场景,无需全局检索事件关联,清晰区分不同模块的事件逻辑,降低跨团队协作成本。
  • 减少仿真与代码生成风险:避免因全局事件重名导致的触发冲突,或子系统独立执行时引发的事件不匹配问题,保障仿真稳定性与代码生成的准确性。

示例说明

正确示例
Stateflow 事件(含触发事件、内部事件等)在最小适用作用域级别定义。
错误示例
Stateflow 事件(含触发事件、内部事件等)未在最小适用作用域级别定义。

jc_0701: 首索引可用数值规范

规范描述

  1. 当 [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: 默认转换路径执行时序规范

规范描述

  1. Chart\]的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)必须设置为 "未勾选" 状态。

核心目的

  • 避免逻辑误解:统一默认转移的执行时机,防止因部分 Chart 启用初始化执行、部分未启用导致的行为不一致,确保所有 Chart 的默认转移逻辑遵循相同触发规则。
  • 保障信号有效性:模型初始化阶段,Chart 的输入信号可能尚未完成初始化(如传感器信号、外部输入参数),禁止初始化时执行默认转移,可避免使用无效信号触发转移逻辑,防止非预期行为。
  • 提升模型一致性:标准化默认转移的执行机制,降低跨团队协作时对转移时机的理解偏差,简化模型评审与调试流程。

示例说明

正确示例
[Chart]的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)设置为 "未勾选" 状态。
错误示例
[Chart]的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)设置为 "勾选" 状态。

jc_0722: 并行状态中本地数据定义规范

规范描述

  1. 在并行状态(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规范进行解读,部分图形会有引用,而非另起炉灶撰写。


感谢阅读,如有错误恳请指正,如对您有帮助,动手点个赞吧^ - ^

相关推荐
t198751282 小时前
TOA定位算法MATLAB实现(二维三维场景)
开发语言·算法·matlab
jllllyuz2 小时前
粒子群算法解决资源分配问题的MATLAB实现
开发语言·算法·matlab
aini_lovee3 小时前
MATLAB圆锥滚子轴承滚子参数分析程序
人工智能·算法·matlab
guygg885 小时前
基于ADMM的MRI-PET高质量图像重建算法MATLAB实现
开发语言·算法·matlab
feifeigo1235 小时前
基于MATLAB的V-BLAST结构BER仿真
开发语言·matlab
The hopes of the whole village6 小时前
Matlab FFT分析
开发语言·matlab
Evand J7 小时前
【IMM】非线性目标跟踪算法与MATLAB实现:基于粒子滤波的交互式多模型,结合CV和CT双模型对三维空间中的机动目标进行高精度跟踪
算法·matlab·目标跟踪·pf·粒子滤波·imm·多模型
想创新AI的新青年8 小时前
武汉理工复试上机练习———(一)信号与系统
matlab·信号处理·信号与系统·武汉理工复试上机
Love Song残响8 小时前
MATLAB疑难杂症全攻略:从报错到优化
开发语言·matlab