首页 上一页 1 2 下一页 尾页

AI_ContReadChannel函数 点击:4175 | 回复:21



blueleaf

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-31 14:20:00
楼主
AI_ContReadChannel函数中的InBuf参数的数据格式是D11...D0,C3...C0,那么我怎么样才能把D11...D0从中取出来?还是说InBuf[]中就已经存储的是转换以后的数据?谢谢



别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-04 11:41:00
1楼
看来你的卡型是PCI-9111DG或PCI-9112/cPCI9112或PCI-9118DG/HG中的某一款,对吧? 先把数据取回来再对数组统一处理。 函数原型: I16 AI_ContReadChannel (U16 CardNumber, U16 Channel, U16 AdRange, U16 *Buffer, U32 ReadCount, F32 SampleRate, U16 SyncMode); Description: Buffer : An integer array to contain the acquired data. Buffer must has a length equal to or greater than the value of parameter ReadCount. If double-buffered mode is enabled, this buffer is of no use, you can ignore this argument. //...若采用non-double-buffer mode... #define ChNo 0 #define AdRange AD_B_5_V #define SampLen 2048 //读取样点数 #define SampRate 20000.000f U16 InBuf[SampLen]; ...... AI_ContReadChannel(CardID, ChNo,AdRange,InBuf, SampLen,SampleRate,SYNC_ASYNC); ...... for(i=0;i<SampLen;i++) InBuf[ChNo] /= 16;//<==>InBuf[i]>>=4; 这就可以了.

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-04 11:43:00
2楼
上述原码最后一行改为   for(i=0;i<SampLen;i++)    InBuf[i] /= 16;//<==>InBuf[i]>>=4; 笔误,抱歉。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-04 12:05:00
3楼
罗老师 :InBuf[ChNo] /= 16;//<==>InBuf[i]>>=4;这句话没看懂,既然InBuf[SampLen];怎么又InBuf[ChNo]?不就是InBuf[0]吗?    另外,数据时实采集时InBuf中的数据总是0(不管怎么样,他总得有数值吧)而AI_ReadChannel函数的analog_input中就有值。 谢谢

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-04 12:17:00
4楼
PCI-9111DG 同步,non-double-buffer mode 源代码如下: // PCI_9111DG : Continuous AI /******************************************************** The following code segment is generated according to your device setup. You can copy and insert it into your program to operate your device. ********************************************************/ #include "dask.h" //constants definition #define CardNumber 0 #define ADChan 0 #define ScanCount 65536 #define SampleRate 8000.0000 //AI config constants definition #define PreTrigEn 0 #define TraceCnt 0 //variables definition I16 cardID = -1; I16 err=0; U32 AccessCnt = 0; U32 MemSize = 0; I16 InBuf[65536]; //AI data buffer cardID = Register_Card(PCI_9111DG, CardNumber); if (cardID<0) { //Error occurs !! //ToDo : Handle error here } err = AI_InitialMemoryAllocated(cardID,&MemSize); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } if (MemSize*1024 < ScanCount*sizeof(I16) ) { //available memory size for analog input in the device driver //is smaller than the data size specified!! //ToDo : do something here } err = AI_AsyncDblBufferMode(cardID, 0); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } err=AI_9111_Config(cardID, TRIG_INT_PACER, PreTrigEn, TraceCnt); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } err=AI_ContReadChannel (cardID, ADChan, AD_B_10_V, InBuf, ScanCount, SampleRate, SYNCH_OP); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } Release_Card(cardID); //------------end-------------------------------------- //////////////////////////////////////////////////////// PCI-9111DG 异步,non-double-buffer mode源代码如下 // PCI_9111DG : Continuous AI /******************************************************** The following code segment is generated according to your device setup. You can copy and insert it into your program to operate your device. ********************************************************/ #include "dask.h" //constants definition #define CardNumber 0 #define ADChan 0 #define ScanCount 65536 #define SampleRate 8000.0000 //AI config constants definition #define PreTrigEn 0 #define TraceCnt 0 //variables definition I16 cardID = -1; I16 err=0; BOOLEAN fstop = 0; U32 AccessCnt = 0; U32 MemSize = 0; I16 InBuf[65536]; //AI data buffer cardID = Register_Card(PCI_9111DG, CardNumber); if (cardID<0) { //Error occurs !! //ToDo : Handle error here } err = AI_InitialMemoryAllocated(cardID,&MemSize); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } if (MemSize*1024 < ScanCount*sizeof(I16) ) { //available memory size for analog input in the device driver //is smaller than the data size specified!! //ToDo : do something here } err = AI_AsyncDblBufferMode(cardID, 0); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } err=AI_9111_Config(cardID, TRIG_INT_PACER, PreTrigEn, TraceCnt); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } err=AI_ContReadChannel (cardID, ADChan, AD_B_10_V, InBuf, ScanCount, SampleRate, ASYNCH_OP); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } do { AI_AsyncCheck(cardID, &fstop, &AccessCnt); } while (!fstop); err = AI_AsyncClear(cardID, &AccessCnt); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } Release_Card(cardID); //------end----------------------------------------- 你是不是那里出了错漏? 你可以用PCIS-DASK 4.0里的PCIS-DASK Code Creator自己生成 上述代码。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-04 12:26:00
5楼
是不是我太懒了 我只想调用一个函数解决数据采集的问题,看来没这么简单! 非常感谢!

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-04 12:37:00
6楼
必需的步骤是缺一不可的! 其实我现在也在编采集程序,PCI-9114HG,用VC和BCB, 问题还没解决呢! 在一瞬间(<<0.500ms)采一帧数据(0至N道每道采一个样点我称为一帧)的核心问题还没实现。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-04 14:16:00
7楼
哈哈,我可帮不上你,对于vc、pci我都是新手。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-04 14:25:00
8楼
现在又出现新问题,就是InBuf中的数据又都变成-13108,这肯定不对,哪里的问题?谢谢!

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-04 15:25:00
9楼
用例子程序试一试。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-04 16:53:00
10楼
此函数返回的err为-205,代码与上面的程序完全一样,例子中err=0,

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-04 17:16:00
11楼
查一下status code,-205是连续采集API fail 的报错,检查参数设置是否正确。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-04 17:42:00
12楼
什么参数?是函数中的参数吗?

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-05 14:20:00
13楼
该函数对于采样长度是不是有限制,我的采样长度为512以下时,err=-205;采样长度为65536,err=-15;在512-32768之间err=0;是库函数本身设定的,还是我的程序有问题,我只新建了一个vc程序,在doc.cpp里添加的这部分程序,进行测试,别的什么都没做。

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-05 15:54:00
14楼
请注意PCIS-DASK中关于AI_ContReadChannel的ReadCount参数的下述说明:“Note: if the card is PCI-9111, PCI-9113 or PCI-9114, this function uses FIFO-Half-Full interrupt transfer mode. So the value of ReadCount must be the multiple of 512 for non-double-buffer mode, or multiple of 1024 for double-buffer mode.” 至于采样长度为65536,err=-15,应该是你驱动的AI Buffer设置的不够大。

