资源简介
通过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
评论
共有 条评论