⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controller_sf.c

📁 直流电机控制MATLAB仿真(国外文献)含金量高
💻 C
字号:
#if !defined(S_FUNCTION_NAME)
#define S_FUNCTION_NAME                 Controller_sf
#endif
#define S_FUNCTION_LEVEL                2

#include <stdio.h>
#include <math.h>
#include "simstruc.h"
#include "fixedpoint.h"
#include "rtlibsrc.h"

#define rt_logging_h
#define RTWSfcnInfo                     void *
#include "Controller.h"

static int8_T Controller_sf_counter = 0;

#define MDL_CHECK_PARAMETERS
#if defined(MDL_CHECK_PARAMETERS) && defined(MATLAB_MEX_FILE)
static void mdlCheckParameters(SimStruct *S)
{
  
  {
    int dimsArray[2] = {1, 1};
    ssCheckSFcnParamValueAttribs(S, 0, "FeedForwardGain_Gain", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {16, 1};
    ssCheckSFcnParamValueAttribs(S, 1, "Observer_A", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {8, 1};
    ssCheckSFcnParamValueAttribs(S, 2, "Observer_B", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {4, 1};
    ssCheckSFcnParamValueAttribs(S, 3, "Observer_C", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {1, 1};
    ssCheckSFcnParamValueAttribs(S, 4, "Observer_X0", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {1, 4};
    ssCheckSFcnParamValueAttribs(S, 5, "L2_Gain", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {1, 1};
    ssCheckSFcnParamValueAttribs(S, 6, "DiscreteTimeIntegrator_g",
     DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {1, 1};
    ssCheckSFcnParamValueAttribs(S, 7, "DiscreteTimeIntegrator_I",
     DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }

  {
    int dimsArray[2] = {1, 1};
    ssCheckSFcnParamValueAttribs(S, 8, "IntegralGain_Gain", DYNAMICALLY_TYPED,
     2, dimsArray, false);
  }
}
#endif

static void updateGlobalVarsFromRunTimeParams(SimStruct *S)
{
  int_T i;

  Controller_P.FeedForwardGain_Gain = (((real_T *)
    ssGetRunTimeParamInfo(S,0)->data)[0]);

  for (i=0; i<16; i++) {
    Controller_P.Observer_A[i] = (((real_T *)
      ssGetRunTimeParamInfo(S,1)->data)[i]);
  }

  for (i=0; i<8; i++) {
    Controller_P.Observer_B[i] = (((real_T *)
      ssGetRunTimeParamInfo(S,2)->data)[i]);
  }

  for (i=0; i<4; i++) {
    Controller_P.Observer_C[i] = (((real_T *)
      ssGetRunTimeParamInfo(S,3)->data)[i]);
  }

  Controller_P.Observer_X0 = (((real_T *) ssGetRunTimeParamInfo(S,4)->data)[0]);

  for (i=0; i<4; i++) {
    Controller_P.L2_Gain[i] = (((real_T *) ssGetRunTimeParamInfo(S,5)->data)[i]);
  }

  Controller_P.DiscreteTimeIntegrator_g = (((real_T *)
    ssGetRunTimeParamInfo(S,6)->data)[0]);

  Controller_P.DiscreteTimeIntegrator_I = (((real_T *)
    ssGetRunTimeParamInfo(S,7)->data)[0]);

  Controller_P.IntegralGain_Gain = (((real_T *)
    ssGetRunTimeParamInfo(S,8)->data)[0]);
}

#define MDL_PROCESS_PARAMETERS
#if defined(MDL_PROCESS_PARAMETERS) && defined(MATLAB_MEX_FILE)
static void mdlProcessParameters(SimStruct *S)
{
  ssUpdateAllTunableParamsAsRunTimeParams(S);
  updateGlobalVarsFromRunTimeParams(S);
}
#endif

static void mdlInitializeSizes(SimStruct *S)
{
  
  ssSetNumSFcnParams(S, 9);
  
  if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {
#if defined(MDL_CHECK_PARAMETERS)
    mdlCheckParameters(S);
#endif
    if (ssGetErrorStatus(S) != NULL) {
      return;
    }
  } else {
    return;
  }

  ssSetNumContStates(S, 0);
  ssSetNumDiscStates(S, 0);

  if (!ssSetNumInputPorts(S, 2)) return;
  if(!ssSetInputPortVectorDimension(S, 0, 3)) return;
  if (ssGetSimMode(S) != SS_SIMMODE_SIZES_CALL_ONLY) {
    ssSetInputPortDataType(S, 0, SS_DOUBLE);
  }

  ssSetBusInputAsStruct(S, 0, 1);
  ssSetInputPortDirectFeedThrough(S, 0, 1);
  ssSetInputPortSampleTime(S, 0, 0.0001);
  ssSetInputPortOffsetTime(S, 0, 0.0);
  if(!ssSetInputPortVectorDimension(S, 1, 1)) return;
  if (ssGetSimMode(S) != SS_SIMMODE_SIZES_CALL_ONLY) {
    ssSetInputPortDataType(S, 1, SS_DOUBLE);
  }

  ssSetBusInputAsStruct(S, 1, 1);
  ssSetInputPortDirectFeedThrough(S, 1, 1);
  ssSetInputPortSampleTime(S, 1, 0.0001);
  ssSetInputPortOffsetTime(S, 1, 0.0);

  if (!ssSetNumOutputPorts(S, 1)) return;

  if(!ssSetOutputPortVectorDimension(S, 0, 1)) return;
  if (ssGetSimMode(S) != SS_SIMMODE_SIZES_CALL_ONLY) {
    ssSetOutputPortDataType(S, 0, SS_DOUBLE);
  }

  ssSetOutputPortSampleTime(S, 0, 0.0001);
  ssSetOutputPortOffsetTime(S, 0, 0.0);

  ssSetNumSampleTimes(S, 1);
  ssSetNumRWork(S, 0);
  ssSetNumIWork(S, 0);
  ssSetNumPWork(S, 0);
  ssSetNumModes(S, 0);
  ssSetNumNonsampledZCs(S, 0);

  ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);

}

static void mdlInitializeSampleTimes(SimStruct *S)
{
  ssSetSampleTime(S, 0, 0.0001);
  ssSetOffsetTime(S, 0, 0.0);
}

#define MDL_SET_WORK_WIDTHS
#if defined(MDL_SET_WORK_WIDTHS) && defined(MATLAB_MEX_FILE)
static void mdlSetWorkWidths(SimStruct *S)
{

  if (!ssSetNumRunTimeParams(S, 9)) return;

  ssRegDlgParamAsRunTimeParam(S, 0, 0, "P0_FeedForwardGain_Gain", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 1, 1, "P1_Observer_A", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 2, 2, "P2_Observer_B", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 3, 3, "P3_Observer_C", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 4, 4, "P4_Observer_X0", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 5, 5, "P5_L2_Gain", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 6, 6, "P6_DiscreteTimeIntegrator_g", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 7, 7, "P7_DiscreteTimeIntegrator_I", SS_DOUBLE);

  ssRegDlgParamAsRunTimeParam(S, 8, 8, "P8_IntegralGain_Gain", SS_DOUBLE);

  updateGlobalVarsFromRunTimeParams(S);
}
#endif

#define MDL_INITIALIZE_CONDITIONS

static void mdlInitializeConditions(SimStruct *S)
{

#ifdef PIL_S_FUNCTION
  pilMarshallInitSFcnSimStruct(S);
  pilMarshallInitRootSimStruct(ssGetRootSS(S));
#endif

  Controller_initialize(1);
}

#define MDL_START
#if defined(MDL_START)

static void mdlStart(SimStruct *S)
{
  
  if (++Controller_sf_counter > 1) {
    ssSetErrorStatus(S,"This S-Function is limited to one copy per model.");
    Controller_sf_counter = 0;
    return;
  }
}
#endif

static void mdlOutputs(SimStruct *S, int_T tid)
{
  InputRealPtrsType InPort_0 = (InputRealPtrsType) ssGetInputPortSignalPtrs(S,
   0);

  InputRealPtrsType InPort_1 = (InputRealPtrsType) ssGetInputPortSignalPtrs(S,
   1);

  real_T *OutPort_0 = (real_T *)ssGetOutputPortSignal(S, 0);

  Controller_U.trajectory[0] = InPort_0[0][0];
  Controller_U.trajectory[1] = InPort_0[1][0];
  Controller_U.trajectory[2] = InPort_0[2][0];

  Controller_U.Encoder = InPort_1[0][0];

  Controller_step();

  OutPort_0[0] = Controller_Y.U;
}

static void mdlTerminate(SimStruct *S)
{

  Controller_sf_counter = 0;
}

#ifdef MATLAB_MEX_FILE
#include "simulink.c"
#include "fixedpoint.c"
#else
#include "cg_sfun.h"
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -