当前位置: 首页 > news >正文

MATLAB实战 | S函数的设计与应用

S函数用于开发新的Simulink通用功能模块,是一种对模块库进行扩展的工具。S函数可以采用MATLAB语言、C、C++、FORTRAN、Ada等语言编写。在S函数中使用文本方式输入公式、方程,非常适合复杂动态系统的数学描述,并且在仿真过程中可以对仿真进行更精确的控制。

S函数称为系统函数(System Function),采用非图形化的方式描述功能块。MATLAB语言编写的S函数可以充分利用MATLAB所提供的丰富资源,方便地调用各种工具箱函数和图形函数; 使用C语言编写的S函数可以实现对操作系统的访问,如实现与其他进程的通信和同步等。非MATLAB语言编写的S函数需要用编译器生成MEX文件。本文介绍用MATLAB语言设计S函数的方法,并通过例子介绍S函数的应用。

01、用MATLAB语言编写S函数

S函数有固定的程序格式,可以从Simulink提供的S函数模板程序开始构建自己的S函数。

1. 主程序

S函数主程序的引导语句如下:

图片

其中,fname是S函数的函数名,t、x、u、flag分别为仿真时间、状态向量、输入向量和子程序调用标志。flag控制在仿真的各阶段调用S函数的哪一个子程序,其含义和有关信息如表1所示。Simulink每次调用S函数时,必须给出这4个参数。sys、x0、str和ts是S函数的返回参数。sys是一个返回参数的通用符号,它得到何种参数,取决于flag值。例如,flag = 3时,sys得到的是S函数的输出向量值。x0是初始状态值,如果系统中没有状态变量,x0将得到一个空阵。str仅用于系统模型同S函数API(应用程序编程接口)的一致性校验。对于M文件S函数,它将被置成一个空阵。ts是一个两列矩阵,一列是S函数中各状态变量的采样周期,另一列是相应的采样时间的偏移量。采样周期按递增顺序排列,ts中的一行对应一个采样周期。对于连续系统,采样周期和偏移量都应置成0。如果取采样周期为-1,则将继承输入信号的采样周期。

■ 表1 flag参数的含义

 

此外,在主程序输入参数中还可以包括用户自定义参数表: p1、p2、…、pn,这也就是希望赋给S函数的可选变量,其值通过相应S函数的参数对话框设置,也可以在命令行窗口赋值。于是S函数主程序的引导语句可以写成:

图片

主程序采用switch语句,引导Simulink到正确的子程序。

2. 子程序

S函数M文件共有6个子程序,供Simulink在仿真的不同阶段调用,这些子程序的前缀为mdl。每一次调用S函数时,都要给出一个flag值,实际执行S函数中与该flag值对应的那个子程序。Simulink在仿真的不同阶段,需要调用S函数中不同的子程序。

(1) 初始化子程序mdlInitializeSizes。子程序mdlInitializeSizes定义S函数参数,如采样时间、输入量、输出量、状态变量的个数以及其他特征。为了向Simulink提供这些信息,在子程序mdlInitializeSizes的开始处应调用simsizes函数,这个函数返回一个sizes结构,结构的成员sizes.NumContStates、sizes.NumDiscStates、sizes.NumOutputs和sizes.NumInputs分别表示连续状态变量的个数、离散状态变量的个数、输出的个数和输入的个数。这4个值可以置为-1,使其大小动态改变。成员sizes.DirFeedthrough是直通标志,即输入信号是否直接在输出端出现的标志,是否设定为直通,取决于输出是否为输入的函数,或者是取样时间是否为输入的函数。1表示yes,0表示no。成员sizes.NumSampleTimes是模块采样周期的个数,一般取1。

按照要求设置好的结构sizes用sys = simsizes(sizes)语句赋给sys参数。除了sys外,还应该设置系统的初始状态变量x0、说明变量str和采样周期变量ts。

(2) 其他子程序。状态的动态更新使用mdlDerivatives和mdlUpdate两个子程序,前者用于连续模块的状态更新,后者用于离散状态的更新。这些函数的输出值,即相应的状态,均由sys变量返回。对于同时含有连续状态和离散状态的混合系统,则需要同时写出这两个函数来分别描述连续状态和离散状态。

