📄 ex33c_pid_acc.c
字号:
rtb_Derivative3 = 0.0;
} else {
real_T deltaT;
real_T *lastBank = &ex33C_pid_DWork->Derivative3_RWORK.TimeStampA;
if (timeStampA < timeStampB) {
if (timeStampB < t) {
lastBank += 2;
}
} else if (timeStampA >= t) {
lastBank += 2;
}
deltaT = t - *lastBank++;
rtb_Derivative3 = (ex33C_pid_B->Sum11 - *lastBank++) / deltaT;
}
}
/* Integrator: '<Root>/Integrator' */
rtb_Integrator = ex33C_pid_X->Integrator_CSTATE;
/* Integrator: '<Root>/Integrator3' */
rtb_Integrator3 = ex33C_pid_X->Integrator3_CSTATE;
ex33C_pid_B->Gain11 = ((ex33C_pid_B->Sum11 + rtb_Integrator3 *
ex33C_pid_P->Gain9_Gain) + (rtb_Derivative3 * ex33C_pid_P->Gain10_Gain)) *
ex33C_pid_P->Gain11_Gain;
ex33C_pid_B->Gain2 = ((ex33C_pid_B->Sum8 + (rtb_Integrator *
ex33C_pid_P->Gain_Gain)) + (rtb_Derivative * ex33C_pid_P->Gain1_Gain)) *
ex33C_pid_P->Gain2_Gain;
/* Integrator: '<Root>/Integrator1' */
rtb_Integrator1 = ex33C_pid_X->Integrator1_CSTATE;
ex33C_pid_B->Gain5 = ((ex33C_pid_B->Sum9 + rtb_Integrator1 *
ex33C_pid_P->Gain3_Gain) + rtb_Derivative1_c * ex33C_pid_P->Gain4_Gain) *
ex33C_pid_P->Gain5_Gain;
/* Integrator: '<Root>/Integrator2' */
rtb_Integrator2 = ex33C_pid_X->Integrator2_CSTATE;
ex33C_pid_B->Gain8 = ((ex33C_pid_B->Sum10 + rtb_Integrator2 *
ex33C_pid_P->Gain6_Gain) + rtb_Derivative2 * ex33C_pid_P->Gain7_Gain) *
ex33C_pid_P->Gain8_Gain;
/* TransportDelay Block: <Root>/Transport Delay,0.15 sec. */
{
real_T **uBuffer =
(real_T**)&ex33C_pid_DWork->TransportDelay015sec_PWORK.TUbufferPtrs[0];
real_T **tBuffer =
(real_T**)&ex33C_pid_DWork->TransportDelay015sec_PWORK.TUbufferPtrs[1];
real_T simTime = ssGetT(S);
real_T tMinusDelay = simTime - ex33C_pid_P->TransportDelay015sec_D;
ex33C_pid_B->TransportDelay015sec = rt_TDelayInterpolate(
tMinusDelay,
*tBuffer,
*uBuffer,
ex33C_pid_DWork->TransportDelay015sec_IWORK.CircularBufSize,
&ex33C_pid_DWork->TransportDelay015sec_IWORK.Last,
ex33C_pid_DWork->TransportDelay015sec_IWORK.Tail,
ex33C_pid_DWork->TransportDelay015sec_IWORK.Head,
0,
(boolean_T) (ssIsMinorTimeStep(S) && (ssGetTimeOfLastOutput(S) ==
ssGetT(S))));
}
}
/* Update for root system: '<Root>' */
#define MDL_UPDATE
static void mdlUpdate(SimStruct *S, int_T tid)
{
/* simstruct variables */
ex33C_pid_BlockIO *ex33C_pid_B = (ex33C_pid_BlockIO *) _ssGetBlockIO(S);
ex33C_pid_D_Work *ex33C_pid_DWork = (ex33C_pid_D_Work *) ssGetRootDWork(S);
ex33C_pid_Parameters *ex33C_pid_P = (ex33C_pid_Parameters *)
ssGetDefaultParam(S);
/* Derivative Block: <S1>/Derivative1 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative1_RWORK.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative1_RWORK.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative1_RWORK.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum12;
}
/* Derivative Block: <Root>/Derivative */
{
real_T timeStampA = ex33C_pid_DWork->Derivative_RWORK.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative_RWORK.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative_RWORK.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum8;
}
/* Derivative Block: <S2>/Derivative1 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative1_RWORK_h.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative1_RWORK_h.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative1_RWORK_h.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum2;
}
/* Derivative Block: <Root>/Derivative1 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative1_RWORK_o.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative1_RWORK_o.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative1_RWORK_o.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum9;
}
/* Derivative Block: <S3>/Derivative1 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative1_RWORK_h5.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative1_RWORK_h5.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative1_RWORK_h5.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum4;
}
/* Derivative Block: <Root>/Derivative2 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative2_RWORK.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative2_RWORK.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative2_RWORK.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum10;
}
/* Derivative Block: <S4>/Derivative1 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative1_RWORK_g.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative1_RWORK_g.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative1_RWORK_g.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum6;
}
/* Derivative Block: <Root>/Derivative3 */
{
real_T timeStampA = ex33C_pid_DWork->Derivative3_RWORK.TimeStampA;
real_T timeStampB = ex33C_pid_DWork->Derivative3_RWORK.TimeStampB;
real_T *lastBank = &ex33C_pid_DWork->Derivative3_RWORK.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = ex33C_pid_B->Sum11;
}
/* TransportDelay Block: <Root>/Transport Delay,0.15 sec. */
{
real_T **uBuffer =
(real_T**)&ex33C_pid_DWork->TransportDelay015sec_PWORK.TUbufferPtrs[0];
real_T **tBuffer =
(real_T**)&ex33C_pid_DWork->TransportDelay015sec_PWORK.TUbufferPtrs[1];
real_T simTime = ssGetT(S);
ex33C_pid_DWork->TransportDelay015sec_IWORK.Head =
((ex33C_pid_DWork->TransportDelay015sec_IWORK.Head <
(ex33C_pid_DWork->TransportDelay015sec_IWORK.CircularBufSize-1)) ?
(ex33C_pid_DWork->TransportDelay015sec_IWORK.Head+1) : 0);
if (ex33C_pid_DWork->TransportDelay015sec_IWORK.Head ==
ex33C_pid_DWork->TransportDelay015sec_IWORK.Tail) {
if (!rt_TDelayUpdateTailOrGrowBuf(
&ex33C_pid_DWork->TransportDelay015sec_IWORK.CircularBufSize,
&ex33C_pid_DWork->TransportDelay015sec_IWORK.Tail,
&ex33C_pid_DWork->TransportDelay015sec_IWORK.Head,
&ex33C_pid_DWork->TransportDelay015sec_IWORK.Last, simTime -
ex33C_pid_P->TransportDelay015sec_D, tBuffer, uBuffer,
&ex33C_pid_DWork->TransportDelay015sec_IWORK.MaxNewBufSize)) {
ssSetErrorStatus(S, "tdelay memory allocation error");
}
}
(*tBuffer)[ex33C_pid_DWork->TransportDelay015sec_IWORK.Head] = simTime;
(*uBuffer)[ex33C_pid_DWork->TransportDelay015sec_IWORK.Head] =
ex33C_pid_B->Gain11;
}
}
/* Derivatives for root system: '<Root>' */
#define MDL_DERIVATIVES
static void mdlDerivatives(SimStruct *S)
{
/* simstruct variables */
ex33C_pid_BlockIO *ex33C_pid_B = (ex33C_pid_BlockIO *) _ssGetBlockIO(S);
ex33C_pid_ContinuousStates *ex33C_pid_X = (ex33C_pid_ContinuousStates*)
ssGetContStates(S);
ex33C_pid_StateDerivatives *ex33C_pid_Xdot = (ex33C_pid_StateDerivatives*)
ssGetdX(S);
ex33C_pid_Parameters *ex33C_pid_P = (ex33C_pid_Parameters *)
ssGetDefaultParam(S);
/* TransferFcn Block: <Root>/Transfer Fcn1 */
{
ex33C_pid_Xdot->TransferFcn1_CSTATE[0] =
ex33C_pid_P->TransferFcn1_B*ex33C_pid_B->Gain2;
ex33C_pid_Xdot->TransferFcn1_CSTATE[0] +=
(ex33C_pid_P->TransferFcn1_A[0])*ex33C_pid_X->TransferFcn1_CSTATE[0]
+ (ex33C_pid_P->TransferFcn1_A[1])*ex33C_pid_X->TransferFcn1_CSTATE[1];
ex33C_pid_Xdot->TransferFcn1_CSTATE[1] =
(ex33C_pid_P->TransferFcn1_A[2])*ex33C_pid_X->TransferFcn1_CSTATE[0];
}
/* TransferFcn Block: <Root>/Transfer Fcn2 */
{
ex33C_pid_Xdot->TransferFcn2_CSTATE[0] =
ex33C_pid_P->TransferFcn2_B*ex33C_pid_B->Gain5;
ex33C_pid_Xdot->TransferFcn2_CSTATE[0] +=
(ex33C_pid_P->TransferFcn2_A[0])*ex33C_pid_X->TransferFcn2_CSTATE[0]
+ (ex33C_pid_P->TransferFcn2_A[1])*ex33C_pid_X->TransferFcn2_CSTATE[1];
ex33C_pid_Xdot->TransferFcn2_CSTATE[1] =
(ex33C_pid_P->TransferFcn2_A[2])*ex33C_pid_X->TransferFcn2_CSTATE[0];
}
/* TransferFcn Block: <Root>/Transfer Fcn3 */
{
ex33C_pid_Xdot->TransferFcn3_CSTATE[0] =
ex33C_pid_P->TransferFcn3_B*ex33C_pid_B->Gain8;
ex33C_pid_Xdot->TransferFcn3_CSTATE[0] +=
(ex33C_pid_P->TransferFcn3_A[0])*ex33C_pid_X->TransferFcn3_CSTATE[0]
+ (ex33C_pid_P->TransferFcn3_A[1])*ex33C_pid_X->TransferFcn3_CSTATE[1];
ex33C_pid_Xdot->TransferFcn3_CSTATE[1] =
(ex33C_pid_P->TransferFcn3_A[2])*ex33C_pid_X->TransferFcn3_CSTATE[0];
}
/* TransferFcn Block: <Root>/Transfer Fcn4 */
{
ex33C_pid_Xdot->TransferFcn4_CSTATE[0] =
ex33C_pid_P->TransferFcn4_B*ex33C_pid_B->TransportDelay015sec;
ex33C_pid_Xdot->TransferFcn4_CSTATE[0] +=
(ex33C_pid_P->TransferFcn4_A[0])*ex33C_pid_X->TransferFcn4_CSTATE[0]
+ (ex33C_pid_P->TransferFcn4_A[1])*ex33C_pid_X->TransferFcn4_CSTATE[1];
ex33C_pid_Xdot->TransferFcn4_CSTATE[1] =
(ex33C_pid_P->TransferFcn4_A[2])*ex33C_pid_X->TransferFcn4_CSTATE[0];
}
/* Integrator Block: <Root>/Integrator */
{
ex33C_pid_Xdot->Integrator_CSTATE = ex33C_pid_B->Sum8;
}
/* Integrator Block: <Root>/Integrator3 */
{
ex33C_pid_Xdot->Integrator3_CSTATE = ex33C_pid_B->Sum11;
}
/* Integrator Block: <Root>/Integrator1 */
{
ex33C_pid_Xdot->Integrator1_CSTATE = ex33C_pid_B->Sum9;
}
/* Integrator Block: <Root>/Integrator2 */
{
ex33C_pid_Xdot->Integrator2_CSTATE = ex33C_pid_B->Sum10;
}
}
/* Function to initialize sizes */
static void mdlInitializeSizes(SimStruct *S)
{
/* checksum */
ssSetChecksumVal(S, 0, 546563217U);
ssSetChecksumVal(S, 1, 3006981950U);
ssSetChecksumVal(S, 2, 3412167337U);
ssSetChecksumVal(S, 3, 3700485568U);
/* options */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
/* Accelerator check memory map size match for DWork */
if (ssGetSizeofDWork(S) != sizeof(ex33C_pid_D_Work)) {
ssSetErrorStatus(S,"Unexpected error: Internal DWork sizes do "
"not match for accelerator mex file.");
}
/* Accelerator check memory map size match for BlockIO */
if (ssGetSizeofGlobalBlockIO(S) != sizeof(ex33C_pid_BlockIO)) {
ssSetErrorStatus(S,"Unexpected error: Internal BlockIO sizes do "
"not match for accelerator mex file.");
}
/* model parameters */
_ssSetDefaultParam(S, (real_T *) &ex33C_pid_DefaultParameters);
/* non-finites */
rt_InitInfAndNaN(sizeof(real_T));
}
/* Empty mdlInitializeSampleTimes function (never called) */
static void mdlInitializeSampleTimes(SimStruct *S) { }
/* Empty mdlTerminate function (never called) */
static void mdlTerminate(SimStruct *S) { }
/* MATLAB MEX Glue */
#include "simulink.c"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -