NI Days

    公司又开始准备一年一度“NI Days”活动了。这是公司每年最重要的活动之一,是每年最大规模的与客户交流的活动。

    NI美国总部每年八月都会组织一个类似的活动,叫做“NI Week”。在一个星期的时间中,NI向客户介绍公司最新产品、行业最新动向,交流客户的成功经验以及解决客户的问题。这个活动被挪到中国来,由于客户数量没有美国那么多,就被精简成了“NI Days”。但内容和形式还都被保留了下来。

    “NI Days”的活动在中国也已经举办了多年了,但是我对其最初几次活动都没留下什么印象。一是因为那时活动规模不大,二是因为我并没有真正参与其中。直到最近几次的“NI Days”活动,我也才开始关注起来。首先,参与其中的客户数量急剧膨胀,其次,我所在的研发部门在其中扮演了更加重要的角色。

     每次“NI Days”前三四个月,市场部门的同事就开始向研发部征集宣讲会主题了。如果哪个主题被选中,研发部的同事则可以直接向客户介绍其工作的最新进展。今年更是增加了直接与专家交流的环节,“专家”都是来在研发部从事各领域的工程师。平时,客户在遇到问题时,通常只能询问NI的技术支持工程师。这个新增的环节为研发工程师和客户提供了一个就专门问题做更深入讨论的机会。

     如果有人对“NI Days”感兴趣,在这个链接 ni.com/china/nidays 可以查看到该活动的详细信息。


为什么在CLN节点中,会自动配置某些DLL函数的参数信息

这是一个网友问我的问题,我开始也不了解。后来跟同事打听到了一些信息。

有些DLL,比如说是使用LabVIEW生成的DLL,再LabVIEW中,使用“Call Library Function Node”调用DLL中的函数,选择好一个函数,CLN节点自动就把这个函数的参数信息添加上去了。这样,编程者就不需要再对照着头文件去给它配置参数信息。但是,对于绝大多数DLL,比如通过一般步骤,在VC下编译出来的DLL,使用CLN节点选择了函数后,还要手工为其配置参数信息。它们的区别在哪呢?

那些可以识别参数信息的DLL,是因为它们把参数定义的信息,以IDL/ODL文件格式,嵌入到了DLL文件中。LabVIEW,CVI是可以把这些信息嵌进去的。其它编译器也许也可以把信息嵌入DLL中,但是具体如何操作我就没研究过了。

LabVIEW,VB等编程语言可以识别嵌入DLL的参数设置信息,在这些语言下使用这种使用有参数信息的DLL,更加便捷。

VI Cup 设计竞赛

最近公司组织了一次由在校大学生参加的电子设计竞赛,叫做 VI Cup。今天是竞赛的决赛日,我很荣幸成为了软件设计方面的评委之一。我作为研发工程师,平时与公司其它部门的同事,乃至公司之外的用户、学生等接触的都比较少,所以一直不是很全面的了解其他部门同事和客户的工作。这次活动让我让我在这方面有了新的认识。
首先,最让我惊讶的是同学们的编程水平之高。软件的竞赛题目是编写一个五子棋游戏程序。我参与评审了其中五组竞赛程序,它们的界面之精美,算法之完善都出乎我的意料。加之参赛者都操着一口流利的英语讲解其程序,让我大为感叹。后来又得知,有很多同学都是为了参加竞赛才刚刚开始学习LabVIEW的。我在招聘时,也有类似的感觉,现在每一届学生似乎都比上一届更有所进步。难怪人一旦年纪大了,就总是担心被淘汰。
再者,就是HR和GA部门同事们组织活动的能力也出乎我的意料。这算是一个比较复杂的活动了,但是被她们安排的妥妥当当,事无巨细均考虑周到。我以前只知道公司里研发工程师工作能力比较强,看来其他部门的同事们也不弱啊。

《生活随笔》目录

