您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页LabWindowsCVI扫盲技巧贴

LabWindowsCVI扫盲技巧贴

来源:爱go旅游网
LabWindows/CVI扫盲+技巧贴(CVI学习必看)

字体: 小 中 大 | 打印 发表于: 2008-6-11 13:15 作者: LAVA 来源: TestDevelop

1、什么是LabWindows/CVI?

NI LabWindows/CVI是一类久经验证的ANSI C集成开发环境,为工程师和科学家提供用于创建测试和控制应用的全套编程工具。NI LabWindows/CVI兼有ANSI C的耐用性、复用性和特定的工程性能,适用于仪器控制、数据采集、分析和用户界面开发。

2、CVI适合什么人使用?

CVI是基于ANSI C的快速开发环境,适用于有C,C++基础。使用VB,VC,BC运用控件式组织用户界面的工程师。

3、CVI有几种版本?

基本版RMB10220

完整版RMB21305

   

ANSI C开发环境 用户界面设计 数据采集和仪器控制

IVI驱动连接

 

首选的自动化测试软件包 300多个数学/分析函数

  

因特网连接 Windows SDK .NET开发工具

目前最新的是8.5版,下图是CVI的版本历史:

TimeLine545px.png

4、CVI开发的程序能否独立运行?

可以。和所有的开发工具一样,CVI编写的程序只要提供CVI运行支持库(CVI runtime)即可。

5、CVI的运行支持库在哪里下载?

LabWindows/CVI Run-Time Engine 8.5.1 - Windows 2000/Vista x64/Vista x86/XP

http://sine.ni.com/apps/utf8/niup.ni?ap=GB_NIDU&ip=209&loc=en-US&du=http://joule.ni.com/nidu/cds/view/p/id/907/lang/zhs

LabWindows/CVI Run-Time Engine 8.1.1 for Windows 2000/Vista x64/Vista x86/XP

http://ftp.ni.com/support/softlib/labwindows/cvi/Run-Time%20Engines/8.1.1/NILWCVIRTE811.exe

6、是否要每次手动安装支持库?

否,CVI程序带有发布功能。自动生存你项目需要的所有运行库。 菜单Build——distributions下。

7、EXE程序的信息在哪里定义?

菜单Build——Build steps...下可以更改EXE的图标,版权信息等等。

8、新手怎么开始学习CVI?

新手可以先看看这些书籍和资料。

http://www.vihome.com.cn/bbs/thread-4658-1-1.html http://www.vihome.com.cn/bbs/thread-3180-1-1.html http://www.vihome.com.cn/bbs/thread-3173-1-1.html

9、CVI在哪里下载?

http://www.vihome.com.cn/bbs/thread-4667-1-1.html http://www.vihome.com.cn/sq/?uid/4829

10、如何在CVI中获得系统信息

使用CVI提供的toolbox:

GetWinOSVersion 获得操作系统信息 GetWindowsDirs 获得Windows目录

GetDiskSpace 得到磁盘空间大小,对于文件保存有用,先判断磁盘大小再保存,否则提示。 GetMemoryInfo 获得内存信息。

CODE:

