simbi2de.c
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:4k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. /* $Revision: 1.18 $ */
  2. /*
  3.  * simbi2de  binary to decimal conversion for Simulink block
  4.  *
  5.  *           Syntax:  [sys, x0] = simbi2de(t,x,u,flag,p)
  6.  *                          where p is the calculation base.
  7.  * Wes Wang 6/14/94
  8.  * Copyright 1996-2001 The MathWorks, Inc.
  9.  */
  10. /* specify the name of this S-Function. */
  11. #define S_FUNCTION_NAME simbi2de
  12. /* Defines for easy access  the matrices which are passed in */
  13. #define NUM_ARGS    1
  14. #define CAL_BASE    ssGetArg(S, 0)
  15. #include "simstruc.h"
  16. #include "tmwtypes.h"
  17. /* For RTW */
  18. #if defined(RT) || defined(NRT)  
  19. #undef  mexPrintf
  20. #define mexPrintf printf
  21. #endif
  22. /*
  23.  * mdlInitializeSizes - initialize the sizes array
  24.  */
  25. static void mdlInitializeSizes(SimStruct *S)
  26. {
  27.         ssSetNumContStates(    S, 0); /* number of continuous states */
  28.         ssSetNumDiscStates(    S, 0);       /* number of discrete states */
  29.         ssSetNumInputs    (    S, -1);   /* number of inputs */
  30.         ssSetNumOutputs   (    S, 1);   /* number of outputs */
  31.         ssSetDirectFeedThrough(S, 1);       /* direct feedthrough flag */
  32.         ssSetNumSampleTimes(   S, 1);       /* number of sample times */
  33.         ssSetNumInputArgs(     S, NUM_ARGS);/* number of input arguments */
  34.         ssSetNumRWork(         S, 0);       /* number of real work vector elements */
  35.         ssSetNumIWork(         S, 0);      /* number of integer work vector elements */
  36.         ssSetNumPWork(         S, 0);      /* number of pointer work vector elements */
  37. }
  38. /*
  39.  * mdlInitializeSampleTimes - initialize the sample times array
  40.  *
  41.  * This function is used to specify the sample time(s) for your S-function.
  42.  * If your S-function is continuous, you must specify a sample time of 0.0.
  43.  * Sample times must be registered in ascending order.
  44.  */
  45. static void mdlInitializeSampleTimes(SimStruct *S)
  46. {
  47.     ssSetSampleTimeEvent(S, 0, INHERITED_SAMPLE_TIME);
  48.     ssSetOffsetTimeEvent(S, 0, FIXED_IN_MINOR_STEP_OFFSET);
  49. }
  50. /*
  51.  * mdlInitializeConditions - initialize the states
  52.  * Initialize the states, Integers and real-numbers
  53.  */
  54. static void mdlInitializeConditions(real_T *x0, SimStruct *S)
  55. {
  56. }
  57. /*
  58.  * mdlOutputs - compute the outputs
  59.  *
  60.  * In this function, you compute the outputs of your S-function
  61.  * block.  The outputs are placed in the y variable.
  62.  */
  63. static void mdlOutputs(real_T *y, const real_T *x, const real_T *u, SimStruct *S, int_T tid)
  64. {
  65.     long inSize, i, pow, p;
  66.     inSize = (int_T)ssGetNumInputs(S);
  67.     p = (int_T)mxGetPr(CAL_BASE)[0];
  68.     if (p < 2)
  69.         p = 2;    
  70.     y[0] = 0;
  71.     pow = 1;
  72.     for (i=0; i <inSize; i++) {
  73.          y[0] += (real_T)(abs((int_T)u[i]) % p * pow);
  74.          pow  *= p;
  75.     }
  76. }
  77. /*
  78.  * mdlUpdate - perform action at major integration time step
  79.  *
  80.  * This function is called once for every major integration time step.
  81.  * Discrete states are typically updated here, but this function is useful
  82.  * for performing any tasks that should only take place once per integration
  83.  * step.
  84.  */
  85. static void mdlUpdate(real_T *x, const real_T *u, SimStruct *S, int_T tid)
  86. {
  87. }
  88. /*
  89.  * mdlDerivatives - compute the derivatives
  90.  *
  91.  * In this function, you compute the S-function block's derivatives.
  92.  * The derivatives are placed in the dx variable.
  93.  */
  94. static void mdlDerivatives(real_T *dx, const real_T *x, const real_T *u, SimStruct *S, int_T tid)
  95. {
  96. }
  97. /*
  98.  * mdlTerminate - called when the simulation is terminated.
  99.  *
  100.  * In this function, you should perform any actions that are necessary
  101.  * at the termination of a simulation.  For example, if memory was allocated
  102.  * in mdlInitializeConditions, this is the place to free it.
  103.  */
  104. static void mdlTerminate(SimStruct *S)
  105. {
  106. }
  107. #ifdef       MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
  108. #include "simulink.c"      /* MEX-file interface mechanism */
  109. #else
  110. #include "cg_sfun.h"       /* Code generation registration function */
  111. #endif