1

关于投票
LabVIEW制作EXE流程
builld VI

如何將VI轉換成執行檔(.exe)

作業系統 : Windows 2000/NT/ME/98/95,Linux

适用于LabVIEW 6i

載入欲轉換成執行檔的VI:選取LabVIEW功能表File下的Open,打開 “ C:\Try.vi”(以此為範例)

1.      選取功能表Tools下的Build Application or Shared Library(DLL)…功能,出現畫面如下:

Build target   :請填入您所欲建立檔案種類(.exe) 或 (.dll)

Target file name :請填入您所建立之執行檔(.exe) 或 (.dll) 檔案名稱

Destination directory:LabVIEW會將執行檔(.exe) 或 (.dll)暫時存放在此目錄

Support file directory:LabVIEW會將相關的文件檔(.doc)、(.hlp)、(.txt)暫時存放在此目錄下,例如您可以將相關操作文件附給客戶

2.  請點選 Source Files,如上圖

Add Top-Level VI :按此鍵,可將最上層的VI加入,如Try.vi

Add Support File:按此鍵,可將相關的文件加入,如*.doc,*.txt,*.hlp

Add Directory Contents:按此鍵,可將某一目錄下所有的檔案全部加進來

Remove File:按此鍵,可將不需要的檔案刪除,如您的程式有用到RS232,請加入serpdrv,如用到National Instruments的資料搜集卡,請加入daqdrv,其他不必要的檔案可以刪除

Custom Destinations:按此鍵,彈出如上圖畫面

您可以自由決定哪些檔案將出現在Windows視窗à開始à程序集à項目   

您也可以決定哪些檔案將複製到Windows\System目錄或Windows目錄下

3.      請點選 Application Settings,如上圖

Custom icon:您可改變獨立執行檔的外觀圖形

4.      請點選 Installer,如上圖

請務必圈選Create installer 

Installation name:當客戶在安裝您的程式時螢幕畫面所出現的程式名字

Start menu program group:程式安裝完畢,在開始à程式集à您的程式項目名稱

Default installation directory:程式被安裝在Windows的目錄、檔案路徑

5.      最後按Build鍵,LabVIEW將會彈出如上圖畫面,請務必將Try.vi關閉,再按一次Build鍵,如下圖

6.      最後按Done鍵

7.      請到C:\WINDOWS\TEMP\app\installer\disks 將所有的檔案拷貝到光碟即可

8.      如果必需將所有檔案拷貝到磁片請將setup.exe及Data.001拷貝至第一張磁片,Data.002拷貝至第二張磁片,然後依此類推

※  Build Application or Shared Library(DLL)…的功能:

※  將LabVIEW內的VI編譯成執行檔(.exe )或動態連結檔(.dll)

※  將LabVIEW編譯後的執行檔(.exe),壓縮成可分片的壓縮檔,並可建立setup.exe以及uninstall的功能,以利您將應用程式移植到其他的電腦上。

※  與RS-232及其他串列阜通訊,須將LabView.ini檔存於同一個Folder並改為相同檔名 .ini 檔; .ini內容第一行中括符改為[filename]

点击看大图
点击看大图
点击看大图
点击看大图
点击看大图


点击看大图
系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(187) | 回复(0)

1

关于投票
局部变量全局变量属性VALUE三者使用比较
今天看到一篇关于三者在编程时候使用比较,觉得对大家新编程的人来说很有启发性,因此就发上来和大家SHARE一下. 帖子如下:
之前看過一些文章,多半鼓勵使用property node的value來取代local variable的使用。不知道是我的觀念錯誤或是使用方法錯誤,今天突發奇想想要測試一下兩者之間的執行效率問題,我發現了一個很可怕的數據...兩者的測試方塊圖如下:


然後執行時間使用property node 與 local variable約為100:1

若真的是這樣子的話,使用property node不是反而增加程式運作時間嗎QQ

請各位大大解決我的迷思......

Re:局部变量全局变量属性VALUE三者使用比较

這個涉及到 Thread 的問題。 LabVIEW 是個具備管理 Multithread 的程式,
在 DAQ , File I/O , user I/O 是使用不同的 thread。「Property Node」、「Control Reference」與「user I/O」
是使用同一個 thread。

