MATLAB中S_Function的多输入输出问题(附m文件详细注释)

MATLAB中S_Function的多输入输出问题(附m文件详细注释)

Simulink模型

模型有两个输入(都是sin(t)函数),两个输出(分别对两个输入增大2倍和3倍)
模型有两个输入(都是sin(t)函数),两个输出(分别对两个输入增大2倍和3倍)。
由于S_Function不能有多个输入输出接口,因此需要借助Mux和DeMux模块将模型的多个输入输出转换为向量的形式传递至S_Function。

S_Function配置

在S_function parameters 中输入两个参数,用逗号分开
在S_function parameters 中输入两个增益参数(2和3),多个参数之间用逗号分开。注意此处的参数输入顺序要与m文件中函数内部的参数(gain1,gain2)对应!!!

双击S_Function进入m文件

m文件有详细的标注,方便大家学习

%%%%%%%%%%%%
%t :系统时间
%x :系统状态
%u : 系统输入,即在simulink models中连接至S-function的线上的数据。注意区分x和u
%flag : 系统状态,由系统自动生成,决定了系统应当执行哪个S-function子函数

%sys : 系统本身,可以理解为下一时刻的系统;同时sys的前几个数值(sys[1]等)是系统的输出,即在simulink中S-function伸出线上的数据
%x0 : 系统初始状态
%str : 状态排序字符串,通常指定为[]。
%ts : 可认为是采样时间
%%%%%%%%%%%%%%%%
%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数
function [sys,x0,str,ts,simStateCompliance] = Gain(t,x,u,flag,gain1,gain2)
%gain1和gain2对应的我们在S_Function paramaters里面输入的增益倍数2和3
switch flag
  case 0
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;%S-function进行基本的设置,具体参数会在后面进行介绍。相当于构造函数
  case 1
    sys=mdlDerivatives(t,x,u);%该函数仅在连续系统中被调用,用于产生控制系统状态的导数
  case 2
    sys=mdlUpdate(t,x,u);%该函数仅在离散系统中被调用,用于产生控制系统的下一个状态
  case 3
    sys=mdlOutputs(t,x,u,gain1,gain2);%产生(传递)系统输出
  case 4
    sys=mdlGetTimeOfNextVarHit(t,x,u);%获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。
  case 9
    sys=mdlTerminate(t,x,u);%相当于构析函数,结束该仿真模块时被调用
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes

sizes = simsizes;

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
%输出接口数量为2
sizes.NumOutputs     = 2;
%输入接口数量为2
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; 

sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];
simStateCompliance = 'UnknownSimState';

function sys=mdlDerivatives(t,x,u)


sys = [];

function sys=mdlUpdate(t,x,u)

sys = [];

function sys=mdlOutputs(t,x,u,gain1,gain2)
%用sys(1)和sys(2)拆分sys向量,使之成为两个输出
%用u(1)和u(2)拆分u向量,使之成为两个输入
sys(1)=u(1)*gain1;
sys(2)=u(2)*gain2;


    
function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1;   
sys = t + sampleTime;

function sys=mdlTerminate(t,x,u)

sys = [];

输出结果

在这里插入图片描述

注意事项

1、注意在将多个输入转换为向量时一定要严格按照函数内部的u(1),u(2)顺序进行转换
在这里插入图片描述
2、注意在将输出向量转换成多个输出时一定要严格按照函数内部的sys(1),sys(2)顺序进行转换
在这里插入图片描述
3、注意在在S_function parameters 中输入多个参数时,多个参数之间用逗号分开。注意此处的参数输入顺序要与m文件中函数内部的参数对应!!!
在这里插入图片描述

在这里插入图片描述

  • 29
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
MATLAB ,可以使用 function 关键字定义一个函数文件。函数文件是一个以 .m 扩展名结尾的 MATLAB 代码文件,其包含一个或多个函数定义。 以下是编写一个简单的函数文件的步骤: 1. 打开 MATLAB,并在编辑器创建一个新文件。例如,可以在主菜单选择 File -> New -> Function。 2. 在文件输入以下函数定义格式: ``` function [output_args] = function_name(input_args) %FUNCTION_NAME Summary of this function goes here % Detailed explanation goes here % function body end ``` 其, - `function` 关键字用于定义一个函数。 - `[output_args]` 是由函数返回的输出参数列表。如果函数不返回任何东西,则可以省略此参数列表。 - `function_name` 是函数的名称。 - `(input_args)` 是由函数接收的输入参数列表。 - `% FUNCTION_NAME Summary of this function goes here` 和 `% Detailed explanation goes here` 是函数的注释,用于描述函数的作用和输入输出参数的含义。 - `function body` 是函数的实际代码。 3. 编写完函数后,保存文件并将其命名为函数名称(例如,function_name.m)。 4. 在 MATLAB 命令窗口调用函数。例如,如果函数需要一个输入参数 x,并返回一个输出参数 y,则可以这样调用函数: ``` y = function_name(x); ``` 这就是编写 MATLAB 函数文件的基本步骤。在实际编写函数时,还需要根据具体需求编写函数体和注释,以确保函数的准确性和可读性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值