APP下载

LabVIEW应用于自动控制系统的内存管理

2014-04-26赵静张宁宁

计测技术 2014年3期
关键词:框图内存编程

赵静,张宁宁

(中航工业北京长城计量测试技术研究所,北京100095)

0 引言

在构建自动化控制系统时,计算机软件编程是使得自动控制系统在无人参与情况下按照预期程序进行工作的关键所在。在预定程序的实现中,软件编程不仅要实现所需的任务要求,而且在运行效率、差错管理、系统维护等方面要付出更多的精力。由于无人工参与,某些想象不到的小错误可能会引起软件的崩溃,进而严重威胁整个控制系统。

随着自动控制系统的不断扩展,所需要实现的功能越来越多,系统越来越庞大,软件编程越来越复杂,然而计算机的内存资源是有限的,内存管理的目的就是如何高效、快速的为任务分配内存资源,并且在适当的时候释放和回收资源,内存管理技术在编程中越来越受到重视。一个内存管理好的程序不仅可以提高工作效率,而且可以使系统更为稳定的运行,内存管理不好可能导致内存泄露,甚至内存耗尽而导致系统崩溃。

本文基于LabVIEW编程语言来介绍内存管理,通过汇总LabVIEW的一些内存管理技术以及一些编程技巧,以帮助LabVIEW编程者更好的实现自动控制系统的软件编程。

1 自动控制系统的组成

自动控制系统一般包括控制器、被控对象以及执行机构。控制器即计算机及其内置板卡;被控对象即终端设备;执行机构即实现基本控制任务、数据采集任务等的硬件结构,如电机、电磁阀、数据采集仪等。图1是一个简单的自动控制系统的基本构架。

图1 自动控制系统框图

系统中的控制部分往往需要用到计算机的各种硬件资源口:串口、网口、GPIB口等,或者需要多功能采集卡的多功能通道来进行控制,这些系统资源端口在进行软件编程时要注意及时的分配和释放,如果释放不当,会导致资源口的无效占用,可能导致再次使用时打开失败。

系统本身具有自检功能,这是在整个程序控制中首先要进行的工作,之后又不再需要进行频繁操作,这就涉及到了系统资源的合理分配问题,如何使不常用的功能最少的占用内存资源,并能更好的提高运行效率。

在某些复杂系统中,数据量很大,占用的内存资源也会很大,如何在编程中注意内存资源的管理是提高数据处理量、提高运行效率的关键。

此外,系统还包括了实时采集数据、人机控制、报表操作等多个功能,合理的内存管理机制可以提高计算机多任务处理中的内存利用率,保证系统运行的稳定性和提高系统的运行效率。

2 自动控制系统编程中内存优化管理技巧

2.1 内存检查工具

2.1.1 内存使用的查看工具

在VI属性面板中的“内存使用”工具是用来查看VI内存占用情况的。它显示了一个VI内存占用所包含的四个主要部分:前面板、框图、代码和数据,以及四个部分的总和。通过这个工具,我们可以方便的查看VI所占用的内存,更有针对性的进行优化。

2.1.2 查看数据的内存备份

通过本工具可以方便的找到产生内存拷贝的数据节点,更便于进行程序的优化设计,对某些不必要的内存拷贝,要尽量避免。此外,工具选项下的性能分析有几个查看工具,灵活运用这些工具可以更方便的进行内存管理。

2.2 内存管理的优化

当打开一个主VI时,主VI连同它所有子VI的代码和数据段都会被调入内存,但未打开的前面板和框图并不会被调入内存,只有当主动查看VI的前面板或框图时,才会被调用。基于LabVIEW的这种内存管理特性,介绍几个优化LabVIEW程序的内存管理方法。

2.2.1 子VI的使用

一个复杂的自动控制系统的程序往往需要实现多个功能,将每个功能模块用单独子VI实现,虽然会增加额外的前面板和框图空间,但并不增加额外的代码和数据空间,因此也不会占用额外的内存资源。使用子VI还可以方便LabVIEW在结束子VI运行时及时回收内存资源,更进一步改善了内存的使用效率。

2.2.2 动态调用子VI

自动控制系统中有些功能在程序运行过程中只需要执行一次,例如:系统的自检功能;有些功能在整个程序运行中需要不断调用,例如:设备控制部分和数据采集部分。不常用的自检功能采用动态调用VI方式,即只有在调用时该子VI时才加载到内存中,运行完后在内存中清除此VI;对常用功能采用普通调用方式,即系统在运行程序时就将此VI加载到内存中,只有退出主程序时,该VI才从内存中清除。动态调用程序框图如图2所示。

图2 动态调用VI程序图

合理利用两种调用方式,可以提高内存利用率,避免不常用VI长期占用内存空间。

2.2.3 数据备份及缓存重用

自动控制系统中的数据处理部分,往往要涉及到大量的数据运算,有时要求把采集到的数据显示成波形,LabVIEW程序主要是数据流驱动型的。数据传递到不同节点时往往需要复制一个副本。当对大的数组进行运算时,内存消耗很大,就是因为程序生成了过多的副本。