而「user I/O」是所有 thread 中最為匱乏的。所以如非必要,儘可能減少 roperty Node 的使用量。
可以參考底下的比較圖:

点击看大图
另外,可以在同一個 ropery Node 做完的設定,
就儘量在同一個 oerpery Node 做完,不然每多用一個
Peoperty Node 就多佔用一份記憶體。
佳:

劣:

針對提出的方式做出Local Variable,Global Variable及Property Node三個時間及效能上的比較.
点击看大图
在上圖中的Property_Node.vi執行2次,平均時間14.2812秒,而Local_Variable.vi及Gl obal_Variable.vi各執行5次平均時間0.1187及0.0562秒. 

但是值得大家討論的是,在Global_Variable.vi中,建立的Global Front Penal(Global.vi)雖然Global_Variable.vi只執行5次,但是總共呼叫Global的次數卻高達 400000次,這是因為每當執行到一次Global Variable時,就會去執行一次Global.vi.

在Global_Variable.vi中有8個Global Variable,Global_Variable.vi共執行5次,每次For Loop執行10000次,所以總執行次數400000=8X5X10000.

雖是這樣,但是執行的總時間還是只有0.25秒,平均時間=0.25/400000.

其實對整個執行時間沒有影響.

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(86) | 回复(0)

1

关于投票
LabVIEW调用DLL文件

各位高手,可否解决本人的一个问题,我欲调用如下DLL 文件
alll_API int hello (BYTE* lown);
// to active the lown
// lown is a buffer of 3 elements
// change llown[] is [L_DIS, 0, 0]
// alternate lown[] is [0, L_ELE_AL, 0]

如果用字符串数组,而DLL 必须返回的是一个DATA型的数组,这样是行不通的,如果要调用上述DLL 文件,是否必须重新编译DLL,还是用CIN呢 
alll_API ? stdcall?

int hello (BYTE* lown); 
"Call Library Function Node.vi" setting:
1. return type: Numeric | Signed 32-bit Integer
2. arg1 | Numeric | Unsigned 8-bit Integer | ointer to value

LV 输入 1D(或者多维)U8 array,输出为 I32。
> TCHART:
A WCHAR if UNICODE is defined, a CHAR otherwise.
> WCHAR:
16-bit Unicode character.
> CHAR
8-bit Windows (ANSI) character.

★所有的 Windows 数据类型请参考以下链接★:
http://msdn.microsoft.com/librar ;... dows_data_types.asp

EpromW(TCHART Efile[],HWND,hWnd)
"Call Library Function Node.vi" setting:
1. 如果返回类型是 void,return type: void
2. arg1: 直接用 string 试试看
3. arg2: Numeric | Unsigned 32-bit Integer | value

ps: HWND 就是窗口句柄,一般用 DWORD,就是 U32  

Re:LabVIEW调用DLL文件

调用dll

现使用一块接口卡采集数据,通过调用DLL可以实现对采集卡的状态读取等,函数原型是int _stdcall U***DLLInit(HANDLE instance)图1
而采集数据的函数原型是int _stdcall U***_ReadADOnce(void *Data,int *ReadLen)图2 一运行就退出,不知是不是数据类型的问题但LABVIEW中没有INT的类型,不知如何解决
这个和周立公的一样。第二个是对的。第一个是个缓冲区,你可以用字符串的handlle来
你可以把第二个参数设置为string,Pass为c string ointer试一试
你说的一运行就自动退出labview的现象以前就讨论过了!
是Calling Convertions没有设对!
可以试着将Calling Convertions改为standcall看看!

点击看大图

点击看大图

Re:LabVIEW调用DLL文件

两篇代表性的文章
dll和cin的 
20065282313861.rar
20065282315161.rar
系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(150) | 回复(0)

1

关于投票
LabVIEW的多线程
在labview中画两个并行的loop,他们就是多线程了。你可以用timed loop去设置优先级等

由于Labview的特点,很容易实现多任务或者多线程。例如上面所说的两个Loop, 只要它们之间没有数据依赖关系,他们就可以并行执行。

问题在于如何实现进程之间的协作。首先,Labview提供了执行控制机制,如信号灯, 利用这些机制,可以实现多个进程之间非常高级的通信。只是这些机制比较复杂,我没有在编程时正式使用过。

其实,有一些简单的办法可以有效地实现多个任务(进程)之间的通信。我一般使用Local Variable来解决这个问题。举一个例子
   :进程A负责数据采集
   :进程B负责数据处理以及显示
   :进程A数据采集完成后,通知进程B;进程B开始处理和显示

这时,可以使用一个Local Variable, 称之为State。
   :程序开始运行时,State=0;
   :进程A获得数据后,将State=1;
   :进程B查询State,当State=1时,处理并显示数据;然后,将State=0;

需要注意的是,为了防止进程占用过多CPU时间,每个进程在循环中都要加入wait,具体时间看应用而定。 

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(91) | 回复(0)

1

关于投票
LabVIEW的Chart的问题汇总
Chart的问题汇总

设置waveform chart中x轴更新速度(串口问题)

问题:
用labview 6i做一个模拟仿真示波器,采样后送waveform chart
频率不要求太高,1-100hz即可
但是没法实现显示与波形同步

方法:
chart x轴的更新速度没有意思
因为chart 是根据你的采样而更新的,而且一般用在
低频区域的采样才使用chart, 因为chart的x轴严格对因时间

你将chart 属性中的buffer 设成 0
默认识1024
采样还是要经过数字滤波的
显示只不过吧滤波的结果也就是平均值(假设是100ms内)
显示出来
这样就是说吧本来100个点的数据(假设是这样)变成一个点来显示
放慢了x轴的更新速度


要知道,while循环是必须加delay的呀,
如果你使用的系统是2000,你可以用任务管理器看一下,
如果你不加delay, 你会发现你的CPU负荷为100, 也就是说
所有的CPU资源都被你的while循环吃掉了,这样就无法及时
更新你的串口传输,甚至你的显示也会变慢,而你一旦加上
delay ,哪怕是1ms,你在比较一下,你会发现你的cpu资源几乎
为零,这样cpu就可以及时更新你的serial io乐
另外,chart 的 buffer 只是你显示的buffer 而已, 1024代表
你显示的点数(对应x坐标)为1024点,利用FIFO方式
你采用的是软件采样
还有,串口速率很低,绝对不合适作实时传输 

Re:LabVIEW的Chart的问题汇总

Q:
如何实现用chart显示数据时,x轴显示的是准确时间?右击chart控件,选择“X Scale”->“Formating......”,然后在“Advanced edit mode”下编辑X轴的格式,选择“Absolute time format codes“,但是显示的时间与实际时间不符合
A:
我想你混淆了采样点真实的时间间隔和X轴数字格式显示的关系,X轴的数字表示采样点的多少,即使你将格式转换为时间,表示的仍然为采样点的数量,如X=60转换后为X=1min,如果要在X轴显示真实时间,我做了一个VI,可以供你参考:
1、从系统获取起始时间,作为chart的 t0
2、你实际的采样间隔时间和采样点数量之间的时间转换
vi中我做了一个延时来模拟采样时间间隔,调整它的大小,采样点对应的时间相应改变。
A:
if you use the attachment vi,you'll may see the difference of chart and graph, especially in DAQ, suggest to use 
CHART instead of GRAPH 
20065283105461.rar

Q:
怎样用chart一次显示大容量的数据,如 4M个点,而不滞后?
A:
不知道您所说的“滞后”或者“慢”的标准是什么?我试了一下,4M个随机数,利用graph画,graph VI的运行时间大约是60ms
毕竟是4M的数据呀,从pc内存到显卡的内存再到显示出来应该也需要一些时间的.如果这4M个数据不是同时到来,那就用chart实时更新把
程序非常简单,就是一个for循环里面产生4M个随机数,然后接graph显示。
是不是您的机器的配置不是很高?还是您的程序还有其他比较复杂的操作?
chart 是可以保存历史数据,支持连续输入。graph是一次性输入若干点数据
看看能不能在中途分段显示,不要一次性显示4M个数据,把数据拆分成稍微少的数据显示可能会好一些。
B:
是我的机器慢。我用了20秒的时间显示。 哎

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(107) | 回复(0)

1

关于投票
Labview中文帮助文档——labview与超线程

LabVIEW与超线程

超线程是英特尔Pentium 4及其以后的处理器具有的一项新功能。超线程计算机只有一个处理器,但能象具有多处理器的计算机一样运行。在超线程计算机上打开Windows任务管理器,单击性能,任务管理器将显示两个CPU的使用情况。

超线程处理器就象在同一个芯片上嵌入了多个处理器。芯片上有的资源是重复的,如寄存器;有的资源则是共享的,如执行单元和缓存。某些资源如存储微指令的缓冲区被分成几部分,每个逻辑处理器占用其中的一部分。

利用超线程技术优化应用程序与在多处理器系统上优化应用程序相似,但两者之间也有些差异。例如,超线程计算机共享执行单元,而一个双处理器的计算机则包含两套完整的执行单元。因此,所有受浮点运算执行单元限制的程序在多处理器计算机上能获得更优的性能,因为处理器无须共享执行单元。对缓存而言也是如此。如使用两条线程访问缓存,多处理器计算机的速度更快。因为多处理器计算机上的每个处理器都有其完整的缓存。

LabVIEW运行概述

LabVIEW运行系统支持多处理技术。在基于文本的传统编程语言中,如要创建多线程应用程序,必须先创建多个线程,然后编写代码使线程间相互通信。LabVIEW能判断VI中使用多线程技术的必要性,由运行系统自动为用户处理多线程通信。

下例说明了如何利用LabVIEW多线程运行系统。

MSITStore:\rogram%20Files\National%20Instruments\LabVIEW%208.2ch\help\lvconcepts.chm::/loc_bd_twoloops.gif">

在该VI中,LabVIEW发现可在多处理和超线程环境下独立运行两个循环,通常是同步运行。

质数并行机制范例

下例用于计算所有大于2的质数。

MSITStore:\rogram%20Files\National%20Instruments\LabVIEW%208.2ch\help\lvconcepts.chm::/loc_bd_primesoneloop.gif">

程序框图检查所有3到Num Terms之间的奇数并确定这些数字是否为质数。如果该数能被某个数整除,则内部For循环将返回TRUE。

内部For循环中没有任何输入输出或等待函数,因此计算强度较大。这样的架构没有充分利用LabVIEW中的并行执行功能。循环中的每个操作都按照既定顺序进行。数据流决定了运行顺序,每步操作都必须等待数据输入之后才能运行,所以不能采用任何其它顺序。

可在该VI中引入并行机制。并行功能要求每个循环都不依赖与任何其它循环。只要满足这一条件,就能在两个循环中分配迭代。但是,LabVIEW也有其限制,即每次循环必须在前一次循环完成之后才能开始。如循环没有上述限制,则可将进程分为两个循环来运行。

以下的质数并行操作范例将操作分为两个循环。上面的循环检查其中一半奇数,下面的循环检查另一半。在多处理器计算机中,双循环处理办法更为有效,因为LabVIEW可同时执行两个循环中的代码。注:与上例不同的是,该VI的输出端口有两个数组,而不是一个。可编写一个子VI将两个数组合并,因为计算本身将消耗绝大部分时间,所以程序后半部分额外的VI几乎可忽略不计。

MSITStore:\rogram%20Files\National%20Instruments\LabVIEW%208.2ch\help\lvconcepts.chm::/loc_bd_primestwoloops.gif">

请注意以上两例中的VI都不包含单独的线程管理代码。LabVIEW采用数据流编程框图,使LabVIEW运行系统在不同的线程中运行两个循环。而在很多基于文本的传统编程语言中,必须单独创建并处理线程。

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(95) | 回复(0)

0

关于投票
LabVIEW自定义控件
Customizing Controls

图表是把按纽全换了,可以作为控制按纽使用了 
如果只是想把图标放在按纽上呢,就象boolean text 
那样,图标起一个提示作用,但点击图标一样可以控制按纽 
而不象一般的COPY,图标和按纽是独立的
您把圖像在控制項內縮小,不就結了.. 
注意是貼在文字的物件上圖檔需為 WMF 檔才可放大縮小且可隱藏. 
用普通的controls中的boolean是完全可以成功的 但用classic control中的boolean就只能做个外观 
一但点击,箭头就没了,移动该按纽又出来 
客户需要用他们自己的界面风格,就是大部分界面元素是他们提供的图片资料,现在不知道怎样将所提供的图片资料和LabView结合起来

可以贴图或者插入ActiveX控件,来使LV的界面多元素化。

To customize an object in FrontPanel:
Right Click the target object, select advance->customize, then edit
You may save it for future use

