[求助]一段有关硬件编程的S函数问题,为什么输出总是零呢?
<P>如题,向各位高手求教了,希望不吝赐教,以下为代码,我把与硬件有关的函数都去掉了,给了个固定输出5.0,但在S函数模块输出见到的仍然是0,为什么?</P><P>#define S_FUNCTION_LEVEL 2<BR>#undef S_FUNCTION_NAME<BR>#define S_FUNCTION_NAME my_pcl818hd</P>
<P>#include <stddef.h><BR>#include <stdlib.h></P>
<P>#include "simstruc.h"</P>
<P>#ifdef MATLAB_MEX_FILE<BR>#include "mex.h"<BR>#else<BR>#include <windows.h><BR>#include "io_xpcimport.h"<BR>#endif</P>
<P>/* Input Arguments */</P>
<P>#define NUM_PARAMS (3)<BR>#define BASE_ADDRESS_ARG (ssGetSFcnParam(S,0))<BR>#define CHANNEL_ARG (ssGetSFcnParam(S,1))<BR>#define SAMPLE_TIME_PARAM (ssGetSFcnParam(S,2))</P>
<P><BR>/* Convert S Function Parameters to Variables of Unsigned Integer Type */</P>
<P>#define BASE ((uint_T) mxGetPr(BASE_ADDRESS_ARG))<BR>#define NUM_CHANNEL ((uint_T) mxGetPr(CHANNEL_ARG))<BR>#define SAMPLE_TIME ((real_T) mxGetPr(SAMPLE_TIME_PARAM))<BR>#define SAMPLE_OFFSET ((real_T) mxGetPr(SAMPLE_TIME_PARAM))<BR>//#define BASE 0x220<BR>/* Definition of Quanser Register Adresses for AD conversion */</P>
<P>static char_T msg;</P>
<P><BR>/*====================*<BR> * S-function methods *<BR> *====================*/</P>
<P>static void mdlCheckParameters(SimStruct *S)<BR>{<BR>}</P>
<P>static void mdlInitializeSizes(SimStruct *S)<BR>{<BR> uint_T i;</P>
<P>#ifndef MATLAB_MEX_FILE<BR>#include "io_xpcimport.c"<BR>#endif</P>
<P><BR> ssSetNumSFcnParams(S, NUM_PARAMS);<BR> if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {<BR> mdlCheckParameters(S);<BR> if (ssGetErrorStatus(S) != NULL) {<BR> return;<BR> }<BR> } else {<BR> return; /* Parameter mismatch will be reported by Simulink */<BR> }</P>
<P> ssSetNumContStates(S, 0);<BR> ssSetNumDiscStates(S, 0);</P>
<P> if (!ssSetNumInputPorts(S, 0)) return;</P>
<P> if (!ssSetNumOutputPorts(S, NUM_CHANNEL)) return;</P>
<P> for (i=0;i<NUM_CHANNEL;i++) {<BR> ssSetOutputPortWidth(S, i, 1);<BR> }</P>
<P> ssSetNumSampleTimes(S, 1);</P>
<P> ssSetNumModes(S, 0);<BR> ssSetNumNonsampledZCs(S, 0);</P>
<P> ssSetSFcnParamNotTunable(S,0);<BR> ssSetSFcnParamNotTunable(S,1);<BR> ssSetSFcnParamNotTunable(S,2);</P>
<P> ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_PLACE_ASAP);</P>
<P>}</P>
<P>static void mdlInitializeSampleTimes(SimStruct *S)<BR>{<BR> ssSetSampleTime(S, 0, SAMPLE_TIME);<BR> ssSetOffsetTime(S, 0, SAMPLE_OFFSET);<BR>}</P>
<P><BR>static void mdlOutputs(SimStruct *S, int_T tid)<BR>{</P>
<P>#ifndef MATLAB_MEX_FILE</P>
<P> uint_T i;<BR>//uint_T baseAddr = BASE;<BR>// real_T *y,res;<BR> real_T *y;<BR> for (i=0;i<NUM_CHANNEL;i++) {<BR> <BR> <BR> y=ssGetOutputPortSignal(S,i);<BR> </P>
<P> // rl32eInpB((unsigned short)(baseAddr+10)); /* start conversion */<BR> // while (rl32eInpB((unsigned short)(baseAddr+8)) & 0x80); /* wait until data ready */<BR> // res=rl32eInpW((unsigned short)(baseAddr+4)); /* read data */<BR> // rl32eInpB((unsigned short)(baseAddr+9)); /* clear interrupt request */</P>
<P> <BR> // y=10.0*(res/32752); /* bipolar input */<BR> y=5.0;<BR> <BR> }</P>
<P>#endif<BR> <BR>}</P>
<P>static void mdlTerminate(SimStruct *S)<BR>{ <BR>}</P>
<P><BR>#ifdef MATLAB_MEX_FILE/* Is this file being compiled as a MEX-file? */<BR>#include "simulink.c" /* Mex glue */<BR>#else<BR>#include "cg_sfun.h" /* Code generation glue */<BR>#endif<BR></P>
页:
[1]