www.pudn.com > communicationmatlab.rar > SRANDINT.C
/* * SRANDINT A SIMULINK trigged read from workspace * * Syntax: [sys, x0] = TRIGWKSP(t, x, u, flag, seed, multNum) * This function is for SIMULINK Triggered read-from-workspace block. * The block output a row of VAR at the raising edge of of the input * inpulse. The output inpulse equals the colomn number of VAR. The * raising edge of the trigger signal is detected by greater or * equals to the threshold. When the output index is greater than * the row number of VAR, the block outputs zero if cycl_flag == 0. * The block return to the vary begining of the VAR and cyclically * output the same variable agian when cycl_flag ~= 0. * * Wes Wang August 25, 1994 * Copyright (c) 1994-96 by The MathWorks, Inc. * All Rights Reserved * $Revision: 1.1 $ $Date: 1996/04/01 19:05:26 $ */ #define S_FUNCTION_NAME srandint #include/* needed for declaration of sprintf */ #ifdef MATLAB_MEX_FILE #include "mex.h" /* needed for declaration of mexErrMsgTxt */ #endif /* * need to include simstruc.h for the definition of the SimStruct and * its associated macro definitions. */ #include "simstruc.h" /* * Defines for easy access of the input parameters */ #define NUM_ARGS 2 #define INISEED ssGetArg(S,0) #define MUL_NUM ssGetArg(S,1) #define LOW_SEED 1 /* minimum seed value */ #define HIGH_SEED 2147483646 /* maximum seed value */ #define START_SEED 1144108930 /* default seed value */ /* * mdlInitializeSizes - called to initialize the sizes array stored in * the SimStruct. The sizes array defines the * characteristics (number of inputs, outputs, * states, etc.) of the S-Function. */ static double urand(seed) unsigned int *seed; { unsigned int hi, lo; #if (UINT_MAX == 0xffffffff) int test; #else long test; #endif #define IA 16807 /* magic multiplier = 7^5 */ #define IM 2147483647 /* modulus = 2^31 - 1 */ #define IQ 127773 /*IM div IA */ #define IR 2836 /* IM modulo IA */ #define S 4.656612875245797e-10 /* reciprocal of 2^31-1 */ hi = *seed / IQ; lo = *seed % IQ; test = IA * lo - IR * hi; *seed = ((test < 0) ? (unsigned int)(test + IM) : (unsigned int)test); return ((double) (*seed * S)); #undef IA #undef IM #undef IQ #undef IR #undef S } static void mdlInitializeSizes(S) SimStruct *S; { /* * Set-up size information. */ if (ssGetNumArgs(S) == NUM_ARGS) { int numOutput, iniSeed; numOutput = mxGetN(INISEED) * mxGetM(INISEED); if (numOutput < 1) { #ifdef MATLAB_MEX_FILE char err_msg[256]; sprintf(err_msg, "Input variable is empty."); mexErrMsgTxt(err_msg); #endif } if (((mxGetN(MUL_NUM) * mxGetM(MUL_NUM)) != 1) && (mxGetN(MUL_NUM) * mxGetM(MUL_NUM)) != numOutput) { #ifdef MATLAB_MEX_FILE char err_msg[256]; sprintf(err_msg, "Dimension for boundaries must match the dimension for seeds."); mexErrMsgTxt(err_msg); #endif } ssSetNumContStates( S, 0); ssSetNumDiscStates( S, 0); ssSetNumInputs( S, 0); ssSetNumOutputs( S, numOutput); ssSetDirectFeedThrough(S, 0); ssSetNumInputArgs( S, NUM_ARGS); ssSetNumSampleTimes( S, 1); ssSetNumRWork( S, numOutput); ssSetNumIWork( S, numOutput); ssSetNumPWork( S, 0); } else { #ifdef MATLAB_MEX_FILE char err_msg[256]; sprintf(err_msg, "Wrong number of input arguments passed to S-function MEX-file.\n" "%d input arguments were passed in when expecting %d input arguments.\n", ssGetNumArgs(S) + 4, NUM_ARGS + 4); mexErrMsgTxt(err_msg); #endif } } /* * mdlInitializeSampleTimes - initializes the array of sample times stored in * the SimStruct associated with this S-Function. */ static void mdlInitializeSampleTimes(S) SimStruct *S; { /* * Note, blocks that are continuous in nature should have a single * sample time of 0.0. */ ssSetSampleTimeEvent(S, 0, 0.0); ssSetOffsetTimeEvent(S, 0, 0.0); } /* * mdlInitializeConditions - initializes the states for the S-Function */ static void mdlInitializeConditions(x0, S) double *x0; SimStruct *S; { int numOutput, i; double *RWork = ssGetRWork(S); /* Real Work Vector */ int *IWork = ssGetIWork(S); /* Integer Work Vector */ double *Pseed = mxGetPr(INISEED); double *mulNum = mxGetPr(MUL_NUM); numOutput = mxGetN(INISEED) * mxGetM(INISEED); for (i = 0; i < numOutput; i++) { IWork[i] = RWork[i]; if ((IWork[i] < LOW_SEED) || (IWork[i] > HIGH_SEED)) IWork[i] = START_SEED + i; RWork[i] = urand((unsigned int *) &IWork[i]); } numOutput = mxGetN(MUL_NUM) * mxGetM(MUL_NUM); for (i = 0; i < numOutput; i++) { if (mulNum[i] < 1) { #ifdef MATLAB_MEX_FILE mexErrMsgTxt("Multiple number must be greater than 1."); #endif } } } /* * mdlOutputs - computes the outputs of the S-Function */ static void mdlOutputs(y, x, u, S, tid) double *y, *x, *u; SimStruct *S; int tid; { int numOutput, i, mFlag, j; double *RWork = ssGetRWork(S); /* Real Work Vector */ int *IWork = ssGetIWork(S); /* Integer Work Vector */ double *mulNum = mxGetPr(MUL_NUM); double temp, mul_tmp; numOutput = mxGetN(INISEED) * mxGetM(INISEED); if (mxGetN(MUL_NUM) * mxGetM(MUL_NUM) <= 1) { mFlag = 1; } else { mFlag = 0; } for (i = 0; i < numOutput; i++) { if (mFlag) { mul_tmp = mulNum[0]; } else { mul_tmp = mulNum[i]; } temp = RWork[i] * mul_tmp; for (j = 0; j < mul_tmp; j++) { if (temp >= j) y[i] = (double)j; } RWork[i] = urand((unsigned int *) &IWork[i]); } } /* * mdlUpdate - computes the discrete states of the S-Function */ static void mdlUpdate(x, u, S, tid) double *x, *u; SimStruct *S; int tid; { } /* * mdlDerivatives - computes the derivatives of the S-Function */ static void mdlDerivatives(dx, x, u, S, tid) double *dx, *x, *u; SimStruct *S; int tid; { } /* * mdlTerminate - called at termination of model execution. */ static void mdlTerminate(S) SimStruct *S; { } #ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ #include "simulink.c" /* MEX-File interface mechanism */ #else #include "cg_sfun.h" /* Code generation registration function */ #endif