stateflow基本操作

一、背景

        Stateflow是一种图形化的设计开发工具,是有限状态机的图形实现工具,有人称之为状态流。主要用于simulink中控制和检测逻辑关系的。用户可以在进行simulink仿真时,使用stateflow来实现各个状态的切换,以解决复杂的逻辑问题。利用状态机原理、流图概念和状态转化图,stateflow能够对复杂系统的行为进行清晰、简洁的描述。

二、打开stateflow模型

        在使用stateflow时,首先需要新建一个stateflow模型,常见的打开stateflow的方式主要有以下两类:

(1)命令行方式,可在matalab命令行中输入”sf”、”sflib”、”sfnew -matlab”、”sfnew -c”来打开stateflow;如下图所示:

(2)在”simulink library”中选择”stateflow”,如下图所示:

三、Stateflow基本操作

  1. 模型代码生成

        使用模型的目的是将模型验证成功后转换为C代码,而后集成到硬件平台进行运行,所以需要了解如何将代码生成C代码以及如何对生成的C代码进行优化。单击stateflow界面中的“Model Configuration Parameters”选项进行相应的设置。

  1. 模型解算器solver设置

如下图所示为模型解算器solver设置界面,其中:

  1. Simulation time:仿真开始时间和结束时间,单位为s (对仿真有影响,代码生成无影响作用);
  2. Solver selection : 求解方法,stateflow都是定步长计算,并且是离散求解,因此Type设置为Fixed-step, Solver设置为Discrete;
  3. Solver details :定步长设置就是模型代码运行周期,单位为s如下图所示0.001,则表示模型代码的运行周期为1ms,这也要求硬件底层驱动需要提供一个准确的时基。

  1. 生成目标文件设置

        如下图所示为”Code Generation”设置界面,

  1. Target selection:生成系统目标文件设置,系统默认选择grt.tlc作为系统目标文件,生成的代码可以用作快速原型,一般用来做si测试,主要考察生成软件的架构以及功能的正确性。需要修改为如下图所示的ert.tlc作为系统目标文件,以生成可以用与嵌入式系统的的更高效的代码。
  2. Build process:这里需要勾选仅生成code,防止对外部引用的信号报错或者没有编译环境报错。

  1. 硬件平台设置

        模型生成的代码最终是要集成到指定的硬件平台去运行,因此需要根据实际项目平台,对硬件平台、型号、运算数据的长度等进行设置。如下图所示,在”Device vendor”及”Device type”中选择相应的硬件平台。

 

  1. Custom Code

        主要用于添加用户自定义的后者编译模型时需要的源文件、头文件、头文件夹或者库文件等。

  1. 模型绘制

        参数设置完成后,便可以根据实际逻辑对模型进行设计。如下图所示为stateflow的chart界面,可以选择在其中添加状态、节点、box、simulink组件、图形组件、matlab组件等以完成相应逻辑模型的设计。详细细节将在下一部分进行描述。

  1. 模型仿真

        在模型绘制完成后,需要对模型进行单元仿真测试,以验证设设计的模型能否满足实际的逻辑要求。比较常用的用于单元测试的工具为”test harness”。

        下面将对如何使用test harness对state flow模型进行单元测试进行简要说明。Test harness由被测试模型、信号输入和信号输出三部分组成,并且经过harness进行调试修改后可以保存到原模型中。如果模型不是很复杂的话,可以直接对一个模型整体创建一个test harness模型。如果模型很复杂的话,也可以对模型中的各个子系统分别创建test harness模型,然后分别测试这些模型,之后使用test manager对这些测试用例进行管理。如下图所示为新建test harness模型选项界面:

 

上图中,Name:是给出test harness模型的名称。Save test harness extern...:若勾选该选项,则test harness模型将以一个单独的文件进行保存,反之,将保存在原模型中。Souurces and Sinks:可在其中选择输入信号及输出信号的类型,如下图所示为信号类型选择界面:

 

由上图中可见,输入信号及输出信号的形式很多,输出信号一般保持默认的outport,若想从外部excel中导入信号进行测试,则输入信号选择inport,反之,可选择较为方便使用的test sequence。下面将对如何使用test sequence进行模型的单元测试进行介绍。在创建test harness界面选择完成后,点击OK,将生成如下图所示的一个test harness界面:

 

在上图中,点击输入部分的表格,将弹出一个输入信号的表格,可以在弹出的表格中填入输入、转移条件及转移目标,然后设置好仿真时间,在输出信号端添加,即可点击运行按钮进行测试,双击,可弹出输出信号曲线。如下图所示为输入信号设置的表格:

 

 

上图中第一列为输入信号,第二列为转移条件,第三列为转移目标。以第一行为例,输入信号为RedButtonIN=false,GreenButtonIN=false,转移条件为after(1,sec),转移目标为PressBothButtons,该行意思为设置输入信号RedButtonIN=false,GreenButtonIN=false,在1s之后,输入信号设置为PressBothButtons名称状态下的信号。并且,在调试过程中,可以通过在模型中添加断点的方式查看每个状态转移过程中的输出信号是否满足实际需求。

四、模型绘制

Stateflow提供了一种图形化的语言来帮助我们完成复杂逻辑的开发,包括状态转移图、流程图、状态转移表和真值表。 常用的是stateflow的状态转移图及流程图,下面就其界面内容、状态转移图、流程图三方面进行描述。

  1. 界面内容

如下图所示为stateflow界面,在菜单栏中,可以通过点击”Embedded Coder”来生成嵌入式代码,点击”Simulink test”来做模型的单元测试。在快捷栏中,从下往下依次为zoom(快速放大键)、Fit to view(快速模型适中)、state(图块(状态))、junction(节点)、default transtion(默认转移)、box(图形盒)、simulink function(simulink状态机封装模块)、graphics function(图形函数)、matlab function(matlab脚本函数)、turth table(真值表)、history(历史节点,相当于static,记住离开时的历史状态)、annotion(注释)、image(图片)。

  1. 状态转移图
  1. 状态层次结构

对于多级状态的复杂系统,可以在stateflow图中使用层次结构来表示系统中多个层级的子组件。如下图所示为一个三层级的状态图:

 

如图所示,在一个状态的边界内绘制另一个状态表示内部状态时外部状态的子状态,外部状态时内部状态的父级。

  1. 状态分解

Stateflow图可以组合互斥(OR)和并行(AND)状态:

互斥(OR)状态表示互斥的工作模式。在同一层级上不能有两个互斥状态同时被激活或执行。以实线矩形表示每个互斥状态,如下图所示:

并行(AND)状态表示独立的工作模式。虽然并行状态会依次执行,但是可以有两个或多个并行状态同时处于激活状态。以虚线矩形表示每个并行状态,其中的数字表示执行顺序,如下图所示为A、B两个并行状态,其中A状态的执行顺序优先于B状态的执行顺序:

  1. 状态标签

状态标签显示在状态的长方形框的左上角,一般为以下格式:

name/

entry:entry actions

during:during actions

exit:exit actions

on event_name:on event_name actions

on message_name:on message_name actions

bind:events

如下图所示为状态标签的构成:

 

上图中也同时包含了matlab组件的使用方法,simulink组件的使用与之类似。

  1. 状态名称

状态标签开头为状态名称,其后可接 / 字符。在前面的示例中,状态名称是 On 和 Off。有效的状态名称由字母数字字符组成,可以包含下划线字符 (_)。

  1. 状态动作

在名称后面,可以输入用于该状态的动作语句,对于每种动作类型,可以输入多个动作,以回车符、分号或逗号分隔。可以通过增添on event_name 或 on message_name 行,为一个或多个事件或消息指定动作。

下表所示为不同的状态动作类型:

 

 

 

  1. 时序逻辑

在搭建模型时,还可以根据时序逻辑来完成各个不同状态之间的转移、函数的调用以及变量值的更改。如下图所示为较常见的绝对时间时序逻辑运算符:

每个运算符在满足以下条件时都会将相关联的计时器置零:

①包含运算符的状态重新激活

②包含运算符的转移的原状态重新激活

③duration运算符中的bool条件变为false

另外,某些运算符(如after)支持以秒(sec)、毫秒(msec)和微秒(usec)的基于事件的时序逻辑和绝对时间时序逻辑。

  1. 流程图

Stateflow流程图表示组合逻辑,采用图形化结构,用于对决策树和迭代循环等逻辑模式进行建模。流程图的执行从默认转移开始,到终止节点(没有有效出向转移的节点)结束。

在使用流程图进行模型绘制时,建议将流程图封装在图形函数中,以创建可在图中的任何位置调用的模块化可重用逻辑。

创建流程图时,应遵循以下做法来创建高效准确的流程图:

①仅使用一个默认转移

②仅提供一个终止节点

③将所有转移路径汇聚到终止节点

④为终止节点以外的每个节点提供一个无条件出向转移

⑤使用条件动作而不是转移动作来处理更新

使用流程图,可以实现结构化的程序三种基本的程序结构:顺序结构、选择结构和循环结构。

1.选择结构

(1)if结构

 

 

(2)If else结构

 

(3)Switch case结构

 

2.循环结构

(1)while循环结构

 

(2)do while循环结构

 

(3)for循环结构

 

参考资料

1、

https://blog.csdn.net/qq_44889142/article/details/116985909?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_paycolumn_v3&utm_relevant_index=4

2、使用Simulink Test进行单元测试 - 知乎

3、Simulink Test笔记(含一些小技巧)一_Eigrl的博客-CSDN博客_simulink test

4、

Use External Excel or MAT-File Data in Test Cases- MATLAB & Simulink- MathWorks 中国

5、手把手教用matlab做无人驾驶(十五)--matlab/simulink stateflow学习教程_caokaifa的博客-CSDN博客_stateflow教程

6、https://ww2.mathworks.cn/help/stateflow/getting-started.html?s_tid=CRUX_lftnav

7、状态分解- MATLAB & Simulink- MathWorks 中国

8、状态- MATLAB & Simulink- MathWorks 中国

9、4. Stateflow - 流程图_QWQ-CSDN博客_stateflow流程图

10、Stateflow 中的流程图- MATLAB & Simulink- MathWorks 中国

11、https://ww2.mathworks.cn/help/stateflow/gs/temporal-logic.html

12、https://zhuanlan.zhihu.com/p/103845223

  • 4
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值