blueleaf

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 15回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年11月11日
发表于:2003-12-06 11:44:00
15楼
pci9111dg驱动时,缓冲不是已经设好的吗?那么我怎么设哪

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-08 10:56:00
16楼
在开始->程序->PCIS-DASK->NUDAQPCI Configuration Utility下可以修改AI Buffer的大小,这是驱动为AI操作在内存中开辟的一段存储空间。

江河之水

  • 精华:2帖
  • 求助:0帖
  • 帖子:92帖 | 181回
  • 年度积分:0
  • 历史总积分:906
  • 注册:2003年4月05日
发表于:2003-12-31 14:20:00
17楼
请问用VB能否采集板卡的数据?

yata830429

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2005年10月01日
发表于:2005-10-17 20:22:00
18楼

yata830429

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2005年10月01日
发表于:2005-10-17 20:37:00
19楼
VC下用下面函数采集时,5路以下都可以,一但大于5路,就提示堆栈溢出?为什么?大虾指教 #define CardNumber 0 #define LastADChan 6 #define ADChanCount 7 //5路以下都可以 #define ScanCount 2048 #define SampleRate 7000.0000 #define SampLen 49152 //Sampling-Length per AD channel,in samples F64 vaiData[ADChanCount*SampLen];//volt-value of AI data I16 cardID = -1; I16 err=0; BOOLEAN fstop = 0; BOOLEAN HalfReady = 0; U32 AccessCnt = 0; U32 MemSize = 0; U32 InBuf[ADChanCount*SampLen]; //AI data buffer U32 CurSamples = 0;//total numbers of current transferred samples cardID = Register_Card(PCI_9114DG, CardNumber); if (cardID<0) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: Register_Card(). CarID=%d",cardID); AfxMessageBox(str); exit(1); } err = AI_InitialMemoryAllocated(cardID,&MemSize); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: AI_InitialMemoryAllocated()"); AfxMessageBox(str); exit(1); } if (MemSize*1024 < ScanCount*ADChanCount*sizeof(U32) ) { //available memory size for analog input in the device driver //is smaller than the data size specified!! //ToDo : do something here CString str; str.Format("Error: AI_InitialMemoryAllocated()"); AfxMessageBox(str); exit(1); } err = AI_AsyncDblBufferMode(cardID, 1); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: AI_AsyncDblBufferMode().errcode = %d",err); AfxMessageBox(str); exit(1); } err=AI_9114_Config(cardID, TRIG_INT_PACER); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: AI_9114_Config().errcode=%d",err); AfxMessageBox(str); exit(1); } err=AI_ContScanChannels (cardID, LastADChan, AD_B_10_V, NULL, ScanCount*ADChanCount, SampleRate, ASYNCH_OP); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: AI_ContScanChannels(). errcode = %d",err); AfxMessageBox(str); exit(1); } do { do { AI_AsyncDblBufferHalfReady (cardID, &HalfReady, &fstop); } while (!HalfReady); //half buffer data is ready for read AI_AsyncDblBufferTransfer (cardID, (U16*)(&InBuf[CurSamples])); CurSamples += ScanCount/2;} //here to add the condition to continue the acquisition while (CurSamples<ADChanCount*SampLen); err = AI_AsyncClear(cardID, &AccessCnt); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: AI_AsyncClear().errcode=%d",err); AfxMessageBox(str); exit(1); } AfxMessageBox("sampling completed!"); err=AI_ContVScale(cardID,AD_B_10_V,InBuf,vaiData,ADChanCount*SampLen); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here CString str; str.Format("Error: AI_ContVScale().errcode=%d",err); AfxMessageBox(str); exit(1); } Release_Card(cardID);

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2006-03-21 09:40:00
20楼
我也要进行数据采集了!还是个零呢!学习下吧!!

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页