CVI初学者问答

CVI初学者问答

1.如何减少CVI程序的CPU占用率?
  回答=可以在Options-》Enviroment中进行设置,将Sleep Policy设置为Sleep More。或者在程序中进行设置,设置函数为:SetSleepPolicy (VAL_SLEEP_MORE)。
 
2.在CVI中如何实现将这次面板参数作为下次的缺省值使用?
  回答=一般情况下可以使用文件将各参数保存下来,在下次调用面板时再调用这些参数。也可以使用CVI自带的函数SavePanelState和RecallPanelState。
 
3.CVI中如何实现进度条功能?
  回答=CVI中可以使用slide控件实现进度条功能。也可以使用Programmer's Toolbox里带的函数来创建进度条。
 
4.CVI中的TUI文件?
  回答=TUI文件实际上是UIR文件的文本版本,在使用时同UIR文件的调用方式相同。
 
5.CVI中使用控件的Tab顺序功能时如何略过某些控件?
  回答=将控件改变为Indicator控件,在CVI中Tab顺序是略过显示控件的;2、将控件灰掉,CVI会略过灰掉的控件;3、将下一个控件作为活动控件,从而略过一个控件。
 
6.在LabWindows/CVI中如何用多个安全队列(SafeQueue)来实现对多个采集任务的数据保护?
  回答=一般来说,在编写一个多线程程序时,我们会在默认的线程池(DefaultThreadPool)中建立一个或多个SafeQueue;然后再建立2个新的线程池(NewThreadPool),分别用于数据的采集和处理;在用于采集的线程池中建立多个线程(Thread),分别对应各个板卡或通道;在用于数据处理的线程池(ThreadPool)中建立一个或多个线程来对进行相应的操作。
  1.在安装NI软件的过程中(包括LabVIEW, CVI, hardware drivers, 或使用了MSI installer进行安装的其它NI软件),出现错误2894致使安装程序被迫中止,如何解决该问题?
  回答=该问题是微软网站上已经公布的Microsoft Installer常出现的问题之一。已知有两个原因可能导致出现该问题:其一就是错误的或者被破坏了的Riched20.dll存在于用户的计算机上,或用户计算机上的的Riched20.dll文件丢失。其二就是用户的计算机被诸如[email=W32.Nimda.A@mm]W32.Nimda.A@mm[/email]的病毒感染。
针对第一种情况,用户需要从其他机器上拷贝正确版本的Riched20.dll文件或者重新安装MSI installer。如果用户的操作系统为Windows95,98或者ME,那么必须下载并安装Instmsi.exe,如果用户使用Windows NT4.0, 2000或者Xp,那么必须下载安装InstMsiW.exe。该执行文件将会修复用户系统里的所有损坏文件。
针对第二种情况,用户则需要杀毒并重新安装上述文件。
 
2.LabWindows/CVI中的堆栈大小?
  回答=LabWindows/CVI中的堆栈大小直接影响可以分配的数组大小。如果数组的大小超过堆栈大小,则会报告错误。该值可以在Options->Build Options中设置。缺省值为:250000。建议使用动态内存分配。
 
3.CVI中如何画极坐标?
  回答=CVI中没有专门提供画极坐标的控件。可以使用Picture控件自己画,或者使用绘图软件绘制出极坐标图,然后保存为图片再使用canvas控件将图片导入。
 
4.如何在启动CVS之后立即启动下载到CVS上的执行程序?
  一般有两种方式,其中一种你可以使用LV的工程项来把程序下载到CVS中,那么RTTarget.ApplicationPath=c:/ni-rt/startup/startup.rtexe,
RTTarget.LaunchAppAtBoot=True这两个设置就会自动被LV设置。如果你是通过FTP把程序下载到CVS上,上述两个标签就得手动设置。
 
5.CVI中如何进行二维指针的内存分配?
  回答=具体例子代码如下: p=(ComplexNum**)malloc(3*sizeof(int));  
   for(i=0;i<3;i++)
     p=(ComplexNum*)malloc(3*sizeof(ComplexNum )); 其中p类型为:ComplexNum**;
 
6.CVI中如何实现颜色选择对话框?
  回答=可以使用ColorChangePopup。具体例子代码:static ColorChangeEntry sEntry;
                static ListType colorList = 0;
                static int iResult;
                colorList = ListCreate(sizeof(ColorChangeEntry));
                sEntry.name = "1 Color";
                sEntry.color = VAL_RED;
                sEntry.defaultColor = VAL_BLUE;
                ListInsertItem(colorList, &sEntry, END_OF_LIST);
                sEntry.name = "2 Color";
                sEntry.color = VAL_GREEN;
                sEntry.defaultColor = VAL_BLUE;
                ListInsertItem(colorList, &sEntry, END_OF_LIST);
               
                sEntry.name = "3 Color";
                sEntry.color = VAL_BLUE;
                sEntry.defaultColor = VAL_YELLOW;
                ListInsertItem(colorList, &sEntry, END_OF_LIST);
               iResult = ColorChangePopup("颜色选择", colorList, 1, 0,0);
                ListDispose(colorList);  

1.如何在CVI中实现Flash文件的播放?
  回答=首先需要安装FLASH PLAYER的ActiveX控件。在PANEL上面添加ActiveX控件,在向导中添加SHOCKWAVEFLASH控件。然后使用CVI的自动生成程序框架代码,在向导中会自动生成相应的FP文件。可以根据FP文件提供的函数进行编程了。GetObjHandleFromActiveXCtrl获得ActiveX控件的句柄,ShockwaveFlashObjects_IShockwaveFlashSetMovie设置要播放的文件ShockwaveFlashObjects_IShockwaveFlashPlay播放文件ShockwaveFlashObjects_IShockwaveFlashStop停止播放
 
2.在LabWindows/CVI中如何使用DAQmx采集数据?
  回答=在LabWindows/CVI中的Function Panel里调用NI-DAQmx Library目录下的函数,调用顺序与在LabVIEW中使用DAQmx的API函数基本一致,都必须遵守创建任务->配置通道->设置采样率->设置触发->采集数据->停止任务->清除任务这样的基本顺序。
 
3.CVI中如何使用UDP协议?
  回答=CVI中没有带有关于UDP协议的fp文件,需要使用winsock来写。
 
4.CVI下如何编写多线程程序?
  回答=可以使用函数模版中的Utility Library目录下的函数,首先用CmtNewThreadPool (int Maximum_Number_of_Threads, int *Pool_Handle)函数创建一个线程池(也可以使用程序默认的线程池),然后使用CmtScheduleThreadPoolFunction (int Pool_Handle, ThreadFunctionPtr Thread_Function, void *Thread_Function_Data, int *Thread_Function_ID)函数来指定每个线程的回调函数,以实现不同的操作。最后,记住一定要在结束程序的时候调用CmtDiscardThreadPool (int Pool_Handle)函数释放这些线程的系统资源。
 
5.在LabWindows/CVI中如何将自己编写的函数放在函数模版中,使它可以像函数模版中原有的函数那样使用?
  回答=先新建一个Function Tree,然后在这个Function Tree下新建一个Instrument,并在这个Instrument下建立函数分类(将函数分类管理),再建立一个Function Panel,在上面添加输入输出控件和帮助信息,(如果这个函数没有使用到数采硬件,那么在Option下面将IVI/VXIplug&play Style前的勾去掉)然后选择Tools下的Generate New Source for Fuction Tree,最后只要在自动生成的*.c文件中添加函数的代码并保存,然后就可以像函数面板中的其他函数一样调用了。(下次使用LabWindows/CVI时需要重新载入)
 
6.在没有.LIB和.H文件时,CVI怎么调用DLL??
  回答=使用SDK中的LoadLibary和GetProcAddress以及FreeLibrary可以实现动态DLL的调用。
1.CVI可以做不规则界面吗?
  回答=这是可以的,可以使用SDK函数实现,VC等编程语言实际上是使用SDK封装后的函数,使用SDK函数编程比较麻烦。
 
2.如何处理PANEL的最大化和最小化问题?
  回答=有EVENT_PANEL_SIZE事件可以获得,然后可以读取当前panel的大小来确定区分MAXIMIZE盒MINIMIZE事件.
 
3.如何在CVI中编写DLL?
  回答=首先建立一个新工程,然后创建一个源程序文件,作为dll主程序。利用CVI提供的编辑器功能插入DllMain,这时在源程序文件中就有dll的框架程序。生成的两个函数不能修改。这时就可以在该程序中编写自己的DLL程序。注意函数格式:int __stdcall Function()。创建头文件用于声明dll函数。在Build菜单的TargetSettings中设置dll输出路径,在Exports中选择要输出函数所在的头文件。
 
4.如何在CVI中使用task来自动生成代码?
  回答=首先,在MAX中配置好你的task,然后在CVI中创建一个空程序,然后使用Daqmx load task函数,配置好handle,然后在程序中,选中该函数,右键选择gennerate cvi example code,就可以自动生成代码了。
 
5.如何在CVI中调试用CVI编写的DLL由VC调用?
  回答=首先应有VC写的调用程序。在CVI中需要进行的设置:在Specify External Process中选择调用dll的可执行文件。配置Target Settings为Debug,选择dll的目录为可执行文件所在的目录。就可以在CVI中进行调试工作了。
 
6.CVI8.0如何编写dll可以使用VC调用,包括节目.
  回答=在编写dll时,需要注意两点:dll头文件的编写格式,由于VC使用的是C++,在dll头文件中需加入:#ifdef __cplusplus
    extern "C" {
#endif#ifdef __cplusplus
    }
