第三章数组簇与波形.docx
- 文档编号:4163199
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:17
- 大小:242.11KB
第三章数组簇与波形.docx
《第三章数组簇与波形.docx》由会员分享,可在线阅读,更多相关《第三章数组簇与波形.docx(17页珍藏版)》请在冰豆网上搜索。
第三章数组簇与波形
第三章数据类型:
数组、簇和波形
3.1 概述
数组是同类型元素的集合。
一个数组能够是一维或多维,若是必要,每维最多可有231-1个元素。
能够通过数组索引访问其中的每一个元素。
索引的范围是0到n–1,其中n是数组中元素的个数。
图3-1所显示的是由数值组成的一维数组。
注意第一个元素的索引号为0,第二个是1,依此类推。
数组的元素能够是数据、字符串等,但所有元素的数据类型必需一致。
图3-1 数组示用意
簇(Cluster)是另一种数据类型,它的元素能够是不同类型的数据。
它类似于C语言中的stuct。
利用簇能够把散布在流程图中各个位置的数据元素组合起来,如此能够减少连线的拥堵程度。
减少子VI的连接端子的数量。
波形(Waveform)能够理解为一种簇的变形,它不能算是一种有普遍意义的数据类型,但超级实用。
3.2 数组的创建及自动索引
3.2.1 创建数组
一般说来,创建一个数组有两件事要做,第一要建一个数组的“壳”(shell),然后在那个壳中置入数组元素(数或字符串等)。
若是需要用一个数组作为程序的数据源,能够选择Functions»Array»ArrayConstant,将它放置在流程图中。
然后再在数组框中放置数值常量、布尔数仍是字符串常量。
下图显示了在数组框放入字符串常量数组的例子。
左侧是一个数组壳,中间的图上已经置入了字符串元素,右边的图反映了数组的第0个元素为:
”ABC”,后两个元素均为空。
图3-1 数组的创建
在前面板中创建数组的方式是,从Controls模板当选择Array&Cluster,把数组放置在前面板中,然后选择一个对象(例如数值常量)插入到数组框中。
如此就创建了一个数值数组。
也能够直接在前面板中创建数组和相应的控制对象,然后将它们复制或拖曳到流程图中,创建对应的常数。
还有很多在流程图中创建和初始化数组的方式,有些功能函数也能够生成数组。
3.2.2 数组控制对象、常数对象和显示对象
通过把数组与数值、布尔数、字符串或簇组合在一路,能够在前面板和流程图中创建任何一种控制对象、常数对象和显示对象。
数组元素不能是数组、图表或图形。
若是您想查看一些数组的例子,请查看Examples\General\中的例子。
3.2.3 自动索引
For循环和While循环能够自动地在数组的上下限范围内编索引和进行累计。
这些功能称为自动索引。
在启动自动索引功能以后,当把某个外部节点的任何一维元素连接到循环边框的某个输入通道时,该数组的各个元素就将按顺序一个一个地输入到循环中。
循环会对一维数组中的标量元素,或二维数组中的一维数组等编制索引。
在输出通道也要执行一样的工作――数组元素按顺序进入一维数组,一维数组进入二维数组,依此类推。
在默许情形下,对于每一个连接到For循环的数组都会执行自动索引功能。
能够禁止那个功能的执行,方式是用鼠标右键单击通道(输入数组进入循环的位置),在快捷菜单当选择DisableIndexing。
练习3-1创建一个自动索引的数组
目的:
利用For循环的自动索引功能创建数组,并用一个图形(Graph)显示该数组。
前面板
图3-2 练习3-1的面板
1.
打开一个新的前面板。
2.
选择Controls»Array&Cluster,在前面板中放置一个数组。
设置它的标签为WaveformArray。
3.选择Controls»Numeric,在数组框中插入一个数字式显示对象。
如右图所示。
它用于显示数组的内容。
4.选择Controls»Graph,在前面板中放置一个波形图。
设置它的标签为WaveformGraph。
5.隐藏图例和模板。
6.用鼠标右键单击图形,并在快捷菜单中取消选中YScale»AutoscaleY,禁止自动坐标功能。
7.利用文本工具,把Y轴的范围改成到。
流程图
8.依照下图创建流程图。
图3-2 练习3-1的流程图
●由Functions»SelectaVI…寻觅LabVIEW\activity目录
下的GenerateWaveformVI,它的作用是返回波形中的某一点。
那个VI需要输入一个索引,咱们将循环周期连接到那个输入。
●注意GenerateWaveformVI连出来的连线在循环边界变成一个数组时会变粗,正是在那个边界处形成了一维数组。
●For循环会自动累计边界内的数组。
这种功能叫做自动索引。
在那个例子中,连接到循环计数输入的数值常数令For循环创建了一个由100个元素组成的数组。
●
Bundle函数(Functions»Cluster)——将图块中的各个组件组合成一个簇,在正确连接以前需要改变该函数的图标的大小。
将移位工具放在图标的左下角。
变形工具会变成如左图所示,拖曳鼠标直到出现第三个输入端子。
●数值常数(Functions»Numeric)——三个数值常数用于设置For循环执行的周期数N=100,初始X=0和deltaX=1。
9.之前面板执行该VI。
该VI将把自动索引后的波形图数组显示在波形图中。
10.把X的delta值改成,X的初始值改成20。
再次执行该VI。
注意,波形图此刻一样显示100个点,而每一个点的初始值为20,X的delta值为(见X轴)。
11.只需在显示器中输入元素的索引号就可以够查看波形数组中的任何元素。
若是输入的数比数组的元素个数大,那么显示器将变暗,表示您没有为该元素设置索引。
若是需要一次查看多个元素,能够通过改变数组显示对象的大小来实现。
把定位工具放置在数组框的右下角。
工具将变成右图所示的变形工具。
当工具变形时,用鼠标拖曳数组的右边或下边。
数组此刻就可以够依照元素索引的上升顺序显示多个素,以某个与指定索引对应的元素开始,如下图所示。
图3-3 练习3-1中多个数组元素的同时观察
在前面的流程图中,您为波形图指定了初始的X值和deltaX值。
默许的X初始值是0,deltaX值是1。
如此,也能够把波形数组直接连接到波形图端子,而无需指定初始的X值和deltaX值,如图3-4所示。
图3-4 练习3-1利用默许X及DeltaX时简化后的流程图
12.按上图删除Bundle功能函数和它所连接的常数对象。
方式是用移位工具选择该功能函数和连接的常数对象,按下
再选择Edit»RemoveBadWires。
依照上图完成流程图的连线。
13.执行该VI。
注意初始的X值是0,deltaX值是1。
●多图区图形
能够创建含有多条曲线的图形,方式是创建一个数组,用它来聚集传给单图区图形的类型的数据元素。
图3-5 练习3-1多图区图形的流程图
14.
依照上图创建流程图。
●正弦函数(Functions»Numeric»Trigonometric)——在这里,它用于在For循环中创建一个由数据点组成的数组,表示一个正弦波周期。
●
Pi常数(Functions»Numeric»AdditionalNumericConstants)
●
BuildArray(Functions»Array)——在这里,它用于创建适合的数据结构(一个二维数组),在波形图中绘制两条曲线。
。
用移位工具拖曳边角能够增大该函数的面积,创建两个输入端子。
15.返回前面板,执行该VI。
注意同一个波形中的两个图区。
默许情形下,它们的X初始值都是0,deltaX初始值都是1。
下图是该程序的运行结果(前面板未改动)。
16.把该VI保留为LabVIEW\Activity目录中的GraphWaveform。
17.能够修改图形中的某个图区的外观。
方式是,用鼠标右键单击那个图形,再从弹出菜单选择对应的图例。
图3-6 练习3-1多图区图形的面板显示
练习3-1 结束。
在上面那个例子中,由于计算端子连接了一个值为100的常数对象,所以For循环将执行100次。
下面那个例子显示了另外一种控制循环执行次数的方式。
更详细的例子建议调阅Examples》Fundamentals》GraphsandCharts》GraphExamples》WaveformGraph例子。
练习3-2 对输入数组利用自动索引功能
目的:
打开并执行一个VI,它将在一个For循环中利用自动索引功能处置一个数组。
1.选择File»Open…,打开Examples\General\中的SeparateArrayValuesVI。
2.打开流程图。
下面的示用意显示的是在TRUE和FALSE时的情形。
图3-7 练习3-2的流程图
注意,InputArray引出的连线与For循环外的粗线不同,表示这是一个数组,而循环内部的细线则表示这是一个数组元素。
数组元素在每一个循环期间将自动编号。
●用自动索引功能设置For循环的计数器
注意,计数器端子尚未连线。
当您对某个进入For循环的数组利用自动索引功能时,循环就将按照数组的大小执行相应的次数,如此就无需连接某个值到计数器的端口。
若是对一个以上的数组利用自动索引功能,或在利用自动索引功能之外还需要设置计数器时,实际的循环次数将是其中最小的数。
3.执行该VI。
在输入的八个数中,能够看到4个属于正数数组,另外4个属于负数数组。
4.从流程图中将一个值为5的常数对象连接到For循环的计数器端子。
执行该VI。
能够看到虽然输入数组仍然有八个元素,可是3个位于正数数组,另外2个位于负数数组。
这说明,若是设置了N并开启了自动索引功能,那么实际循环的次数将取较小的数。
5.关闭该VI,不要保留任何修改。
注:
练习3-2的算法说明
下面是一段伪代码,解释上面的算法,假定输入数组为A(已赋值),B(正数)、C(负数)。
Sbr、Scr别离是与B数组、C数组对应的右寄放器数组,Sbl、Scl别离是与B数组、C数组对应的左寄放器数组,size运算为测数组实际大小,ins运算为将一个数插入数组中最左侧的空位。
B=0
初始化
C=0
K=size(A(.))
测A数组大小
Fori=0tok-1
p=A(i)
取第I个元素值
ifp>=0then
Insp,Sbr
将p值插入右寄存器
Else
Insp,Scr
endif
Sbl=Sbr
右寄存器值送给左寄存器
Scl=Scr
Nexti
B=Sbr
右寄存器值送到正数组
C=Scr
PrintB
显示
PrintC
End
练习3-2结束。
3.3 数组功能函数
LabVIEW提供了很多用于操作数组的功能函数,位于Functions»Array中。
其中包括ReplaceArrayElement,、Search1DArray、Sort1DArray、Reverse1DArray和MultiplyArrayElements等等。
●
创建数组——BuildArray函数(Functions»Array),用于按照标量值或其他的数组创建一个数组。
开始时,BuildArray函数具有一个标量输入端子。
您能够按照需要向该功能函数中加入任意数量的输入,输入能够是标量或数组。
若是要添加其他的输入,用鼠标单击函数的左侧,在弹出菜单当选择AddElementInput或AddArrayInput。
还能够用变形工具来增大节点的面积(把移位工具放置在某个对象的边角就会变成变形光标)。
也能够利用变形光标或选择RemoveInput来删除输入。
下图显示了利用流程图中的常数对象的值创建和初始化数组的两种方式。
左侧的方式是,将5个字符串常数放入一个一维字符串数组中。
右边的方式是,将三组数值常数放入三个一维数值数组,再将这三个数组组成一个二维数组。
如此最后产生的是一个3x3的数组,三列别离是3,4,7;–1,6,2;5,–2,8.。
还能够通过结合其他的含有标量元素的数组来创建数组。
例如,假设有两个数组,三个标量元素,可把它们组成一个新的数组,顺序是:
数组1,标量1,标量2,数组2,标量3。
●
初始化数组(InitializeArray)——用于创建所有元素值都相等的数组。
下图中,该功能函数创建了一个一维数组。
元素输入端子决定每一个元素的数据类型和数值,维长度输入端子决定数组的长度,例如,假设元素类型是长整型,值为5,维长度为100,那么创建的数组是一个一维的、由100个值为5的长整型元素组成的数组。
也能够之前面板控制端子、流程图常数或程序其他部份的计算结果取得输入。
创建和初始化一个多维数组的方式是,用鼠标右键单击函数的右下侧,在弹出菜单当选择AddDimension。
还能够利用变形光标来增大初始化数组节点的面积,为每一个增加的维添加一个维长度输入端子。
也能够通过缩末节点的方式来删除维,即从函数的弹出菜单当选择RemoveDimension,或利用变形光标。
下面的示用意显示了如何初始化一个三维数组。
若是所有的维长度输入都是0,该函数会创建一个具有指定数据类型和维数的空数组。
●数组大小——ArraySize函数,返回输入数组中的元素个数。
●数组子集(ArraySubset)——选取数组或矩阵的某个部份。
该函数能够返回从某个指针开始的部份数组,并包括了长度元素。
下图显示了一些数组子集的例子,注意,数组索引从0开始。
●索引数组(IndexArray)——用于访问数组中的某个元素。
下图显示了一个索引函数的例子,它用于访问数组中的第三个元素。
注意,因为第一个元素的索引为0,所以第三个元素的索引是2。
将一个二维数组与IndexArray函数相连,IndexArray就会含2个索引端子。
将一个三维数组与IndexArray函数相连,IndexArray就会含3个索引端子。
余类推。
能够利用的索引端的符号是一个黑方快,被禁止利用的索引端(DisableIndexing)是一个空心的小方框。
当给一个被禁止利用的索引端连接上一个Constant或Control是它会自动变成黑方快,即变成能够索引,相反原来一个能够利用的索引端上连接的Constant或Control被删去时,索引端符号会自动变成空心的小方框,即变成禁止利用。
也能够依照任何维的组合提取子数组,下面的示用意显示了如何从一个二维数组中提取一个一维的行或列数组。
还能够从一个三维数组中提取一个二维数组,方式是禁止两个索引端子,或通过禁止一个索引端子提取一个一维数组。
下图显示了从三维数组提取数组的各类方式。
下面的规则对利用剪切数组进行了规定:
输出对象的维数必需等于被禁止的索引端口的数量。
例如
0个索引端口被禁止=标量元素
1个索引端口被禁止=二维元素
2个索引端口被禁止=三维元素
启动的端子所连接的数值必需指定输出元素。
如此,您就可以够理解,上图中左下方的例子的作用是,利用0列和3行的所有元素产生一个一维数组,而右上方的例子的作用是利用第一帧中的所有元素产生一个二维数组。
新的第0个元素是与原有元素最近的元素。
练习3-3 利用创建数组功能函数
目的:
利用创建数组函数,把一些元素和输出组织成一个更大的数组。
图3-8 练习3-3的面板和框图
1.依照图3-8创建一个前面板。
2.从Controls»Numeric模板当选择一个数字控制对象放置在前面板中,设置它的标签为scalar1。
3.复制并粘贴该数字显示对象,创建两个新的对象,并别离设置它们的标签为scalar2和scalar3。
4.创建一个数字控制对象的数组,设置它的标签为array1。
复制并粘贴它,创建一个新的数组,设置它的标签为array2。
5.在array1、scalar1、scalar2、scalar3、array2中输入数值1到9。
6.创建流程图。
选择Functions»Array,在流程图中放置一个BuildArray功能函数。
用定位工具增大函数额面积,以容纳5个输入。
7.把数组和标量与BuildArray连接起来。
创建输出的一维数组,它由array1、scalar1、scalar2、array2、scalar3中的元素所组成,如图所示。
8.执行该VI。
能够看到array1、scalar1、scalar2、scalar3、array2中的数值出此刻同一个一维数组中。
9.保留该VI为LabVIEW\Activity目录下的Build。
练习3-3结束。
3.4 什么是多态化(Polymorphism)?
多态化是指一种函数功能,即能够协调不同格式、维数或显示的输入数据。
大多数LabVIEW的函数都是多态化的。
例如,图3-9给出了Add函数的一些多态化组合。
图3-9 多态化组合的例子
第一个组合中,两个标量相加,结果仍是一个标量。
第二个组合中,该标量与数组中的每一个元素相加,结果是一个数组。
数组是数据的集合。
第三个组合中,一个数组的每一个元素被加到另一个数组的对应元素中。
您还能够利用其他的组合,例如数值簇或簇数组。
能够把这些准则应用到其他的G语言函数或数据类型。
G语言函数对于各类情形都具有多态性功能。
有些函数同意数值和布尔输入,而有些函数同意其他任何数据格式的组合。
若是您想了解更多关于多态化的知识,请参阅OnlineReference»FunctionandVIReference。
3.5 簇
3.5.1 创建簇控制和显示
在前面板上放置一个簇壳(Clustershell)就创建了一个簇。
然后你能够将前面板上的任何对象放在簇中。
例如数组,你也能够直接从Control工具板上直接拖取对象堆放到簇中。
一个簇中的对象必需全数是Control,或尽是Indicator,不能在同一个簇中组合Control与Indicator,因为簇本身的属性必需是其中之一。
一个簇将是Control或Indicator,取决于其内的第一个对象的状态。
若是需要能够利用工具重置簇的大小。
右图所示是一个含4个Control的簇。
也能够在流程图上用类似的方式创建簇常数。
若是你要求簇严格地符合簇内对象的大小,可在簇的边界上弹出快速菜单选择自动概念大小(Autosizing)
簇的序(Order)
簇的元素有一个序,它与簇内元素的位置无关。
簇内第一个元素的序为0,第二个是1,等等。
若是你删除一个元素,序号将自动调整。
若是你想将一个簇与另一个簇连接,这两个簇的序和类型必需同一。
若是想改变簇内元素的序,可在快速菜单当选择ReOrderControlsInClaster,这时会出现一个窗口,在该窗口内能够修改序。
3.5.2 利用簇与子VI传递数据
一个VI的连接窗口最大有28个端子,若是你不希望利用全数28个端子传递数据,这既烦琐又易犯错。
通过把控制或显示对象捆绑成一个簇的方式,仅利用一个端子就可以够实现该功能。
●
捆绑(Bundle)数据
Bundle功能将分散的元件集合为一个新的簇,或允许你重置一个已有的簇中的元素。
能够用位置工具拖曳其图标的右下角以增加输入端子的个数。
最终簇的序是取决于被捆绑的输入的顺序。
右图中Bundle图标中部的Claster端子用于用新元素重置原簇中的元素。
●分解(Unbundle)簇
Unbundle功能是Bundle的逆进程,它将一个簇分解为若干分离的元件。
若是你要对一个簇分解,就必需明白它的元素的个数。
LabVIEW还提供一种能够按照元素的名字来捆绑或分解簇的方式,稍后介绍。
练习3-4 簇
目的:
学习创建簇、分解簇,再捆绑簇而且在另一个簇中显示其内容。
图3-10 练习3-4的面板和框图
1.打开前面板,创建一个簇壳(Array&Clusterpalette),标签改成InputCluster,拖曳至适当大小。
2.在那个簇壳中放置一个数字Control,两个布尔开关,和一个串Control。
3.仿照以上步骤,创建OutputCluster如上。
注意将各Control改成相应的indicator。
4.用快速菜单查看两个簇的序是不是一致,如有不同,改之。
5.在前面板上设置一个[STOP]按钮。
注意其缺省值为FALSE,不要改变它的状态。
6.成立如上面所示的流程图。
注意在[STOP]按钮与循环条件端子之间接入了一个NOT函数,因为按钮缺省值为FALSE,经NOT函数后变成TRUE,这就意味着当按钮状态不变时,循环继续执行,相反一旦按钮动作,则循环终止。
在6i版本中那个设置能够简化,没必要利用NOT函数,直接将[STOP]按钮与循环条件端子相连,然后用鼠标右键点击循环条件端子,选择stopiftrue即可。
结果如右图所示。
7.返回前面板并运行VI。
在输入簇中输入不同的值观察输出。
8.关闭并保留程序。
Cluster
练习3-4 结束
3.5.3 用名称捆绑与分解簇
有时你并非需要聚集或分解整个簇,而仅仅需要对其一、两个元素操作。
这时你能够用名称来捆绑与分解簇。
在Cluster工具模板中除Bundle及Unbundle功能外,还提供有BundleByName和UnbundleByName功能。
它们允许按照元素的名称(而不是其位置)来查询元素。
与Bundle不同,利用BundleByName能够访问你需要的元素,但不能创建新簇;它只能重置一个已经存在的簇的元素,同时你必需给BundleByName图标中间的输入端子一个输入以申明要替换其元素的簇。
Unbundle可返回指定名称的簇元素,没必要考虑簇的序和大小。
例如,若是你想重置上例中Boolean2的值,就可以够利用BundleByName功能而没必要担忧簇的序和大小。
与此类似若是你要访问串的值,能够利用UnbundleByName功能。
图3-11 用名称操作簇
在上面的例子中,ClusterControl中有两个元素,一个是数据类型(名称是Numeric),另一个是字符串型(名称是String),另一个控制是字符串“ABCD”,框图如右所示,运行该程序,即可将簇内的字符串值重置。
(本例中为了使BundleByName的输入端由Numeric变成String,需利用快速菜单中的SelectItem项操作。
)
3.5.4 数组和簇的互换
有时你会发觉,将数组变成簇(或相反)很方便。
尤其是因为LabVIEW包括的关于数组的操作功能多于簇。
例如,前面板上有一个多按钮的簇,你希望倒置这些按钮值的序。
好了,Reverse1DArray功能正好可用,可是它仅可用于数组。
这没关系,你能够利用功能ClustertoArray将簇转换为数组,利用Reverse1DArray切换开关的值,最后再利用ArraytoClaster变换回簇。
3.6 Waveform数据类型
在数据收集和信号分析中常常要碰到波形数据,在LabVIEW6i中增加了Waveform数据类型,使得波形的描述加倍简练。
Waveform数据类型包括了波形的数据(Y)、起始时刻(t0)和步长ΔX,利用Waveform模板的BuildWaveform函数能够成立一个波形。
许多用于数据收集和波形分析的VI和函数的缺省状态都同意或返回Waveform数据类型。
当你将一个Waveform数据类型连接到WaveformGraph或Chart时,会自动画出相应的曲线。
图3-12 利用Waveform的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 数组 波形