📄 s_xmp6.c
字号:
/* *****************************************************//* s_xmp6 *//* This is a C version of the S-file subsystem that *//* implements a discrete PID controller. *//* *//* Based on MathWorks template file *//* Copyright (c) 1990-96 by The MathWorks, Inc. *//* All Rights Reserved *//* *****************************************************/#define S_FUNCTION_NAME s_xmp6#include "simstruc.h"#include "math.h"#define Kp_macro *mxGetPr(ssGetArg(S,0))#define Ki_macro *mxGetPr(ssGetArg(S,1))#define Kd_macro *mxGetPr(ssGetArg(S,2))#define L_upper_macro *mxGetPr(ssGetArg(S,3))#define L_lower_macro *mxGetPr(ssGetArg(S,4))#define T_samp_macro *mxGetPr(ssGetArg(S,5))/* *****************************************************//* mdlInitializeSizes *//* *****************************************************/static void mdlInitializeSizes(SimStruct *S){ ssSetNumContStates( S, 0); ssSetNumDiscStates( S, 1); ssSetNumInputs( S, 1); ssSetNumOutputs( S, 1); ssSetDirectFeedThrough(S, 1); ssSetNumSampleTimes( S, 1); ssSetNumSFcnParams( S, 6); ssSetNumRWork( S, 1); ssSetNumIWork( S, 0); /* integer work vec */ ssSetNumPWork( S, 0); /* pointer work vec */}/* *****************************************************//* mdlInitializeSampleTimes *//* *****************************************************/static void mdlInitializeSampleTimes(SimStruct *S){ double T_samp ; T_samp = T_samp_macro ; ssSetSampleTime(S, 0, T_samp); ssSetOffsetTime(S, 0, 0.0);}/* *****************************************************//* mdlInitializeConditions *//* *****************************************************/static void mdlInitializeConditions(double *x0, SimStruct *S){ *x0 = 0.0 ; ssSetRWorkValue(S, 0, 0.0) ; /* Initialize to zero */}/* *****************************************************//* mdlOutputs *//* *****************************************************/static void mdlOutputs(double *y, double *x, double *u, SimStruct *S, int tid){ double Kp, Ki, Kd, T_samp, u_prev, u_deriv ; Kp = Kp_macro ; Ki = Ki_macro ; Kd = Kd_macro ; T_samp = T_samp_macro ; u_prev = ssGetRWorkValue(S, 0) ; ssSetRWorkValue(S, 0, *u) ; /* Reset to current input */ u_deriv = (*u - u_prev)/T_samp ; *y = Kp*(*u) + Ki*(*x) + Kd*u_deriv ;}/* *****************************************************//* mdlUpdate *//* *****************************************************/static void mdlUpdate(double *x, double *u, SimStruct *S, int tid){ double T_samp, L_upper, L_lower ; T_samp = T_samp_macro ; L_upper = L_upper_macro ; L_lower = L_lower_macro ; *x = *x + T_samp*(*u) ; /* Compute update */ if(*x > L_upper) *x = L_upper ; /* Apply limits */ if(*x < L_lower) *x = L_lower ;}/* *****************************************************//* mdlDerivatives *//* *****************************************************/static void mdlDerivatives(double *dx, double *x, double *u, SimStruct *S, int tid){}/* *****************************************************//* mdlTerminate *//* *****************************************************/static void mdlTerminate(SimStruct *S){}#ifdef MATLAB_MEX_FILE #include "simulink.c" #else#include "cg_sfun.h" #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -