4.1 LabVIEW7.1语言简介
LabVIEW是实验室虚拟仪器集成环境(Laboratory Virtual Instrument Engineering Workbench)的简称,是美国国家仪器公司(NATIONAL INSTRUMENTS,简称NI)的创新软件产品,也是目前应用最广、发展最快、功能最强的图形化软件集成开发环境。LabVIEW是一种图形化编程语言,又称G语言。其编写的程序称为虚拟仪器VI (Virtual Instrument),以.VI后缀[30]。
在长达20年的时间里,工程师和科学家们一直都在使用NI LabVIEW这一强大的图形化开发环境完成信号采集、测量分析和数据表示等各方面的任务。LabVIEW在提供图形化编程语言的灵活性的同时,摒弃了传统开发工具的复杂性。
NI LabVIEW是一个开放性的环境。交互式的助手、代码生成工具、和数千种仪器设备的轻松连接等特性,使得它与任何测量硬件之间的连接都非常简单。
LabVIEW内建600多个分析函数,用于从所采集的数据中提取有用信息,或进行测量数据分析和信号处理。
LabVIEW为数据显示、用户界面设计、网页发布、报告生成、数据管理以及软件连接提供了各类工具。
本监控软件采用LabVIEW图形化编程软件将会事半功倍。
4.2程序设计说明[32,33,34,35,36]
4.2.1系统监测数据的预处理
作为系统重要输入之一的实时监测数据包含全部4个设备共40个监测点的实时数据,如果将其直接引入系统,势必造成数据处理程序的冗肿庞大,因此在引入系统前,对监测数据使用簇进行分类汇总。
-39-
昆明理工大学工程硕士学位论文
-40-
首先使用Bundle BY Name 按名称替换簇成员函数将每个设备的10个监测点
的数据汇总到一个簇中,然后在通过Bundle
合成簇函数
将4个设备的数据汇总到一个簇数组中,这个簇数组就包含了某一时刻所有设备所有监测点的实时数据,具体程序如图4.1所示:
图4.1 监测数据预处理源代码-1 然后,使用相反的流程就可以解析出每个设备及每个监测点的数据,即首先使用Unbundle
解析簇函数分离出各个设备的监控数据簇,然后再通过Unbundle BY
Name
按名称解析簇成员函数
解析出每个监测点的实时数据。具体程序设计如下图4.2所示:
昆明理工大学工程硕士学位论文
-41-
图4.2 监测数据预处理源代码-2
4.2.2系统功能模块设计
根据对卷烟机、包装机设备工艺流程的分析,确定本监控系统结构如图4.3所示:
图4.3 系统结构图 现对系统各模块的功能、算法及流程进行具体分析。
4.2.2.1设备参数设定模块
1.功能描述
设定各个设备中的各个检测点的阀值范围。
设置报警事件列表的存储路径和存储的最大记录数。
各个检测点的阀值:double 类型。
报警事件列表最大记录数:int 类型。
输出:无。
2.算法
本程序没有采用特殊算法。
3.流程逻辑
昆明理工大学工程硕士学位论文
-42-
该模块没有特殊逻辑。
4.界面
该模块的界面如图4.4所示(以设备1为例):
图4.4设备参数设定模块界面
5.程序设计
每个监测点的阀值都可以进行的设置。在系统中可以通过创建监控点阀值的属性节点来根据实际需要对其具体的属性进行引用,如图4.5所示。
图4.5 各检测点阀值设置源代码
4.2.2.2设备实时监测模块
1.功能描述
判断数据是否超出阀值。如果超出则指示灯显示红色报警信号,棒图变为红
色显示;如果没有超出则棒图为绿色显示,指示灯不亮。
昆明理工大学工程硕士学位论文
-43-
输入:监测数据,double 类型。
输出:棒图显示,指示灯显示。
实时数据,double 类型。
2.算法
阀值比较算法:将监测数据和设定的阀值数进行比较,如果超出阀值范围(监测数大于阀值上限或小于阀值下限均视为超出阀值范围)则报警,否则为正常范围。
3.流程逻辑
该模块的流程逻辑如图4.6所示
:
图4.6 设备组态图模块的逻辑流程图
4.界面
“设备实时监测”模块界面如图4.7所示(以设备1为例):
昆明理工大学工程硕士学位论文
-44-
图4.7 设备实时监测模块界面
5.程序设计(以设备1为例)
首先将实时数据从数据簇中解析出来,然后使用阀值比较子VI 与上限阀值和下限阀值进行比较,同时输出到界面上的棒图。比较的结果输出到指示灯、上限报警、下限报警三个变量中,同时在界面上动态显示。最后使用Build Array 创建数组函数将上限报警、下限报警变量的值保存到设备1的状态数组中,以便相关功能模块的调用, 如图4.8所示。
昆明理工大学工程硕士学位论文
-45-
图4.8 设备实时监测模块源代码
4.2.2.3实时趋势图模块
1.功能描述
显示任一设备的任意三个监测点的实时趋势图。 输入:通过界面选择要显示的设备和监测点。 输出:实时趋势图形。 2.算法
本模块没有特殊算法,只是显示各个检测点的实时趋势。 3.流程逻辑
实时趋势图模块逻辑流程图如图4.9所示
:
图4.9 实时趋势图模块逻辑流程图
4.界面
“实时趋势图”模块界面如图4.10所示。
昆明理工大学工程硕士学位论文
-46-
图4.10 实时趋势图模块界面
5.程序设计
实时趋势图显示监测点监测的工艺参数随时间变化的趋势,对监控和分析生产情况,加强生产管理十分有用。在本模块设计中通过选择设备中任意三个监测点来同时显示生产情况。其中不仅要实现数据的显示,还要实现趋势图X 轴标签显示、X 轴实时坐标显示和监测点上下限的显示,下面对上述功能的实现具体分析:
① X 轴实时坐标显示和监测点上下限的显示:首先对实时趋势图初始化,设置X 轴起始时间、设置最大显示时间和清除历史数据,涉及到实时趋势图中XScale.Offest 、XScale.minimun 、XScale.maximum 和History 等属性, 如图4.11所示。
昆明理工大学工程硕士学位论文
-47-
图4.11 实时趋势图初始化源代码
然后将实时监测数据、数据上限、数据下限组合成一个簇输出到实时趋势图中。 ② 趋势图X 轴标签显示:首先在设备选择中将设备信息存入设备信息簇中,然后在选择监测点时读出设备信息,使用Format Date/Time String 函数格式化输出当
前日期,通过Concatenate String 函数
将上述信息组合成一个字符串,最后输出到
趋势图的XScale.NameLbl.Text 属性中,实现X 轴标签实时显示当前选择的设备、监测点和时间信息。程序见图4.12
在程序设计中选用选择结构实现设备选择、监测点选择、数据显示的顺序性,同时保证三个趋势图同时刷新。
昆明理工大学工程硕士学位论文
-48-
图4.12 实时趋势图显示源代码
4.2.2.4实时状态报表模块
1.功能描述
同时显示两个设备所有监测点的实时数据。 输入:double 类型。
输出:实时数据,double 类型。 2.算法
该模块没有特殊算法。 3.流程逻辑
该模块没有特殊逻辑。
昆明理工大学工程硕士学位论文
-49-
4.界面
“实时状态报表”模块界面如图4.13所示。
图4.13 实时状态报表模块界面
5.程序设计
实时状态报表用于集中显示某个生产设备各工艺参数实时变化的监控数据表。显示内容包括:监测点名、监测点数据安全范围、实时数据。通过查看该表,可以很快的了解生产系统的运行情况,比较、分析各参数之间、各参数和安全范围之间的相互关系,及时协调关系。现对其功能实现具体分析如下:
通过Unbundle BY Name 按名称解析簇成员函数
解析出每个监测点的实时数
据,通过字符处理子VI 格式化输出,将结果输出到界面上,如图4.14所示。
昆明理工大学工程硕士学位论文
-50-
图4.14 实时状态报表源代码
4.2.2.5事件报警列表模块
1.功能描述
显示任一设备的监测点的报警事件。 输入:监测点状态变量,boolen 类型。 阀值范围:double 类型。 输出: int 类型。 报警时间:datetime 类型。 报警位置:string 类型。 报警类型:string 类型。 设定值:double 类型。 报警值:double 类型。 2.算法
阀值比较算法:监测数据与设定的阀值数进行比较,如果超出阀值范围(监测数据大于阀值上限或小于阀值下限均视为超出阀值范围),则记录报警事件并输出到报警事件列表中。当报警事件记录数达到设定的最大值时将报警事件写入文件,同时清空事件报警列表。
昆明理工大学工程硕士学位论文
-51-
3.流程逻辑
事件报警列表模块逻辑流程图如图4.15所示
:
图4.15 事件报警列表模块逻辑流程图
4.界面
“事件报警列表”模块界面如图4.16所示
:
图4.16 事件报警列表模块界面
5.程序设计
本功能模块用于记录报警事件,其主要包括实时数据的监测、取监测点状态、报
昆明理工大学工程硕士学位论文
-52-
警事件的记录、报警事件写文件三大功能。下面对具体功能的程序设计进行详细介绍:
① 实时数据的预处理:在设备实时监测模块的程序中,在每次轮询监测点状态后,都要将每个监测点的状态存入当前设备的数组中,然后再将所有设备的状态数组存储到一个总状态数组,如图4.17所示:
图4.17 实时数据的预处理源代码
这个总状态数组就包含了所有设备所有监测点的报警状态。同时将每个监测点的上下限阀值存入设备阀值簇中,以便相关程序调用。
② 取监测点状态:首先使用FOR 循环对数组的自动索引将总状态数组中每个设备每个监测点的每个上、下限状态读出,其基本结构如图4.18所示:
图4.18 取监测点状态功能结构示意图
最外层的循环用于取出4个设备的状态数组,在此层中要加入设备的信息处理程序,
图4.19 设备信息处理程序源代码
中间层的循环用于取出设备中10个监测点的状态数组,在此层中还要加入各监测点的信息处理程序,其中使用字符处理子VI将监测点的实时数据格式化为字符类型,如图4.20所示:
图4.20 监测点信息处理程序源代码
最里层的循环用于取出每个监测点的上下限报警状态,在此层中要加入监测点报警状态的信息处理程序,如图4.21所示:
图4.21 报警状态信息处理程序源代码
③报警事件的记录:当监测数据超出阀值时(不管是上限还是下限),就会激活报警事件记录程序。报警事件记录程序由以下几个关键部分组成:▲记录表初始化:创建一个字符数组,数组的行数由设备参数设置中最大记录数确定,列数固定为6 (分别为序号、报警时间、报警位置、报警类型、设定值和报警值,具体看界面),由这个数组初始化表格。如图4.22所示。
-53-昆明理工大学工程硕士学位论文
-54-
图4.22 记录表初始化程序源代码
在程序中使用到计数器来判断当前记录数,在开始使用前必须进行初始化。
▲记录组成:事件记录表格中每条记录包含序号、报警时间、报警位置、报警类型、设定值和报警值等信息,因此在将记录写入表格前必须对记录进行格式化,即加入报警事件发生时的日期、时间、报警点位置、报警类型、监测点设定值和监测点报警值。其中报警点位置、报警类型、监测点设定值和监测点报警值等信息在各层循环获取(详细内容见○2取监测点状态)
▲事件写入表格:基本算法是通过Replace Array Subset 替换数组成员函数依次将记录替换表格中的第n行,达到顺序添加记录的功能。计数器记录当前被替换行的行号。如图4.23所示。
图4.23 事件写入表程序源代码
④报警事件写文件:当事件记录表中的记录达到最大记录数时,就会激活文件记录程序。如图4.24所示:
昆明理工大学工程硕士学位论文
-55-
图4.24 报警事件写文件程序源代码
文件记录程序由以下几个关键部分组成:
▲标题输出:实现将事件记录表的列标题输出到记录文件的首行的功能。基本算法是使用Replace Array Subset 替换数组成员函数替换掉记录表中首行记录。如图4.25所示。
图4.25 标题输出程序源代码
▲文件名的组成:记录数据文件的文件名由两部分组成,第一部分由Format Date/Time String
函数格式化输出当前日期,第二部分使用Seconds To Date/Time 函数输出当前小时、分钟、秒,然后将这两部分组成文件名。
▲文件记录:首先使用Current VI’s Path 函数返回当前VI 路径和程序文件名,Strip
昆明理工大学工程硕士学位论文
-56-Path 函数从中把当前VI 的文件名剥离出来,Build Path 函数把记录数据的文件名加到路径中,从而使记录数据的文件与程序保存在同一目录中。设置Open/Creat/Replace File 函数的功能参数function 为creat ,这样每次调用文件记录程序时就会在与程序存放的同一目录下创建以当前日期、事件为文件名的新文件。Open/Creat/Replace File 函数同时返回一个参考号refnum ,标识打开的文件。如图4.26所示。
图4.26 文件记录程序源代码
Array To Spreed Sheet String
函数将事件记录表中的每行记录转换为字符串,加上换行符后写入数据文件组成一条记录。Write File 写文件函数将Data 接口输入由事件记录表转换来的字符串写入文件。由于只有当事件记录表中记录达到最大记录数时才会调用写文件程序,所以写入数据文件的记录为当前事件记录表的所有记录。当写文件的操作结束后,调用Close File 函数关闭文件。
▲数据文件:完成报警事件表写文件后创建的数据文件如图4.27所示:
昆明理工大学工程硕士学位论文
-57-
图4.27 数据文件
▲表格初始化:当文成写文件操作后,清空记录表,初始化计数器,准备下次记录。如图4.28所示
图4.28 表格初始化
4.2.3子VI 程序设计
在系统设计中,通过设计子VI 来完成不同模块的通用功能,如阀值比较子VI 、字符处理子VI 等,下面对系统中的每个子VI 进行具体的分析。
4.2.3.1阀值比较子VI
① 功能:本子VI 用于实现监测数据与上、下限阀值的比较,输入为监测数据、
上限阀值、下限阀值,输出为报警状态、上限报警状态、下限报警状态,同时根据比较的结果输出不同的颜色显示,即当超出阀值时(不管是上限还是
昆明理工大学工程硕士学位论文
-58-
下限)输出参数Fill Color 为红色,否则为绿色。根据结果输出的不同颜色输入到设备实时监测界面中的棒图上,直观清晰的显示当前系统运行情况。 ② 界面:阀值比较子VI 界面如图4.29所示
图4.29 阀值比较子VI 界面
③ 算法:程序算法如图所示,首先将当前监测数据与下限阀值比较,大于下限,
然后比较上限阀值,如果小于上限,则监测值在上、下限之间,属正常显示;若监测值小于下限,同时小于上限,则监测值低于下限,属下限报警;若监测值大于上限,则必定大于下限,属上限报警。如图4.30所示。
图4.30 阀值比较子VI 逻辑流程图
④ 程序设计:本程序的实现关键在于选用Select
函数,该函数有三个输入参
数,一个输出参数,实现x=true?T:F 功能(T 、x 、F 依次为三个输入参数)。具体程序如图4.31所示:
图4.31 阀值比较子VI程序源代码
⑤ 接口:接口在调用该子VI的程序与它交换数据时,起到图形化参数表的作用。
如图4.32所示
图4.32 阀值比较子VI接口示意图
4.2.3.2字符处理
① 功能:将输入的double型数据格式化为String型字符输出。
② 界面:字符处理子VI界面如图4.33所示:
图4.33 字符处理子VI界面
③ 程序设计:使用Number To Fractional String 函数将double型数据转换成6
位长度带3位小数的String型字符输出,如图4.34所示。
-59-
昆明理工大学工程硕士学位论文
-60-
图4.34 字符处理子VI 程序源代码
③接口:接口在被其他程序调用时起到图形化参数表的作用。如图4.35所示。
图4.35 字符处理子VI 接口示意图
4.2.3.3字符串处理
① 功能:将两个double 型数据格式化为String 型字符后,以“~”为分隔符组成
一个字符串输出。
② 界面:字符串处理子VI 界面如图4.36所示:
图4.36 字符串处理子VI 界面
③ 程序设计:使用Number To Fractional String
函数将double 型数据转换成6
位长度带3位小数的String 型字符,然后通过Concatenate String 函数
将两个字符连接成一个字符串输出。如图4.37所示:
图4.37 字符串处理子VI 程序源代码
图4.38 字符串处理子VI接口示意图
-61-昆明理工大学工程硕士学位论文
-62-