Matlab simulink上手控制仿真学习笔记3-常用模块S Function及使用案例

在这里插入图片描述
讲得真的十分细致!个人感觉看完前4节就差不多了。

今天记录的是S Function。
内容比较多,加个目录:

  • S Function
  • 前置工作
  • 1.1 parameter.m
  • 1.2 plant.m
    • function [sys,x0,str,ts,simStateCompliance] = plant(t,x,u,flag,pa)
    • function [sys,x0,str,ts]=mdlInitializeSizes
    • function sys=mdlDerivatives(t,x,u,pa)
    • function sys=mdlOutputs(t,x,u)
  • 1.3 ctrl.m
    • function [sys,x0,str,ts,simStateCompliance] = ctrl(t,x,u,flag,pa)
    • function [sys,x0,str,ts]=mdlInitializeSizes
    • function sys=mdlOutputs(t,x,u)
  • 1.4 signal.m
    • function [sys,x0,str,ts,simStateCompliance] = plant(t,x,u,flag,pa)
    • function [sys,x0,str,ts]=mdlInitializeSizes
    • function sys=mdlOutputs(t,x,u)
  • 1.5 simulink系统搭建
  • 1.6 demo_plot.m

S Function

可以用Matlab Function轻松搭建方程,(长得下面这样子),具体看视频的

第3节:S-Function/S函数,一个实例带你直接上手(非线性反步法搭建)

第4节:S-Function/S函数补充,滑模控制器完整搭建

演示的是这个方程

在这里插入图片描述

前置工作

在工作目录下创建四个函数:

plant.m 描述物理方程
ctrl.m 描述控制律
parameter.m 描述常数
demo_plot.m 绘制图形

下面我们依次讲怎么写这些函数。

1.1 parameter.m

写入我们要的参数。

pa.k=8;
pa.m=1;
pa.k1=1;
pa.k2=1;
pa.A=5;%生成信号使用
pa.T=20;%生成信号使用

在这里插入图片描述
填写好以后运行一下,让pa在工作区中可以被调用。

1.2 plant.m

对应公式:

在这里插入图片描述

输入u,输出 x 1 x_1 x1 x 2 x_2 x2.
没有直接馈入。

在命令行输入edit sfuntmpl

调出S function的模板:

在这里插入图片描述
把模板里的内容复制到plant.m中,然后把sfuntmpl改成plant。注意我们调用parameter.m里的pa结构体参数,我们需要注意在用到pa的地方都加上pa。
在这里插入图片描述

在这里插入图片描述

function [sys,x0,str,ts,simStateCompliance] = plant(t,x,u,flag,pa)

function [sys,x0,str,ts,simStateCompliance] = plant(t,x,u,flag,pa)

switch flag,

  %%%%%%%%%%%%%%%%%%
  % Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

  %%%%%%%%%%%%%%%
  % Derivatives %
  %%%%%%%%%%%%%%%
  case 1,
    sys=mdlDerivatives(t,x,u,pa);

  %%%%%%%%%%
  % Update %
  %%%%%%%%%%
  case 2,
    sys=mdlUpdate(t,x,u);%连续系统不用管

  %%%%%%%%%%%
  % Outputs %
  %%%%%%%%%%%
  case 3,
    sys=mdlOutputs(t,x,u);

  %%%%%%%%%%%%%%%%%%%%%%%
  % GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);

  %%%%%%%%%%%%%
  % Terminate %
  %%%%%%%%%%%%%
  case 9,
    sys=mdlTerminate(t,x,u);

  %%%%%%%%%%%%%%%%%%%%
  % Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

end

function [sys,x0,str,ts]=mdlInitializeSizes

设置初始化。

如图输入不是直通的, x 1 x_1 x1 x 2 x_2 x2的表达式并没有 u u u x 2 x_2 x2的导数和 u u u有关系,但是 x 2 x_2 x2并没有直接和 u u u直接产生关系。
在这里插入图片描述
在这里插入图片描述

