我在编写适用于simulink real time的pci1724u板卡驱动,现在驱动可以下载运行,但是没有电流输出。不知道是哪里出了问题,大神们帮我看看吧!!!!救救孩子
/* adadvPCI1724.c - xPC Target, non-inlined S-function driver for A/D section of Advantech PCI1724 board */
#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME adadvPCI1724u
#include <stdlib.h>
#include "simstruc.h"
#ifdef MATLAB_MEX_FILE
#include "mex.h"
#else
#include <windows.h>
#include "io_xpcimport.h"
#endif
/* Input Arguments */
#define NUM_PARAMS (4)
#define BASE_ADDRESS_ARG (ssGetSFcnParam(S,0))
#define CHANNEL_ARG (ssGetSFcnParam(S,1))
#define RANGE_ARG (ssGetSFcnParam(S,2))
#define SAMPLE_TIME_PARAM (ssGetSFcnParam(S,3))
/* Convert S Function Parameters to Varibles */
#define SAMPLE_TIME ((real_T) mxGetPr(SAMPLE_TIME_PARAM)[0])
#define SAMPLE_OFFSET ((real_T) mxGetPr(SAMPLE_TIME_PARAM)[1])
int BASE;
static char_T msg[256];
/*====================*
* S-function methods *
*====================*/
static void mdlCheckParameters(SimStruct *S)
{
}
static void mdlInitializeSizes(SimStruct *S)
{
uint_T i;
ssSetNumSFcnParams(S, NUM_PARAMS);
if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {
mdlCheckParameters(S);
if (ssGetErrorStatus(S) != NULL) {
return;
}
} else {
return; /* Parameter mismatch will be reported by Simulink */
}
ssSetNumContStates(S, 0);
ssSetNumDiscStates(S, 0);/*No use*/
if (!ssSetNumOutputPorts(S, 0)) return;
if (!ssSetNumInputPorts(S, mxGetNumberOfElements(CHANNEL_ARG))) return;
for (i=0;i<mxGetNumberOfElements(CHANNEL_ARG);i++) {
ssSetInputPortWidth(S, i, 1);
}
ssSetNumSampleTimes(S, 1);
ssSetSFcnParamNotTunable(S,0);
ssSetSFcnParamNotTunable(S,1);
ssSetSFcnParamNotTunable(S,2);
ssSetSFcnParamNotTunable(S,3);
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_PLACE_ASAP);
}
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, SAMPLE_TIME);
ssSetOffsetTime(S, 0, SAMPLE_OFFSET);
}
#define MDL_START
static void mdlStart(SimStruct *S)
{
#ifndef MATLAB_MEX_FILE
unsigned char ucStatus;
PCIDeviceInfo pciinfo;
char devName[20];
strcpy(devName,"PCI-1724u");
rl32eGetPCIInfo(0x13FE, (unsigned short)0x1724, &pciinfo);
BASE = (uint_T)pciinfo.BaseAddress[2];
rl32eOutpDW((unsigned short)(BASE+4),0); /* 同步输出*/
#endif
}
static void mdlOutputs(SimStruct *S, int_T tid)
{
#ifndef MATLAB_MEX_FILE
uint_T i,j, n, channel;
real_T *y, range, res;
unsigned char ucStatus;
rl32eOutpB((unsigned short)(BASE+4),0);
for (i=0;i<mxGetNumberOfElements(CHANNEL_ARG);i++) {
y=ssGetInputPortSignal(S,i);
rl32eOutpDW((unsigned short)BASE,0x11cfff);
rl32eOutpDW((unsigned short)BASE,0x12cfff);
rl32eOutpDW((unsigned short)BASE,0x10cfff);
res=(rl32eInpW((unsigned short)BASE)&0xFFFF);
}
#endif
}
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* Mex glue */
#else
#include "cg_sfun.h" /* Code generation glue */
#endif
想知道问题具体出在哪里?怎么编写成功啊?