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所示的仿真模型。
在模型编辑窗口中双击S-Function模块,打开其参数对话框,在“S-function名称”框中填入S函数名timek,在“S-function参数”框中填入外部参数k,如图2所示。如果有多个外部参数,参数之间用逗号分隔。k可以在MATLAB工作区用命令定义。当输入k的值为5时,运行得到的仿真结果如图3所示。
相关文章:
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) 最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树…...
逻辑漏洞 暴力破解(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…...
properties转yml
目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...
谈谈中间件设计的思路
前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1:基础通用技术的深入理解和运用2:了解和熟悉常见中间件的设计思想,且有自己的感悟,并且能按照自己的理解模仿写一写3:业务的高度理解能力…...
WT2605-24SS音频蓝牙录放语音芯片:标准蓝牙功能与多样化存储播放方式助力音频体验升级
在音频技术日新月异的今天,WT2605-24SS音频蓝牙录放语音芯片以其强大的功能和出色的性能,成为了音频市场的一颗璀璨明星。该芯片不仅具备标准音频蓝牙功能,还支持蓝牙电话本、录音功能以及多种存储和播放方式,为用户提供了更加便捷…...
openssl生成ssl证书
x509证书一般会用到三类文,key,csr,crt。 Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
