Matlab simulink建模与仿真 第十八章(Stateflow状态机)

参考视频:Simulink/stateflow的入门培训_哔哩哔哩_bilibili

一、概述

        Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模与仿真,或者说,Stateflow适用于针对事件响应系统进行建模与仿真。

        下图所示的是TCP状态机,系统每时每刻都会处于一个状态,当满足某些条件后,系统下一时刻的状态可能就会变换并做出指定动作,Stateflow正是用于实现这种复杂的控制逻辑,如果不使用Stateflow,而仅仅依靠Simulink中的其它模块对状态机进行搭建,这样不仅会使建模难度大大提升,还可能会发生系统在同一时刻处于两种状态的情况。

二、基本的Stateflow创建和模块信号交互

1、Stateflow的创建

(1)方法一:在命令行窗口中输入“sfnew”,MATLAB会新建一个模型文件并在其中添加一个状态机。

(2)方法二:直接打开模块库,找到Chart模块并将其拖拽到模型文件中。

(3)方法三:如下图所示,在MATLAB的工具栏中可以直接新建一个模型文件并在其中添加一个状态机。(较低版本的MATLAB可能不支持该方式)

2、模块信号交互

(1)双击Chart模块,即可进入Stateflow的编辑界面。

(2)和其它子系统模块一样,Chart模块可以随意添加输入端口和输出端口,在未旋转的前提下,添加输入端口时将信号线往Chart模块左侧引进,添加输出端口时将信号线往Chart模块右侧引进即可。

(3)使用Chart模块需要对其进行变量管理,按下Ctrl+H可打开模型浏览器,在这里可以更改输入变量、输出变量及内部变量的名称、数据类型等属性。

(4)Chart模块中只可对输出变量和内部变量进行更改,对输入变量只有读的权限。

三、Stateflow中的基础功能块

1、State状态块与Default transition缺省转移

(1)每个状态在Chart模块中对应一个状态块,状态块的添加方式如下图所示,其它模块的添加方式亦是如此。

(2)在添加第一个状态块时会自动为该块添加缺省转移,缺省转移可认为是状态机的入口,决定状态机的初始状态是哪一个状态块,它必须有且每个状态机中只能有一个。

(3)状态块的内容编辑可分为以下几部分:(其中关键词并不是必须都要有,且下面没有列出全部关键词,仅列出了三个常用的)

①状态名称:每个状态的名称置于状态块编辑区首行,其命名规则和一般变量名一样。

②entry关键词:在编辑区中键入“entry:”或者“en:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态被激活时(或者说进入该状态)执行的动作,且只是在进入状态之初执行一次,并不是重复执行。

③exit关键词:在编辑区中键入“exit:”或者“ex:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态退出时执行的动作。

④during关键词:在编辑区中键入“during:”或者“du:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态下重复执行的动作,重复频率取决于仿真步长(在本章中如无特殊说明,所有举例的仿真步长均为0.2s)。

2、transition转移

(1)状态块与状态块之间需要依靠转移线连接,转移线代表状态的转换路径,其编辑区中提供了一对方括号和一对花括号。

①方括号内需要填写转移条件,在有触发事件的前提下也可以不填写,当状态机处于转移线首端的状态,且转移条件为真时(如果有触发事件,事件需要已发生),状态会根据该条转移线进行状态的切换,也就是退出上一个状态并进入下一个状态。(缺省转移没有转移条件)

②花括号内填写的是转移发生时执行的动作(也称条件动作),条件动作可以不填写。

③括号之外可填写触发事件,在有转移条件的前提下也可以不填写,当状态机处于转移线首端的状态,且事件发生时(如果有转移条件,转移条件需要为真),状态会根据该条转移线进行状态的切换。(缺省转移没有触发事件)

④除了缺省转移外,如果转移线不填写转移条件和触发事件,仿真时也能运行,但因为转移没有任何限制,转移线首端的状态仅会持续一个仿真步长就会退出。

(2)点击状态块的边界(除了四个角以外),按住鼠标拖动,即可从状态块引出一条转移线,拖住转移线的末端即可将其连接到其它状态块上(转移线两端可以连在同一个状态块上)。

(3)比较常用的触发事件有时间触发事件after,它有两个参数,第一个是时间参数,第二个是时间单位参数,当进入转移线首端的状态时,after开始计时,当达到计时时间后事件发生。

