📄 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 <stdio.h> /* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -