2011年1月15日,第一稿
2011年7月20日,第二稿
2011年7月20日,第二稿
5.2 控制程序流程——运算符和算术表达式
图形化代码如何执行数据流的运行机制是我们所关注的问题之一。图形化代码最基本的控制程序流程的方法就是通过运算符和算术表达式。
5.2.1 数值运算符
在LabVIEW函数选板的数值子选板中,提供了许多数值运算符。这些数值运算符通过输入操作数和连线实现数值的相关运算。
连线并不是程序框图中的对象,因为我们根本无法设置独立的连线线段。连线的建立取决于数据源和数据终端的存在,并且二者的数据类型必须完全相一致。
一元数值运算符
所谓一元数值运算符就是指具有一个操作输入端的数值运算符。图形化代码提供了多种一元运算符,比如加1、减1、绝对值、平方、平方根、取负数、倒数等等。参见下图。
连线并不是程序框图中的对象,因为我们根本无法设置独立的连线线段。连线的建立取决于数据源和数据终端的存在,并且二者的数据类型必须完全相一致。
一元数值运算符
所谓一元数值运算符就是指具有一个操作输入端的数值运算符。图形化代码提供了多种一元运算符,比如加1、减1、绝对值、平方、平方根、取负数、倒数等等。参见下图。
显然图形化的一元运算符要比基于文本语言中的一元运算符丰富得多。所以在程序设计中使用会方便很多。当然还有数组元素相加、数组元素相乘、向上取整、向下取整等。
这些运算符仅仅适用于数值的计算,包括对波形数据中的数组元素(波形的幅值)的计算。对与枚举和下拉列表它们也是按数字显示的数值来进行处理的。
二元数值运算符
与其它基于文本的语言相类似,加、减、乘、除也是图形化代码中最基本的二元数值运算符。通过操作数(输入控件和常量)、连线与运算符相接(包括显示控件)就构成了最基本的控制程序流程。这种控制程序流程的方式也是最直观的。
二元运算符加、减、乘、除的基本运算规律我们是清楚的,但是对于数组和波形数据的处理是特殊的。
例 5-4 数组加、减、乘、除一个常数
数组加、减、乘、除一个常数,其结果是常数与数组中每个元素分别进行加、减、乘、除,参见下图。
这些运算符仅仅适用于数值的计算,包括对波形数据中的数组元素(波形的幅值)的计算。对与枚举和下拉列表它们也是按数字显示的数值来进行处理的。
二元数值运算符
与其它基于文本的语言相类似,加、减、乘、除也是图形化代码中最基本的二元数值运算符。通过操作数(输入控件和常量)、连线与运算符相接(包括显示控件)就构成了最基本的控制程序流程。这种控制程序流程的方式也是最直观的。
二元运算符加、减、乘、除的基本运算规律我们是清楚的,但是对于数组和波形数据的处理是特殊的。
例 5-4 数组加、减、乘、除一个常数
数组加、减、乘、除一个常数,其结果是常数与数组中每个元素分别进行加、减、乘、除,参见下图。
例 5-5 数组加、减、乘、除一个数组(维数不同)
数组加、减、乘、除一个数组,数组间的元素对应相互运算,结果是一个最小元素个数的新数组。
数组加、减、乘、除一个数组,数组间的元素对应相互运算,结果是一个最小元素个数的新数组。
例 5-5 波形数据与常数的加、减
波形数据加、减一个常数就是波形的零位的起始点的位移。参见下图。
波形数据加、减一个常数就是波形的零位的起始点的位移。参见下图。
我们看到波形数据加一个常数,导致波形的位移上移一个常数值(0.5)。当然,减一个常数相当于位移下降一个常数值。
如果我们将仿真信号的Offset的值设定=0.5,而加的常数值改为:0,其效果是完全一样的。
从物理意义上讲,相当于示波器的水平位移调节0.5,也相当于信号中加入0.5V的直流偏置。
如果使用例2-2的理想滤波器可以很容易将没有直流成分的信号提取出来,参见下图红色的波形。
如果我们将仿真信号的Offset的值设定=0.5,而加的常数值改为:0,其效果是完全一样的。
从物理意义上讲,相当于示波器的水平位移调节0.5,也相当于信号中加入0.5V的直流偏置。
如果使用例2-2的理想滤波器可以很容易将没有直流成分的信号提取出来,参见下图红色的波形。
例 5-7 波形数据与常数的乘、除
波形数据与常数相乘除,相当于波形幅值的现性缩放。其物理意义是实现波形幅度的增益或衰减的调节。类似于示波器的增益(衰减)开关。
波形数据与常数相乘除,相当于波形幅值的现性缩放。其物理意义是实现波形幅度的增益或衰减的调节。类似于示波器的增益(衰减)开关。
波形数据是图形化语言所特有的,通过波形数据与运算符之间的关系,来更深入理解波形数据的一些特殊性。同时,对应于工程中应用,也给出了实际物理意义。比如对比于虚拟示波器的设计,一个就是垂直位移的调节(加、减一个常数),另一个就是垂直增益的调节(乘、除一个常数)。
数值运算符确定了最基本的数据流运行方式,操作数、连线、显示结果。
数值运算符确定了最基本的数据流运行方式,操作数、连线、显示结果。
5.2.2 关系运算符
关系运算符会评估两个操作数之间的关系,评估的结果用布尔量来表示。关系运算符在函数选板的比较子选板中。
一元关系运算符
基本的一元关系运算符有这样几个,如下图所示。
一元关系运算符
基本的一元关系运算符有这样几个,如下图所示。
二元关系运算符
基本的二元关系运算符有这样几个,如下图所示。
基本的二元关系运算符有这样几个,如下图所示。
不过请注意,浮点数的比较是很严肃的事情,要注意数据精度间的关系。因为一个微小的差别也会导致不相等。比如同为Pi常数,一个是双精度数据(上),另一个是单精度数据(下),比较结果是不相等。但是我们从程序框图上很难看出它们之间的区别,参见下图。
由于关系运算符输出的是布尔量,所以利用比较关系可以控制程序的运行方向。比如比较结构为真,执行A程序段;比较结果为假,执行B程序段。
5.2.3 算术表达式
操作数、连线、运算符构成算术表达式。算术表达式中最需要注意的关系就是运算优先序。运算优先序在图形化语言中依赖于程序员的警觉性和对表达式的理解。因为我们一直以来已经习惯了先乘除,后加减的优先序,所以程序一定会按照这样的思路来设计。但是还要注意括弧的优先序最高。
由于图形化数据流编程的关系,我们很容易处理表达式中的优先序。
例 5-8 算术表达式中的优先序
对于公式:Y=A+B*C,
图形化的表示方法,参见下图。
由于图形化数据流编程的关系,我们很容易处理表达式中的优先序。
例 5-8 算术表达式中的优先序
对于公式:Y=A+B*C,
图形化的表示方法,参见下图。
该式的数据流关系非常明显,只有所有节点中的数据都到达后,Y才会输出最终值。同时也可以看出它的处理进程是过程式(命令式)的。
对于公式:Y=(A+B)*C,
它的图形化表示方法,参见下图。完全依赖我们的思维方式。
对于公式:Y=(A+B)*C,
它的图形化表示方法,参见下图。完全依赖我们的思维方式。
5.2.4 逻辑运算符
图形化代码满足了基本逻辑运算要求,包括很多个逻辑运算符,参见下图。
逻辑运算符中其它函数都好理解,只有“蕴涵”这个函数有些特别,这种逻辑关系不知何时需要使用。但是还是有人给出了自己的见解[11]。
“每次我想写一个条件代码需要满足如下要求:如果X是True而Y是False,那么做一些事情;如果是其它情况,那么就做其它事情。当我想写这样的代码时,经常会用到Implies函数(蕴涵)。”
与关系运算符一样,逻辑运算关系也是控制程序流程的一种基本方法。但是,为解决更复杂的问题仅有这些简单的方法是不够的。
“每次我想写一个条件代码需要满足如下要求:如果X是True而Y是False,那么做一些事情;如果是其它情况,那么就做其它事情。当我想写这样的代码时,经常会用到Implies函数(蕴涵)。”
与关系运算符一样,逻辑运算关系也是控制程序流程的一种基本方法。但是,为解决更复杂的问题仅有这些简单的方法是不够的。