Pasting graph is supported by LabVIEW, i.e. ict Ring

For advance level editing, ActiveX should be considered 
为什么combo box的下拉按钮没法改变大小? 
系统采用的是触摸屏,按钮太小不容易点上
try customize it:
right click on the control, select Advanced >> Customiz

系统分类: 测试测量
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(115) | 回复(0)

0

关于投票
LabVIEW 2,8,10,16进制间转换

LabVIEW8.2中,其他版本类似

整数的转换

1. 首先,在
Control Panel上新增一个Numeric Control,

在其上方按右键,在下拉菜单中选Formatrecision,

2.然后在Numeric Properties窗口中,

如果要用10进制表示,选Floating point, Digits选0,

如果要用16进制表示,选Hexadecimal,

如果要用8进制表示,选Octal,

如果要用2进制表示,选Binary,

点击看大图

3.以下程序图,在Numeric Control选择以16进制表示,然后增加3个Numeric Indicator,分别选择以2进制,8进制,10进制表示.

其中Block Diagram为:

系统分类: 测试测量
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(83) | 回复(0)

0

关于投票
利用LabVIEW工程库实现面向对象编程

利用LabVIEW工程库实现面向对象编程


阮奇桢
ruanqizhen@gmail.com


注意:


    我写这篇文章的时候,LabVIEW 8.2 还没有出来。现在 LabVIEW 8.2 本身就以支持面向对象的编程方法,所以这里介绍的方法有点过时。我有时间会再写一篇关于新 LVOOP 的文章。


摘 要:


    本文将简要介绍图形化编程语言LabVIEW 中面向对象的编程思想。并且提出了一种实现面向对象编程具体方法,即利用LabVIEW 8.0的新特性:工程库,来帮助实现对象的程序设计思想。


关键词:


LabVIEW,面向对象,类,工程库


Implementing Object Oriented Programming in LabVIEW with Project Library

Abstract:


    This paper introduces the Object Oriented Programming in LabVIEW, which is also called as GOOP.  And it also introduces a new way of implementing the GOOP application: with the help of Project Library, a new feature in LabVIEW 8.0


Key Words:


LabVIEW, GOOP, Class, Project Library

一. 背景

LabVIEW是一个强大的编程语言,但是随着开发程序规模变大,LabVIEW程序员可能会觉得对程序越来越难于管理和维护。其根本原因就是LabVIEW是面向过程的编程语言,它采用基于数据流的运行方法。而这种程序设计方式在模块划分方面有着天然的缺陷。使用LabVIEW编写程序时关注的是按流程完成功能,而不是程序功能模块的划分。因此LabVIEW程序划分出来的不同的块之间可能会公用很多子VI,或全局变量,它们的存在使得程序各个模块无法完全独立,更糟糕的事模块之间的关系可能不为编程人员所察觉。当程序规模大到一定程度,尤其是需要多名开发人员共同参与的时候,编写出来程序会越来越显得杂乱无章,使得程序的调试、维护、和升级都变得非常困难。
解决这一问题的途径就是引入更加抽象化的面向对象的编程方法[2]。通过构造类的方法,把不同模块之间的数据彻底分离开来,甚至把数据和操作分离开来。这样就保证了不同模块可以完全独立的开发、测试。对某一模块的修改将不会影响到任何其他模块。这样,就可以将一个大的工程分解为可以完全独立开发的多个模块,彻底解决前文所提到的开发困难。
早在1999年,NI就曾向用户演示过在LabVIEW中使用面向对象的编程思想的示例。一些第三方的公司还为LabVIEW面向对象编程提供了一些开放工具。但是由于这些工具使用复杂,功能简单,LabVIEW面向对象的编程思想当时并没有引起用户广泛的注意和重视。
刚刚推出的LabVIEW 8.0版的一些新特性明显体现出面向对象的编程思想。尽管它仍然没能实现对面向对象的编程的整体支持,但是可以预见,LabVIEW将在后续的版本中完整的实现对面向对象的编程的支持。


二. LabVIEW工程库(LabVIEW Project Library)

LabVIEW 8.0的一个重要新特性就是“工程库”,这也是LabVIEW向现行对象开发语言过渡的一个重要体现。工程库是一组功能相关联的VI或其它文件的集合。工程库与传统的LabVIEW的LLB文件有着本质的区别。LLB文件只是将一组VI打包存储的一种形式,而工程库与如何存储VI无关,它更关注是把功能相关的VI按一定结构组合封装,以便于代码的管理和发布。
工程库的一些特性可以帮我们方便地实现面向对象的编程:
1. 工程库的名字也是库中VI的名字空间(name space)。
名字空间是LabVIEW 8.0的一个新特性。在8.0前的LabVIEW中无法打开两个文件名相同但内容不同的VI,这就好比在C语言中,一个工程不能拥有两个名字相同的函数。新版本的LabVIEW不再有此限制,但是被同时打开两个同名VI必须存在于不同的名字空间,也就是在不同的工程库中的同名VI才能被同时打开。这与C++、C#等语言中的名字空间的概念类似。
2. 库中的VI有操作安全设置, 每一个VI成员可以被设置为公有(Public,可以被库外的VI调用);或者私有(Private,只能被库的成员VI调用)。
3. 使用VI Scripting技术,可以在运行时方便的得到库的组织结构信息。
VI Scripting技术也是LabVIEW的新特性。利用它可以直接在LabVIEW中解析或更改LabVIEW VI。


三. LabVIEW面向对象编程的具体实现方法

我们可以把一组相关的数据和VI放在一个工程库内,借以实现类的封装功能,但是这种方法不能实现类的继承和多态。


 
图1:LabVIEW工程库的结构

1. 工程库的结构
例如,要建立一个表示“猪”的类,我们先要为它新建一个名为Pig的LabVIEW工程库。然后按一定的分类方法建立文件夹结构,比如将表示数据的VI放在Attribute文件夹下;把表示动作的VI放在Method文件夹下。也可以划分两个文件夹分别存放公有VI和私有VI。各种分类组织方法并无本质区别,可凭个人爱好选择。
从数据和操作安全的角度考虑,需要在工程库的属性面板中设置成员VI的公有或私有属性。为了维护和使用方便,还应当为库设置适当的版本号、图标等属性。

2. 类的设计
LabVIEW工程库一般是不能直接就拿来当作一个类来使用的。类是一个抽象概念,在使用时,需要类进行实例化,类的实例才是真正参与工作的。类的每个实例要保存自己的一份数据,而类中的方法则只需存有一份。因此我们需要为类编写一些用来管理数据的VI,例如图1中的new.vi。它就相当于这个类中构造函数。
我们可以使用两种方法来为每个实例保存一份数据。
简单的方法是在new.vi初始化一个结构(cluster),把所有这个类可能用到的数据都包括在这个结构里。例如,在本例中,可以做一个结构,有一个字符串和一个数字量构成,分别表示我们将用到的名字,和重量。其他类中的成员VI都必须使用这个结构作为传入参数,这样就保证了每份实例的数据互不影响。
另一种方法需要借助C语言的帮助,比较复杂,但是可以避免把一个大的数据结构作为参数传来传去。我们可以使用C编写一套专门处理类数据的API函数,生成DLL文件供LabVIEW调用。具体操作时,用C语言为类中所有的数据开辟一块内存空间,然后返回内存地址给LabVIEW。我们可以在new.vi中把返回的内存指针强制转换为自定义的Data Log File Refnum数据类型,这样我们还可以为每个类定义一个专用的reference类型。其他类中的成员VI都使用这个reference作为主要参数。需要使用某一数据时,可以调用C语言编写的API从内存里读出数据。使用这种方法一定要有一个类似析构函数功能的VI,释放开始时开辟的内存。这种方式类似于LabVIEW中的文件操作VI。



 

图2:借助C语言的帮助实现开辟多份实例

3. 类的使用
类的使用相对来说要简单得多,与面向对象的文本语言的编写方法相类似。基本步骤也是首先调用构造VI创建类的实例,然后对类的实例进行操作,操作结束需要调用析构VI释放实例占用的资源。如图3所示的例子,用我们在前文中设计的“猪”的类编写的一段程序。程序中我们创建了“两头猪”,然后经过不同的喂养方法,再比较一下他们的体重。
相信读者仅凭代码中的图标就已经可以读懂程序的功能。由此也可见面向对象编程对程序提高可读性的帮助。而使用传统方法编写类似LabVIEW程序,由于没有很好的数据封装,在程序框图中数据连线多且杂乱,极易引起错误。
更值得一提的是,LabVIEW与C++不同,使用面向对象的编程方法不会引起程序效率的损失。
 