#endif。在dll设置时选中Embed project。Uir,这样不需要拷贝uir文件到相应的目录中去。
1.DAQmx模拟触发信号有噪声怎么解决?
  回答=可以使用迟滞模拟触发。可以有两种方式,一种正迟滞触发,一种负迟滞触发。对于前一种,只有当触发电平降低到迟滞电平以下后才可以进行下一次触发采集;对于后一种,只有当触发电平上升到迟滞电平以上后才可以进行下一次触发采集。LabVIEW中有hysteresis trigger的例子。参考:http://zone.ni.com/reference/en-XX/help/370592G-01/digitizers/hysteresis_triggers/
2.当调用CVI自带的与Matlab相关的程序运行时,会产生错误提示:类没有注册,错误代码-2147221164。
  回答=这是由于CVI里的这些例子是针对较早的Matlab版本写的,当机器上的Matlab的版本与写例程时的版本不一致时,就会产生这样的错误。解决方法是在CVI中相关的Project中建立相应的ActiveX控件。下面的方法适用于Matlab 6.5 R13:1.使用Tools >> Create ActiveX Controller,删除当前MATLAB instrument,重新建立MATLAB Automation Server Type。 MATLAB instrument的名字为MATLAB Application Type Library。将新建立的ActiveX controller的名字设置成与原来例子中相同的名字。2.将 matlabdemo.c中的launch callback中的stat = MLApp_NewDIMLApp (NULL, &hMatlab)改为stat = MLApp_NewDIMLApp (NULL, 1, LOCALE_NEUTRAL, 0, &hMatlab);3.打开MATLAB instrument的原代码,将所有&MLApp_IID_DIMLApp替换为 &IID_IDispatch。由于新函数中修改了参数,因此还要修改调用该函数的地方。另外,所有&MLApp_IID_DIMLApp需要被替换为相应MATLAB版本的&IID_IDispatch。详细操作可以参考http://digital.ni.com/public.nsf/allkb/0FB80F59D0AF9A4F8625703E007BF78B
3.在Table控件中使用Ring如何获得当前选中的值?
  回答=使用GetTableCellValue,但是该函数得到的是显示字符串的ASC值,调试相对应的值。
 
4.如何使用ActiveX Wizard使CVI能够使用matlab6.5
  回答=1,选择Tools/Create ActiveX Automation Controller。2,next后选择应用程序(matlab)。选择即将生成的文件保存路径。next后即可得到 *.fp, *.c, *.sub, *.h,  *.obj 文件。详情参考http://digital.ni.com/public.nsf/websearch/4B597F188B89B6DD862568970071F2FC?OpenDocument
 
5.LabVIEW 7.1如何实现将Chart的时间坐标与计算机系统时间一致
  回答=Chart 属性 Format and Precision 选Absolute time,显示方式改System time format 和 System data format。程序框图里Get date/time in seconds获取当前时间,转换为双精度浮点型后输入到Waveform Chart的属性节点Xscale.Offset。属性节点Xscale.Format设为模式7。
 
6.CVS长时间工作出现死机现象
  回答=可能的原因是CVS温度过高,CVS要求的工作温度为0 °C to 45 °C,垂直放置的时候可以为0 °C to 55 °C,当温度过高的时候,power ok的指示灯变为红色,CVS将会停止工作。
  1.问题=如何实现8位并口采集和输出?
  回答=8位并口不是指打印机的并口,而是指可并行的8位数字IO。 在CVI中,使用DAQmxCreateTask;DAQmxCreateDIChan;DAQmxCfgSampClkTiming这三个函数来创建并配置通道。推荐使用创建通道时使用port方式,而不用line方式。
 
2.问题=PCI-8431 LV7.0 CVI7.0 是4口RS422串口卡,在LV和LABWINDOWS下如何编程.能否使用RS232的编程方式.
  回答=可以,在LV7.0下对于串口编程,已经都是统一的VISA编程方式.在CVI7.0下,是可以使用RS232的函数库的,因为RS232和RS422只是物理接口定义不同,但编程方法还是一样的.
 
3.问题=LabWindows/CVI 5.5 中SampleRate和ScanRate的区别?
  回答=SampleRate是指在进行单个通道采集的速率,而ScanRate包含了SampleRate,表征两次采集之间速率。在Easy IO中只需要设置ScanRate,而在中级和低级数据采集函数中需设置SampleRate和ScanRate,如函数:SCAN_OP和DAQ_RATE,SCAN_START。
 
4.问题=LabWindows/CVI5.5中easy IO和Low Level I/o的分别在什么情况下使用?
  回答=Easy IO通常用在简单采集情况下,不需进行复杂的底层控制。而Low Level I/O使用在较复杂的控制,如:触发、连续采集存盘等。
 
5.问题=Lab/Windows CVI 8.0装了DAQ 8.0驱动,但4472仍然无法使用,有NI-DAQmx Library,但Traditioanl NI-DAQ Library是灰色的,不可用,为什么?
  回答=4472只支持Traditioanl DAQ,但是DAQ 8.0的驱动不包含Traditional DAQ,所以要找一个低版本的驱动安装,如DAQ 7.3或7.4,Traditioanl NI-DAQ就可用了。

你可能感兴趣的:(c++及技术类)