有些LabVIEW节点可以缓存重用,合理利用这些节点可以有效的提高内存使用率,减少备份。

1)移位寄存器的使用

移位寄存器是内存优化的一个重要节点,其在循环结构的两端是强制使用同一块内存的。图3是对实现同一功能的两种LabVIEW节点的编程比较。

图3 移位寄存器节点比较

经过内存查看工具发现第一种方式大概占用了3.4 M的内存空间,第二种方式仅占用了1.2 M的内存空间。

2)元素同址操作

元素同址节点是另外一种强制数据缓存重用内存的一种方式。该节点用于数组的索引、替换,簇的绑定和解除以及任意元素的缓存重用,可以使更新数据或簇中元素时,不进行数据备份。图4是同址操作结构的程序框图。

图4 元素同址节点应用

2.2.4 全局变量和局部变量的应用

在自动控制系统的人机交互编程中往往会用到大量的界面操作,针对同一控件的读写操作往往出现在程序的不同位置。这时就会用到界面元素的属性特点或者使用局部变量来实现操作。另外,在数据处理的编程部分中,有些复杂的算法往往需要顺序结构多步实现,这时也会用到局部变量来进行参数的传递。图5是两种编程方式的比较。

图5 局部变量使用比较

经过测试发现,第一种方式的运行时间是191 ms,占用内存42.2 M;第二种方式的运行时间是159 ms,占用内存9.0 M。

局部变量和全局变量都会涉及到数据的备份,对某些大型数组的操作会导致内存的大量占用,可以利用以下方式避免局部变量的应用。

错误簇的方式不仅能使数据的传输保持一定的顺序,而且可以避免局部变量的使用。错误簇的例子如图6所示。

全局变量除了有内存备份的弊病之外,还存在竞争的问题。在程序的任何地方都可以随意更改全局变量的值,容易造成其值被莫名其妙更改,且不便于程序的调试。全局变量在编程中可以通过使用队列或者通告、事件结构等方式来尽量避免。

图6 错误簇的妙用

2.2.5 防止内存泄露

在控制系统的设备控制部分和数据采集部分以及文件I/O部分,会经常用到设备端口的配置、采集卡任务的创建以及文件引用的创建。如果忘记关闭这些引用,就会导致内存泄露,由于内存泄漏是动态产生的,我们无法通过VI属性面板来查看,但可以通过Windows自带的任务管理工具来查看。也可以使用LabVIEW的Profile(Tools>>Advanced>>Profile VIs)工具来查看某个VI运行时内存的分配情况。

图7是控制仪器和文件打开和关闭引用的例子。

图7 防止内存泄露的程序框图

2.2.6 减少数据备份

尽量使用占用资源较小的数据类型,例如使用16位整型数据,而不是双精度浮点数;尽量要在循环内进行大量数据的运算操作;合理利用内联VI。

3 实例分析

以一套传感器的压力温度性能检测系统为例,对内存管理进行实例分析。本系统的基本组成如图9所示。

该系统是用于检测传感器在不同温度、不同压力情况下的输出性能。主要实现的功能在图10中列出。

图9 压力温度试验系统

图10 软件功能框图

整个程序采用事件驱动机制,将事件响应节点放在顺序框图中,第一步是对硬件各种引用的打开操作,并进行差错管理,一旦有错误就关闭引用,以避免出现错误时导致引用无法关闭而引起内存泄露。所有与主要功能无关的界面操作均在此步中实现,以避免在进行主要功能时影响运行效率;顺序的第二部分是主要功能的实现,此部分全局变量主要用于存储数值常量包括一些硬件的命令字符串,在自动控制循环中应用移位寄存器来实现数据的传输,例如压力控制部分,需要循环得到实际压力值,并通过平均值判断是否到达指定标准值,此时应用移位寄存器而不是直接的数组累加方式来实现压力值的平均值求取,温度控制也类似;为了得到传感器的性能分析,需要对采集到的大量数据进行数学计算,这时尽量应用错误簇取代局部变量的应用来实现计算的先后顺序,且在数据运算时尽量保持运算中数值类型的一致性;顺序的最后一步是对各种引用的正常关闭,以及文件的操作、界面元素的恢复等。

整个程序本着优化内存管理的思路,实现了要求的所有功能。

[1]李周华,严毅.软件设计中的性能优化与内存管理[C]//广西计算机学会——2004年学术年会论文集.2004.

[2]Jeffrey Richter.Windows核心编程 [M].北京:机械工业出版社,2000.

[3]魏海涛,姜昱明,李建武,等.内存管理机制的高效实现研究[J].计算机工程与设计,2009(16):3708-3712.

猜你喜欢

框图内存编程
外部高速缓存与非易失内存结合的混合内存体系结构特性评测
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
捷豹I-PACE纯电动汽车高压蓄电池充电系统(三)
“春夏秋冬”的内存
电路图2017年凯迪拉克XT5
算法框图的补全
基于图表法构建《万有引力定律与航天》知识网络