图3:面向对象编程方法的示例
4. 其它方法实现面向对象编程
除了文中提到的借助LabVIEW工程库实现面性对象编程的编程方法之外,我们还可以借助于LabVIEW 8.0的其它一些新特性,比如XControl等帮助实现面向对象的编程方法。他们的具体实现方法留待其它文章讨论。


四. 面向对象的方法对LabVIEW程序设计的影响

目前,LabVIEW程序开发的一般流程是先设计和实现顶层VI,一般来说顶层VI也就是程序的主界面。然后自上而下的设计和编写LabVIEW程序。面向对象的编程方法由于大大提高了程序模块之间连接和搭建的效率,它使得程序员把更多的精力集中在模块的设计开发上。而不同的模块之间相对独立,可以并行的开发、测试。这就使得LabVIEW开发大型程序的效率大大提高。可以预见,随着面向对象的编程方法在LabVIEW中的推广,LabVIEW程序的规模将有一个本质性的飞跃提高。

系统分类: 测试测量
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(57) | 回复(0)

0

关于投票
超声波测量方法
超声波测量方法
发布日期:2008-5-15 19:23:00    浏览次数:94 次
摘 要:上海树信仪器
  •  超声波测量方法

一、一般测量方法:
1、(1)在一点处用探头进行两次测厚,在两次测量中探头的分割面要互为90°,取较小值为被测工件厚度值。(2)30mm多点测量法:当测量值不稳定时,以一个测定点为中心,在直径约φ30mm的圆内进行多次测量,取最小值为被测工件厚度值。
2、精确测量法:在规定的测量点周围增加测量数目,厚度变化用等厚线表示。
3、连续测量法:用单点测量法沿指定路线连续测量,间隔不大于5mm。
4、网格测量法:在指定区域划上网格,按点测厚记录。此方法在尿素高压设备、不锈钢衬里腐蚀监测中广泛使用。

二、超声波测厚示值失真原因分析:
超声波测厚在实际应用中,尤其是在役设备的监测中,如果出现示值失真,偏离实际厚度的现象,结果造成管线(设备)隐患存在,就是依据错误的数据更换了管件,造成大量材料浪费。根据我公司几年来超声波测厚的跟踪使用情况,将示值失真现象及原因分析如下:
1、无示值显示或示值闪烁不稳原因分析:这种现象在现场设备和管道检测中时常出现,经过大量现象和数据分析,归纳原因如下:
(1)工件表面粗糙度过大,造成探头与接触面耦合效果差,反射回波低,甚至无法接收到回波信号。在役设备、管道大部分是表面锈蚀,耦合效果极差。
(2)工件曲率半径太小,尤其是小径管测厚时,因常用探头表面为平面,与曲面接触为点接触或线接触,声强透射率低(耦合不好)。
(3)检测面与底面不平行,声波遇到底面产生散射,探头无法接受到底波信号。
(4)铸件、奥氏体钢因组织不均匀或晶粒粗大,超声波在其中穿过时产生严重的散射衰减,被散射的超声波沿着复杂的路径传播,有可能使回波湮没,造成不显示。
(5)探头接触面有一定磨损。常用测厚探头表面为丙烯树脂,长期使用会使其表面粗糙度嶒加,导致灵敏度下降,从而造成不显示或闪烁。
(6)被测物背面有大量腐蚀坑。由于被测物另一面有锈斑、腐蚀凹坑,造成声波衰减,导致读数无规则变化,在极端情况下甚至无读数。
2、示值过大或过小原因分析 在实际检测工作中,经常碰到测厚仪示值与设计值(或预期值)相比,明显偏大或偏小,原因分析如下:
(1)被测物体(如管道)内有沉积物,当沉积物与工件声阻抗相差不大时,测厚仪显示值为壁厚加沉积物厚度。 (2)当材料内部存在缺陷(如夹杂、夹层等)时,显示值约为公称厚度的70%(此时要用超声波探伤仪进一步进行缺陷检测)。
(3)温度的影响。一般固体材料中的声速随其温度升高而降低,有试验数据表明,热态材料每增加100°C,声速下降1%。对于高温在役设备常常碰到这种情况。
(4)层叠材料、复合(非均质)材料。要测量未经耦合的层叠材料是不可能的,因超声波无法穿透未经耦合的空间,而且不能在复合(非均质)材料中匀速传播。对于由多层材料包扎制成的设备(像尿素高压设备),测厚时要特别注意,测厚仪的示值仅表示与探头接触的那层材料厚度。
(5)耦合剂的影响。耦合剂是用来排除探头和被测物体之间的空气,使超声波能有效地穿入工件达到检测目的。如果选择种类或使用方法不当,将造成误差或耦合标志闪烁,无法测量。实际使用中由于耦合剂使用过多,造成探头离开工件时,仪器示值为耦合剂层厚度值。
(6)声速选择错误。测量工件前,根据材料种类预置其声速或根据标准块反测出声速。当用一种材料校正仪器后(常用试块为钢)又去测量另一种材料时,将产生错误的结果。
7)应力的影响。在役设备、管道大部分有应力存在,固体材料的应力状况对声速有一定的影响,当应力方向与传播方向一致时,若应力为压应力,则应力作用使工件弹性增加,声速加快;反之,若应力为拉应力,则声速减慢。当应力与波的传播方向不一至时,波动过程中质点振动轨迹受应力干扰,波的传播方向产生偏离。根据资料表明,一般应力增加,声速缓慢增加。
(8)金属表面氧化物或油漆覆盖层的影响。金属表面产生的致密氧化物或油漆防腐层,虽与基体材料结合紧密,无名显界面,但声速在两种物质中的传播速度是不同的,从而造成误差,且随覆盖物厚度不同,误差大小也不同。