GetDiskSpace (\"C:\

diskSpaceMB = (double)totalBytes64.hiBytes * 4096 + (double)totalBytes64.loBytes/1048576; freeSpaceMB = (double)freeBytes64.hiBytes * 4096 + (double)freeBytes64.loBytes/1048576; 我也来说两句 查看全部回复 最新回复

LAVA (2008-6-11 13:45:21)

11、CVI中如何打开别的应用程序文件,如Doc,PDF,HLP?

CODE:

OpenDocumentInDefaultViewer (\"C:\\example.pdf\12、怎么在CVI中使用非NI公司的PCI板卡?

其它厂家虽然没有NI这样的FP文件或向导,但都提供DLL动态链接库使用。VCBC,CVI通用。

13、如何使用DLL?

需要DLL文件和H头文件,LIB文件。#inlcude \"头文件名.h\"加入CVI中。将*.lib文件加入工程中。工程右击——add file...即可使用DLL。

14、没有LIB文件如何使用DLL?

在CVI菜单中打开DLL相应的.h文件。Option——Generate DLL Import Library选择DLL文件,即可生成LIB文件。

15、如何根据DLL和.H文件看到C代码?

Option——Generate DLL Import source选择DLL文件,即可生存C文件。不过只有函数定义,源代码就不用想了,现在还没有DLL的破解。

16、如何创建DLL程序文件?

Build——Target Type——Dynamic Link Library ,即可将当前的工程生存DLL形式。同理Static Library生存Lib形式。

17、运行时窗口的响应慢,显示不及时?

CVI是事件驱动式的运行方法,排队响应个个事件。造成显示滞后。需要强制在函数中加入ProcessSystemEvent()。当然有效的方法是使用CVI或API的多线程技术。

18、CVI中获取本地计算机的IP地址

可以调用 GetTCPHostAddr 函数。需要注意的是,该函数获取的是当前程序运行的电脑的默认IP地址。GetTCPHostAddr 函数会向Windows操作系统获取所有可用的IP地址的列表,但返回的只是其中的第一个。

同样地,如果要获取该电脑的所有IP地址,可以调用GetAllTCPHostAddresses 函数来实现。

19、CVI如何实现右键菜单功能?

调用编辑好的右键菜单可以使用以下两个函数实现:

CODE:

menuHandle = LoadMenuBar (0, \"popupmenu.uir\

RunPopupMenu (menuHandle, MENUBAR_MENU1, panel, eventData1, eventData2, 1, 1, 1, 1); 20、CVI对多线程的如何支持?

CVI对多线程的支持(1)概念篇

【 原帖地址:http://easons.blogbus.com/logs/2006/04/2366573.html】

多线程对于windows应用程序来说,并不是什么先进的技术,打开你的任务管理器,选择“进程”分页,点击菜单的在“查看”->选择列,在“线程计数”前打勾,确定后你在“进程”分页里头看到现在在运行的绝大多数程序都基于2个以上的线程。

那么进程线程的概念以及他们之间的关系又是什么呢?

线程技术是指开发架构将应用程序的一部分分离为“线程”,使线程与程序其余部分执行步骤不一致。线程是一种特殊的对象,是操作系统执行多任务的一部分,它允许应用程序的一部分独立于其他对象而单独运行,因此也就脱离了应用程序的常规执行顺序。

目前主流的Windows系统都是基于多任务机制,即可同时运行多个应用程序(“应用程序”这个词并不恰当,恰当的说法是“进程”)。当启动应用程序时,系统就会为该应用程序分配所需的内存以及其他资源。内存和资源的物理分离叫做进程。换言之,进程是应用程序的一个运行实例,当然,应用程序可以启动多个进程。每个进程至少有一个基本线程(主线程)。线程与数据一起隔离在某一物理区域,在进程中声明的数据可通过该线程进行访问。

Windows操作系统为抢占式多任务运行机制,即采用时间片轮换的方式来执行多任务,时间片轮换的基本对象是线程。操作系统为每一个线程分配时间片,让该线程在这个时间段内运行,之后中断该线程的运行,启动另外的线程执行。多线程技术的优势在于将进程分解,在主线程外产生一个或几个辅助线程,用于完成如数据采集、网络访问、数据存储等后台工作。

CVI对多线程的支持(2)基本原理

【原帖地址:http://easons.blogbus.com/logs/2006/05/2518754.html】

在典型的LabWindws/CVI多线程程序中,使用下线程创建、显示并运行用户界面,在次线程中,运行其它的对时间要求很高的操作[3]。LabWindows/CVI提供了两种设计辅助线程的机制,分别为线程池(thread pools)和异步定时器(asynchronous timers),线程池适用于需要不连续地执行多次或在循环中执行的任务,而异步定时器适用于在固定时间间隔内执行的任务(只支持一个辅助线程),若要使用多个辅助线程,只能采用线程池技术。

多线程的创建

线程池机制中辅助线程的创建是通过调用实用库(Utility Library)的CmtScheduleThreadPoolFunction Adv函数,把想要在次线程中运行的函数名传递给它,线程池调用这个函数在它的其中一个线程中运行。根据线程池的设置和当前状态,线程池创建一个新的辅助线程,使用一个已经存在的空闲线程,或等待一个活动的线程空闲来执行需要调度的函数。

多线程间的数据安全

数据保护是在使用辅助线程时必须要解决的关键问题,防止多个线程同时操作某一变量,导致逻辑错误,是多线程协调运行的重要内容。在CVI中,系统提供了线程锁(blocked)、线程安全变量(thread safe variables)和线程安全队列(thread safe queues)三种机制来保护共享数据,实现线程间安全的数据传输。其中线程安全队列保护机制传输数据量大;且读取数据和写数据互不影响;数据传输基于事件模式,可以注册读取数据和写数据回调函数在队列数据达到指定数量才被调用。基于多线程监控程序的典型应用为:辅助线程采集处理大量数据并传递给主线程进行显示,线程安全队列机制是最佳的选择。

写入线程把要传送给读出线程的数据打包后写入到数据队列中,数据队列采用先进先出的工作模式,每写入一个数据包,系统调用在读出线程指定的回调函数来处理数据。选择合适的队列长度后,即使读出线程没有完成上一个数据包的读出,写入线程依然可以安全的写入下一个数据,对数据队列可以同时进行读写操作,线程间的数据传输是安全可靠的。

监视控制辅助线程

监视控制辅助线程的运行,是多线程协调运行的另一个关键问题,CVI提供了CmtGetThreadPoolFunc- tionAttribute函数来监视辅助线程的状态。在多通道、定时数据采集的监控软件中,多个辅助线程定时处理某项任务,直到主线程通知其停止。

CVI提供的异步定时器机制可以方便的实现以上功能,但异步定时器机制只能创建一个辅助线程。结合线程池机制和定时器控件成为可行的选择之一。CVI在创建面板的线程中调用该面板控件的回调函数,即要在辅助线程中运行某一定时器控件的回调函数,则该定时器控件所在的面板必须在辅助线程中创建。这样,主线程就可以通过开关该定时器来控制辅助线程开始或停止某项任务,实现多个辅助线程定时处理某项任务,且每个线程定时可以不同。

LAVA (2008-6-11 13:58:29)

21、如何实现CVI窗体的全屏?

CODE:

GetMonitorFromPanel (Main, monitor);//获得显示器ID

GetMonitorAttribute (monitor, ATTR_HEIGHT, height);//得到高度 GetMonitorAttribute (monitor, ATTR_WIDTH, width);//得到宽度

SetPanelSize (Main, height-25,width);//设置窗口高宽度 (高度需要去处任务栏的部分)

SetPanelPos (Main, 25, 0);//设置窗口位置但仍会看到状态栏,像游戏一样的全屏还没想到。希望网友跟贴解决哦。

22、如何在LabWindows中调用Matlab程序?

CVI和Matlab混合编程,必须要先安装Matlab

在CVI中,建立ActiveX控件服务器,选择Matlab Automatin Server Type Library.(Matlab必须在CVI之前安装才能看到这个选项),创建后将生成三个文件,XXX.fp、XXX.C和XXX.h,将.C和.H文件包含在CVI工程中就可以了。.C文件中包含着CVi和Matlab的接口函数。 其中就包括打开Matlab函数,运行Matlab函数等。

23、如何在CVI中播放Flash影片?

需要先安装好FLASH PLAYER的IE插件。

实现方法:主要是通过调用ActiveX控件的方式进行。需要在panel上创建一个ActiveX 容器。 第一步:获得ActiveX控件句柄;

CODE:

errorCode = MD_NO_ERROR;

errorCode = GetObjHandleFromActiveXCtrl (panel, control, movie); if(errorCode != 0)

goto error;第二步:设置播放文件路径;

CODE:

errorCode = ShockwaveFlashObjects_IShockwaveFlashSetMovie(*movie, NULL, path); if(errorCode < 0)

goto error;第三步:开始播放文件

CODE:

errorCode = ShockwaveFlashObjects_IShockwaveFlashPlay (*movie, NULL); if(errorCode < 0)

goto error;第四步:关闭打开的对象句柄

CODE:

errorCode = CA_DiscardObjHandle (movie); 24、如何动态调用DLL?

CODE:

#include #include #include #include

//根据函数申明进行定义

typedef int(*lpaddfun)(char[], char[]); int main (int argc, char *argv[]) {

void *handle=0;

char str1[100],str2[100]; lpaddfun DISKID32; HMODULE DLLhandle;

if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */

DLLhandle = LoadLibrary (\"d:\\\\Customer\\\\diskid32v2.00\\\\DiskID32.dll\"); DISKID32 = (lpaddfun)GetProcAddress (DLLhandle,\"DiskID32\"); //执行函数 //释放DLL

FreeLibrary(DLLhandle); }25、CVI编译器设置参数的意思?

build options菜单Default calling convention选项中,有两个选项,一个是\"cdecl\另一个是\"stdcall\StdCall pascal cdecl 区别:参数传入Stack的顺序有所不同

Directive Parameter order Clean-up Passes parameters in registers? register Left-to-right Routine Yes pascal Left-to-right Routine No cdecl Right-to-left Caller No stdcall Right-to-left Routine No safecall Right-to-left Routine No

_stdcall将参数压栈是按C语言的顺序(从右到左),但与C 语言不同的是它是由被调用者将参数从栈中清除的,所以它的编译文件比_cdecl小。_stdcall是Windows API函数中默认的调用约定,VB、VFP等也采用这个约定。 _cdecl是C语言采用的默认调用方法,它的优点是支持printf这样的可变参数调用。 另外,VC++对于两种调用方法的名称转换方法也不同。

不断更新中....

LAVA (2008-6-11 14:00:20)

1. CVI的.fp文件的类属性近似C++中的类的概念么?

不是的,CVI中类仅说明文件在仪器驱动程序中的等级,指明其所处的层次,CVI中和C++中的类相近的概念可以理解为各种面板!

2. CVI中如何作数据流盘?

一般情况下我们可以使用CVI8.1提供的TDM库函数。另外可以使用磁盘阵列,自己编写数据保存,注意一次写入磁盘的数据量为64的整倍数,但

是也不要过大。

3. 如何在CVI中使用inp等低级函数?

CVI中是不能直接使用这种类型的函数对端口地址进行操作。需要使用CVILowLevelSupportDriverLoaded函数打开CVI对低级函数的支持。

4. 请问CVI中的事件驱动是指什么?

事件驱动是CVI应用程序和用户进行交互的核心原理,具体是指应用程序通过响应用户界面所发生的“事件”来执行代码、调用回调函数。这些事件可以是发生在面板上的对象或者是面板自身。使用LabWindows/CVI进行编程,可以生成事件驱动的代码。通过事件驱动代码,可以将用户界面中的

控件连接到代码中的函数。每次对用户界面进行操作都会产生一个事件,LabWindows/CVI就会确定在何控件上发生了什么事件,如果对该控件有一

个相应的回调函数,就会激活并运行该回调函数中的代码,进而响应事件。

5. 请问CVI中回调函数的参数分别有什么意义?

CVI中回调函数的第一个参数是控件所在的面板的句柄。第二个参数为产生事件的控件的标识符。第三个参数是所产生的事件。第四个参数是回调数

据,这些回调数据被用来在回调函数之间传递数据。回调数据可以是任何类型的数据。第五和第六个参数随着事件的不同而不同。

1.

2.

3. 4.

6. LabWindows/CVI控件的四种模式有何区别?

Normal:该模式下用户对控件的操作可产生除Commit事件外的所有事件。

Hot:该模式下可产生包括Commit事件在内的所有事件。 Validate:在满足相应条件时可产生Commit事件。 Indicator:只能做显示用,不能产生任何事件。

LAVA (2008-6-11 14:25:59)

1. 请问CVI中条件断点的作用是什么?

CVI中的条件断点不同于普通断点,只有在某些条件被满足后条件断点才会中断程序的运行。这些条件可以是某个变量等于了某一个值,另外,条件

断点还可以设置成当一个条件被满足一定次数以后这个断点才会有效。

2. 请问CVI中的控件有哪几种模式,各有什么意义?

CVI中的控件一共有四种模式,分别是:Normal、Hot、Validate以及Indicator。

o

Normal指这个控件可以由用户直接操作或者是通过编程来进行操作。但是只能够产生数值改变事件而不能产生COMMIT

事件。

o o

Hot指这个控件可以由用户直接操作或者是通过编程来进行操作。用户的操作可以产生数值改变事件以及COMMIT事件。 Validate指与Hot模式相似,但是CVI环境会检查面板上所有数值控件的值是否处于有效范围内,只有所有的值都有效

才会产生COMMIT事件。如果有无效值存在就会弹出一个对话框,而不生成COMMIT事件。

o

Indicator指这个控件只能通过编程进行操作。用户对其的操作不会产生任何事件。

3. CVI中如何调用帮助文件?

在CVI中调用帮助文件有两种方式。ShowHtmlHelp (, HH_DISPLAY_TOPIC, 0);和SystemHelp (\"\可以根据自己编写的

帮助文件来使用不同的函数。

4. CVI中的事件驱动,在一个回调函数中会响应几个事件?

在CVI中的事件,当控件响应一个鼠标按钮时它会产生几种事件,并在回调函数中执行响应的代码。例如:当用鼠标点击开关时会产生

EVENT_COMMIT和EVENT_VAL_CHANGED事件,这样在回调函数中就会出现执行两个不同的代码的情况。

5. CVI中如何实现系统托盘图标?

在CVI中可以通过Programmer's Toolbox提供的System Tray Icons来实现系统托盘图标。将应用程序的图标放到托盘上去。

6. CVI中如何实现及时提示功能?

在CVI中为了实现Windows中当鼠标指针放到某个按钮控件上时自动出现提示,简单说明该按钮的功能。可以使用SetCtrlToolTipAttribute函数来

实现该功能。

LAVA (2008-6-11 14:34:07)

1. 在CVI中,是否支持一个有冲突变量的函数? 支持,比如说以下包含冲突变量就可以运行:

CODE:

#include #include float average(int num, ...);

main() { float x;

x = average(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); printf(\"\\nThe first average is %f.\

x = average(5, 121, 206, 76, 31, 5); printf(\"\\nThe second average is %f.\

}

float average(int num, ...)

{ /* declare a variable of type va_list */

va_list arg_ptr; int count; int total=0; /* initialize the argument pointer */

va_start(arg_ptr, num);

for (count=0; count < num; count++) total += va_arg(arg_ptr, int);

/* clean up */ va_end(arg_ptr); return((float)total/num);

}

2. 如何减少CVI程序的CPU占用率?

可以在Options-》Enviroment中进行设置,将Sleep Policy设置为Sleep More。或者在程序中进行设置,设置函数为:SetSleepPolicy

(VAL_SLEEP_MORE)。

3. 在CVI中如何实现将这次面板参数作为下次的缺省值使用?

一般情况下可以使用文件将各参数保存下来,在下次调用面板时再调用这些参数。也可以使用CVI自带的函数SavePanelState和RecallPanelState。

4. CVI中如何实现进度条功能?

CVI中可以使用slide控件实现进度条功能。也可以使用Programmer's Toolbox里带的函数来创建进度条。

5. CVI中的TUI文件?

TUI文件实际上是UIR文件的文本版本,在使用时同UIR文件的调用方式相同。

6. CVI中使用控件的Tab顺序功能时如何略过某些控件?

o

将控件改变为Indicator控件,在CVI中Tab顺序是略过显示控件的;

o o

将控件灰掉,CVI会略过灰掉的控件; 将下一个控件作为活动控件,从而略过一个控件。

LAVA (2008-6-11 14:41:51)

1. 在LabWindows/CVI中如何用多个安全队列(SafeQueue)来实现对多个采集任务的数据保护?

一般来说,在编写一个多线程程序时,我们会在默认的线程池(DefaultThreadPool)中建立一个或多个SafeQueue;然后再建立2个新的线程池

(NewThreadPool),分别用于数据的采集和处理;在用于采集的线程池中建立多个线程(Thread),分别对应各个板卡或通道;在用于数据处理的线程

池(ThreadPool)中建立一个或多个线程来对进行相应的操作。

2. 在安装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,那么必胂略匕沧癐nstMsiW.exe。该执行文件将会修复用户

系统里的所有损坏文件。

针对第二种情况,用户则需要杀毒并重新安装上述文件。

3. LabWindows/CVI中的堆栈大小?

LabWindows/CVI中的堆栈大小直接影响可以分配的数组大小。如果数组的大小超过堆栈大小,则会报告错误。该值可以在Options->Build Options

中设置。缺省值为:250000。建议使用动态内存分配。

4. CVI中如何画极坐标?

CVI中没有专门提供画极坐标的控件。可以使用Picture控件自己画,或者使用绘图软件绘制出极坐标图,然后保存为图片再使用canvas控件将图

片导入。

5. 如何在启动CVS之后立即启动下载到CVS上的执行程序?

一般有两种方式,其中一种你可以使用LV的工程项来把程序下载到CVS中,那么RTTarget.ApplicationPath=c:\\ni-rt\\startup\\startup.rtexe,

RTTarget.LaunchAppAtBoot=True这两个设置就会自动被LV设置。如果你是通过FTP把程序下载到CVS上,上述两个标签就得手动设置。

6. CVI中如何进行二维指针的内存分配?

具体例子代码如下:

CODE:

p=(ComplexNum**)malloc(3*sizeof(int));

for(i=0;i<3;i++)

p=(ComplexNum*)malloc(3*sizeof(ComplexNum )); //其中p类型为:ComplexNum**;

LAVA (2008-6-11 14:44:05)

1. CVI中如何实现颜色选择对话框? 可以使用ColorChangePopup。具体例子代码:

CODE:

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(\"颜色选择\

ListDispose(colorList);

2. 如何在CVI中实现Flash文件的播放?

首先需要安装FLASH PLAYER的ActiveX控件。在PANEL上面添加ActiveX控件,在向导中添加SHOCKWAVEFLASH控件。然后使用CVI的自动生成程序框架代码,在向导中会自动生成相应的FP文件。可以根据FP文件提供的函数进行编程了。GetObjHandleFromActiveXCtrl获得ActiveX

控件的句柄,

ShockwaveFlashObjects_IShockwaveFlashSetMovie设置要播放的文件,

ShockwaveFlashObjects_IShockwaveFlashPlay播放文件, ShockwaveFlashObjects_IShockwaveFlashStop停止播放。

3. 在LabWindows/CVI中如何使用DAQmx采集数据?

在LabWindows/CVI中的Function Panel里调用NI-DAQmx Library目录下的函数,调用顺序与在LabVIEW中使用DAQmx的API函数基本一致,

都必须遵守创建任务->配置通道->设置采样率->设置触发->采集数据->停止任务->清除任务这样的基本顺序。

4. CVI中如何使用UDP协议?

CVI中没有带有关于UDP协议的fp文件,需要使用winsock来写。

5. 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)函数释放这些线程的系统资源。

6. 在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时需要重新载入)

LAVA (2008-6-11 14:55:36)

1. 在没有.LIB和.H文件时,CVI怎么调用DLL?

使用SDK中的LoadLibary和GetProcAddress以及FreeLibrary可以实现动态DLL的调用。

2. CVI可以做不规则界面吗?

这是可以的,可以使用SDK函数实现,VC等编程语言实际上是使用SDK封装后的函数,使用SDK函数编程比较麻烦。

3. 如何处理PANEL的最大化和最小化问题?

有EVENT_PANEL_SIZE事件可以获得,然后可以读取当前panel的大小来确定区分MAXIMIZE盒MINIMIZE事件。

4. 如何在CVI中编写DLL?

首先建立一个新工程,然后创建一个源程序文件,作为dll主程序。利用CVI提供的编辑器功能插入DllMain,这时在源程序文件中就有dll的框架程

序。生成的两个函数不能修改。这时就可以在该程序中编写自己的DLL程序。注意函数格式:int __stdcall Function()。创建头文件用于声明dll函数。

在Build菜单的TargetSettings中设置dll输出路径,在Exports中选择要输出函数所在的头文件。

5. 如何在CVI中使用task来自动生成代码?

首先,在MAX中配置好你的task,然后在CVI中创建一个空程序,然后使用Daqmx load task函数,配置好handle,然后在程序中,选中该函数,

右键选择gennerate cvi example code,就可以自动生成代码了。

6. 如何在CVI中调试用CVI编写的DLL由VC调用?

首先应有VC写的调用程序。在CVI中需要进行的设置:在Specify External Process中选择调用dll的可执行文件。配置Target Settings为Debug,

选择dll的目录为可执行文件所在的目录。就可以在CVI中进行调试工作了。

LAVA (2008-6-11 14:59:26)

1. CVI8.0如何编写dll可以使用VC调用,包括节目.

在编写dll时,需要注意两点:

dll头文件的编写格式,由于VC使用的是C++,在dll头文件中需加入:

CODE:

#ifdef __cplusplus extern \"C\" { #endif#ifdef __cplusplus

}

#endif。在dll设置时选中Embed project。Uir,这样不需要拷贝uir文件到相应的目录中去。

2. DAQmx模拟触发信号有噪声怎么解决?

可以使用迟滞模拟触发。可以有两种方式,一种正迟滞触发,一种负迟滞触发。对于前一种,只有当触发电平降低到迟滞电平以下后才可以进行下

一次触发采集;对于后一种,只有当触发电平上升到迟滞电平以上后才可以进行下一次触发采集。LabVIEW中有hysteresis trigger的例子。

参考:http://zone.ni.com/reference/en-XX/help/370592G-01/digitizers/hysteresis_triggers/

3. 当调用CVI自带的与Matlab相关的程序运行时,会产生错误提示:类没有注册,错误代码-2147221164。

这是由于CVI里的这些例子是针对较早的Matlab版本写的,当机器上的Matlab的版本与写例程时的版本不一致时,就会产生这样的错误。解决方

法是在CVI中相关的Project中建立相应的ActiveX控件。

下面的方法适用于Matlab 6.5 R13:

0. 使用Tools >> Create ActiveX Controller,删除当前MATLAB instrument,重新建立MATLAB Automation Server Type。

MATLAB instrument的名字为MATLAB Application Type Library。将新建立的ActiveX controller的名字设置成与原来例子中相同的名

1.

字。

将 matlabdemo.c中的launch callback中的stat = MLApp_NewDIMLApp (NULL, &hMatlab)改为stat =

MLApp_NewDIMLApp (NULL, 1, LOCALE_NEUTRAL, 0, &hMatlab);

2.

打开MATLAB instrument的原代码,将所有&MLApp_IID_DIMLApp替换为 &IID_IDispatch。由于新函数中修改了参数,

因此还要修改调用该函数的地方。另外,所有&MLApp_IID_DIMLApp需要被替换为相应MATLAB版本的&IID_IDispatch。

详细操作可以参考http://digital.ni.com/public.nsf/allkb/0FB80F59D0AF9A4F8625703E007BF78B

4. 在Table控件中使用Ring如何获得当前选中的值?

使用GetTableCellValue,但是该函数得到的是显示字符串的ASC值,调试相对应的值。

3. 4.

5.

5. 如何使用ActiveX Wizard使CVI能够使用matlab6.5

选择Tools/Create ActiveX Automation Controller。 next后选择应用程序(matlab)。选择即将生成的文件保存路径。

next后即可得到 *.fp, *.c, *.sub, *.h, *.obj 文件。

详情参考http://digital.ni.com/public.nsf/websearch/4B597F188B89B6DD862568970071F2FC?OpenDocument

6. 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。

LAVA (2008-6-11 15:07:41)

1. CVS长时间工作出现死机现象

可能的原因是CVS温度过高,CVS要求的工作温度为0 °C to 45 °C,垂直放置的时候可以为0 °C to 55 °C,当温度过高的时候,power ok的指示

灯变为红色,CVS将会停止工作。

2. 问题=如何实现8位并口采集和输出?

8位并口不是指打印机的并口,而是指可并行的8位数字IO。 在CVI中,使用DAQmxCreateTask;DAQmxCreateDIChan;DAQmxCfgSampClkTiming

这三个函数来创建并配置通道。推荐使用创建通道时使用port方式,而不用line方式。

3. PCI-8431 LV7.0 CVI7.0 是4口RS422串口卡,在LV和LABWINDOWS下如何编程.能否使用RS232的编程方式?

可以,在LV7.0下对于串口编程,已经都是统一的VISA编程方式.在CVI7.0下,是可以使用RS232的函数库的,因为RS232和RS422只是物理接口定

义不同,但编程方法还是一样的。

4. LabWindows/CVI 5.5 中SampleRate和ScanRate的区别?

SampleRate是指在进行单个通道采集的速率,而ScanRate包含了SampleRate,表征两次采集之间速率。在Easy IO中只需要设置ScanRate,

而在中级和低级数据采集函数中需设置SampleRate和ScanRate,如函数:SCAN_OP和DAQ_RATE,SCAN_START。

5. LabWindows/CVI5.5中easy IO和Low Level I/O分别在什么情况下使用?

Easy IO通常用在简单采集情况下,不需进行复杂的底层控制。而Low Level I/O使用在较复杂的控制,如:触发、连续采集存盘等。

6. 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

就可用了。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务