zym765 发表于 2006-6-3 11:33

[求助]一段有关硬件编程的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    &lt;stddef.h&gt;<BR>#include    &lt;stdlib.h&gt;</P>
<P>#include    "simstruc.h"</P>
<P>#ifdef      MATLAB_MEX_FILE<BR>#include    "mex.h"<BR>#else<BR>#include    &lt;windows.h&gt;<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&lt;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&lt;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)) &amp; 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]
查看完整版本: [求助]一段有关硬件编程的S函数问题,为什么输出总是零呢?