三、超声波测厚示值失真的预防措施及注意事项:由以上产生示值失真的原因分析,在现场检测中就应采取相应措施,进行事前积极预防,避免造成事故隐患或不必要的浪费。为此,根据几年来的跟踪检测经验,归纳总结如下几点,作为预防超声测厚示值失真的预防措施。

1、正确选用测厚探头
(1)测曲面工件时,采用曲面探头护套或选用小管径专用探头(φ6mm),可较精确的测量管道等曲面材料。(2)对 于 晶 粒 粗 大 的 铸 件 和 奥 氏 体 不 锈 钢 等,应 选 用 频 率 较 低 的 粗 晶 专 用 探 头(2.5MHz).
(3)测高温工件时,应选用高温专用探头(300-600°C),切勿使用普通探头。
(4)探头表面有划伤时,可选用500#砂纸打磨,使其平滑并保证平行度。如仍不稳定,则考虑更换探头。

2、对被检物表面进行处理。通过砂、磨、挫等方法对表面进行处理,降低粗糙度,同时也可以将氧化物及油漆层去掉,露出金属光泽,使探头与被检物通过耦合剂能达到很好的耦合效果。

3、正确识别材料,选择合适声速。在测量前一定要查清被测物是哪种材料,正确预置声速。对于高温工件,根据实际温度,按修正后的声速预置或按常温测量后,将厚度值予以修正。此步很关键,现场检测中经常因忽视这方面的影响而出错。

4、正确使用耦合剂。首先根据使用情况选择合适的种类,当使用在光滑材料表面时,可以使用低粘度的耦合剂;当使用在粗糙表面、垂直表面及顶表面时,应使用粘度高的耦合剂。高温工件应选用高温耦合剂。其次,耦合剂应适量使用,涂抹均匀,一般应将耦合剂涂在被测材料的表面,但当测量温度较高时,耦合剂应涂在探头上。

5、特殊情况的处理
(1)检测时发现数值明显偏离预期值,应用超声波探伤仪进行辅助判断。当发现背面有腐蚀凹坑时,这个区域测量就得十分小心,可选择变换分割面角度作多次测量。
(2)当测量复合外形的工件(如管子弯头处)时,可采用〔一、1、(1)〕介绍的方法,选较小的数据作为该工件在测量点处的厚度。
(3)被测工件的另一表面必须与被测面平行,否则得不到满意的超声响应,将引起测量误差或根本无读数显示。
(4)对于层叠材料、复合材料以及内部结构特异的,常见的应用超声反射原理测量厚度的仪器就不适用。

系统分类: 测试测量
用户分类: