李老师我又有疑问 点击:488 | 回复:4



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-05-25 00:11:00
楼主
我在使用PCI9118DG的过程中又遇到了问题。这是我的程序片断。思路是这样的,采样频率为100k,double buffer设为10000,当存贮点数达到1000000时,换文件名存,同时用DChart显示。可实际采集时出现奇怪现象,就是如果无信号或是信号恒定,则存储显示没有问题,可一旦信号发生变化,显示没问题,可存贮的数据就会掉点。不知道怎么搞得。而且更奇怪的是掉点的dat文件大小和没有掉点的文件大小一样。比如正常的话一个存贮1000000个点的dat文件为1.91M,可掉点的文件大小也为1.91M,可就是转化后点数少了。真是奇怪。 //数据采集及显示线程 UINT CDemo2Dlg::TempThread(LPVOID lpVOID) { FILE *streamout=NULL; BOOLEAN HalfReady; BOOLEAN fstop; int n=1; U32 count=0; int realnumber; unsigned long totalnumber=0; F64* buf1=new F64[data_size/2]; F64* buf2=new F64[data_size/2]; CString num; CString szFile; CString findDir; BOOL bFind=FALSE; CString m_tempName; CString m_newFilename; CDemo2Dlg* dlg=(CDemo2Dlg*) lpVOID; if (bTofile) //是否存储数据 { findDir=szDir; findDir+="*.*"; CFileFind ff; BOOL res=ff.FindFile(findDir); while (res) { res=ff.FindNextFile(); if ((ff.IsDirectory ())&&(!ff.IsDots())) //是否存在Data目录 if (ff.GetFileName()==m_Filename) { bFind=TRUE; AfxMessageBox("该目录已存在,请输入其他文件名或检查Data目录下的文件!",MB_OK); ff.Close (); dlg->m_Start .EnableWindow (TRUE); dlg->KillTimer (0); return 1; } } ff.Close(); szDir+=m_Filename; if (!bFind) //不存在就创建一个采集数据目录 CreateDirectory(szDir,NULL);//当前采集数据所存放目录 szDir+="\\"; m_tempName=m_Filename; m_newFilename=m_tempName; m_newFilename+=".dat"; szFile+=szDir; szFile+=m_newFilename; //把dat文件存在data目录下 if ((streamout=fopen(szFile,"w+t"))==NULL) { AfxMessageBox("File error!",MB_OK); } fwrite(&AdRange, sizeof(U16),1,streamout); //记录采集卡量程 fwrite(&(dlg->ChanType),sizeof(U16),1,streamout); //记录采集类型 } if ((err=AI_ContReadChannel(card, 0,AdRange, ai_buf, data_size, (F64)sample_rate, ASYNCH_OP)) != NoError) { printf("AI_ContReadChannel error=%d", err); return -1; } data_size /= 2; while (!clear_op) { do { AI_AsyncDblBufferHalfReady(card, &HalfReady, &fstop); } while (!HalfReady); AI_AsyncDblBufferTransfer(card, ai_buf); if (bTofile)//同时显示并存储 { if (count<=1000000) { //AI_AsyncDblBufferTransfer(card, ai_buf); AI_ContVScale(0,AdRange,ai_buf,buf1,data_size); //数据转化 for (int i=0;i<data_size;i++) { buf2[i]=(buf1[i]+0.173)/0.0143; //转换公式 } dlg->m_Chart.PlotCharts(&ArrayToVar(buf2, data_size),1, BoolToVar(false)); realnumber=fwrite(ai_buf, sizeof(U16),data_size,streamout); count+=realnumber; } else { fclose(streamout); //关闭上一个文件 m_newFilename=m_tempName; num.Format("%d",n); //文件序号 n++; m_newFilename+=num; m_newFilename+=".dat"; //下一个文件名为PCI9118n.dat; szFile.Empty (); szFile+=szDir; szFile+=m_newFilename; count=0; if ((streamout=fopen(szFile,"w+t"))==NULL)//打开下一个文件 { AfxMessageBox("File error!",MB_OK); } fwrite(&AdRange, sizeof(U16),1,streamout); //记录采集卡量程 fwrite(&(dlg->ChanType),sizeof(U16),1,streamout); //记录采集类型 } } else { AI_ContVScale(0,AdRange,ai_buf,buf1,data_size); //卡号为0 ,数据转化 for (int i=0;i<data_size;i++) { buf2[i]=(buf1[i]+0.173)/0.0143; //转换公式 } dlg->m_Chart.PlotCharts(&ArrayToVar(buf2, data_size),1, BoolToVar(false)); } } if (streamout!=NULL) fclose(streamout); delete []buf1; delete []buf2; AI_AsyncClear(card, &totalnumber); return 0; } //这是我转化文件格式的程序片断。dat->txt void CConvertFileDlg::OnStart() { // TODO: Add your control notification handler code here FILE *streamout; ofstream



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-05-22 22:48:00
1楼
李老师,文件转换中测力和测力测温同时测量部分不用看,只用看测温部分,呵呵!情急之下都贴出去了,好像搞得太复杂了,呵呵!我先怀疑是不是因为在存储的同时显示造成的掉点,可当我把显示部分去掉后,还是有这个问题,真是不知道怎么办了。

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-05-23 17:54:00
2楼
自己解决了,呵呵!犯了个低级错误,呵呵!见笑了。

李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2003-05-23 18:59:00
3楼
我很感兴趣你的double buffer half full的时间是多少&你解决问题的途径是什么.

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-05-25 00:11:00
4楼
我就是设为每采集5000个点产生一个半满中断,按100k的采样频率算得话应该是50ms一个中断。至于我以上的问题,只是我一时疏忽,再用fopen写文件时没有注意t和b的参数,造成的读取文件格式错误,不值得一提,呵呵。但是我在使用Dchart时又发现,ViewNumber属性好像有bug,不信你可以试一下,就是如果ViewNumber设为大于2000左右(具体上限值不清楚),坐标能跟着变,但图形却不按照可视点数来显示了,很是奇怪。比如我设ViewNumber为5000,实际图形却大概按500来显示,似乎是有一个上限值,超过它就自动截取了,此点说明书上没有说明。您能不能帮我问问?谢谢!

热门招聘
相关主题

官方公众号

智造工程师