(4)当一个状态块引出两条转移线时,转移线上会有编号,Chart模块会优先判断编号较小的转移线是否满足转移条件(以下提到的“满足转移条件”均指的是转移条件为真且事件触发)。

(5)当转移线两端连接同一个状态块时,有两种情况:

①转移线在状态块外部:如果转移线生效,当前状态会先退出再重新进入,也就是要执行关键词entry下的代码段。

②转移线在状态块内部:内部的转移线优先判断,如果转移线生效,当前状态不会退出,不会执行关键词entry下的代码段。

3、Junction节点

(1)在Stateflow中,流程图是一种比较特殊的应用,流程图中不包含任何状态,它仅由连接节点和转移线组成,节点之间的转移线连接操作方法和状态块直接转移线的连接操作一样。

(2)由于流程图中没有任何状态,因此不具备任何记忆元件(状态块是记忆元件)。

(3)流程图从检测其默认转移开始,到检测完每一条有效的通路且到达不具备有效出口的转移线为止,简单来说就是从流程图的入口开始“走流程”,直到走到没有通往其它节点转移线的节点为止,这个过程是在一个仿真步长内完成的,这是和状态图最大的区别。

(4)使用节点和转移线搭建逻辑结构:

①选择结构:

[1]单分支if语句:

if <条件表达式>

   <满足条件执行的语句组>

end

[2]双分支if语句:

if <条件表达式>

   <满足条件执行的语句组>

else

   <不满足条件执行的语句组>

end

[3]多分支if语句:(switch语句实际上也是多分支选择结构,只是在流程图中表示起来可能稍微复杂些,这里不进行演示)

if <条件表达式1>

   <满足条件1执行的语句组>

elseif <条件表达式2>

   <不满足条件1而满足条件2执行的语句组>

 ... ...

elseif <条件表达式m>

   <仅满足条件m执行的语句组>

else

   <不满足所有条件执行的语句组>

end

②循环结构:

[1]for循环:

for <循环变量> = <取值列表>    %取值列表通常是一个向量

    <循环体>                 %不要在循环体内改变循环变量的值

end                   %循环语句可以嵌套使用

[2]while循环:

while <条件表达式>

    <循环体>

end                   %循环语句可以嵌套使用

[3]do...while循环:(MATLAB中没有直接提供do...while循环结构的语句)

4、Annotation和Image

(1)Annotation是文字说明模块,相当于程序文字版注释,不会影响状态机。

(2)Image是图片说明模块,相当于程序图片版注释,也不会影响状态机。

四、层次化建模

1、动作执行的顺序

        在系统状态转换时,可能涉及到多个动作,它们是有先后执行顺序的,首先状态机执行转移线上的条件动作,然后执行旧状态退出时需执行的动作,接着执行转移线上的转移动作(转移动作的代码段也用花括号包含,它位于条件动作之后,二者用“/”分隔,不过转移动作使用较少),最后执行新状态进入时需执行的动作。

2、子状态机

(1)和子系统一样,状态块中可以添加“二级状态块”(以下二级状态块所在的状态块称为“一级状态块”)。

(2)当状态机进入一级状态块后,这个一级状态块可视为一个“子状态机”,子状态机和一般的状态机一样,也有缺省转移,这是该子状态机的入口;当从一级状态块引出的转移线有其中一条满足转移条件时,子状态机退出,当前系统状态从一级状态块退出并进入新状态。

(3)子状态机的创建:选中需要添加进子状态机的内容,右键选择“Create Container”→“Create Superstate from Selection”,即可将选中内容封装为一个子状态机(或者说一级状态块)。(“Create Subchart from Selection”用于创建“子Chart模块”,实际上该选项也可用来创建子状态机,本章不对其进行介绍)

(4)子状态机中的二级状态块可以直接引出转移线至主状态机中的一级状态块(包括二级状态块所在的一级状态块)。

(5)子状态机中可以实现并行状态,也就是一个子状态机中可以有不止一个缺省转移,这就意味着子状态机可同时处于两个状态。

①串行(OR逻辑):子状态机每一时刻只可处于一种状态,这种情况直接将一级状态块当作普通状态块进行状态机的搭建即可,不用进行其它处理。

