精华内容
下载资源
问答
  • Matlab编写S函数,实现y=ku+b

    千次阅读 2019-05-22 16:24:13
    [s函数实例](https://blog.csdn.net/qq_34317499/article/details/81044757) S函数代码如下: function [sys,x0,str,ts]=zhai(t,x,u,flag,k,b) switch flag case 0 [sys,x0,str,ts]=mdlInitial...

    这是个简单的例子,注:此博客参考

    [s函数小实例](https://blog.csdn.net/qq_34317499/article/details/81044757)

    S函数代码如下:

    function [sys,x0,str,ts]=zhai(t,x,u,flag,k,b)
    switch flag
        case 0
            [sys,x0,str,ts]=mdlInitializeSizes; %初始化
        case 3
            sys=mdlOutputs(t,x,u,k,b);          %计算输出量
        case {1,2,4,9}
            sys=[];
        otherwise                               %出错处理
            error(num2str(flag))
    end
    function [sys,x0,str,ts]=mdlInitializeSizes()
    sizes=simsizes;
    sizes.NumContStates=0;   %无连续状态
    sizes.NumDiscStates=0;    %无离散状态
    sizes.NumOutputs=1;            %有一个输出量
    sizes.NumInputs=1;         %有一个输入信号
    sizes.DirFeedthrough=1;   %输出量中含有输入量
    sizes.NumSampleTimes=1;   %单个采样周期
    sys=simsizes(sizes);
    %给其他返回参数赋值
    x0=[];                   %设置初始状态为零状态
    str=[];                    %将str变量设置为空字符串
    ts=[-1,0];                 %假定继承输入信号的采样周期
    function sys=mdlOutputs(t,x,u,k,b)
    sys=k*u+b;
    

    Simulink模型如下

    Simulink模型Simulink模型
    S函数参数设置

    在这里插入图片描述

    其中 :正弦波为输入,别忘了设置初始值(一开始我忘了,找了好久原因),这个是一个输入,一个输出的例子

    仿真结果

    结果

    输入为2个及以上变量时,只需修改

    sizes.NumInputs=2;         %有二个输入信号
    
    %%%%%%%%
    function sys=mdlOutputs(t,x,u,k,b)
    sys=k*u(1)+b*u(2);
    

    效果图如下

    2个变量

    展开全文
  • s函数官方编程手册(英文),主要包括S-function的介绍、详细方法、内部原理介绍、使用MATLAB、C、C++、Fortran等编写S函数、S函数编写实例等。
  • 一般而言matlab/simulink能满足多数使用要求,但是往往在研究中会使用User-... 本文是我第一次参考资料,利用m语言编写s函数实例。User-Definition的s-fun可以作为一个simulink模块使用,这样在工程和科研中就可...

        一般而言matlab/simulink能满足多数使用要求,但是往往在研究中会使用User-difinition s-function或者调用c,c++的库函数,这时候就需要matlab能进行c,c++以及fortran语言的编译。

        本文是我第一次参考资料,利用m语言编写s函数的实例。User-Definition的s-fun可以作为一个simulink模块使用,这样在工程和科研中就可以自己开发需要的模块,并入simulink仿真之中,不必受制于simulink自带的有限模块。使用m语言写s-fun不需要mingw编译器。

    题目:编写User-Definition的s-fun,使得正弦函数的波形加倍20倍,然后输出到scope。

    实现步骤:

    1. 新建simulink模型,拖入User-Definition的s-fun,然后双击s-fun,点击edit,进入编辑模块;


    2. 编写m-sfun代码,并另存为time20.m,可以参照m-sfun的格式,具体代码如下:

    function [sys,x0,str,ts]=timestwo(t,x,u,flag)
    %   t是采样时间
    %   x是状态变量
    %   u是该simulink模块的输入
    %   flag是仿真过程的状态标志,用来判断当前状态是初始化、执行、输出等
    %   sys是flag的函数,不同的标志执行不同的sys
    %   x0是状态变量的初始值
    %   str是保留参数,一般在初始化置空
    %   ts是一个1*2的向量,其中ts(1)是采样周期,ts(2)是偏移量
    %   本s-fun主要就是调用initialize和output函数
    
    switch flag,
        
    %Initialization,flag=0时,具体初始化函数参照35行
      case 0         
        [sys,x0,str,ts] = mdlInitializeSizes;
    
    %Calculate  outputs
      case 3
        sys = mdlOutputs(t,x,u);
    
    %Unused flags
      case {1,4,2,9}
        sys = []; % do nothing
    
      otherwise
             error('Simulink:blocks:unhandledFlag', num2str(flag));
    end
    %
    %=============================================================================
    % mdlInitializeSizes
    % Return the sizes, initial conditions, and sample times for the S-function.
    %=============================================================================
    %初始化函数是必不可少的,其中的结构体形式是固定不变的
    function [sys,x0,str,ts] = mdlInitializeSizes
    
    sizes = simsizes;
    %用于设置模块参数的结构体用simsizes生成
    sizes.NumContStates  = 0;
    %模块连续状态变量的个数
    sizes.NumDiscStates  = 0;
    %模块离散状态变量的个数
    sizes.NumOutputs     = 1;
    %模块输出变量的个数
    sizes.NumInputs      = 1;
    %模块输入变量的个数
    sizes.DirFeedthrough = 1;
    %模块是否存在直通反馈,存在为1。直通的意思是输入能直接控制输出
    sizes.NumSampleTimes = 1;
    %模块的采样时间个数,至少是一个
    
    sys = simsizes(sizes);  %设置完后赋给sys输出
    str = [];   %   str是保留参数,一般在初始化置空
    x0  = [];   %   x0是状态变量的初始值,显然初始值置空
    ts  = [-1 0];   % sample time: [period, offset]
    
    %start mdlOutputs
    %当运行到mdlOutputs,就会输出20*u。
    function sys = mdlOutputs(t,x,u)
    sys=20*u;
    % end mdlOutputs
    

    3. 代码完成之后,将matlab工作目录更改为time20.m所在的文件夹,然后双击simulink模块,将time20填入s-function name,由于本例不需要输入参数,故其他不需要填写。


    4.  运行。



    展开全文
  • 一般而言matlab/simulink能满足多数使用要求,但是往往在研究中会使用User-... 本文是我第一次参考资料,利用c语言编写s函数实例。User-Definition的s-fun可以作为一个simulink模块使用,这样在工程和科研中就可...

        一般而言matlab/simulink能满足多数使用要求,但是往往在研究中会使用User-difinition s-function或者调用c,c++的库函数,这时候就需要matlab能进行c,c++以及fortran语言的编译。

        本文是我第一次参考资料,利用c语言编写s函数的实例。User-Definition的s-fun可以作为一个simulink模块使用,这样在工程和科研中就可以自己开发需要的模块,并入simulink仿真之中,不必受制于simulink自带的有限模块。使用c语言写s-fun需要mingw编译器。

        与m-sfun不同的是用c语言编写的sfun需要先经过mingw编译,生成mexw可执行文件(有资料也说是dll文件),然后才可以在自定义的s-fun模型中使用。

    题目:编写User-Definition的s-fun,使得正弦函数的波形加倍2倍,然后输出到scope。

    实现步骤:

    1. 新建simulink模型,拖入User-Definition的s-fun,然后双击s-fun,点击edit,进入编辑模块;


    2. 编写m-sfun代码,并另存为sin2.m,可以参照c-sfun的格式,具体代码如下:

    /*
     * sfuntmpl_basic.c: Basic 'C' template for a level 2 S-function.
     *
     * Copyright 1990-2013 The MathWorks, Inc.
     */
    
    
    /*
     * You must specify the S_FUNCTION_NAME as the name of your S-function
     * (i.e. replace sfuntmpl_basic with the name of your S-function).
     */
    
    #define S_FUNCTION_NAME  sin2   //这里的sin2一定要与c文件的文件名一致
    #define S_FUNCTION_LEVEL 2
    
    /*Level 2 M文件S函数----支持访问更多地S函数API,支持代码生成。当你要使用M文件
     * 来实现一个S函数的时候,选择Level 2 M文件S函数。
     */
    
    /*
     * Need to include simstruc.h for the definition of the SimStruct and
     * its associated macro definitions.
     */
    #include "simstruc.h"
    //程序里用到的头文件在这里引用
    
    /*====================*
     * S-function methods *
     *====================*/
    
    /* Function: mdlInitializeSizes ===============================================
     * Abstract:
     *    The sizes information is used by Simulink to determine the S-function
     *    block's characteristics (number of inputs, outputs, states, etc.).
     */
    static void mdlInitializeSizes(SimStruct *S)
    {
     //这个函数用来设置输入、输出和参数
        ssSetNumSFcnParams(S, 0);  /* Number of expected parameters */
        //设置参数个数,这里为0
        if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
            /* Return if number of expected != number of actual parameters */
            return;
        }
    
       // ssSetNumContStates(S, 0);   //设置连续状态的个数,缺省为0
      //  ssSetNumDiscStates(S, 0);   //设置离散状态的个数,缺省为0
    
        if (!ssSetNumInputPorts(S, 1)) return;  //设置输入变量的个数,这里为1
        ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);   //设置输入变量0的维数为动态的
       // ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/
        /*
         * Set direct feedthrough flag (1=yes, 0=no).
         * A port has direct feedthrough if the input is used in either
         * the mdlOutputs or mdlGetTimeOfNextVarHit functions.
         */
        /*
         *设置input0的访问方式,true就是临近访问,这样指针的增量后
         * 就可以直接访问下个input端口
         */
        ssSetInputPortDirectFeedThrough(S, 0, 1);
        //设置输入端口的信号是否在mdlOutputs函数中使用,这里设置为true
        if (!ssSetNumOutputPorts(S, 1)) return; 
        //设置输出变量的个数,这里为1
        ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);    //设置输出变量0的维数为动态
       // ssSetOutputPortWidth(S, 1, 1);    //设置输出变量1的维数为1
        
        ssSetNumSampleTimes(S, 1);  //设置采样时间1s
        //ssSetNumRWork(S, 0);
       // ssSetNumIWork(S, 0);
        //ssSetNumPWork(S, 0);
        //ssSetNumModes(S, 0);
       // ssSetNumNonsampledZCs(S, 0);
    
        /* Specify the sim state compliance to be same as a built-in block */
       // ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE);
    
        ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
     
    }
    
    /* Function: mdlInitializeSampleTimes =========================================
     * Abstract:
     *    This function is used to specify the sample time(s) for your
     *    S-function. You must register the same number of sample times as
     *    specified in ssSetNumSampleTimes.
     */
    static void mdlInitializeSampleTimes(SimStruct *S)
    {
        ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
        ssSetOffsetTime(S, 0, 0.0);
    
    }
    
    //#define MDL_INITIALIZE_CONDITIONS   /* Change to #undef to remove function */
    //#if defined(MDL_INITIALIZE_CONDITIONS)
      /* Function: mdlInitializeConditions ========================================
       * Abstract:
       *    In this function, you should initialize the continuous and discrete
       *    states for your S-function block.  The initial states are placed
       *    in the state vector, ssGetContStates(S) or ssGetRealDiscStates(S).
       *    You can also perform any other initialization activities that your
       *    S-function may require. Note, this routine will be called at the
       *    start of simulation and if it is present in an enabled subsystem
       *    configured to reset states, it will be call when the enabled subsystem
       *    restarts execution to reset the states.
       */
     
    static void mdlOutputs(SimStruct *S, int_T tid)
    {
       int_T i;
        InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs ( S,0 );
        real_T *y = ssGetOutputPortRealSignal (S,0 );
        int_T width = ssGetOutputPortWidth ( S,0 );
        for ( i=0;i<width;i++ ) {
        *y++ = 2.0 *( *uPtrs[ i ] );
                                 }
    }
    
    static void mdlTerminate(SimStruct *S)
    {
    }
    
    /*=============================*
     * Required S-function trailer *
     *=============================*/
    
    #ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
    #include "simulink.c"      /* MEX-file interface mechanism */
    #else
    #include "cg_sfun.h"       /* Code generation registration function */
    #endif
    

    3. sin2.c完成之后,需要生成sin2.mexw,在命令行键入 mex sin2.c即可

    >> mex sin2.c
    使用 'MinGW64 Compiler (C)' 编译。
    MEX 已成功完成。

    4. 将matlab工作目录更改为sin2.mexw所在的文件夹,然后双击simulink模块,将sin2填入s-function name,由于本例不需要输入参数,故其他不需要填写。


    5. 运行。



    展开全文
  • MATLAB/simulink S-函数编程实践

    千次阅读 2018-11-03 10:47:35
    M-文件 S-函数编写实例:实现两个正余弦函数叠加合成。 simulink自带S-函数模板,在MATLAB/toolbox/simulink/blocks/sfuntmpl.m 目录 以简单加法器为例内容如下: function[sys, x0, str, ts] = sinAddcos(t,x,u...

    M-文件 S-函数编写实例:实现两个正余弦函数叠加合成。

    simulink自带S-函数模板,在MATLAB/toolbox/simulink/blocks/sfuntmpl.m 目录

    以简单加法器为例内容如下:

    function[sys, x0, str, ts] = sinAddcos(t,x,u,flag)
    %% Create a s function to add the sine wave and cosine wave
    % t         --simulated time
    % x         --inner simulated block
    % u         --simulated output
    % flag      --operation flage
    % sys       --S function output
    % x0        --S function initial states
    % str       --temp empty vector
    % ts        --(2 X 2)time sample matrix,[:,1] sampling time and [:,2] time shifting
     
    switch flag,
      case 0,
            [sys, x0, str, ts] = mdlInitializeSizes;
      case 1,
            sys = mdlDerivatives(t, x, u);
             
      case 2,
            sys = mdlUpdate(t, x, u);
      case 3,
            sys = mdlOutputs(t, x, u);
      case 4,
            sys = mdlGetTimeOfNextVarHit(t, x, u);
      case 9,
            sys = mdlTerminate(t, x, u);
      otherwise
            error(['Unhandled flag = ', num2str(flag)])
    end
     
    function [sys, x0, str, ts] = mdlInitializeSizes
    sizes = simsizes;
    sizes.NumContStates = 0;
    sizes.NumDiscStates = 1;
    sizes.NumOutputs = 1;
    sizes.NumInputs = 2;
    sizes.DirFeedthrough = 1;
    sizes.NumSampleTimes = 1;
    sys = simsizes(sizes);
    x0 = [0];
    str = [];
    ts = [0 0];
     
    function sys = mdlDerivatives(t, x, u)
            sys = [];
    function sys = mdlUpdate(t, x, u)
            sys = x;
    function sys = mdlOutputs(t, x, u)
            sys = u(1) + u(2);                            %output = u_1 + u_2
    function sys = mdlGetTimeOfNextVarHit(t, x, u)
            sampleTime = 1;
            sys = t + sampleTime;
    function sys = mdlTerminate(t, x,u)
            sys = [];

     

    展开全文
  • 详细介绍matlab中有关simulink模块函数:s-function的编写方法和实例,详细介绍代码含义,可以帮助理解和使用s函数
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 3.2.2 M文件S-函数编写示例 30 3.3 C语言S-函数 46 3.3.1 C语言S-函数简介 46 3.3.2 C语言S-函数编写示例 51 3.4 C 语言S-函数 60 第4章 信源和信宿 66 4.1 信源 66 4.1.1 压控振荡器 66 4.1.2...
  • 全书共分10章,前3章介绍MATLAB通信仿真的基础,包括Simulink和S-函数;第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的...
  • MATLAB中如何编写S-函数前言认识S函数模板一个实际的栗子仿真...本文将通过一个实例,来说明如何编写S函数,并用其搭建一个简单的Simulink模型。 认识S函数模板 S函数编写可以在MATLAB提供的模板基础上直接完成。在
  • 本文从S-Function高效编程技巧出发,让你从概念到实例,全方位的了解及操作,能全流程的对S函数编写技巧有全面掌握,加深理解,增强编写技能,你值得拥有。
  • 2.7MATLAB编程实例 2.7.1汉诺塔问题 2.7.2MATLAB在自动控制中的应用 2.7.3MATLAB在电力信号分析处理中的应用 2.8本章小结 第3章Simulink仿真基础 3.1Simulink仿真环境 3.2Simulink模块库 3.2.1标准Simulink模块库 ...
  • 全书共分为17章,从matlab简介开始,详细介绍了simulink的基础知识、模块操作、信号操作、仿真设置、积分器使用、子系统技术、系统仿真过程、模型的调试、编写m语言s-函数及stateflow建模等内容。在本书最后还重点...
  • 第五章至第七章介绍英国设菲尔德(Sheffield)大学的MATLAB遗传算法工具箱及其使用方法,举例说明如何利用遗传算法工具箱函数编写求解实际优化问题的MATLAB程序。第八章和第九章介绍MathWorks公司最新发布的MATLAB...
  • 全书共分为17章,从matlab简介开始,详细介绍了simulink的基础知识、模块操作、信号操作、仿真设置、积分器使用、子系统技术、系统仿真过程、模型的调试、编写m语言s-函数及stateflow建模等内容。在本书最后还重点...
  • 8.1.2 编写待优化函数的M文件 148 8.2 使用遗传算法工具初步 149 8.2.1 遗传算法使用规则 149 8.2.2 遗传算法使用方式 150 8.2.3 举例:Rastrigin函数 151 8.2.4 遗传算法的一些术语 156 8.2.5 遗传算法如何...
  • 在研究自抗扰控制技术的基础上,以MATLAB/SIMULINK 为仿真平台,编写M_Funtion 程 序实现特殊非线性函数、应用S_Funtion 定制跟踪微分器和扩张状态观测器等新型动态系统模块、利 用子系统封装技术完成控制律组合和...
  • 在研究自抗扰控制技术的基础上,以MATLAB/SIMULINK 为仿真平台,编写M_Funtion 程 序实现特殊非线性函数、应用 S_Funtion 定制跟踪微分器和扩张状态观测器等新型动态系统模块、利 用子系统封装技术完成控制律组合和...
  • 在上一篇文章加百力介绍了MATLAB生成、访问金融时间序列数据的基础知识并提供了实例代码。在这一篇文章中我们将介绍如何通过MT5平台获取我们想要的海量历史数据,并转化成金融时间序列。  这里首先简单介绍一下...
  • 电子设计.doc

    2019-05-28 11:58:28
    0218、VB_上位机编写实例代码集带源码 0219、PROTEUS软件及教程资料 0220、PIC单片机PIC16F877例程包 0221、AT89S52单片机C语言应用100例 0222、FPGA例程包14例资料 0223、51单片机典型模块设计实例导航资料 0224、...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

matlabs函数编写实例

matlab 订阅