📄 sfun_eulerupd.c
字号:
#define S_FUNCTION_NAME sfun_eulerupd#define S_FUNCTION_LEVEL 2#include "simstruc.h"#include "simstruc_types.h"#include <math.h>#define FI0_IDX 0#define PARAM_FI0(S) ssGetSFcnParam(S,FI0_IDX)#define THETA0_IDX 1#define PARAM_THETA0(S) ssGetSFcnParam(S,THETA0_IDX)#define PSI0_IDX 2#define PARAM_PSI0(S) ssGetSFcnParam(S,PSI0_IDX)#define NPARAMS 3#define U(element) (*uPtrs[element]) /* Pointer to Input Port0 */static void mdlInitializeSizes(SimStruct *S){ ssSetNumSFcnParams(S, NPARAMS); if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { return; } ssSetSFcnParamTunable(S, FI0_IDX, true); ssSetSFcnParamTunable(S, THETA0_IDX, true); ssSetSFcnParamTunable(S, PSI0_IDX, true); ssSetNumContStates(S, 3); ssSetNumDiscStates(S, 0); if (!ssSetNumInputPorts(S, 1)) { return; } ssSetInputPortWidth(S, 0, 3); if (!ssSetNumOutputPorts(S, 1)) { return; } ssSetOutputPortWidth(S, 0, 3); ssSetNumSampleTimes(S, 1); ssSetNumRWork(S, 0); ssSetNumIWork(S, 0); ssSetNumPWork(S, 0); ssSetNumModes(S, 0); ssSetNumNonsampledZCs(S, 0); ssSetOptions(S, (SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_USE_TLC_WITH_ACCELERATOR)); return;}static void mdlInitializeSampleTimes(SimStruct *S){ ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME); ssSetOffsetTime(S, 0, 0.0);}#define MDL_SET_WORK_WIDTHS /* Change to #undef to remove function */#if defined(MDL_SET_WORK_WIDTHS) && defined(MATLAB_MEX_FILE)/* Function: mdlSetWorkWidths =============================================== * Abstract: * Set up run-time parameters. */static void mdlSetWorkWidths(SimStruct *S){ const char_T *rtParamName_fi0 = "fi0"; const char_T *rtParamName_theta0 = "theta0"; const char_T *rtParamName_psi0 = "psi0"; ssSetNumRunTimeParams(S, NPARAMS); if (ssGetErrorStatus(S) != NULL) return; ssRegDlgParamAsRunTimeParam(S, FI0_IDX, 0, rtParamName_fi0, SS_DOUBLE); ssRegDlgParamAsRunTimeParam(S, THETA0_IDX, 1, rtParamName_theta0, SS_DOUBLE); ssRegDlgParamAsRunTimeParam(S, PSI0_IDX, 2, rtParamName_psi0, SS_DOUBLE);}#endif /* MDL_SET_WORK_WIDTHS */#define MDL_INITIALIZE_CONDITIONSstatic void mdlInitializeConditions(SimStruct *S){ real_T *x0 = ssGetContStates(S); x0[0]=mxGetPr(ssGetSFcnParam(S, 0))[0]; x0[1]=mxGetPr(ssGetSFcnParam(S, 1))[0]; x0[2]=mxGetPr(ssGetSFcnParam(S, 2))[0];}static void mdlOutputs(SimStruct *S, int_T tid){ real_T *y = ssGetOutputPortRealSignal(S, 0); real_T *x = ssGetContStates(S); y[0]=x[0]; y[1]=x[1]; y[2]=x[2];}#define MDL_DERIVATIVESstatic void mdlDerivatives(SimStruct *S){ real_T *dx = ssGetdX(S); real_T *x = ssGetContStates(S); InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, 0); double wx,wy,wz,fi,theta,psi; wx=U(0); wy=U(1); wz=U(2); fi=x[0]; theta=x[1]; psi=x[2]; dx[0] = wx+sin(fi)*tan(theta)*wy+cos(fi)*tan(theta)*wz; dx[1] = cos(fi)*wy-sin(fi)*wz; dx[2] = sin(fi)/cos(theta)*wy+cos(fi)/cos(theta)*wz;}static void mdlTerminate(SimStruct *S){}#define MDL_RTW#if defined(MDL_RTW)&&(defined(MATLAB_MEX_FILE)||defined(NRT))static voidmdlRTW(SimStruct *S){/* if (!ssWriteRTWParameters(S, 1, SSWRITE_VALUE_VECT, "", "", mxGetPr(ssGetSFcnParam(S,0)), 1)) { return; }*//* if (!ssWriteRTWScalarParam(S, "fi0", ssGetSFcnParam(S, 0), SS_DOUBLE)) { return; } if (!ssWriteRTWScalarParam(S, "theta0", ssGetSFcnParam(S, 1), SS_DOUBLE)) { return; } if (!ssWriteRTWScalarParam(S, "psi0", ssGetSFcnParam(S, 2), SS_DOUBLE)) { return; }*/}#endif#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -