请教:MEX编程实现MATLAB对PCL812PG读和写 点击:3412 | 回复:9



jg_wang2000

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:6帖 | 4回
  • 年度积分:0
  • 历史总积分:57
  • 注册:2003年6月30日
发表于:2004-02-14 22:08:00
楼主
本人在MATLAB环境下用MEX编程,实现MATLAB对PCL812PG卡的读和写(多路),但有些问题。 特请教诸位大侠,看看谁做过类似工作,以便交流。 我的邮箱jg_wang2000@163.com



李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2004-01-17 23:52:00
1楼
Matlab可以调用DLL,你可以调用PCL812PG的DLL。

国安

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2002年4月15日
发表于:2004-02-14 22:01:00
2楼
在MATLAB中,可以用MEX命令把某种格式的C源程序编译成MATLAB中可以直接调用的DLL文件,这样就可以实现MATLAB与外部数据采集卡的交互。具体实现如下:

国安

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2002年4月15日
发表于:2004-02-14 22:04:00
3楼
生成一个C源文件(data9118.c) 上面说的某种格式,指的是MATLAB约定的调用接口。我们知道,在DOS编程,C语言的入口叫main,在WINDOWS编程中C语言的入口叫WinMain,与MATLAB的接口叫mexFunction。 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *y; long iCount, iFs; if(nrhs!=2) mexErrMsgTxt("Usage: data9118(iCount, iSampleRate)"); else if(nlhs!=1) mexErrMsgTxt("Need one array for output!"); iCount=mxGetScalar(prhs[0]); iFs=mxGetScalar(prhs[1]); plhs[0]=mxCreateDoubleMatrix(iCount, 1, mxREAL); y=mxGetPr(plhs[0]); data9118(y, iCount, iFs); } 在调用接口中,nlhs指的是在调用函数时返回值的个数,plhs[]是每个返回值(在MATLAB中都是矩阵)的指针;nrhs指的是调用函数时的参数个数,prhs[]是每个参数的指针。在上例中,我们会传两个值进来iCount为采样点数,iFs为采样频率。返回值为prhs[0],在这里是一个iCount元素的矩阵。我们把这个矩阵的地址取到,并把它作为采样函数的参数。采样函数如下: void data9118(double *y, long iCount, long iFs) { int i; U16 ad_data; data_size=iCount; sample_rate=iFs; card=Register_Card(PCI_9118DG, 0); if(card<0) mexErrMsgTxt("Error Initialing card!"); mem_size=data_size*2; hMem = GlobalAlloc(GMEM_ZEROINIT,mem_size); if(hMem==0) mexErrMsgTxt("Not Enough Memory!"); ai_buf = GlobalLock(hMem); if (ai_buf == 0) mexErrMsgTxt("Not Enough Memory!"); GlobalFix(hMem); AI_9118_Config(card,P9118_AI_BiPolar|P9118_AI_SingEnded,0,0,0); AI_ContScanChannels (card, channel, range, ai_buf, data_size, (F32)sample_rate, SYNCH_OP); for(i=0; i<data_size; i++) { ad_data=ai_buf[i]; y[i]=5.0*((ad_data>>4)-2048)/2048.0; } if(card>=0) Release_Card(card); if(hMem!=0) { GlobalUnfix(hMem); GlobalUnlock(hMem); GlobalFree(hMem); } return; }

国安

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2002年4月15日
发表于:2004-02-14 22:05:00
4楼
此例中我们用ADLink公司PCI-9118数据采集卡。在Win98下它提供PCIS-DASK编程接口,该接口为DLL调用,提供LIB文件和dask.h文件。对它的编程很简单:首先,对9118卡进行初始化(Register_Card),然后为AD采样分配一块内存(GlobalAlloc,GlobalLock,GlobalFix),接着配置板卡(AI_9118_Config),在这里设置板卡的输入范围、输入极性等特性,然后就可以进行采样了(AI_ContScanChannels),在这个函数里可以输入采样点数、通道数、采样频率等参数。采样完成后对结果进行处理,并把结果存在指针y中,y就是刚才我们在接口函数中分配的矩阵的指针。这样当我们的程序返回时,采样数据就可以传回给MATLAB中的矩阵。

国安

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2002年4月15日
发表于:2004-02-14 22:05:00
5楼
编译这个例程的方法是:在MATLAB中运行如下指令: mex data9118.c pci-dask.lib 编译成功后会生成一个data9118.dll的文件。

国安

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2002年4月15日
发表于:2004-02-14 22:06:00
6楼
采样的例程如下: y=data9118(2000, 100000);

国安

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:256
  • 注册:2002年4月15日
发表于:2004-02-14 22:08:00
7楼
jg_wang2000, 这是我很久以前在MATLAB下用ADLINK PCI-9118时的一个程序。当时PCI卡不提供MATLAB驱动的,我直接用DLL调用。现在不用了。 你说的ISA卡也可以一样做。你试一下,有问题的话告诉我。 这个论坛单个帖子长度有限制,贴得我累死了。 还有,李侃,我怎么不能贴图呢?

交流的天空

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 93回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2003年3月18日
发表于:2004-03-03 14:06:00
8楼
用法跟NI的卡是一样的, 看看matlab的help就可以了! matlab6.5以后的版本内置了研华的驱动 直接用就可以了!

曹云鹏

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2003年3月27日
发表于:2006-08-11 17:04:00
9楼
问国安:
     如何在matlab下对PCL812PG计数器编程。谢谢指导?

热门招聘
相关主题

官方公众号

智造工程师