• 大小: 48KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: 其他
  • 标签: s函数  

资源简介

通过c编写的pid s函数,可以通过这个例子更好地理解pid,以及学会如何编写s函数。,,,,,,,,,,,

资源截图

代码片段和文件信息

/*
 * 文件名: sfuntmpl_doc.c
 * 摘要: ...
 * Copyright 1990-2002 The MathWorks Inc.
 * 版本: 1.50.4.1 $
 */
// 第一段用来说明函数的内容包括函数文件名以及大致内容 
 

/*
 * You must specify the S_FUNCTION_NAME as the name of your S-function.
 */

#define S_FUNCTION_NAME  your_sfunction_name_here
#define S_FUNCTION_LEVEL 2
// 第二段中包括函数名称的定义以及级别的控制

/* 
 *  需要包括simstrc.h用来定义SimStruct和它相关的宏定义
 * 
 * 以下几个头文件在被编译成MEX文件时被matlabroot/simulink/include/simstruc.h调用
 * 
 * matlabroot/extern/include/tmwtype.h    - 普通类型,如real_T
 *  matlabroot/extern/include/mex.h         - MATLAB MEX 文件 API 程序api  API(Application Programming Interface应用程序编程接口)
 *  matlabroot/extern/include/matrix.h      - MATLAB MEX 文件 API 程序
 * 
 * 以下几个头文件在用RTW编译时被matlabroot/simulink/include/simstruc.h调用
 * 
 *  matlabroot/extern/include/tmwtypes.h    - 普通类型,如real_T
 *  matlabroot/rtw/c/libsrc/rt_matrx.h      -  MATLAB API 程序 宏定义
 */

#include “simstruc.h“



/*  错误处理
 *  -------------
 *  采用以下技术报告在s-function碰到的错误
 *       ssSetErrorStatus(S“error encountered due to ...“);
 *       return;       
 *   
 *  注意ssSetErrorStatus中第二个参数必须是存在于静态存储区内。
 *  它不能是程序中的一个局部变量。例如下列程序导致不可预测的错误
 *
 *      mdlOutputs()
 *      {
 *         char msg[256];         {非法: 修正为 “static char msg[256];“}
 *         sprintf(msg“Error due to %s“ string);
 *         ssSetErrorStatus(Smsg);
 *         return;
 *      }
 *
 *  ssSetErrorStatus错误处理机制是mexErrMsgTxt函数的替代物。mexErrMsgTxt
 *  利用“异常处理“立即中止S-function的运行并返回simulink控制权。为了在S-function
 *  支持异常处理机制 。Simulink必须设置每个S-function的异常处理优先级
 *  给仿真带来了额外的开销。
 *  
 *  如果不调用mexErrMsgTxt或者其他可能导致异常发生的程序,应该采用SS_OPTION_EXCEPTION_FREE_CODE
 *  选项。这个功能选择在紧跟的命令中在mdlInitializeSizes函数体内完成。
 *         ssSetOptions(S SS_OPTION_EXCEPTION_FREE_CODE);
 *
 *  设置该选项,将提高S-function的性能,Simulink将跳过异常处理设置。应该特别留意修改代码当
 *  通过设置SS_OPTION_EXCEPTION_FREE_CODE不在使用异常处理时。如果此时S-function产生异常,不可预测的结果将发生
 *
 *  异常取消的代码是指从不“long jumps“代码也就是远跳转的。如果它包括有任何调用可能产生“long jumps“的代码,
 *  那么S-function不是异常取消的代码。例如调用mexErrMsgTxt时抛出异常,将结束S-function的执行。
 *  使用mxCalloc可能导致不可预测的问题。当memory分配产生错误将产生远跳转。如果需要分配内存,
 *  应该直接使用stdlib.h calloc程序并且执行自己的错误处理函数。
 *
 *  所有的mex程序都有远距离跳转的可能性(或者产生异常)。例外集中mx程序也有产生远距离跳转的可能性。
 *  为了避免复杂度太高,只有获取指针和确定参数个数的程序可以被使用。例如以下几者永远不会抛出异常
 *  :mxGetPr mxGetDatamxGetNumberOfDimensions mxGetM mxGetN mxGetNumberOfElements.
 *  
 *  如果你的实时方法中不含有可能产生异常的代码,你可以使用下面的选项
 *    ssSetOptions(S SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE); 
 * 另外一些方法在S-function是有可能产生异常的代码,包括以下几种方式
 *   mdlGetTimeOfNextVarHit mdlOutputs mdlUpdate and mdlDerivatives
 *
 * 警告&打印字符串
 * -------
 * 使用ssWarning(Smsg)显示警告
 * -当S-function在Simulink中编译为mex时,ssWarning等效于ssWarning
 *  —当S-function在Real-Time Workshop时,ssWarning等效于
 *    printf(“Warning: in block ‘%s‘ ‘%s‘\n“ ssGetPath(S)msg);
 * 如果目标有标准输入和输出设备。否则它会变为一个注释并且不在执行
 * 
 * 使用ssPrintf(fmt ...)打印一条信息
 * -当S-function在Simulink中编译为mex时,ssPrintf 等效于 mexPrintf。
 * -在S-function在Real-Time Workshop中使用时,如果有标准输入和输出设备时,ssPrintf等效于printf

评论

共有 条评论