皮脂腺囊肿

    最近跑医院比上班还勤,都是让背上一个皮脂腺囊肿害得。这个囊肿在我身上也有年头了。大约4年前的某天,我洗完澡闲着没事在后背上乱抓,突然摸到一个大包。平时后背也会长些类似小痘痘之类的小红包,但是这个包的个头要大很多。我赶紧对着镜子仔细研究起了这个包包。

    这个包长在后背皮肤左侧,正对着心脏的位置。回头对着镜子勉强可以看见,但看不太清楚。第二天在网上查了一下相关资料,最可能是得了皮脂腺囊肿,也可能是脂肪瘤。总之都不是什么严重的病,由于它不痛不痒,也没红肿,所以我也没太重视。家人都劝我做个手术把它切了,但是,我总觉得它又没怎么影响我的生活,平白无故切一刀多不值啊,所以一直没去医院看。

    直到两星期前,老妈发现这个囊肿变红了,我也觉它有些微微发痒,这才去医院检查。医生诊断是皮脂腺囊肿引发感染。医生说应该早来,一刀切掉就好了。等到现在发炎就比较麻烦,要多糟不少罪。
    治疗方案是首先贴上膏药;等一星期,囊肿里全部化脓,再把它割开放掉脓液,清洗干净。过1~3个月,伤口完全愈合,另作一手术,把囊肿切除。

    按照医生建议,先敷药。不到一星期,后背的包就变得很红很光亮了,像个糖炒栗子。还没等去医院动手术,它自己就先破开,流了一堆恶心吧啦的东西出来。
    第二天去医院,在门诊手术室把它切开引流。给我动手术的是个年轻女医生,我还真是佩服她,这东西现在粘乎乎的,红黑黄三种颜色混杂在一起,我自己都不想看,她居然还可以用刀把它切开进行清理。女医生就是比较温柔的,我趴在手术床上的时候,她对我说:“你这里全部化脓了,打麻药也不起作用,你忍着点啊!”于是下刀,在我的囊肿上切了个十字花,然后用消毒纱布在里面擦洗。当时疼的我……只能咬着手指头。
    手术完之后,伤口不能缝合,就这么敞开着。里面塞块油纱布,外面用白纱布盖上。每天换药。我自己一直没看到过伤口是什么样的,也不知道她是给我切了个加法还是乘法?

    由于这种排脓伤口是不缝合的,医生说至少一个月才能长上。不能洗澡就算了,晚上睡觉也特不舒服。为了不压到伤口,不能平躺,翻身也得先坐起来,换个方向再躺下。一边睡觉还得一边仰卧起坐,太累了。有一天躺在床上突然想起了小时候我养的一只乌龟。我那时候欺负它,经常把它翻过来,仰面朝天躺着。它就一伸脖,用脑袋把自己顶正过来。这真是一只聪明的小乌龟啊,于是我也一伸脖,后背腾空翻了个身,哈哈,终于睡舒服了。

    这几天要特别感谢老婆啊,她正在为毕业论文忙的焦头烂额呢,还陪着我跑了好几趟医院:) 《生活随笔》目录

循环运行某个时间后退出

有时候需要一个循环不是在迭代多少次之后停下,而是在运行多少时间之后停下。一般,直接的解决方案就是利用“时间计数器”函数,进入循环前,记下当前时间,然后每次循环迭代都查看一下当前时间,若超过所需时间,则退出循环。这个功能也可以使用“已用时间”Express VI来完成。

把“已用时间”Express VI拖到程序框图上,会出现它的配置对话框。我们需要这个Express VI计时5秒,每次计时完成自动重置。

在循环里,需要用到的是“已用时间”的“结束”输出,一旦运行时间超过5秒,这个值就会被设为真。这时循环停止。

但是下图程序有个问题,就是“耗时40毫秒”这个完成功能的VI和“已用时间”VI之间没有连线,它们是同时运行的,而“已用时间”运行时间几乎可以忽略,一调用它,它就立刻返回“结束”值。这时,即便“结束”值为“真”,循环也要再等大约40毫秒,待功能完成功能不部分运行结束,循环才停止。

强制程序先工作,再计时间是否可以解决这个问题呢,如下图中的程序。这样也不行,因为“已用时间”是在重置后,第一次调用它的时候开始计时的。下图这个程序,循环第一次迭代,并没有马上就开始计时,而是要等到功能VI完成后,已经耗用的一段时间,才开始计时。这个即时已经不精确了。

所以要完全解决这个问题,只能麻烦一点。程序中多加一个条件语句。在循环一开始,就立刻计时;而在后续的迭代中,每次功能完成再检查当前时间。或者,把“已用时间”放在前面,每次判断是否结束。如果是,则不执行“耗时40毫秒”这个VI。

《我和 LabVIEW》目录

利用循环条件结构控制几个任务的执行顺序

循环条件结构不是一个基本结构,它是指在循环结构内套一个条件结构,这样的复合结构。这是LabVIEW中常见的程序结构之一。

假设需要编写这样一个测试程序,它有多个测试任务:任务A、任务B……,需要顺序执行每一个测试任务。这是一个典型的顺序结构的程序,可以采用上一章提到的顺序程序的编写方法。它的代码如下:

 
图1:顺序执行测试任务

如果程序要求更复杂一些,这个简短的顺序结构就不够灵活了。比如,有多中产品需要测试,但每种产品的测试流程不一样,有的产品需要测试任务ABC,有的需要测试任务CDB,等。针对不同产品编写不同的测试程序不是一种高效的方法。

高效的方法是把测试任务做为测试程序的输入,程序根据用户每次指定的测试任务顺序来调用测试任务。这个程序可以使用循环条件结构来完成。它的程序如图2所示。

 
图2:按照输入的顺序执行测试任务

这个程序中的“任务队列”应该是一个输入控件,这样用户不需要改动程序,就可以改变它的输入值。但是在这里为了便于观看,把它变成了一个常量。“任务队列”是一个数组,元素按照找任务执行的顺序排列。这样在程序运行时,循环每迭代一次,循环结构从“任务队列”中取出一个任务,然后由条件结构判断该任务并进入相应的分支,执行该任务。 《我和 LabVIEW》目录