②并行(AND逻辑):子状态机可同时处于不止一种状态,这需要子状态机中有至少两个“孙状态机”,孙状态机之间不需要产生交互,在此基础上右键子状态机(下例中的子状态机名为Main),选择“Decomposition”→“AND(Parallel)”,将子状态机从默认的OR逻辑更改为AND逻辑,这样,孙状态机的边框会变成虚线,说明设置成功。(实际上整个状态机,也就是Chart模块也可以设置成AND逻辑,但不建议这么做)

3、自定义函数

(1)在第十六章中介绍过用户自定义函数,在Stateflow中同样也提供了自定义函数模块,该模块有三种形式,分别为Simulink function、Graphical function和MATLAB function,它们可以用不同的方法实现自定义函数,但是下图“?”处需填写的内容均和自定义函数引导行一样(即“<输出形参列表> = <函数名>(<形参列表>)”)。

(2)Simulink function块:该模块可以以搭建模型的方式定义函数,其中In模块对应输入参数,Out模块对应输出参数,下例中simfcn为函数名,定义该函数后可以在状态机中直接调用,调用规则遵循MATLAB的规则。(值得注意的是,In模块和Out模块的数据类型Data type、信号类型Signal type是否为复数、是否为可变尺寸信号Variable-size signal以及端口数据维度Port dimensions需要明确,不可以是“inherit”,可通过双击输入输出模块进行配置)

(3)Graphical function块:该模块可以以搭建流程图的方式定义函数,输入参数和输出参数在流程图中需要有应用,且不可与其它已定义的变量同名,下例中grafcn为函数名,定义该函数后可以在状态机中直接调用,调用规则遵循MATLAB的规则。

(4)MATLAB function块:该模块可直接用MATLAB语言定义函数,双击该模块可打开代码编辑区,接下来的步骤和编写函数M文件的方法差不多。

function  <输出形参列表> = <函数名>(<形参列表>)

% 注释说明部分(可选)

<函数体语句>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428361.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习:(五)初识神经网络

&#xff08;一&#xff09;神经网络的层数 除去输入层&#xff0c;但包括输出层&#xff0c;每一层都有自己的参数。 输入层称为第零层。 &#xff08;二&#xff09;最简单的神经网络&#xff08;逻辑回归&#xff09; 下图中的小圆圈&#xff0c;代表了一种运算。且一个小…

基于深度学习的花卉智能分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 传统的花卉分类方法通常依赖于专家的知识和经验&#xff0c;这种方法不仅耗时耗力&#xff0c;而且容易受到主观因素的影响。本系统利用 TensorFlow、Keras 等深度学习框架构建卷积神经网络&#…

【第十三章:Sentosa_DSML社区版-机器学习聚类】

目录 【第十三章&#xff1a;Sentosa_DSML社区版-机器学习聚类】 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章&#xff1a;Sentosa_DSML社…

环境搭建2(游戏逆向)

#include<iostream> #include<windows.h> #include<tchar.h> #include<stdio.h> #pragma warning(disable:4996) //exe应用程序 VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT X坐标, SHORT y坐标, WORD UIwide, W…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实&#xff0c;提供互动性强的学习体验&#xff0c;正在改变传统教育模式。AI不仅改变了传统的教学模式&#xff0c;还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务&#xff0c;AI正在全方位提升教育质量和效率。随着…

使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI

目录 概述 1 系统框架介绍 1.1 模块功能介绍 1.2 UI页面功能 2 软件框架结构实现 2.1 软件框架图 2.1.1 应用层API 2.1.2 硬件驱动层 2.1.3 MCU底层驱动 2.2 软件流程图 4 软件功能实现 4.1 状态机功能核心代码 4.2 页面功能函数 4.3 源代码文件 5 功能测试 5.1…

基于多域名,通过云运营商弹性负载,Nginx配置等基于的多租户系统部署

已经开发好久的系统&#xff0c;因为业务上没有需求&#xff0c;没有做上线部署&#xff0c;此系统为多租户系统&#xff0c;原来设计是通过租户码参数来识别的&#xff0c;每个租户访问&#xff0c;需要传自己的码过来&#xff0c;才能确定是哪个租户登录系统&#xff0c; 今…

nacos和eureka的区别详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Nacos 和 Eureka 是两种服务注册与发现的组件&#xff0c;它们在微服务架构中扮演重要角色。两者虽然都是为了解决服务发现的问题&#xff0c;但在功能特性、架构、设计理念等方面有很多不同。以下是详细的…

C++——map和set的使用以及map系列

目录 map和set的使用 1. 序列式容器和关联式容器 2. set系列的使⽤ 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 set的增删查关注以下⼏个接⼝即可&#xff1a; 2.6 find和erase使⽤样例&#xff1a; lower_bound(); upper_bo…

如何选择OS--Linux不同Distribution的选用

写在前言&#xff1a; 刚写了Windows PC的不同editions的选用&#xff0c;趁热&#xff0c;把Linux不同的Distribution选用也介绍下&#xff0c;希望童鞋们可以了解-->理解-->深入了解-->深入理解--...以致于能掌握特定版本的Linux的使用甚者精通。……^.^…… so&a…

项目文件配置

1. 参数配置化 1.1 问题分析 1.2 问题解决 Value 注解通常用于外部配置的属性注入&#xff0c;具体用法为&#xff1a;Value("${配置文件中的key}") 2. yml配置文件 2.1 SpringBoot提供了多种属性配置方式 2.2 常见配置文件格式对比 2.3 yml 基本语法 大小写敏…

实时美颜的技术突破:视频美颜SDK与直播美颜工具的开发详解

如今&#xff0c;视频美颜SDK和直播美颜工具的开发&#xff0c;为各类应用提供了技术支持&#xff0c;使得美颜效果更加智能、高效。本文将详细探讨实时美颜的技术突破及其在视频美颜SDK和直播美颜工具中的应用与开发。 一、视频美颜SDK的核心技术 1.人脸检测与特征点识别 视…

HObject复制耗时试用

测试源码一 //第一步const int N 1000;HObject[] imgs new HObject[N];for (int i 0; i < N; i){HOperatorSet.GenImageConst(out imgs[i], "byte", 1024 i, 1024 i);}//第二步List<HObject> lists new List<HObject>();for(int i 0; i < …

OpenCV特征检测(3)计算图像中每个像素处的特征值和特征向量函数cornerEigenValsAndVecs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算图像块的特征值和特征向量用于角点检测。 对于每一个像素 p &#xff0c;函数 cornerEigenValsAndVecs 考虑一个 blockSize blockSize 的邻…

[Spring]Spring MVC 请求和响应及用到的注解

文章目录 一. Maven二. SpringBoot三. Spring MVC四. MVC注解1. RequestMapping2. RequestParam3. PathVariable4. RequestPart5. CookieValue6. SessionAttribute7. RequestHeader8. RestController9. ResponseBody 五. 请求六. 响应 一. Maven Maven是⼀个项⽬管理⼯具。基于…

JavaScript发送邮件:实现前端触发的教程?

JavaScript发送邮件的方式&#xff1f;怎么使用JavaScript发信&#xff1f; 无论是用户反馈、联系表单还是自动通知&#xff0c;前端触发的邮件发送功能都能极大地提升用户体验。AokSend将详细介绍如何通过JavaScript发送邮件&#xff0c;实现前端触发的邮件发送功能。 JavaS…

力扣 438找到字符串中所有字母异位词

https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 题目描述 题目分析 异位词所表示的空间 P \text{P} P 即一字符串的所有排列,记 s i \bold{s_i} si​为以 s [ i ] s[i] s[i]开头的长度为 plen \text{plen} plen的 s s s子串 故本题可理解为求解 A n s Ans Ans…

LabVIEW提高开发效率技巧----采用并行任务提高性能

在复杂的LabVIEW开发项目中&#xff0c;合理利用并行任务可以显著提高系统的整体性能和响应速度。并行编程是一种强大的技术手段&#xff0c;尤其适用于实时控制、数据采集以及多任务处理等场景。LabVIEW的数据流编程模型天然支持并行任务的执行&#xff0c;结合多核处理器的硬…

Toon Dinosaurs 2 可爱卡通恐龙怪物模型带动画

剑龙、甲龙、厚头龙、副龙、二龙和腕龙使用(根运动)动画文件绘制人物。 动画: 空闲+随机空闲动画跳跃(跳跃、跌倒、落地)。 3攻击 2个被击中,1个死亡和1个起床动画。 咆哮 左转和右转。跑,跑,转身。 最近添加:向前走,转身走。 查看视频以观看动画! 近似三角形计数:…