Qizhen's profileLabVIEWPhotosBlogListsMore Tools Help

LabVIEW

LabVIEW工程师的生活

计数器

Qizhen Ruan

文章安内容分类

Search

Loading...
O Troupe of little vagrants of the world, leave your footprints in my words.
Photo 1 of 23

《我的成功可以复制》

我本来都没怎么听说过唐骏这人,我平时比较关注相关公司的技术动向,至于这些公司的领导人则不太关心。像《我的成功可以复制》这种没技术内容纯粹吹牛的书更不可能去看了。不过最近唐骏很火,网上到处都是关于他的文章,《我的成功可以复制》也跟着家喻户晓了。昨天恰好看到有网友张贴了《我的成功可以复制》中的一部分内容,和技术有些关系。唐骏号称是一开始去微软就做汉化的,他这段表述,非技术人员就不要看了;技术人员可以当笑话看看,调节一下心情:

image

压缩感知

最近研究了一下压缩感知理论。压缩感知大概是近几年里,测试测量领域唯一称得上革命性的理论了。它在理论上证明了信号采集可以突破奈奎斯特-香农采样定理(Nyquist–Shannon sampling theorem)的限制:即,以低于原始信号频率2倍的采样率采集并还原原始信号。

压缩感知的理论是这样的:

一个信号可以拆分成多个不相关的小信号的叠加(小信号称作向量),在不同拆分方法之间转换叫做域变换。如果某一个域上,只有一部分向量的值比较大,其它向量的值接近于0,则这个信号时可压缩的(近似0值的向量可以被去除,却不影响信号整体性质)。

所有的信号都是可压缩的,只要找到合适的转换域。

如果对信号先压缩,再做AD转换,就可以用低速率的AD转换器来采集高带宽的信号了。因为信号压缩后数据量减少,相当于带宽降低了。

在这个理论框架下,实现的采集与传统方法相比,有两点主要不同:

一是,数据采集硬件不同。因为采样函数变了。目前常见的硬件设备,采集一维信号的数据采集卡,相当于使用等距脉冲函数对原始信号做调制;二维图像的采集函数是像素位置函数。而压缩感知理论框架下需要使用高斯随即矩阵或等效的函数作为采样函数,这导致采集硬件必须完全重新设计。

二是,原始信号重建方法不同。传统数据采集可以直接从采集到的样本还原原始信号(受奈奎斯特定理的限制)。但在压缩感知理论下,采集到的样本数,少于可以直接重建原始信号所需的数量,不能直接重建。只能首先重建原始信号在某一稀疏域上的信号(通过最优化算法求得该域的最稀疏解)。再通过域转换,重建原始信号。

压缩感知最大的优势在于可以使用低速率的数据采集设备,来采集时域上高频的信号。这听起来很诱人,不过由于这需要重新设计所有的采集硬件,这一理论到实用也许还有相当长一段距离。

Startup VI 可以包含多个VI

今天发现,在发布产品,生成.exe文件时,Build Specification->Source Files->Startup VIs 栏目中可以包含多个VI。

这样生成的EXE,在一启动时,就会同时打开多个VI的面板。

为列表框控件添加自定义的图标

LabVIEW 中 Listbox, Tree 等控件,每个条目之前都可以显示出一个图标。选中控件的右键菜单 Visible Items->Symbols 就可以把这些图标显示出来。

image

控件中每个条目的图标可以直接通过控件的 Item Symbol 右键菜单来选择,也可通过才程序中设置控件的 Item Symbols属性来设置。控件自带的图标都比较简陋,并且总共只有40几个。(最后一个图标其实不是“图标”,它是分割线,有时可能是非常有用的)

image

但是LabVIEW提供了对这些图标的扩展功能。通过编程,可以为Listbox控件添加自定义的图标。设置图标时使用的“Custom Item Symbol –> Set To Custom Symbol” 方法,这个方法有两个输入,Index 表示图标的序号。应给给新图标选一个比较大的序号,以免覆盖掉控件自带的图标。第二个参数是图标的图片。

image

我在这个例子中,自己做了一张图片 Icon.png,它是一张彩色的LabVIEW标志。打开这个图片文件,得到它的图像数据,然后设置给Listbox控件。效果图如下:

image

转贴一个笑话

有一只熊猫,它到一家饭店点了菜就开始吃,吃完之后掏出一把枪乱放几枪走了。
饭店的老板就问它,你为什么要这样做?
熊猫就说,你查一下字典。
老板发现字典上写着:
Panda: an animal, eats shoots and leaves

今天突然发现维基百科居然还有文言文版的

相当的牛啊,不知道是些什么人在维护文言版的条目。

http://zh-classical.wikipedia.org/wiki/%E7%B6%AD%E5%9F%BA%E5%A4%A7%E5%85%B8:%E5%8D%B7%E9%A6%96

摘录一段全球变暖的文言文解释:
全球暖化者,天地日暖也。蓋百年以來,其勢日明,其害日顯,此固由人為也。工業日進,污染日甚,溫室氣體日濃,熱無以去,遂俳佪於天地間。萬物因而易,異象因而生。海面日 漲、氣候突變、水旱交侵,漸 廢、物種亡絕、病蟲日增。萬民見害,苦之久矣。諸國遂盟,訂《京都議定書》,力減溫室氣體之釋,以緩此變。惟其成功與否,尚未可知。

Live Space 无法看到最新的留言了?

最近这个Space改版了一下。以前可以直接看到所有文章下最新的留言,这样我也可以比较及时的回答一些问题。现在号线看不到了。有人遇到跟我同样的问题吗?

Google支持HTTPS加密搜索

对于中国用户来说,HTTPS的加密搜索一劳永逸地解决了中国用户对于Google搜索的稳定性问题。在Google中搜索某些敏感词语,会出现“连接被重置”,这导致一些很常用的词语,例如“学习”、“胡萝卜”、“温度计”等无法在Google搜索,而现在,使用HTTPS的Google,我们可以搜索你想搜索的任何词语, 再也不会出现“连接被重置”了。

为了你的用户隐私、安全和稳定性,现在就把你的Google搜索地址更换为 https://www.google.com 吧。

对于中国 用户来说,如果你访问 https://www.google.com 自动跳转Google.com.hk,请点一下页面底部的Google.com in English,然后再访问https的Google即可使用。

参考来源:http://www.williamlong.info/archives/2131.html

如何在程序中同时弹出多个子VI的界面,各自运行互不影响

回答网友一个问题:“我设计了一个labview界面子VI,我想在主VI中多次调用该界面VI(同时执行,单独分配内存),并显示出多窗口,该如何设置?我尝试将子VI属性设置成可重入,仍无法解决。”

这个问题其实挺常见的。若需要子VI打开多份实例,子VI必须是可重入的。所以第一步要把子VI设置为可重入。但仅仅这样还不够,主程序运行到子VI处,把子VI打开后,会一直等在这里,知道子VI运行结束,才继续执行主VI后续的代码。主VI既然已经停在这里了,自然不会再继续去打开其它子VI。解决的办法是在调用子VI的地方,改为动态调用,并且不等待子VI运行结束。这样一来,主程序运行到这里,将子VI调起后,立即执行后续代码,又可以去调用其它的子VI了。

需要注意的是,用于子VI是可重入的,需要给“Open VI Reference”函数设置一个值为“8”的Options参数。主VI程序代码如下:

image

在Google Wave上讨论LabVIEW问题

如果还不了解 Google Wave,点击后面的链接查看 Google Wave 的各种介绍。需要 Wave 的邀请,可以在这里留下 Email。

最近公司同事都积极的开始用上它了。在我看来,Google Wave 取代或整合 Gmail 是迟早的事,已经在用 Gmail 的兄弟姐妹,赶快来熟悉一下新系统吧。但 Wave 会不会整体取代传统 Email 就很难说了。商业公司对待更换 Email 系统这样的决定会非常的保守。毕竟,它的影响面实在太广了,公司的营运时刻也离不开 Email。而且,很可能会有一大堆的数据库、服务应用等于 Email 系统绑定在一起。移植的工作量极其巨大。就说我们公司吧,使用的 Loutus Notes 系统。Notes 做的真的很烂,用过的人没有不骂的。可是抱怨了十几年,我们公司也还是在坚持用着。

但不论怎样,Wave 的出现给了大家提供了一条新的交流途径。我的 Wave 帐号和 Eamil 是同一个:ruanqizhen@gmail.com,需要加我的话题尽管加:)。 如果有兴趣在 Wave 上讨论 LabVIEW 问题,可以登录 Wave 后加入这个帖子“试验在Wave上讨论LabVIEW问题”,获得所有LabVIEW讨论者的名单。打算讨论《我和LabVIEW》这本书的问题,可以加入“《我和LabVIEW》讨论区


