初学者创建的程序通常仅仅是为了完成某种特定的功能,它的程序结构往往存在很多问题,因此基本上是无法重用的,LABVIEW创建的程序尤其如此,原因在于LabVIEW图形化编程非常易于使用,与编程者的思维方式更容易契合,因此创建的程序框图显得更为随意,没有规划。

同一些LabVIEW初学者交流程序时,每当要求他们贴图时,他们经常会说“没办法,程序框图太大”。“程序框图太大”本身就说明我们的程序框图存在相当大的问题,如果能把我们的程序框图缩小到一定程度,就说明程序框图的模块化程度很高了。

在完成的程序功能基础上,一定要花费一定时间对代码进行重构和优化,否则一段时间后,可能我们自己也无法看懂了。

下面我通过网友的一个具体的实例谈谈代码重构的问题,示例存在很多的各种问题。因为程序框图非常大,只能通过导航窗口才能看到全貌,如下图所示:

Picture
这是包括硬件采集、分析处理和存储三个基本功能的应用。采集部分使用了DAQ 助手,包括扩CH0\CH1\CH2三个通道,每次采样一个点,为了便于说明,我利用三个随机数构成一个数组表示采集后的结果。
 
Picture
下面对程序框图中几个主要部分进行一下重构,从中可以看出程序框图中存在的问题:

一、采集后的结果线性化处理

网友采集三个点后实际上是三个双精度数,对于每个通道都需要线性化处理(Y=KX+B),区别在于K、B值的不同。一般这样的系数由于可能需要经常调整,应该存贮在INI文件。

网友是利用公式快速VI进行处理的,如下图所示:

Picture
这样简单的线性化处理根本不需要公式节点快速VI,使用表达式更为简洁方便。由于LABVIEW支持支持数组与数组的运算,因此线性化处理通过基本运算也很方便,下面给出两种不同的简化方法,线性化处理过程比较简单,可以和采集部分合并。
 
Picture
二、滑动平均值的计算

为了去除干扰,消去峰值,网友采用10个移位寄存器记录采集结果,然后求取平均值,见下图:

Picture
网友的这部分程序存在几个明显问题:

1、三个通道计算方式完全相同,因此可以考虑用子VI来实现。

2、当移位寄存器很多时,采用移位寄存器显然就不合适了,应该考虑用数组实现。

3、如果平均次数需要可以灵活设置怎么办,不允许动态增减移位寄存器。

我曾经专门写过滑动平均数的问题,参考下面的链接。

http://tm.eefocus.com/csxcs366/blog/08-12/162578_c0ca2.html

我们直接采用逐点分析库中的数据队列函数就可以实现求取滑动平均数了,简化后的程序框图如下图所示,直接返回平均后的结果。

Picture
三、10个布尔移位寄存器重构为数组

类似于上面的滑动平均数计算,网友创建了10个布尔型移位寄存器,并进行10次与运算,如下图所示:

Picture
在计算滑动平均数时,网友采用了复合运算节点函数,实现了10个数的连加运算。很显然他对这个函数不很清楚,因为函数具有强大的逻辑运算功能。上述代码可以简化为:
 
Picture
根据上面的经验,对于过多的移位寄存器,我们还是采用数组操作更为合适。我们在滑动平均数中用到的数据队列仅支持双精度数和复数,不支持其它数据类型。

上面的数据队列函数提供了源代码,因此稍微改动一下,就可以存储其它数据类型。

Picture
创建完这个布尔队列函数,就可以替代多个一位寄存电器结构了。

网友的程序框图当然还存在许多其它的问题,上面各项是针对其中比较有代表性的问题进行了重构,供大家参考。


 





Leave a Reply.