function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 2;%连续状态个数为2:x_1和x_2,因为采用连续采样周期仿真
sizes.NumDiscStates  = 0;%离散状态个数为0
sizes.NumOutputs     = 2;%输出量为2个:x_1和x_2
sizes.NumInputs      = 1;%输入量为1个,u
sizes.DirFeedthrough = 0;%方程中输入没有直馈于输出
sizes.NumSampleTimes = 1;%采样周期数是1,默认就不动
sys = simsizes(sizes);
x0=[0,0]:%初始化输出值x_1和x_2都是0
str=[]:%无其他说明
ts=[0 0]:%连续采样,第一个值为0(每隔0秒采样一次),没有偏移,第二个值也设为0

function sys=mdlDerivatives(t,x,u,pa)

设置微分方程。
在这里插入图片描述
输出是左边的导数项,输入是 x 1 x_1 x1 x 2 x_2 x2 u u u,然后 k k k m m m是常数从parameter结构体中获取。函数的输入项注意要加上pa。
在这里插入图片描述

function sys=mdlDerivatives(t,x,u,pa)
k=pa.k;
m=pa.m;

x1=x(1);
x2=x(2);

dx1=x(2);
dx2=-k/m*x1^3+1/m*u;
sys = [dx1;dx2];

function sys=mdlOutputs(t,x,u)

设置输出,我们输出的是x。

function sys=mdlOutputs(t,x,u)

sys = x;

1.3 ctrl.m

设置控制律。

在命令行输入edit sfuntmpl

调出S function的模板:

在这里插入图片描述
把模板里的内容复制到ctrl.m中,然后把sfuntmpl改成ctrl。注意我们调用parameter.m里的pa结构体参数,我们需要注意在用到pa的地方都加上pa。

在这里插入图片描述

在这里插入图片描述

function [sys,x0,str,ts,simStateCompliance] = ctrl(t,x,u,flag,pa)

function [sys,x0,str,ts,simStateCompliance] = ctrl(t,x,u,flag,pa)

switch flag,

  %%%%%%%%%%%%%%%%%%
  % Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

  %%%%%%%%%%%%%%%
  % Derivatives %
  %%%%%%%%%%%%%%%
  case 1,
    sys=mdlDerivatives(t,x,u);

  %%%%%%%%%%
  % Update %
  %%%%%%%%%%
  case 2,
    sys=mdlUpdate(t,x,u);%连续系统不用管

  %%%%%%%%%%%
  % Outputs %
  %%%%%%%%%%%
  case 3,
    sys=mdlOutputs(t,x,u,pa);

  %%%%%%%%%%%%%%%%%%%%%%%
  % GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);

  %%%%%%%%%%%%%
  % Terminate %
  %%%%%%%%%%%%%
  case 9,
    sys=mdlTerminate(t,x,u);

  %%%%%%%%%%%%%%%%%%%%
  % Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

end

function [sys,x0,str,ts]=mdlInitializeSizes

设置初始化。

对应公式:

在这里插入图片描述

输入 x 1 d x_{1d} x1d x ˙ 1 d \dot{x}_{1d} x˙1d x ¨ 1 d \ddot{x}_{1d} x¨1d x 1 x_1 x1 x 2 x_2 x2,共5个.输出 u u u,共1个。

是直接馈入。如图输入是直通的, u u u的输出直接和五个输入参数有关。
在这里插入图片描述
在这里插入图片描述

注意没有状态变量,连续状态和离散状态都是0。

function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;%连续状态个数为0,没有状态
sizes.NumDiscStates  = 0;%离散状态个数为0,没有状态
sizes.NumOutputs     = 1;%输出量为1个:u
sizes.NumInputs      = 5;%输入量为5个,$x_{1d}$、$\dot{x}_{1d}$、$\ddot{x}_{1d}$、$x_1$和$x_2$
sizes.DirFeedthrough = 1;%方程中输入有直馈于输出
sizes.NumSampleTimes = 1;%采样周期数是1,默认就不动
sys = simsizes(sizes);
x0=[]:%没有状态变量
str=[]:%无其他说明
ts=[0 0]:%连续采样,第一个值为0(每隔0秒采样一次),没有偏移,第二个值也设为0

function sys=mdlOutputs(t,x,u)

设置输出,用到了parameter的参数所以要在输入参数中添加pa,和前面是一样的。

在这里插入图片描述

function sys=mdlOutputs(t,x,u,pa)

k=pa.k;
m=pa.m;
k1=pa.k1;
k2=pa.k2;

x1d=u(1);
dx1d=u(2);
ddx1d=u(3);
x1=u(4);
x2=u(5);

e1=x1d-x1;
e2=dx1d+k1*e1-x2;

uc = m*e1+m*ddx1d+m*k1*(dx1d-x2)+k*x1^3+m*k2*e2;
sys = uc;

1.4 signal.m

function [sys,x0,str,ts,simStateCompliance] = plant(t,x,u,flag,pa)

用到了parameter参数中的pa,注意加上。

在这里插入图片描述
在这里插入图片描述

function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag,pa)

switch flag,

  %%%%%%%%%%%%%%%%%%
  % Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

  %%%%%%%%%%%%%%%
  % Derivatives %
  %%%%%%%%%%%%%%%
  case 1,
    sys=mdlDerivatives(t,x,u);

  %%%%%%%%%%
  % Update %
  %%%%%%%%%%
  case 2,
    sys=mdlUpdate(t,x,u);

  %%%%%%%%%%%
  % Outputs %
  %%%%%%%%%%%
  case 3,
    sys=mdlOutputs(t,x,u,pa);

  %%%%%%%%%%%%%%%%%%%%%%%
  % GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);

  %%%%%%%%%%%%%
  % Terminate %
  %%%%%%%%%%%%%
  case 9,
    sys=mdlTerminate(t,x,u);

  %%%%%%%%%%%%%%%%%%%%
  % Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

end

function [sys,x0,str,ts]=mdlInitializeSizes

信号我们给的是一个正弦信号:
x 1 d = A sin ⁡ ( 2 π T t ) x ˙ 1 d = A 2 π T cos ⁡ ( 2 π T t ) x ¨ 1 d = − A ( 2 π T ) 2 sin ⁡ ( 2 π T t ) \begin{aligned}x_{1d}&=A\sin\left(\frac{2\pi}{T}t\right)\\ \dot{x}_{1d}&=A\frac{2\pi}{T}\cos\left(\frac{2\pi}{T}t\right)\\ \ddot{x}_{1d}&=-A\left(\frac{2\pi}{T}\right)^2\sin\left(\frac{2\pi}{T}t\right)\end{aligned} x1dx˙1dx¨1d=Asin(T2πt)=AT2πcos(T2πt)=A(T2π)2sin(T2πt)

三个输出,零个输入,没有反馈直通,无状态变量。信号的导数建议不要使用simulink自带的微分模块,容易出现突变导致仿真的失真。

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes

sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 3;%三个输出
sizes.NumInputs      = 0;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);

x0  = [];
str = [];
ts  = [0 0];

function sys=mdlOutputs(t,x,u)

设置输出,用到了parameter的参数所以要在输入参数中添加pa,和前面是一样的。

在这里插入图片描述

function sys=mdlOutputs(t,x,u,pa)

A=pa.A;
T=pa.T;

x1d=A*sin(2*pi/T*t);
dx1d=2*pi/T*A*cos(2*pi/T*t);
ddx1d=-(2*pi/T)^2*sin(2*pi/T*t);

sys = [x1d;dx1d;ddx1d];

1.5 simulink系统搭建

打开simulink,双击鼠标输入S function。
在这里插入图片描述

选择后然后双击。把Function名称改作我们刚刚设置的函数(下面是ctrl的设置)。注意参数加上pa(外部参数),如果有多个参数就用逗号隔开。外部参数就是上面说的除了模板里原有参数其他的参数。

在这里插入图片描述
在这里插入图片描述

变成这样

在这里插入图片描述

最后连线成这样。我保存为demo_sim.slx,其他名字也可以。
在这里插入图片描述
我们设置一下求解器

在这里插入图片描述
设置仿真为定步长,步长是0.001.定步长速度比变步长慢,但是精度更高,曲线更加平滑。

在这里插入图片描述
仿真时间设置为50s。
在这里插入图片描述

运行:

在这里插入图片描述
在scope我们看到仿真结果,可以看到较好地进行了跟踪。
在这里插入图片描述
选择视图->样式。

在这里插入图片描述
我们可以打开样式调整一下画面线型、线宽、画布颜色等。我设置了图窗、坐标区、各个线条属性。

在这里插入图片描述

在这里插入图片描述
还可以添加图例。
在这里插入图片描述

在这里插入图片描述

如果想把simulink的数据导出到matlab的工作区。需要添加 to workspace模块。

在这里插入图片描述
我们双击修改一下名字叫x.并以数组的形式输出。

在这里插入图片描述

在这里插入图片描述

我们看到前面有一个out.,默认是以结构体的形式输出到工作区的。我们可以再模型设置里设置不要以结构体输出:

在这里插入图片描述
在这里插入图片描述
就没有前面的out了。连接一下。
在这里插入图片描述

工作区就出现了时间tout和我们要的x。
在这里插入图片描述
我们双击看一下x。
第一列是x1d,第二列是x1。

现在工作区有了数据,我们可以自定义画图了!

1.6 demo_plot.m

新建一个画图的m文件demo_plot.m

figure;
plot(tout,x(:,1),'k',...
    tout,x(:,2),'r:','LineWidth',2);
legend('x1d','x1');
title('Position Tracking');
xlabel('t/s');
ylabel('Position/mm')

就可以自定义自己想要的图了!
在这里插入图片描述
上述文件可以在我的资源Matlab Simulink S函数使用实例(有讲解)中找到。

其他参考资料

  1. Matlab S-function 使用总结
  2. S-function入门及案例详解(1)——S-function基础介绍及基本案例
  3. S-function入门及案例详解(2)——S-function基本案例介绍
  4. S-function入门及案例详解(3)——S-function进阶案例
  5. S-function入门及案例详解(4)——S-function进阶案例之连续/离散状态空间表达式的S-function实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Kubernetes部署篇:Ubuntu20.04基于containerd二进制部署K8S 1.24.12集群(一主多从)》

一、架构图 如下图所示: 如下图所示: 二、环境信息 1、部署规划 主机名IP地址操作系统内核版本软件说明etcd01192.168.1.62Ubuntu 20.04.5 LTS5.15.0-69-genericetcd02192.168.1.63Ubuntu 20.04.5 LTS5.15.0-69-genericetcd03192.168.1.64Ubuntu 20.04.…

第三章 运算符

文章目录1. 什么是运算符2 算术运算符2.1 基本四则运算符 、-、*、/、%2.2 增量赋值运算符 、- 、* 、/ 、%2.3 自增/自减运算符 、--3. 关系运算符4. 逻辑运算符5. 位运算符6. 移位运算7. 条件运算符8. 运算符的优先级1. 什么是运算符 计算机的最基本的用途之一就是执行数学运…

Web Components 技术分析

简括: Web Components 基于四个主要的规范: Custom Elements,Shadow DOM,HTML Templates 和 HTML Imports。 Custom Elements 可以让开发人员创建自定义的 HTML 标签。 Shadow DOM 可以让开发人员将样式和行为封装到自定义元素内…

C/C++|物联网开发入门+项目实战|C语言基础|玩转c代码---从输入输出开始-学习笔记(6)

文章目录玩转c代码---从输入输出开始参考教程:C语言编程:一本全面的C语言入门教程(第3版)第16章需要掌握的内容需要了解的内容常见的人机交互接口串口的输入输出PC常用的几个输入输出函数示例代码3 printf函数使用难点分析A.格式控制字符串的基本形式:示…

今天给大家介绍一篇基于springboot的医院管理系统的设计与实现

临近学期结束,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问题,今天给大家介绍一篇基…

APK一键注入网络验证后台PHP源码ThinkPHP开发版

APK一键注入网络验证后台PHP源码ThinkPHP开发版 APK一键注入网络验证后台PHP源码ThinkPHP开发版 源码: https://url11.ctfile.com/d/25976711-55383299-827d49?p6724 (访问密码:6724) 修复 已去除登录提示到期问题。 功能简介 - 无注…

软考-套接字(scoket)

💤SocketSocket套接字:是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。将OSI模型中从传输层到物理层封装起来的抽象层,把网络协议隐藏在Socket抽象层中,只对使用者暴露API接口&#xff0c…

Redis实现分布式锁原理和Redisson框架实现分布式锁,全网最详细讲解

声明:我的大部分篇幅都讲的分布式锁的原理和实现,如果想直接用Redisson框架实现分布式锁,可以直接翻至最后面 关于分布式锁,适用于并发量特别大的微服务集群,能做到同步的实现资源的获取 我其实没有经过真实项目的分布…

【ROS2指南-1】配置ROS2环境

资料来源Configuring your ROS 2 environment — ROS 2 Documentation: Dashing documentationhttp://docs.ros.org/en/dashing/Tutorials/Configuring-ROS2-Environment.html 目标:本教程将向您展示如何准备 ROS 2 环境。 教程级别:初学者 时间&…

MyBatis(十一)、MyBatis查询语句专题

准备工作: 模块名:mybatis-007-select 打包方式:jar 引入依赖:mysql驱动依赖、mybatis依赖、logback依赖、junit依赖。 引入配置文件:jdbc.properties、mybatis-config.xml、logback.xml 创建pojo类:Car 创…

【华为机试真题详解JAVA实现】—从单向链表中删除指定值的节点

目录 一、题目描述 二、解题代码 一、题目描述 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 链表的值不能重复。 构造过程,例如输入一行数据为: 6 2 1 2 3 2 5 1 4 5 7 2 2 则第一个参数6表示输入总共6个节点,…

AI又进化了,声音克隆革命性突破

大家好,我是 Jack。 因 ChatGPT、Stable Diffusion 让 AI 在文本、图像生成领域火出了圈。 但 AI 在生成方面的能力,可不仅如此,音频领域也出现了很多优秀的项目。 我用我本人的音频数据,训练了一个 AI 模型,生成了…

数据结构系列17——lambda表达式

目录 1. 基本概念 2. 基本语法 3. 函数式接口 4. Lambda表达式的基本使用 4.1 语法精简 5. 变量捕获 6. Lambda在集合当中的使用 1. 基本概念 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一…

循环依赖详解及解决方案

介绍 上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办法完整创建造成失败. 循环依赖代码演示 public class Demo {public static void main(String[] args) {new Demo1();} }class Demo1…

打造出ChatGPT的,是怎样一群人?

震惊世界的ChatGPT,要多少人才能开发出来?几百,还是几千? 答案是:87个人。 老实说,刚看到这个数字真是惊到我了,印象里,之前看媒体报道各大巨头人工智能人才储备时,动辄…

长草

4 5 .g… … …g… … 2 gggg. gggg. ggggg .ggg. #include <iostream> using namespace std;int r,l;char arr[1005][1005];int t;char dp[1005][1005]; int dx[4]{0,0,1,-1},dy[4]{1,-1,0,0}; void dfs(int x,int y) {for(int i0;i<4;i){int axdx[i];int bydy[i];if…

Qt Quick - 分隔器综述

Qt Quick - 分隔器综述一、概述二、MenuSeparator 控件1. 用法&#xff1a;三、ToolSeparator 控件1. 用法一、概述 Qt Quick Controls 提供了多种分隔符&#xff0c;其实就是分割一下MenuBar和ToolBar里面的内容。 控件功能MenuSeparator将菜单中的一组项目与相邻项目分开To…

dolphinscheduler资源中心

资源中心 资源中心介绍 资源中心提供文件管理&#xff0c;UDF管理&#xff0c;任务组管理。 文件管理可以访问要执行的hive的sql文件 UDF管理可以放置fllink执行的自定义udf函数jar包&#xff0c;hive自定义的UDF函数jar包 以上的*.sql,*.jar文件可以理解为资源&#xff0c…

【服务器数据恢复】 重装系统导致xfs文件系统分区丢失的数据恢复案例

服务器数据恢复环境&#xff1a; EMC某型号存储&#xff0c;20块磁盘组建raid5磁盘阵列&#xff0c;划分2个lun。 服务器故障&#xff1a; 管理员执行重装系统操作后发现分区发生改变&#xff0c;原先的sdc3分区丢失&#xff0c;该分区采用xfs文件系统&#xff0c;存储了公司重…

红队内网靶场

文章目录开篇介绍靶场介绍靶场下载以及配置Tomcat Get Shell突破DMZ防火墙拿下域内成员机器将内网机器上线到CS使用Adfind侦察子域信息控制子域DCRadmin登录子域进行权限维持(白银票据/ACL)子域bloodhound获取父域信息分析子域Krbtgt密钥创建跨域金票Dcsync父域PTH父域DC准备打…