LabVIEW 2009 新功能 - 图标编辑器

与文本语言相比,图形化的 LabVIEW VI 有个非常好的特点,就是使用图标来表示 VI 的功能。这样,在程序中,看一眼子VI的图标,就大致知道它的作用了。这比看枯燥的函数名方便迅速多了。
如下图这个VI,一看就知道它和生成波形有关。

image

VI 的图标虽然会给使用子 VI 的人带来方便,但却需要子 VI 的编写者花费一定的时间与心思来设计绘制它。旧版本 LabVIEW 的图标编辑器非常简单,功能有限。因此,很多开发者宁愿在子 VI 的图标上面写几个字就算了。
LabVIEW 2009 改进了 VI 图标的编辑工具,新的工具增添了绘图工具中常用的功能,来帮助开发人员快速制作精美的 VI 图标。

打开新的图标编辑器,可以看到,它拥有多个选项卡页面。每个页面助开发者从不同的角度对图标进行加工。

第一个页面是模板页。开发者制作图标时,往往不是从一个空白图标开始。功能相关的一批子VI,总会有共同的风格。比如说共同的边框、底色、标签等。有的公司也会为自己开发的 VI 制定规范,统一图标风格。这些共同的部分,可以作为模板,保存起来。编辑新图标时,先从模板中选取一个模板,然后再其基础上修改,可以简化不少工作量。

image 

新图标编辑器,仍然可以像以前那样,直接在图标上直接写文字。不过,他还在“图标文字”选项页中提供了更便捷的添加文字方法。在这一页面提供的文本框中,直接输入想要写的文字就可以了。最多可以写入四行文字。每行文字可以使用不同的颜色。
你可能会发现,新图标编辑器写出的文字在图标上是模糊的。只是因为字体不够大引起的。调整一下这个页面上的字号选项,就可以让文字变清晰了。

image

选取图形大概是新图标编辑器中最有用的部分了。VI开发者最头疼的就是设计绘制好看的图片,如果能从现成的图形库里选几个出来,组成一个图标,那就方便多了。“图形”选项页里选项页中提供了大量候选的小图片元素,直接把它们拖到右侧图标上就可以使用了。

image 

新图标编辑器中制作的图标是有涂层的。图标中的模板背景、文字、图形元素等,都被保存在独立的图层中。有了图层,我们就可以只针对图标中某一图层进行修改,而不影响其它图层上的内容。比如将这一图层上的图形挪动一下位置、设置为半透明等。

image

新图标编辑器还有一个额外的优点:它是开源的G代码程序。如果大家想参考一下这个复杂程序是如何编写的,它的主VI是“<labview>\resource\plugins\lv_icons.vi”,打开来就可以看到源代码了。

尽管新的图标编辑器在功能上改进不少,但我个人还是更喜欢旧的图标编辑器。新图标编辑器与旧的相比,也并非完全是优点。比如,新图标编辑器启动速度慢、无法书写清晰的小字号文字、运行不稳定等。幸好旧的图标编辑器没有从LabVIEW中移除,我们仍然还可以使用它。给“<labview>\resource\plugins\lv_icons.vi”改个名字,再试图编辑图标时,LabVIEW找不到新的编辑器,就会自动打开旧的那个了。

《我和LabVIEW》补充与注释

如何激活LabVIEW Scripting高级功能

LabVIEW Scripting的高级功能(比如创建新的VI,修改VI程序框图上的程序等)是需要特殊授权的。从2009年8月开始,NI公司将这一授权公开给了所有LabVIEW用户。也就是任何一个LabVIEW用户都可以免费申请获得LabVIEW Scripting的高级功能的使用授权。

取得授权并激活这一功能的方法是:

首先打开 LabVIEW Scripting 的网页,网址(http://decibel.ni.com/content/docs/DOC-4973),下载 LabVIEW Scripting 的安装包。安装包在页面的最下方。

image

比如,我的电脑是Windows XP操作系统,LabVIEW版本8.6,那就下载 LabVIEW Scripting API - WinXP.zip 这个安装包。

这个安装包会为LabVIEW添加一个 LabVIEW Scripting 许可证,许可证还要激活后才能使用。打开NI许可证管理器,找到LabVIEW xx版本下“工具包->Scripting Development”, 选择激活。输入注册码“L12S86758”(这是NI提供给所有用户,专用于激活LabVIEW Scripting 高级功能的注册码)就可以将 LabVIEW Scripting 的高级功能激活了。  

激活 LabVIEW Scripting 后,再打开LabVIEW,可以看到在函数选板“Programming->Application Control”下,多出了三个函数,这三个函数分别用于创建一个新的VI,得到某VI上某个对象的引用,和创建一个新的对象。这里说的对象包括前面板的控件,程序框图上的函数、结构、子VI、数据线,等。

image

并且,在使用Property Node和Invoke Node的时候会发现,它们多出了很多新的属性和方法共用户使用。使用这些 LabVIEW Scripting 的高级功能,几乎可以完成所有手工编辑VI可以完成的操作。

《我和LabVIEW》勘误

这里列出的是在本书出版之后,又发现的一些错漏。对于不清晰的插图,可以点击这里查看清晰版插图

页码 位置
原文
修改后内容
注释
序1 第二段,倒数第1行,第1列 一个人, 人, 删除“一个”两字。
前言2 第6行 自己的一点绵薄之力。本书的内容和特点 自己的一点绵薄之力。
    本书的内容和特点
“本书的内容和特点”是新的一节,应当另起一行。
35 第二段,第4行 其含义是 1904-01-01 08:00:00 这一时刻 其含义是北京时间 1904-01-01 08:00:00 这一时刻 这一时间是指在中文电脑上使用北京时间,相当于格林威治时间 1904-01-01 12:00am
60 第10行 <数据 标题=”输入值” 类型=”DBL”>34.2</数据> <data label=”输入值” type=”DBL”>34.2</data> 一般来说,应该使用英文作为xml元素和属性的名称;但元素和属性内容可以是中文的。
65 表2.3,表格第2行,第2列, 显示来 显示 去掉多余的“来”字。
65 表2.3,表格第4行,第2列,文字第2行 只使用英语不用 只使用英语。不用 断句不正确。
65 表2.3,表格第4行,第3列,文字第2行 使用本地化语言在后面加一 使用本地化语言。在后面加一 断句不正确。
77 最后一段,倒数第4行 子VI时间计数器.vi位于 函数“时间计数器(ms)”位于 这是一个LabVIEW内建的函数而非子VI
78 第四段,第2行 在图3.5中,数据从顺序结构流到“迭代次数”;然而,在图3.6、图3.7中,看不到这个数据是如何产生的,只有等到顺序结构切换到第一帧,才能找到数据来源。 在图3.6中,数据从顺序结构流到“迭代次数”;然而,在图3.5、图3.7中,看不到这个数据是如何产生的,只有等到顺序结构切换到第二帧,才能找到数据来源。 引用图片的次序需要调整。
85 图 3.23   <点击查看正确插图> 图片中的程序使用了一个 “等于?”函数,但实际上它应当是“大于等于?”函数
86 最后一段,倒数第2行,倒数第11列 保障 保证 用词不精确
93 第四段,第2行正中 分别为两次、三次…… 分别为前两次、前三次…… 少了“前”字,引起误解
152 第四段,第1行 LabVIEW程序员在使用DLL、ActiveX等控件之前 LabVIEW程序员在使用DLL、ActiveX控件等之前 把“等”字后移
152 倒数第二段,第1行,第14列 互联接口 互连接口 “互连接口”是目前LabVIEW中文版中的翻译方法。
书中其它使用到“互联接口”的地方,也都应当改为“互连接口”
155 第三段,第1行,倒数第8列 动态连接库 动态链接库 书中其它使用到“动态连接库”的地方,也都应当改为“动态链接库”
156 第一段,第3行 "LabVIEW]\examples\ "[LabVIEW]\examples\ 少了一个左方括号
190 图6.30中,第五个注释框里的文字 关闭所有打开的VI引用,以避免可 关闭所有打开的VI引用,以避免可能引发的内存泄漏。 结尾处漏掉几个字。
204 图7.10和7.11的标题 声音型号 声音信号 笔误
219 图7.32   <点击查看正确插图> 使用了错误的插图
221 第7.5.3节,第一段,倒数第1行 TDM流 TDMS LabVIEW2009之后,全部改用TDMS
233 第二段,第2行,最后几个字 重要的数据了 重要的数据 去掉“了”字。
241 最后一段,第1行,第11个字开始 时间顺序结构 定时顺序结构 采用LabVIEW中文版中的名称
242 第一段,第1行,倒数第9字开始 时间顺序结构 定时顺序结构 采用LabVIEW中文版中的名称
257 第9.2.2节的标题 名字空间 命名空间 “命名空间”似乎更常用
269 第三段,第3行,第7个字起 可以为这些机构编写一些模板 可以为这些结构编写一些模板 “机构”改为“结构”
271 倒数第1行 C:\Program Files\National Instruments\LabVIEW 8.6\www “[LabVIEW]\www\” 应当使用相对路径
276 倒数第1行 现代风格 新式风格 使用LabVIEW中文版的标准翻译
314 倒数第2行,第1个逗号之后 而是一个不特殊形状。 而是一个特殊形状。 去掉“不”字
315 图10.69   <点击查看正确插图> 原图没有显示数值的长度、进制等信息,容易引起误解。
336 图11.19   <点击查看正确插图> 使用了错误的插图
340 第1行,括弧中
黑店
黑点 笔误
348 第三段,倒数第一行 接线柱 接线端 使用标准译法
407 图13.24的标题 插件们的类结构 插件的类结构 中文不应有名词复数:)

返回《我和LabVIEW》主页

女儿的名字

虽然我的下一代影都还没有呢,但我未雨绸缪,已经开始为他们想名字了。由于干我这行的倾向于生女儿,目前只考虑了女儿的名字。

老婆是山东人,所以老早给女儿想了个名字叫“阮思齐”。我并不是很喜欢这个名字,理想的名字应当是:字不算太生僻,但组合起来却没有重名的。“思齐”这个名字网上一搜一大把,创意不够。

上个星期,回南京参加同学聚会。老同学得知我十年没跳槽,还在NI工作,跟我打趣说:“你打算在NI呆一辈子啦,将来生个孩子叫‘阮恩爱’得了。”
“阮恩爱”这名字不算常见,不过听起来像是韩剧里的人物,不好。再说了,也不能真把公司名挪来用啊。叫“阮恩爱”、“阮仪器”,将来孩子会恨我的。

不过这事还没完,回上海的路上,老婆说如果把你们公司名称里的“恩”“仪”两个字取出来做名字还是不错的。回到家Google上一搜还真没有叫“阮恩仪”的。我仔细想了想,这个名字还不错:常用字、无重名、有纪念意义,还带着台湾味,比韩版的好听多了。


LabVIEW 2009 新功能 - 传引用

以前版本的LabVIEW虽然也有多种方法可以让数据以引用的方式在程序间传递,但是用起来都有些麻烦。LabVIEW有了构建数据传引用的节点,大大简化了传引用的程序代码。

新添的有关传引用的两个节点在函数选板“Programing->Application Control->Memory Control”中,分别是“New Data Value Reference”和“Delete Data Value Reference”。“New Data Value Reference”用于创建一个数据的引用,“Delete Data Value Reference”可以从引用中取回原来的数据。

image

引用最主要应用于多线程程序中。如果两个线程同时对同一份数据进行修改,则必须使用传引用的机制。否则,使用值传递的方式,数据在数据线分叉的地方,就会编程独立的两份,之后在两个线程内分别修改的是两份完全独立的数据,没办法对同一份数据进行修改的。

比如下图这个程序,程序输入了一个数组,然后需要在两个并行的子VI中同时对这个数组中的数据进行修改。每个子VI可能修改了数组不同的元素,程序运行结束产生的数组应当把两个子VI中的修改都包含进来。因此,程序一开始需要数组数据生成一个引用,然后把引用分别传递到两个子VI中去。两个子VI都运行结束后,在从引用中取回数据。

image

LabVIEW中已有的函数还都是为值传递设计的,所以使用值传递少不了把数据取出、放回的过程。这以过程中,可能又会产生数据拷贝,效率会比较差。好在我们可以使用“In Place Element Structure”结构来处理从引用中取出、放回数据的过程。配合了“In Place Element Structure”结构使用后,LabVIEW会尽量使用数组原地址,而不是把从引用中取出的数据复制一份,这样就做到了传引用与效率的兼顾。比如下面两图中的程序,功能是完全相同的,但LabVIEW会对下面一幅图中的程序进行优化,提高效率。

image

 image

《我和LabVIEW》补充与注释