模块输出信号的计算使用mdlOutputs子程序,系统的输出仍由sys变量返回。

一般应用中很少使用flag为4和9的情况,mdlGetTimeOfNextVarHit和mdlTerminate两个子程序较少使用。

02、S函数的应用

下面来看用M文件编写S函数的例子。

【例1】采用S函数实现y=k(1+x),即把一个输入信号加1后放大k倍。

(1) 编写S函数,程序如下:

S函数 timek.m,其输出是输入加1的k倍
function[sys,x0,str,ts]= timek(t,x,uflag,k)
switch flag,
case 0
[sys,x0,str,ts]= mdlInitializeSizes;//初始化
case 3
sys = mdlOutputs(t,x,u,k);//计算输出量
case{1,2,4,9)
sys =[];
otherwise
error(num2str(flag));//出错处理
end
//mdlInitializeSizes:当 flag 为0时进行整个系统的初始化
functionsys,x0,str,ts]= mdlInitializeSizes()
//调用函数 simsizes 以创建结构 sizes
sizes = simsizes;
//用初始化信息填充结构 sizes
sizes.NumContStates = 0;//无连续状态
sizes.NumDiscStates = 0://无离散状态
sizes.NumOutputs = 1;//有一个输出量
sizes.NumInputs = 1;//有一个输入量
sizes.DirFeedthrough = 1;//有一个输入量
sizes.NumSampleTimes =1;//输出量中含有输入量
//根据上面的设置设定系统初始化参数
sys = simsizes(sizes);
//给其他返回参数赋值
x0[];
//设置初始状态为零状
str=[];
ts=[-1,0];//将 str 变量设置为空字符串%假定继承输入信号的采样周期
//mdlOutputs当 flag 值为3 时,计算输出量
function sys = mdlOutputs(t,x,u,k)
sys=k*(1+u)

将该程序以文件名timek.m存盘。编好S函数后,就可以对该模块进行测试了。

(2) S函数模块的测试。建立S-Function模块和编写的S函数文件之间的联系。新建一个模型,向模型编辑窗口中添加User-Defined Functions模块库中的S-Function模块,还有Sine Wave模块和Scope模块,构建如图1所示的仿真模型。

■ 图1 S函数仿真模型

在模型编辑窗口中双击S-Function模块,打开其参数对话框,在“S-function名称”框中填入S函数名timek,在“S-function参数”框中填入外部参数k,如图2所示。如果有多个外部参数,参数之间用逗号分隔。k可以在MATLAB工作区用命令定义。当输入k的值为5时,运行得到的仿真结果如图3所示。

■ 图2 S函数参数对话框

 

■ 图3 S函数的仿真结果

相关文章:

MATLAB实战 | S函数的设计与应用

S函数用于开发新的Simulink通用功能模块,是一种对模块库进行扩展的工具。S函数可以采用MATLAB语言、C、C、FORTRAN、Ada等语言编写。在S函数中使用文本方式输入公式、方程,非常适合复杂动态系统的数学描述,并且在仿真过程中可以对仿真进行更精…...

Day41 使用listwidget制作简易图片播放器

1.简介 使用QlistWidget实现简易图片播放器,可以打开一个图片序列,通过item的单击事件实现图片的切换,通过设置list的各种属性实现图片预览的显示,美化滚动条即可实现一个简易图片播放器。 2.效果 3.实现步骤: 1.初始…...

matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航

1、内容简介 略 25-可以交流、咨询、答疑 2、内容说明 基于卡尔曼滤波的GPS-INS的数据融合的导航 "基于卡尔曼滤波的GPS-INS的数据融合的导航 基于卡尔曼滤波实现GPS-INS组合导航系统" 卡尔曼滤波、GPS、INS、数据融合、导航 3、仿真分析 4、参考论文 略 …...

vivado实现分析与收敛技巧6-策略建议

典型时序收敛策略需运行大量实现策略并选取其中最佳的策略以供在实验室内应用。 ML 策略同样可选 , 且只需您运行3 项策略即可达成类似的 QoR 收益。这些策略使用机器学习来检验布线后设计的各项功能特性 , 以便预测相同设计上不同策略的性能。在 repo…...

SOCKET、TCP、HTTP之间的区别与联系

SOCKET、TCP、HTTP之间的区别与联系 一、 Socket 1、什么是socket2、为什么需要socket3、建立socket连接 二、HTTP(基于TCP) 1、HTTP的概念2、HTTP连接的特点 连接请求:一次连接连接请求:短连接(socket是长连接) 三、TCP/IP协议簇 四、HTTP、Socket…...

javascript的Proxy

1. 什么是Proxy Proxy是ES6中新增的一个特性,它可以拦截对象的操作,提供了一个中间层来控制对目标对象的访问。简单来说,它可以对对象进行代理,从而实现对对象的监控、修改、过滤等操作。 2. 为什么出现Proxy 在JavaScript中&a…...

Python发送微信模板消息

1、根据appid,secret获取token 2、查找粉丝 3、指定模板及粉丝id发送模板消息 4、链接SqlServer数据库获取消息任务 5、创建定时任务监听消息 from logging import exception import time import pymysql import datetime; from utils.http_utils import *; from model.msg_wx_…...

springboot(ssm医院门诊信息管理系统 医院管理平台Java(codeLW)

springboot(ssm医院门诊信息管理系统 医院管理平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&am…...

css所有属性介绍

文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性(Animation)1.2 CSS 背景属性(Background)1.3 CSS 边框属性(Border 和 Outline)1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…...

C#语言高阶开发

目录 数据结构 集合 动态数组ArrayList 习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类,有一个属性叫做id,每个…...

使用Qt Designer设计水平布局,加addStretch()不起作用,解决办法?

解决办法: 将main函数中的MainWindow.show()改为:ui.show() if __name____main__:app QApplication(sys.argv)MainWindow QMainWindow()ui Ui_MainWindow()ui.setupUi(MainWindow)ui.show()app.exec()完整代码: import sysfrom PyQt5 i…...

数据结构:带头双向循环链表的实现

引言 单链表存在缺陷:需要从头开始找前一个节点 解决方法:双向链表 链表的结构(8种): 1. 单向,双向 2. 带头、不带头 带头即为带哨兵位的头节点,第一个节点不存储有效数据。带头节点&#…...

最小生成树(Minimum Spanning Tree)及生成MST的几种方法

最小生成树 (Minimum Spanning Tree) 最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树&#xf…...

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计 0x01 前言 在当今互联网的广袤世界中,各式交互平台层出不穷。每一个交互平台几乎都要求用户注册账号,而这些账号则成为我们在数字世界中的身份象征。账号的安全性变得至…...

io基础入门

压缩的封装 参考:https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…...

k8s ingress 无法找到端点

文章目录 ingress rule无法找到端点这个注解是什么意思呢?为何不生效呢?端点无法更新?如何确认ingressclass呢?修复端点无法发现的问题多个ingress controller 架构 ingress rule无法找到端点 在vnnox-cn集群创建ingress&#xf…...

properties转yml

目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...

谈谈中间件设计的思路

前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1:基础通用技术的深入理解和运用2:了解和熟悉常见中间件的设计思想,且有自己的感悟,并且能按照自己的理解模仿写一写3:业务的高度理解能力…...

WT2605-24SS音频蓝牙录放语音芯片:标准蓝牙功能与多样化存储播放方式助力音频体验升级

在音频技术日新月异的今天,WT2605-24SS音频蓝牙录放语音芯片以其强大的功能和出色的性能,成为了音频市场的一颗璀璨明星。该芯片不仅具备标准音频蓝牙功能,还支持蓝牙电话本、录音功能以及多种存储和播放方式,为用户提供了更加便捷…...

openssl生成ssl证书

x509证书一般会用到三类文,key,csr,crt。 Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

【生成模型】视频生成论文调研

工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...