示例#1
0
/* Model update function */
void m1006_update(int_T tid)
{

  if (rtmIsMajorTimeStep(m1006_M)) {
    rt_ertODEUpdateContinuousStates(&m1006_M->solverInfo, 0);
  }

  /* Update absolute time for base rate */

  if(!(++m1006_M->Timing.clockTick0)) ++m1006_M->Timing.clockTickH0;
  m1006_M->Timing.t[0] = m1006_M->Timing.clockTick0 * m1006_M->Timing.stepSize0
    + m1006_M->Timing.clockTickH0 * m1006_M->Timing.stepSize0 * 4294967296.0;

  if (rtmIsMajorTimeStep(m1006_M) &&
   m1006_M->Timing.TaskCounters.TID[1] == 0) {
    /* Update absolute timer for sample time: [0.1s, 0.0s] */

    if(!(++m1006_M->Timing.clockTick1)) ++m1006_M->Timing.clockTickH1;
    m1006_M->Timing.t[1] = m1006_M->Timing.clockTick1 *
      m1006_M->Timing.stepSize1 + m1006_M->Timing.clockTickH1 *
      m1006_M->Timing.stepSize1 * 4294967296.0;
  }

  rate_scheduler();
}
示例#2
0
/* Model update function */
void Crane_update(int_T tid)
{
  if (rtmIsMajorTimeStep(Crane_M) &&
      Crane_M->Timing.TaskCounters.TID[1] == 0) {
    /* Update for Memory: '<Root>/Memory' */
    Crane_DWork.Memory_PreviousInput[0] = Crane_B.Gain3[1];
    Crane_DWork.Memory_PreviousInput[1] = Crane_B.Gain3[2];
    Crane_DWork.Memory_PreviousInput[2] = Crane_B.Constant;
  }

  /* Derivative Block: '<S9>/Derivative' */
  {
    real_T timeStampA = Crane_DWork.Derivative_RWORK.TimeStampA;
    real_T timeStampB = Crane_DWork.Derivative_RWORK.TimeStampB;
    real_T *lastBank = &Crane_DWork.Derivative_RWORK.TimeStampA;
    if (timeStampA != rtInf) {
      if (timeStampB == rtInf) {
        lastBank += 4;
      } else if (timeStampA >= timeStampB) {
        lastBank += 4;
      }
    }

    *lastBank++ = Crane_M->Timing.t[0];
    *lastBank++ = Crane_B.Sum[0];
    *lastBank++ = Crane_B.Sum[1];
    *lastBank++ = Crane_B.Sum[2];
  }

  if (rtmIsMajorTimeStep(Crane_M)) {
    rt_ertODEUpdateContinuousStates(&Crane_M->solverInfo);
  }

  /* Update absolute time for base rate */
  if (!(++Crane_M->Timing.clockTick0))
    ++Crane_M->Timing.clockTickH0;
  Crane_M->Timing.t[0] = Crane_M->Timing.clockTick0 * Crane_M->Timing.stepSize0
    + Crane_M->Timing.clockTickH0 * Crane_M->Timing.stepSize0 * 4294967296.0;
  if (rtmIsMajorTimeStep(Crane_M) &&
      Crane_M->Timing.TaskCounters.TID[1] == 0) {
    /* Update absolute timer for sample time: [0.001s, 0.0s] */
    if (!(++Crane_M->Timing.clockTick1))
      ++Crane_M->Timing.clockTickH1;
    Crane_M->Timing.t[1] = Crane_M->Timing.clockTick1 *
      Crane_M->Timing.stepSize1 + Crane_M->Timing.clockTickH1 *
      Crane_M->Timing.stepSize1 * 4294967296.0;
  }

  UNUSED_PARAMETER(tid);
}
示例#3
0
/* Model update function */
void xpcosc_update(int_T tid)
{
  if (rtmIsMajorTimeStep(xpcosc_rtM)) {
    rt_ertODEUpdateContinuousStates(&xpcosc_rtM->solverInfo);
  }

  /* Update absolute time for base rate */
  /* The "clockTick0" counts the number of times the code of this task has
   * been executed. The absolute time is the multiplication of "clockTick0"
   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
   * overflow during the application lifespan selected.
   * Timer of this task consists of two 32 bit unsigned integers.
   * The two integers represent the low bits Timing.clockTick0 and the high bits
   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
   */
  if (!(++xpcosc_rtM->Timing.clockTick0)) {
    ++xpcosc_rtM->Timing.clockTickH0;
  }

  xpcosc_rtM->Timing.t[0] = rtsiGetSolverStopTime(&xpcosc_rtM->solverInfo);

  {
    /* Update absolute timer for sample time: [0.001s, 0.0s] */
    /* The "clockTick1" counts the number of times the code of this task has
     * been executed. The absolute time is the multiplication of "clockTick1"
     * and "Timing.stepSize1". Size of "clockTick1" ensures timer will not
     * overflow during the application lifespan selected.
     * Timer of this task consists of two 32 bit unsigned integers.
     * The two integers represent the low bits Timing.clockTick1 and the high bits
     * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment.
     */
    if (!(++xpcosc_rtM->Timing.clockTick1)) {
      ++xpcosc_rtM->Timing.clockTickH1;
    }

    xpcosc_rtM->Timing.t[1] = xpcosc_rtM->Timing.clockTick1 *
      xpcosc_rtM->Timing.stepSize1 + xpcosc_rtM->Timing.clockTickH1 *
      xpcosc_rtM->Timing.stepSize1 * 4294967296.0;
  }

  /* tid is required for a uniform function interface.
   * Argument tid is not used in the function. */
  UNUSED_PARAMETER(tid);
}
示例#4
0
/* Model update function */
void motor_io_update(void)
{
  if (rtmIsMajorTimeStep(motor_io_M)) {
    rt_ertODEUpdateContinuousStates(&motor_io_M->solverInfo);
  }

  /* Update absolute time for base rate */
  /* The "clockTick0" counts the number of times the code of this task has
   * been executed. The absolute time is the multiplication of "clockTick0"
   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
   * overflow during the application lifespan selected.
   * Timer of this task consists of two 32 bit unsigned integers.
   * The two integers represent the low bits Timing.clockTick0 and the high bits
   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
   */
  if (!(++motor_io_M->Timing.clockTick0)) {
    ++motor_io_M->Timing.clockTickH0;
  }

  motor_io_M->Timing.t[0] = rtsiGetSolverStopTime(&motor_io_M->solverInfo);

  {
    /* Update absolute timer for sample time: [0.01s, 0.0s] */
    /* The "clockTick1" counts the number of times the code of this task has
     * been executed. The absolute time is the multiplication of "clockTick1"
     * and "Timing.stepSize1". Size of "clockTick1" ensures timer will not
     * overflow during the application lifespan selected.
     * Timer of this task consists of two 32 bit unsigned integers.
     * The two integers represent the low bits Timing.clockTick1 and the high bits
     * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment.
     */
    if (!(++motor_io_M->Timing.clockTick1)) {
      ++motor_io_M->Timing.clockTickH1;
    }

    motor_io_M->Timing.t[1] = motor_io_M->Timing.clockTick1 *
      motor_io_M->Timing.stepSize1 + motor_io_M->Timing.clockTickH1 *
      motor_io_M->Timing.stepSize1 * 4294967296.0;
  }
}
/* Model update function */
void Mechanics_update(int_T tid)
{
  if (rtmIsMajorTimeStep(Mechanics_M)) {
    rt_ertODEUpdateContinuousStates(&Mechanics_M->solverInfo);
  }

  /* Update absolute time for base rate */
  if (!(++Mechanics_M->Timing.clockTick0))
    ++Mechanics_M->Timing.clockTickH0;
  Mechanics_M->Timing.t[0] = Mechanics_M->Timing.clockTick0 *
    Mechanics_M->Timing.stepSize0 + Mechanics_M->Timing.clockTickH0 *
    Mechanics_M->Timing.stepSize0 * 4294967296.0;
  if (rtmIsMajorTimeStep(Mechanics_M) &&
      Mechanics_M->Timing.TaskCounters.TID[1] == 0) {
    /* Update absolute timer for sample time: [35.0s, 0.0s] */
    if (!(++Mechanics_M->Timing.clockTick1))
      ++Mechanics_M->Timing.clockTickH1;
    Mechanics_M->Timing.t[1] = Mechanics_M->Timing.clockTick1 *
      Mechanics_M->Timing.stepSize1 + Mechanics_M->Timing.clockTickH1 *
      Mechanics_M->Timing.stepSize1 * 4294967296.0;
  }

  UNUSED_PARAMETER(tid);
}
/* Model step function */
void trajectoryModel_step(void)
{
  /* local block i/o variables */
  real_T rtb_Sqrt;
  real_T rtb_Divide1;
  int8_T rtAction;
  real_T rtb_Divide;
  real_T rtb_Add1;
  if (rtmIsMajorTimeStep(trajectoryModel_M)) {
    /* set solver stop time */
    if (!(trajectoryModel_M->Timing.clockTick0+1)) {
      rtsiSetSolverStopTime(&trajectoryModel_M->solverInfo,
                            ((trajectoryModel_M->Timing.clockTickH0 + 1) *
        trajectoryModel_M->Timing.stepSize0 * 4294967296.0));
    } else {
      rtsiSetSolverStopTime(&trajectoryModel_M->solverInfo,
                            ((trajectoryModel_M->Timing.clockTick0 + 1) *
        trajectoryModel_M->Timing.stepSize0 +
        trajectoryModel_M->Timing.clockTickH0 *
        trajectoryModel_M->Timing.stepSize0 * 4294967296.0));
    }
  }                                    /* end MajorTimeStep */

  /* Update absolute time of base rate at minor time step */
  if (rtmIsMinorTimeStep(trajectoryModel_M)) {
    trajectoryModel_M->Timing.t[0] = rtsiGetT(&trajectoryModel_M->solverInfo);
  }

  /* Integrator: '<Root>/x' */
  trajectoryModel_B.x = trajectoryModel_X.x_CSTATE;

  /* Sum: '<S3>/x-Planet_x' incorporates:
   *  Constant: '<Root>/0 '
   */
  rtb_Divide1 = trajectoryModel_B.x - trajectoryModel_P._Value;

  /* Integrator: '<Root>/y ' */
  trajectoryModel_B.y = trajectoryModel_X.y_CSTATE;

  /* Sqrt: '<S3>/Sqrt' incorporates:
   *  Product: '<S3>/(x-Planet_x)^2'
   *  Product: '<S3>/y^2'
   *  Sum: '<S3>/(x-Planet_x)^2+y^2'
   */
  rtb_Sqrt = sqrt(rtb_Divide1 * rtb_Divide1 + trajectoryModel_B.y *
                  trajectoryModel_B.y);

  /* If: '<Root>/If' incorporates:
   *  Constant: '<Root>/stopRadius'
   *  Constant: '<Root>/terminate'
   */
  if (rtmIsMajorTimeStep(trajectoryModel_M)) {
    if (rtb_Sqrt < trajectoryModel_P.stopRadius) {
      rtAction = 0;
    } else {
      rtAction = 1;
    }

    trajectoryModel_DW.If_ActiveSubsystem = rtAction;
  } else {
    rtAction = trajectoryModel_DW.If_ActiveSubsystem;
  }

  switch (rtAction) {
   case 0:
    /* Outputs for IfAction SubSystem: '<Root>/If Action Subsystem' incorporates:
     *  ActionPort: '<S1>/Action Port'
     */
    trajectoryMod_IfActionSubsystem(rtb_Sqrt,
      &trajectoryModel_B.IfActionSubsystem);

    /* End of Outputs for SubSystem: '<Root>/If Action Subsystem' */
    break;

   case 1:
    /* Outputs for IfAction SubSystem: '<Root>/If Action Subsystem1' incorporates:
     *  ActionPort: '<S2>/Action Port'
     */
    trajectoryMod_IfActionSubsystem(trajectoryModel_P.terminate_Value,
      &trajectoryModel_B.IfActionSubsystem1);

    /* End of Outputs for SubSystem: '<Root>/If Action Subsystem1' */
    break;
  }

  /* End of If: '<Root>/If' */
  if (rtmIsMajorTimeStep(trajectoryModel_M)) {
    /* Stop: '<Root>/Stop Simulation' */
    if (trajectoryModel_B.IfActionSubsystem1.In1 != 0.0) {
      rtmSetStopRequested(trajectoryModel_M, 1);
    }

    /* End of Stop: '<Root>/Stop Simulation' */
  }

  /* Integrator: '<Root>/dx' */
  trajectoryModel_B.x_dot = trajectoryModel_X.dx_CSTATE;

  /* Integrator: '<Root>/dy' */
  trajectoryModel_B.y_dot = trajectoryModel_X.dy_CSTATE;
  if (rtmIsMajorTimeStep(trajectoryModel_M)) {
  }

  /* Sum: '<S4>/x-Planet_x' incorporates:
   *  Constant: '<Root>/Earth_x'
   */
  rtb_Divide1 = trajectoryModel_B.x - (-trajectoryModel_P.mu);

  /* Sqrt: '<S4>/Sqrt' incorporates:
   *  Product: '<S4>/(x-Planet_x)^2'
   *  Product: '<S4>/y^2'
   *  Sum: '<S4>/(x-Planet_x)^2+y^2'
   */
  rtb_Divide1 = sqrt(rtb_Divide1 * rtb_Divide1 + trajectoryModel_B.y *
                     trajectoryModel_B.y);

  /* Product: '<Root>/Divide1' incorporates:
   *  Constant: '<Root>/Moon_x Earth mass'
   *  Product: '<Root>/Divide2'
   */
  rtb_Divide1 = (1.0 - trajectoryModel_P.mu) / (rtb_Divide1 * rtb_Divide1 *
    rtb_Divide1);

  /* Sum: '<S5>/x-Planet_x' incorporates:
   *  Constant: '<Root>/Moon_x Earth mass'
   */
  rtb_Divide = trajectoryModel_B.x - (1.0 - trajectoryModel_P.mu);

  /* Sqrt: '<S5>/Sqrt' incorporates:
   *  Product: '<S5>/(x-Planet_x)^2'
   *  Product: '<S5>/y^2'
   *  Sum: '<S5>/(x-Planet_x)^2+y^2'
   */
  rtb_Divide = sqrt(rtb_Divide * rtb_Divide + trajectoryModel_B.y *
                    trajectoryModel_B.y);

  /* Product: '<Root>/Divide' incorporates:
   *  Constant: '<Root>/Moon mass'
   *  Product: '<Root>/Divide3'
   */
  rtb_Divide = trajectoryModel_P.mu / (rtb_Divide * rtb_Divide * rtb_Divide);

  /* Sum: '<Root>/Add1' incorporates:
   *  Constant: '<Root>/2'
   */
  rtb_Add1 = (trajectoryModel_P._Value_f - rtb_Divide1) - rtb_Divide;

  /* Sum: '<Root>/Add' incorporates:
   *  Gain: '<Root>/Gain'
   *  Product: '<Root>/Product'
   */
  trajectoryModel_B.Add = trajectoryModel_B.y * rtb_Add1 -
    trajectoryModel_P.Gain_Gain * trajectoryModel_B.x_dot;

  /* Sum: '<Root>/Add6' incorporates:
   *  Constant: '<Root>/Earth_x'
   *  Constant: '<Root>/Moon_x Earth mass'
   *  Gain: '<Root>/Gain1'
   *  Product: '<Root>/Product5'
   *  Product: '<Root>/Product6'
   *  Product: '<Root>/Product7'
   *  Sum: '<Root>/Add7'
   */
  trajectoryModel_B.Add6 = (((1.0 - trajectoryModel_P.mu) * rtb_Divide +
    -trajectoryModel_P.mu * rtb_Divide1) + trajectoryModel_B.x * rtb_Add1) +
    trajectoryModel_P.Gain1_Gain * trajectoryModel_B.y_dot;
  if (rtmIsMajorTimeStep(trajectoryModel_M)) {
    /* Matfile logging */
    rt_UpdateTXYLogVars(trajectoryModel_M->rtwLogInfo,
                        (trajectoryModel_M->Timing.t));
  }                                    /* end MajorTimeStep */

  if (rtmIsMajorTimeStep(trajectoryModel_M)) {
    /* signal main to stop simulation */
    {                                  /* Sample time: [0.0s, 0.0s] */
      if ((rtmGetTFinal(trajectoryModel_M)!=-1) &&
          !((rtmGetTFinal(trajectoryModel_M)-
             (((trajectoryModel_M->Timing.clockTick1+
                trajectoryModel_M->Timing.clockTickH1* 4294967296.0)) * 0.01)) >
            (((trajectoryModel_M->Timing.clockTick1+
               trajectoryModel_M->Timing.clockTickH1* 4294967296.0)) * 0.01) *
            (DBL_EPSILON))) {
        rtmSetErrorStatus(trajectoryModel_M, "Simulation finished");
      }
    }

    rt_ertODEUpdateContinuousStates(&trajectoryModel_M->solverInfo);

    /* Update absolute time for base rate */
    /* The "clockTick0" counts the number of times the code of this task has
     * been executed. The absolute time is the multiplication of "clockTick0"
     * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
     * overflow during the application lifespan selected.
     * Timer of this task consists of two 32 bit unsigned integers.
     * The two integers represent the low bits Timing.clockTick0 and the high bits
     * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
     */
    if (!(++trajectoryModel_M->Timing.clockTick0)) {
      ++trajectoryModel_M->Timing.clockTickH0;
    }

    trajectoryModel_M->Timing.t[0] = rtsiGetSolverStopTime
      (&trajectoryModel_M->solverInfo);

    {
      /* Update absolute timer for sample time: [0.01s, 0.0s] */
      /* The "clockTick1" counts the number of times the code of this task has
       * been executed. The resolution of this integer timer is 0.01, which is the step size
       * of the task. Size of "clockTick1" ensures timer will not overflow during the
       * application lifespan selected.
       * Timer of this task consists of two 32 bit unsigned integers.
       * The two integers represent the low bits Timing.clockTick1 and the high bits
       * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment.
       */
      trajectoryModel_M->Timing.clockTick1++;
      if (!trajectoryModel_M->Timing.clockTick1) {
        trajectoryModel_M->Timing.clockTickH1++;
      }
    }
  }                                    /* end MajorTimeStep */
}
示例#7
0
/* Model step function */
void Position_TiltModelClass::step()
{
  real_T rtb_Filter;
  if (rtmIsMajorTimeStep((&Position_Tilt_M))) {
    /* set solver stop time */
    if (!((&Position_Tilt_M)->Timing.clockTick0+1)) {
      rtsiSetSolverStopTime(&(&Position_Tilt_M)->solverInfo, (((&Position_Tilt_M)
        ->Timing.clockTickH0 + 1) * (&Position_Tilt_M)->Timing.stepSize0 *
        4294967296.0));
    } else {
      rtsiSetSolverStopTime(&(&Position_Tilt_M)->solverInfo, (((&Position_Tilt_M)
        ->Timing.clockTick0 + 1) * (&Position_Tilt_M)->Timing.stepSize0 +
        (&Position_Tilt_M)->Timing.clockTickH0 * (&Position_Tilt_M)
        ->Timing.stepSize0 * 4294967296.0));
    }
  }                                    /* end MajorTimeStep */

  /* Update absolute time of base rate at minor time step */
  if (rtmIsMinorTimeStep((&Position_Tilt_M))) {
    (&Position_Tilt_M)->Timing.t[0] = rtsiGetT(&(&Position_Tilt_M)->solverInfo);
  }

  /* Sum: '<S1>/Sum' incorporates:
   *  Inport: '<Root>/Pos'
   *  Inport: '<Root>/PosRef'
   */
  rtb_Filter = Position_Tilt_U.PosRef[0] - Position_Tilt_U.Pos[0];

  /* Gain: '<S2>/Filter Coefficient' incorporates:
   *  Gain: '<S2>/Derivative Gain'
   *  Integrator: '<S2>/Filter'
   *  Sum: '<S2>/SumD'
   */
  Position_Tilt_B.FilterCoefficient = (Position_Tilt_P.Kd_N * rtb_Filter -
    Position_Tilt_X.Filter_CSTATE) * Position_Tilt_P.PIDController_N;

  /* Outport: '<Root>/u_des' incorporates:
   *  Gain: '<S2>/Proportional Gain'
   *  Sum: '<S2>/Sum'
   */
  Position_Tilt_Y.u_des = Position_Tilt_P.Kp_N * rtb_Filter +
    Position_Tilt_B.FilterCoefficient;

  /* Sum: '<S1>/Sum1' incorporates:
   *  Inport: '<Root>/Pos'
   *  Inport: '<Root>/PosRef'
   */
  rtb_Filter = Position_Tilt_U.PosRef[1] - Position_Tilt_U.Pos[1];

  /* Gain: '<S3>/Filter Coefficient' incorporates:
   *  Gain: '<S3>/Derivative Gain'
   *  Integrator: '<S3>/Filter'
   *  Sum: '<S3>/SumD'
   */
  Position_Tilt_B.FilterCoefficient_f = (Position_Tilt_P.Kd_E * rtb_Filter -
    Position_Tilt_X.Filter_CSTATE_b) * Position_Tilt_P.PIDController1_N;

  /* Outport: '<Root>/v_des' incorporates:
   *  Gain: '<S3>/Proportional Gain'
   *  Sum: '<S3>/Sum'
   */
  Position_Tilt_Y.v_des = Position_Tilt_P.Kp_E * rtb_Filter +
    Position_Tilt_B.FilterCoefficient_f;
  if (rtmIsMajorTimeStep((&Position_Tilt_M))) {
    rt_ertODEUpdateContinuousStates(&(&Position_Tilt_M)->solverInfo);

    /* Update absolute time for base rate */
    /* The "clockTick0" counts the number of times the code of this task has
     * been executed. The absolute time is the multiplication of "clockTick0"
     * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
     * overflow during the application lifespan selected.
     * Timer of this task consists of two 32 bit unsigned integers.
     * The two integers represent the low bits Timing.clockTick0 and the high bits
     * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
     */
    if (!(++(&Position_Tilt_M)->Timing.clockTick0)) {
      ++(&Position_Tilt_M)->Timing.clockTickH0;
    }

    (&Position_Tilt_M)->Timing.t[0] = rtsiGetSolverStopTime(&(&Position_Tilt_M
      )->solverInfo);

    {
      /* Update absolute timer for sample time: [0.01s, 0.0s] */
      /* The "clockTick1" counts the number of times the code of this task has
       * been executed. The resolution of this integer timer is 0.01, which is the step size
       * of the task. Size of "clockTick1" ensures timer will not overflow during the
       * application lifespan selected.
       * Timer of this task consists of two 32 bit unsigned integers.
       * The two integers represent the low bits Timing.clockTick1 and the high bits
       * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment.
       */
      (&Position_Tilt_M)->Timing.clockTick1++;
      if (!(&Position_Tilt_M)->Timing.clockTick1) {
        (&Position_Tilt_M)->Timing.clockTickH1++;
      }
    }
  }                                    /* end MajorTimeStep */
}
示例#8
0
/* Model step function */
void AttitudeModelClass::step()
{
  real_T Sphi;
  real_T Cphi;
  real_T Ctheta;
  real_T rtb_Sum4;
  real_T rtb_ProportionalGain;
  real_T rtb_ProportionalGain_h;
  real_T rtb_Rates_B[3];
  real_T rtb_Sum6;
  real_T rtb_Saturate_l;
  real_T rtb_Sum_k;
  real_T tmp[9];
  int32_T i;
  if (rtmIsMajorTimeStep((&Attitude_M))) {
    /* set solver stop time */
    if (!((&Attitude_M)->Timing.clockTick0+1)) {
      rtsiSetSolverStopTime(&(&Attitude_M)->solverInfo, (((&Attitude_M)
        ->Timing.clockTickH0 + 1) * (&Attitude_M)->Timing.stepSize0 *
        4294967296.0));
    } else {
      rtsiSetSolverStopTime(&(&Attitude_M)->solverInfo, (((&Attitude_M)
        ->Timing.clockTick0 + 1) * (&Attitude_M)->Timing.stepSize0 +
        (&Attitude_M)->Timing.clockTickH0 * (&Attitude_M)->Timing.stepSize0 *
        4294967296.0));
    }
  }                                    /* end MajorTimeStep */

  /* Update absolute time of base rate at minor time step */
  if (rtmIsMinorTimeStep((&Attitude_M))) {
    (&Attitude_M)->Timing.t[0] = rtsiGetT(&(&Attitude_M)->solverInfo);
  }

  /* Saturate: '<S1>/Saturation' incorporates:
   *  Inport: '<Root>/Stick'
   */
  if (Attitude_U.Stick[0] > Attitude_P.Saturation_UpperSat) {
    rtb_Sum4 = Attitude_P.Saturation_UpperSat;
  } else if (Attitude_U.Stick[0] < Attitude_P.Saturation_LowerSat) {
    rtb_Sum4 = Attitude_P.Saturation_LowerSat;
  } else {
    rtb_Sum4 = Attitude_U.Stick[0];
  }

  /* Sum: '<S1>/Sum' incorporates:
   *  Gain: '<S1>/Yaw-rate1'
   *  Inport: '<Root>/IMU_Attitude'
   *  Saturate: '<S1>/Saturation'
   */
  rtb_Sum4 = Attitude_P.rollMax * rtb_Sum4 - Attitude_U.IMU_Attitude[0];

  /* Gain: '<S3>/Proportional Gain' */
  rtb_ProportionalGain = Attitude_P.KRP * rtb_Sum4;

  /* Gain: '<S3>/Filter Coefficient' incorporates:
   *  Gain: '<S3>/Derivative Gain'
   *  Integrator: '<S3>/Filter'
   *  Sum: '<S3>/SumD'
   */
  Attitude_B.FilterCoefficient = (Attitude_P.KRD * rtb_Sum4 -
    Attitude_X.Filter_CSTATE) * Attitude_P.N;

  /* Saturate: '<S1>/Saturation1' incorporates:
   *  Inport: '<Root>/Stick'
   */
  if (Attitude_U.Stick[1] > Attitude_P.Saturation1_UpperSat) {
    rtb_Sum4 = Attitude_P.Saturation1_UpperSat;
  } else if (Attitude_U.Stick[1] < Attitude_P.Saturation1_LowerSat) {
    rtb_Sum4 = Attitude_P.Saturation1_LowerSat;
  } else {
    rtb_Sum4 = Attitude_U.Stick[1];
  }

  /* Sum: '<S1>/Sum1' incorporates:
   *  Gain: '<S1>/Yaw-rate2'
   *  Inport: '<Root>/IMU_Attitude'
   *  Saturate: '<S1>/Saturation1'
   */
  rtb_Sum4 = Attitude_P.pitchMax * rtb_Sum4 - Attitude_U.IMU_Attitude[1];

  /* Gain: '<S2>/Proportional Gain' */
  rtb_ProportionalGain_h = Attitude_P.KPP * rtb_Sum4;

  /* Gain: '<S2>/Filter Coefficient' incorporates:
   *  Gain: '<S2>/Derivative Gain'
   *  Integrator: '<S2>/Filter'
   *  Sum: '<S2>/SumD'
   */
  Attitude_B.FilterCoefficient_e = (Attitude_P.KPD * rtb_Sum4 -
    Attitude_X.Filter_CSTATE_m) * Attitude_P.N;

  /* Sum: '<S1>/Sum2' incorporates:
   *  Inport: '<Root>/IMU_Attitude'
   *  Inport: '<Root>/Stick'
   */
  rtb_Sum4 = Attitude_U.Stick[3] - Attitude_U.IMU_Attitude[2];

  /* Gain: '<S4>/Filter Coefficient' incorporates:
   *  Gain: '<S4>/Derivative Gain'
   *  Integrator: '<S4>/Filter'
   *  Sum: '<S4>/SumD'
   */
  Attitude_B.FilterCoefficient_d = (Attitude_P.KYD * rtb_Sum4 -
    Attitude_X.Filter_CSTATE_mi) * Attitude_P.N;

  /* Switch: '<S1>/Switch' incorporates:
   *  Gain: '<S1>/Yaw-rate3'
   *  Gain: '<S4>/Proportional Gain'
   *  Inport: '<Root>/Selector'
   *  Inport: '<Root>/Stick'
   *  Saturate: '<S1>/Saturation2'
   *  Sum: '<S4>/Sum'
   */
  if (Attitude_U.Selector >= Attitude_P.Switch_Threshold) {
    rtb_Sum4 = Attitude_P.KYP * rtb_Sum4 + Attitude_B.FilterCoefficient_d;
  } else {
    if (Attitude_U.Stick[2] > Attitude_P.Saturation2_UpperSat) {
      /* Saturate: '<S1>/Saturation2' */
      rtb_Sum4 = Attitude_P.Saturation2_UpperSat;
    } else if (Attitude_U.Stick[2] < Attitude_P.Saturation2_LowerSat) {
      /* Saturate: '<S1>/Saturation2' */
      rtb_Sum4 = Attitude_P.Saturation2_LowerSat;
    } else {
      /* Saturate: '<S1>/Saturation2' incorporates:
       *  Inport: '<Root>/Stick'
       */
      rtb_Sum4 = Attitude_U.Stick[2];
    }

    rtb_Sum4 *= Attitude_P.yawRateMax;
  }

  /* End of Switch: '<S1>/Switch' */

  /* MATLAB Function: '<S1>/To body from Earth_rates' incorporates:
   *  Inport: '<Root>/IMU_Attitude'
   */
  /* MATLAB Function 'Attitude Controller/To body from Earth_rates': '<S8>:1' */
  /* '<S8>:1:3' */
  /* '<S8>:1:4' */
  /* '<S8>:1:6' */
  Sphi = sin(Attitude_U.IMU_Attitude[0]);

  /* '<S8>:1:7' */
  Cphi = cos(Attitude_U.IMU_Attitude[0]);

  /* '<S8>:1:8' */
  /* '<S8>:1:9' */
  Ctheta = cos(Attitude_U.IMU_Attitude[1]);

  /* '<S8>:1:11' */
  /* '<S8>:1:15' */
  tmp[0] = 1.0;
  tmp[3] = 0.0;
  tmp[6] = -sin(Attitude_U.IMU_Attitude[1]);
  tmp[1] = 0.0;
  tmp[4] = Cphi;
  tmp[7] = Sphi * Ctheta;
  tmp[2] = 0.0;
  tmp[5] = -Sphi;
  tmp[8] = Cphi * Ctheta;

  /* SignalConversion: '<S8>/TmpSignal ConversionAt SFunction Inport2' incorporates:
   *  MATLAB Function: '<S1>/To body from Earth_rates'
   *  Sum: '<S2>/Sum'
   *  Sum: '<S3>/Sum'
   */
  rtb_ProportionalGain += Attitude_B.FilterCoefficient;
  rtb_ProportionalGain_h += Attitude_B.FilterCoefficient_e;

  /* MATLAB Function: '<S1>/To body from Earth_rates' incorporates:
   *  SignalConversion: '<S8>/TmpSignal ConversionAt SFunction Inport2'
   */
  for (i = 0; i < 3; i++) {
    rtb_Rates_B[i] = tmp[i + 6] * rtb_Sum4 + (tmp[i + 3] *
      rtb_ProportionalGain_h + tmp[i] * rtb_ProportionalGain);
  }

  /* Sum: '<S1>/Sum4' incorporates:
   *  Inport: '<Root>/IMU_Rates'
   */
  rtb_Sum4 = rtb_Rates_B[0] - Attitude_U.IMU_Rates[0];

  /* Gain: '<S5>/Filter Coefficient' incorporates:
   *  Gain: '<S5>/Derivative Gain'
   *  Integrator: '<S5>/Filter'
   *  Sum: '<S5>/SumD'
   */
  Attitude_B.FilterCoefficient_o = (Attitude_P.Kdp * rtb_Sum4 -
    Attitude_X.Filter_CSTATE_k) * Attitude_P.N;

  /* Sum: '<S5>/Sum' incorporates:
   *  Gain: '<S5>/Proportional Gain'
   *  Integrator: '<S5>/Integrator'
   */
  rtb_ProportionalGain = (Attitude_P.Kpp * rtb_Sum4 +
    Attitude_X.Integrator_CSTATE) + Attitude_B.FilterCoefficient_o;

  /* Saturate: '<S5>/Saturate' */
  if (rtb_ProportionalGain > Attitude_P.satp) {
    rtb_ProportionalGain_h = Attitude_P.satp;
  } else if (rtb_ProportionalGain < -Attitude_P.satp) {
    rtb_ProportionalGain_h = -Attitude_P.satp;
  } else {
    rtb_ProportionalGain_h = rtb_ProportionalGain;
  }

  /* End of Saturate: '<S5>/Saturate' */

  /* Sum: '<S1>/Sum5' incorporates:
   *  Inport: '<Root>/IMU_Rates'
   */
  Sphi = rtb_Rates_B[1] - Attitude_U.IMU_Rates[1];

  /* Gain: '<S6>/Filter Coefficient' incorporates:
   *  Gain: '<S6>/Derivative Gain'
   *  Integrator: '<S6>/Filter'
   *  Sum: '<S6>/SumD'
   */
  Attitude_B.FilterCoefficient_b = (Attitude_P.Kdq * Sphi -
    Attitude_X.Filter_CSTATE_e) * Attitude_P.N;

  /* Sum: '<S6>/Sum' incorporates:
   *  Gain: '<S6>/Proportional Gain'
   *  Integrator: '<S6>/Integrator'
   */
  Cphi = (Attitude_P.Kpq * Sphi + Attitude_X.Integrator_CSTATE_f) +
    Attitude_B.FilterCoefficient_b;

  /* Saturate: '<S6>/Saturate' */
  if (Cphi > Attitude_P.satq) {
    Ctheta = Attitude_P.satq;
  } else if (Cphi < -Attitude_P.satq) {
    Ctheta = -Attitude_P.satq;
  } else {
    Ctheta = Cphi;
  }

  /* End of Saturate: '<S6>/Saturate' */

  /* Sum: '<S1>/Sum6' incorporates:
   *  Inport: '<Root>/IMU_Rates'
   */
  rtb_Sum6 = rtb_Rates_B[2] - Attitude_U.IMU_Rates[2];

  /* Gain: '<S7>/Filter Coefficient' incorporates:
   *  Gain: '<S7>/Derivative Gain'
   *  Integrator: '<S7>/Filter'
   *  Sum: '<S7>/SumD'
   */
  Attitude_B.FilterCoefficient_oo = (Attitude_P.Kdr * rtb_Sum6 -
    Attitude_X.Filter_CSTATE_g) * Attitude_P.N;

  /* Sum: '<S7>/Sum' incorporates:
   *  Gain: '<S7>/Proportional Gain'
   *  Integrator: '<S7>/Integrator'
   */
  rtb_Sum_k = (Attitude_P.Kpr * rtb_Sum6 + Attitude_X.Integrator_CSTATE_h) +
    Attitude_B.FilterCoefficient_oo;

  /* Saturate: '<S7>/Saturate' */
  if (rtb_Sum_k > Attitude_P.satr) {
    rtb_Saturate_l = Attitude_P.satr;
  } else if (rtb_Sum_k < -Attitude_P.satr) {
    rtb_Saturate_l = -Attitude_P.satr;
  } else {
    rtb_Saturate_l = rtb_Sum_k;
  }

  /* End of Saturate: '<S7>/Saturate' */

  /* Outport: '<Root>/Moments' */
  Attitude_Y.Moments[0] = rtb_ProportionalGain_h;
  Attitude_Y.Moments[1] = Ctheta;
  Attitude_Y.Moments[2] = rtb_Saturate_l;

  /* Sum: '<S5>/SumI1' incorporates:
   *  Gain: '<S5>/Integral Gain'
   *  Gain: '<S5>/Kb'
   *  Sum: '<S5>/SumI2'
   */
  Attitude_B.SumI1 = (rtb_ProportionalGain_h - rtb_ProportionalGain) *
    Attitude_P.Kbp + Attitude_P.Kip * rtb_Sum4;

  /* Sum: '<S6>/SumI1' incorporates:
   *  Gain: '<S6>/Integral Gain'
   *  Gain: '<S6>/Kb'
   *  Sum: '<S6>/SumI2'
   */
  Attitude_B.SumI1_e = (Ctheta - Cphi) * Attitude_P.Kbq + Attitude_P.Kiq * Sphi;

  /* Sum: '<S7>/SumI1' incorporates:
   *  Gain: '<S7>/Integral Gain'
   *  Gain: '<S7>/Kb'
   *  Sum: '<S7>/SumI2'
   */
  Attitude_B.SumI1_k = (rtb_Saturate_l - rtb_Sum_k) * Attitude_P.Kbr +
    Attitude_P.Kir * rtb_Sum6;
  if (rtmIsMajorTimeStep((&Attitude_M))) {
    rt_ertODEUpdateContinuousStates(&(&Attitude_M)->solverInfo);

    /* Update absolute time for base rate */
    /* The "clockTick0" counts the number of times the code of this task has
     * been executed. The absolute time is the multiplication of "clockTick0"
     * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
     * overflow during the application lifespan selected.
     * Timer of this task consists of two 32 bit unsigned integers.
     * The two integers represent the low bits Timing.clockTick0 and the high bits
     * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
     */
    if (!(++(&Attitude_M)->Timing.clockTick0)) {
      ++(&Attitude_M)->Timing.clockTickH0;
    }

    (&Attitude_M)->Timing.t[0] = rtsiGetSolverStopTime(&(&Attitude_M)
      ->solverInfo);

    {
      /* Update absolute timer for sample time: [0.01s, 0.0s] */
      /* The "clockTick1" counts the number of times the code of this task has
       * been executed. The resolution of this integer timer is 0.01, which is the step size
       * of the task. Size of "clockTick1" ensures timer will not overflow during the
       * application lifespan selected.
       * Timer of this task consists of two 32 bit unsigned integers.
       * The two integers represent the low bits Timing.clockTick1 and the high bits
       * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment.
       */
      (&Attitude_M)->Timing.clockTick1++;
      if (!(&Attitude_M)->Timing.clockTick1) {
        (&Attitude_M)->Timing.clockTickH1++;
      }
    }
  }                                    /* end MajorTimeStep */
}