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

news2025/2/25 18:04:25

在这里插入图片描述
讲得真的十分细致!个人感觉看完前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实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三电技术(电池(BMS)、电驱(MCU)、电控(VCU))

三电技术 1、概述 三电技术不仅是新能源汽车的核心技术,也是基础性技术。 三电是指电池,电驱(电机),电控,简称 BMC。 2、电池 为了区分新能源汽车上的低压电池将其称为动力电池,“动力电池“也是行业术语。动力电…

毫无废话,四个小案例手把手教你Vue2基础轻松入门_学习笔记

四个小案例手把手教你Vue2基础轻松入门_学习笔记 本文将通过四个小案例介绍Vue2学习 根据 黑马程序员vue前端基础教程-4个小时带你快速入门vue 教程。 因教程中的网络项目和综合项目难度不高,且内容仅为综合使用,本笔记不另介绍。 * 源自教程&#xff0c…

【Linux】网络编程之套接字 --TCP

目录🌈前言🌸1、TCP相关API🍡1.1、socket函数🍢1.2、bind函数🍧1.3、listen函数🍨1.4、accept函数🍰1.5、connect函数🌺2、TCP网络编程🍡2.1、简单TCP通信程序 -- 多进程…

【redis】验证redis是否正常运行以及报错解决方案

Redis 出现 “(error) NOAUTH Authentication required.” 错误,意味着客户端尝试向 Redis 服务器发送命令,但未提供身份验证或提供的身份验证信息不正确。这通常是由于 Redis 实例开启了密码认证机制导致的。 为了解决该问题,可以尝试以下…

代码随想录算法训练营第六天|242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和

文章目录哈希表242 有效的字母异位词思路代码总结349 两个数组的交集思路代码总结202 快乐数思路代码总结1 两数之和思路代码总结哈希表 哈希碰撞:拉链法(链表)线性探测法(顺序向后) std::unordered_map, std::unorde…

LinuxGUI自动化测试框架搭建(四)-Hyper-V上安装Ubuntu操作系统

(四)-Hyper-V上安装Ubuntu操作系统 1 Ubuntu下载1.1 下载地址1.2 下载说明2 Hyper-V上安装Ubuntu2.1 创建虚拟机2.2 安装Ubuntu系统3 设置虚拟你网络4 关闭虚拟机检查点并移除DVD驱动器5 启动虚拟机6 配置Ubuntu网络7 网络测试1 Ubuntu下载 1.1 下载地址 官网地址:https://…

(十五)排序算法-归并排序

1 基本介绍 1.1 概述 归并排序(Merge Sort)是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。 将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数&…

华为浮动路由和BFD配置

拓扑图 电脑配置 pc1:192.168.10.1/24 pc2:192.168.20.1/24 AR1路由器配置 配置4个接口的地址 ge0/0/0:192.168.10.254/24 ge0/0/1:192.168.20.254/24 ge0/0/2:12.1.1.1/30 ge4/0/0:13.1.1.1/30 <Huawei>system-view Enter system view, return user view with CtrlZ…

机器学习笔记之正则化(五)Dropout

机器学习笔记之正则化——Dropout引言引子&#xff1a;题目描述(正则化相关)正确答案&#xff1a;ABCD\mathcal A\mathcal B\mathcal C\mathcal DABCD题目解析回顾&#xff1a;集成学习方法&#xff1a;Bagging\text{Bagging}BaggingDropout\text{Dropout}Dropout方法深度神经网…

黑马程序员微服务技术栈教程 - 1. SpringCloud 微服务治理

教程链接&#xff1a;https://www.bilibili.com/video/BV1LQ4y127n4 黑马的资料下载链接&#xff1a;https://pan.baidu.com/s/1zRmwSvSvoDkWh0-MynwERA&pwd1234 目录认识微服务单体架构分布式架构微服务微服务结构微服务技术对比SpringCloud总结 &#x1f380;服务拆分及远…

刷题day54:柱形图中最大矩形

题意描述&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 暴力方法&#xff1a; class Solution { public:int largestRectangleArea(ve…

软考第四章 局域网与城域网

局域网与城域网 传统局域网&#xff08;LAN&#xff09;是分组广播式网络&#xff0c;这是与分组交换式的广域网的主要区别。广播技术中&#xff0c;所有工作站都连接到共享的传输介质上&#xff0c;共享信道的分配技术是局域网的核心技术&#xff0c;而这一技术又与网络的拓扑…

故障分析 | 从一则错误日志到 MySQL 认证机制与 bug 的深入分析

作者&#xff1a;李锡超 一个爱笑的江苏苏宁银行 数据库工程师&#xff0c;主要负责数据库日常运维、自动化建设、DMP平台运维。擅长MySQL、Python、Oracle&#xff0c;爱好骑行、研究技术。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得…

Redis的MoreKey和BigKey问题

文章目录1、MoreKey案例2、BigKey案例1、MoreKey案例 大批量往Redis里面插入200w测试数据key 在Linux Bash下面执行&#xff0c;插入200w数据 for((i1;i<200*10000;i)); do echo "set k$i v$i">>/root/redisTest.txt;done;使用命令 tail -10 redisTest.t…

Android四大组件之 Activity的启动过程源码解析

前言 Activity是Android中一个很重要的概念&#xff0c;堪称四大组件之首&#xff0c;关于Activity有很多内容&#xff0c;比如生命周期和启动Flags&#xff0c;这二者想要说清楚&#xff0c;恐怕又要写两篇长文&#xff0c;更何况分析它们的源码呢。不过本文的侧重点不是它们…

小黑向携程进攻啦1:跟紧沛奇老师的携程步伐

为什么要学 异步非阻塞、asynciotornado、fastapi、django 3.x asgi、aiohttp都在异步->提升功能 如何讲解&#xff1f; 协程asyncio模块进行异步编程实战案例 1.协程 协程不是计算机提供&#xff0c;程序员人为创造出来的。协程&#xff0c;又称微线程&#xff0c;是一…

共聚焦显微镜——光伏产业制造智能化测量新技术

我国智能光伏应用持续升级&#xff0c;产业各环节产量又创新高。根据光伏行业规范公告企业信息和行业协会预测的数据来看&#xff0c;全国多晶硅、组件产量同比增长均超过60%&#xff0c;晶硅电池产品出口同比增长超过156%。 以共聚焦显微测量技术为原理、应用于材料生产领域的…

STM32的SRAM

文章目录SRAM的概念XM8A51216介绍特点连接线原理框图硬件连接图SRAM的配置使能 FSMC 时钟&#xff0c;并配置 FSMC 相关的 IO 及其时钟使能初始化FSMC&#xff0c;设置FSMC BANK1区域3使能 BANK1 区域 3FSMC读写代码SRAM的概念 SRAM的介绍 STM32F407ZGT6自带了 192K字节的 SRA…

[助人为乐]层次分析法

朋友论文需要用到层次分析法。于是回顾了一下。 相关资料推荐 层次分析法(AHP) 层次分析法&#xff08;AHP&#xff09;详细版本 用人话讲明白AHP层次分析法&#xff08;非常详细原理简单工具实现&#xff09; 层次分析法的流程图 构建层次结构模型(目标-准则-方案层) 深入…

认证服务---OAuth2.0基本介绍,微博登录整合到实际项目中【下篇】

前言 上一篇简单介绍了它的基本使用&#xff0c;这一篇就粗略说明一下如何在项目中实际应用 1、核心代码 1.1 认证微服务 当你进行了授权之后&#xff0c;跳转到一个新的地址。这个地址应该是你访问接口的地址。在这个接口中完成相应的access_token获取&#xff0c;以及调用…