📄 ps_flc3_controla_acc.c
字号:
/*
* This file is not available for use in any application other than as a
* MATLAB(R) MEX file for use with the Simulink(R) Accelerator product.
*/
/*
* PS_flc3_controlA_acc.c
*
* Real-Time Workshop code generation for Simulink model "PS_flc3_controlA_acc.mdl".
*
* Model Version : 1.86
* Real-Time Workshop version : 6.1 (R14SP1) 05-Sep-2004
* C source code generated on : Fri May 13 09:00:18 2005
*/
#include <math.h>
#include <string.h>
#include "PS_flc3_controlA_acc.h"
#include "PS_flc3_controlA_acc_private.h"
#include <stdio.h>
#include "simstruc.h"
#include "fixedpoint.h"
#define CodeFormat S-Function
#define AccDefine1 Accelerator_S-Function
/* Outputs for root system: '<Root>' */
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* simstruct variables */
PS_flc3_controlA_BlockIO *PS_flc3_controlA_B = (PS_flc3_controlA_BlockIO *)
_ssGetBlockIO(S);
PS_flc3_controlA_ContinuousStates *PS_flc3_controlA_X =
(PS_flc3_controlA_ContinuousStates*) ssGetContStates(S);
PS_flc3_controlA_D_Work *PS_flc3_controlA_DWork = (PS_flc3_controlA_D_Work *)
ssGetRootDWork(S);
PS_flc3_controlA_Parameters *PS_flc3_controlA_P = (PS_flc3_controlA_Parameters
*) ssGetDefaultParam(S);
/* local block i/o variables */
real_T rtb_Derivative1;
real_T rtb_Product_b[5];
real_T rtb_Sum_d;
real_T rtb_Product[2];
real_T rtb_Sum_f;
real_T rtb_Product_c[2];
real_T rtb_Sum_o;
real_T rtb_Product_j[2];
real_T rtb_Sum_m;
real_T rtb_Product_n[2];
real_T rtb_Sum_n;
real_T rtb_Product_i[2];
real_T rtb_Sum_n2;
real_T rtb_netsum[5];
/* Clock: '<Root>/Clock' */
PS_flc3_controlA_B->Clock = ssGetT(S);
/* ToWorkspace: '<Root>/To Workspace4' */
/* Call into Simulink for To Workspace */
ssCallAccelRunBlock(S, 0, 1, SS_CALL_MDL_OUTPUTS);
if (ssIsSampleHit(S, 3, tid)) { /* Sample time: [-2.0s, 0.0s] */
/* DiscretePulseGenerator: '<Root>/Pulse Generator' */
real_T time = ssGetTaskTime(S,tid);
real_T delay = 0.0;
if ( (int_T)PS_flc3_controlA_DWork->justEnabled ) {
PS_flc3_controlA_DWork->justEnabled = 0;
if (time >= delay) {
real_T ratio = (time - delay)/ PS_flc3_controlA_P->PulseGenerator_Period;
PS_flc3_controlA_DWork->numCompleteCycles = (int)floor(ratio);
if ( fabs((PS_flc3_controlA_DWork->numCompleteCycles+1)- ratio ) <
DBL_EPSILON * ratio )
{
PS_flc3_controlA_DWork->numCompleteCycles =
PS_flc3_controlA_DWork->numCompleteCycles+1;
}
PS_flc3_controlA_DWork->numCompleteCycles =
PS_flc3_controlA_DWork->numCompleteCycles;
if (time < delay + PS_flc3_controlA_DWork->numCompleteCycles *
PS_flc3_controlA_P->PulseGenerator_Period
+ PS_flc3_controlA_P->PulseGenerator_Duty *
PS_flc3_controlA_P->PulseGenerator_Period/100) {
PS_flc3_controlA_DWork->currentValue = 1;
PS_flc3_controlA_DWork->nextTime = delay +
PS_flc3_controlA_DWork->numCompleteCycles *
PS_flc3_controlA_P->PulseGenerator_Period
+ PS_flc3_controlA_P->PulseGenerator_Duty *
PS_flc3_controlA_P->PulseGenerator_Period/100;
} else {
PS_flc3_controlA_DWork->currentValue = 0;
PS_flc3_controlA_DWork->nextTime = delay +
(PS_flc3_controlA_DWork->numCompleteCycles + 1) *
PS_flc3_controlA_P->PulseGenerator_Period;
}
} else {
PS_flc3_controlA_DWork->numCompleteCycles = 0;
PS_flc3_controlA_DWork->currentValue = 0;
PS_flc3_controlA_DWork->nextTime = delay;
}
} else {
/* Determine if any values need to change */
if (PS_flc3_controlA_DWork->nextTime <= time) {
if (PS_flc3_controlA_DWork->currentValue == 1) {
PS_flc3_controlA_DWork->currentValue = 0;
PS_flc3_controlA_DWork->nextTime = delay +
(PS_flc3_controlA_DWork->numCompleteCycles + 1) *
PS_flc3_controlA_P->PulseGenerator_Period;
} else {
if ( PS_flc3_controlA_DWork->nextTime != delay) {
PS_flc3_controlA_DWork->numCompleteCycles += 1;
}
PS_flc3_controlA_DWork->currentValue = 1;
PS_flc3_controlA_DWork->nextTime = delay +
PS_flc3_controlA_DWork->numCompleteCycles *
PS_flc3_controlA_P->PulseGenerator_Period
+ 0.01 * PS_flc3_controlA_P->PulseGenerator_Duty *
PS_flc3_controlA_P->PulseGenerator_Period;
}
}
}
/* Set the next hit time */
{
real_T tNext = PS_flc3_controlA_DWork->nextTime;
_ssSetVarNextHitTime(S, (int_T)0.0, tNext);
}
/* Output the values */
if (PS_flc3_controlA_DWork->currentValue == 1){
PS_flc3_controlA_B->PulseGenerator =
PS_flc3_controlA_P->PulseGenerator_Amp;
} else {
PS_flc3_controlA_B->PulseGenerator = 0.0;
}
}
if (ssIsSampleHit(S, 1, tid)) { /* Sample time: [0.0s, 1.0s] */
PS_flc3_controlA_B->Constant = PS_flc3_controlA_P->Constant_Value;
PS_flc3_controlA_B->Gain = (PS_flc3_controlA_B->PulseGenerator -
PS_flc3_controlA_B->Constant) * PS_flc3_controlA_P->Gain_Gain;
}
/* TransferFcn Block: <Root>/Transfer Fcn2 */
PS_flc3_controlA_B->TransferFcn2 =
PS_flc3_controlA_P->TransferFcn2_C*PS_flc3_controlA_X->TransferFcn2_CSTATE[2];
/* Scope: '<Root>/Scope' */
/* Call into Simulink for Scope */
ssCallAccelRunBlock(S, 0, 7, SS_CALL_MDL_OUTPUTS);
/* ToWorkspace: '<Root>/To Workspace' */
/* Call into Simulink for To Workspace */
ssCallAccelRunBlock(S, 0, 8, SS_CALL_MDL_OUTPUTS);
if (ssIsSampleHit(S, 1, tid)) { /* Sample time: [0.0s, 1.0s] */
/* ToWorkspace: '<Root>/To Workspace1' */
/* Call into Simulink for To Workspace */
ssCallAccelRunBlock(S, 0, 9, SS_CALL_MDL_OUTPUTS);
}
PS_flc3_controlA_B->Sum = PS_flc3_controlA_B->Gain -
PS_flc3_controlA_B->TransferFcn2;
/* Derivative Block: <S1>/Derivative1 */
{
real_T t = ssGetTaskTime(S,tid);
real_T timeStampA = PS_flc3_controlA_DWork->Derivative1_RWORK.TimeStampA;
real_T timeStampB = PS_flc3_controlA_DWork->Derivative1_RWORK.TimeStampB;
if (timeStampA >= t && timeStampB >= t) {
rtb_Derivative1 = 0.0;
} else {
real_T deltaT;
real_T *lastBank = &PS_flc3_controlA_DWork->Derivative1_RWORK.TimeStampA;
if (timeStampA < timeStampB) {
if (timeStampB < t) {
lastBank += 2;
}
} else if (timeStampA >= t) {
lastBank += 2;
}
deltaT = t - *lastBank++;
rtb_Derivative1 = (PS_flc3_controlA_B->Sum - *lastBank++) / deltaT;
}
}
if (ssIsSampleHit(S, 2, tid)) { /* Sample time: [0.001s, 0.0s] */
PS_flc3_controlA_B->IW111[0] = PS_flc3_controlA_P->IW111_Value[0];
PS_flc3_controlA_B->IW111[1] = PS_flc3_controlA_P->IW111_Value[1];
PS_flc3_controlA_B->IW112[0] = PS_flc3_controlA_P->IW112_Value[0];
PS_flc3_controlA_B->IW112[1] = PS_flc3_controlA_P->IW112_Value[1];
PS_flc3_controlA_B->IW113[0] = PS_flc3_controlA_P->IW113_Value[0];
PS_flc3_controlA_B->IW113[1] = PS_flc3_controlA_P->IW113_Value[1];
PS_flc3_controlA_B->IW114[0] = PS_flc3_controlA_P->IW114_Value[0];
PS_flc3_controlA_B->IW114[1] = PS_flc3_controlA_P->IW114_Value[1];
PS_flc3_controlA_B->IW115[0] = PS_flc3_controlA_P->IW115_Value[0];
PS_flc3_controlA_B->IW115[1] = PS_flc3_controlA_P->IW115_Value[1];
}
PS_flc3_controlA_B->SE1 = PS_flc3_controlA_B->Sum *
PS_flc3_controlA_P->SE1_Gain;
PS_flc3_controlA_B->SDE001 = rtb_Derivative1 * PS_flc3_controlA_P->SDE001_Gain;
if (ssIsSampleHit(S, 2, tid)) { /* Sample time: [0.001s, 0.0s] */
rtb_Product[0] = PS_flc3_controlA_B->IW111[0] * PS_flc3_controlA_B->SE1;
rtb_Product[1] = PS_flc3_controlA_B->IW111[1] * PS_flc3_controlA_B->SDE001;
/* Sum: '<S13>/Sum' */
rtb_Sum_f = rtb_Product[0];
rtb_Sum_f += rtb_Product[1];
rtb_Product_c[0] = PS_flc3_controlA_B->IW112[0] * PS_flc3_controlA_B->SE1;
rtb_Product_c[1] = PS_flc3_controlA_B->IW112[1] * PS_flc3_controlA_B->SDE001;
/* Sum: '<S14>/Sum' */
rtb_Sum_o = rtb_Product_c[0];
rtb_Sum_o += rtb_Product_c[1];
rtb_Product_j[0] = PS_flc3_controlA_B->IW113[0] * PS_flc3_controlA_B->SE1;
rtb_Product_j[1] = PS_flc3_controlA_B->IW113[1] * PS_flc3_controlA_B->SDE001;
/* Sum: '<S15>/Sum' */
rtb_Sum_m = rtb_Product_j[0];
rtb_Sum_m += rtb_Product_j[1];
rtb_Product_n[0] = PS_flc3_controlA_B->IW114[0] * PS_flc3_controlA_B->SE1;
rtb_Product_n[1] = PS_flc3_controlA_B->IW114[1] * PS_flc3_controlA_B->SDE001;
/* Sum: '<S16>/Sum' */
rtb_Sum_n = rtb_Product_n[0];
rtb_Sum_n += rtb_Product_n[1];
rtb_Product_i[0] = PS_flc3_controlA_B->IW115[0] * PS_flc3_controlA_B->SE1;
rtb_Product_i[1] = PS_flc3_controlA_B->IW115[1] * PS_flc3_controlA_B->SDE001;
/* Sum: '<S17>/Sum' */
rtb_Sum_n2 = rtb_Product_i[0];
rtb_Sum_n2 += rtb_Product_i[1];
{
real_T cg_in_0_30_0[5];
int32_T i1;
for(i1=0; i1<5; i1++) {
PS_flc3_controlA_B->b1[i1] = PS_flc3_controlA_P->b1_Value[i1];
}
cg_in_0_30_0[0] = rtb_Sum_f;
cg_in_0_30_0[1] = rtb_Sum_o;
cg_in_0_30_0[2] = rtb_Sum_m;
cg_in_0_30_0[3] = rtb_Sum_n;
cg_in_0_30_0[4] = rtb_Sum_n2;
for(i1=0; i1<5; i1++) {
rtb_netsum[i1] = cg_in_0_30_0[i1] + PS_flc3_controlA_B->b1[i1];
PS_flc3_controlA_B->Saturation[i1] = rt_SATURATE(rtb_netsum[i1],
PS_flc3_controlA_P->Saturation_LowerSat,
PS_flc3_controlA_P->Saturation_UpperSat);
}
}
}
if (ssIsSampleHit(S, 1, tid)) { /* Sample time: [0.0s, 1.0s] */
{
int32_T i1;
for(i1=0; i1<5; i1++) {
PS_flc3_controlA_B->IW211[i1] = PS_flc3_controlA_P->IW211_Value[i1];
rtb_Product_b[i1] = PS_flc3_controlA_B->IW211[i1] *
PS_flc3_controlA_B->Saturation[i1];
}
}
/* Sum: '<S22>/Sum' */
rtb_Sum_d = rtb_Product_b[0];
rtb_Sum_d += rtb_Product_b[1];
rtb_Sum_d += rtb_Product_b[2];
rtb_Sum_d += rtb_Product_b[3];
rtb_Sum_d += rtb_Product_b[4];
PS_flc3_controlA_B->b2 = PS_flc3_controlA_P->b2_Value;
PS_flc3_controlA_B->SU1 = (rtb_Sum_d + PS_flc3_controlA_B->b2) *
PS_flc3_controlA_P->SU1_Gain;
}
PS_flc3_controlA_B->Sum1 = PS_flc3_controlA_B->SU1 + PS_flc3_controlA_B->Sum;
}
/* Update for root system: '<Root>' */
#define MDL_UPDATE
static void mdlUpdate(SimStruct *S, int_T tid)
{
/* simstruct variables */
PS_flc3_controlA_BlockIO *PS_flc3_controlA_B = (PS_flc3_controlA_BlockIO *)
_ssGetBlockIO(S);
PS_flc3_controlA_D_Work *PS_flc3_controlA_DWork = (PS_flc3_controlA_D_Work *)
ssGetRootDWork(S);
/* Derivative Block: <S1>/Derivative1 */
{
real_T timeStampA = PS_flc3_controlA_DWork->Derivative1_RWORK.TimeStampA;
real_T timeStampB = PS_flc3_controlA_DWork->Derivative1_RWORK.TimeStampB;
real_T *lastBank = &PS_flc3_controlA_DWork->Derivative1_RWORK.TimeStampA;
if (timeStampA != rtInf) {
if (timeStampB == rtInf) {
lastBank += 2;
} else if (timeStampA >= timeStampB) {
lastBank += 2;
}
}
*lastBank++ = ssGetTaskTime(S,tid);
*lastBank++ = PS_flc3_controlA_B->Sum;
}
}
/* Derivatives for root system: '<Root>' */
#define MDL_DERIVATIVES
static void mdlDerivatives(SimStruct *S)
{
/* simstruct variables */
PS_flc3_controlA_BlockIO *PS_flc3_controlA_B = (PS_flc3_controlA_BlockIO *)
_ssGetBlockIO(S);
PS_flc3_controlA_ContinuousStates *PS_flc3_controlA_X =
(PS_flc3_controlA_ContinuousStates*) ssGetContStates(S);
PS_flc3_controlA_StateDerivatives *PS_flc3_controlA_Xdot =
(PS_flc3_controlA_StateDerivatives*) ssGetdX(S);
PS_flc3_controlA_Parameters *PS_flc3_controlA_P = (PS_flc3_controlA_Parameters
*) ssGetDefaultParam(S);
/* TransferFcn Block: <Root>/Transfer Fcn2 */
{
PS_flc3_controlA_Xdot->TransferFcn2_CSTATE[0] =
PS_flc3_controlA_P->TransferFcn2_B*PS_flc3_controlA_B->Sum1;
PS_flc3_controlA_Xdot->TransferFcn2_CSTATE[0] +=
(PS_flc3_controlA_P->TransferFcn2_A[0])*PS_flc3_controlA_X->TransferFcn2_CSTATE[0]
+
(PS_flc3_controlA_P->TransferFcn2_A[1])*PS_flc3_controlA_X->TransferFcn2_CSTATE[1]
+
(PS_flc3_controlA_P->TransferFcn2_A[2])*PS_flc3_controlA_X->TransferFcn2_CSTATE[2];
PS_flc3_controlA_Xdot->TransferFcn2_CSTATE[1] =
(PS_flc3_controlA_P->TransferFcn2_A[3])*PS_flc3_controlA_X->TransferFcn2_CSTATE[0];
PS_flc3_controlA_Xdot->TransferFcn2_CSTATE[2] =
(PS_flc3_controlA_P->TransferFcn2_A[4])*PS_flc3_controlA_X->TransferFcn2_CSTATE[1];
}
}
/* Function to initialize sizes */
static void mdlInitializeSizes(SimStruct *S)
{
/* checksum */
ssSetChecksumVal(S, 0, 2861163539U);
ssSetChecksumVal(S, 1, 1188581179U);
ssSetChecksumVal(S, 2, 3292980389U);
ssSetChecksumVal(S, 3, 1177302536U);
/* options */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
/* Accelerator check memory map size match for DWork */
if (ssGetSizeofDWork(S) != sizeof(PS_flc3_controlA_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(PS_flc3_controlA_BlockIO)) {
ssSetErrorStatus(S,"Unexpected error: Internal BlockIO sizes do "
"not match for accelerator mex file.");
}
/* model parameters */
_ssSetDefaultParam(S, (real_T *) &PS_flc3_controlA_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 + -