石鑫华视觉 发表于 2014-11-2 18:49:42

陈树学:LabVIEW中类if else结构的消除Case结构

问题如下:有这样一个问题:x的取值范围为【0-1000】,我想进行这样的操作:将x分为20等份,在每一等分中y取不同的值。即,在x=【0-50】时,y=a;x=【50-100】时,y=b;。。。一直到x=【950-1000】时,y=z。
最先能想到的解决办法就是嵌套case,但是这要20个case,太复杂,有没有什么办法可以不用嵌套?比如公式节点里面输入C语言?但是这样的程序c语言我不知道该怎么编,哪位指教一下~急求啊~~~
条件结构是编程三大基本结构之一(顺序、条件、循环),使用非常广泛也极为灵活,但是过多的条件分支也往往令人头疼。对于使用过其它编程语言的朋友们,会自然想起IF ELSE,但是LABVIEW却没有这样的结构。有些特定情况,可以考虑用数组来替代CASE结构,针对上面的问题我给出了下面的解决方法:因为X的取值范围是等间隔的,因此自然考虑到用数组取代CASE结构。类似的问题是非常常见的,如果不是等间隔的,按照C语言的编程习惯,我会自然考虑到使用公式节点来解决这个问题。在写这篇博文之前,我想到了另外一种适合LABVIEW的处理方法,因此我觉得应该写出来,供大家参考。对于涉及到取值范围的问题,往往间隔虽然不相同,但是必须是连续的,一般按照升序排列的,因此是可能利用数组来解决的。LABVIEW的数组操作极其方便,这个问题本身也可以归结到数组中,我们考虑这个问题需要两个数组:1、取值范围的数组假设X分成如下几段:0-5,5-11,11-24三段,多个范围时原理是相同的。2、值数组三段对应三个Y值,因此需要构建值数组。Y的类型可以任意的,比如数值、字符串等等,为了说明的更加清楚,我采用字符串数组。三个字符串对应三段数值。下面要考虑的问题是确定给定的X值到底位于那个段的问题了,幸运的是LABVIEW提供了这样的数组操作函数,不过一般用的不多,因此可能不熟悉,下面是帮助中的函数说明。LABVIEW的中文帮助一向是晦涩难懂的,可能是美式中文,中国人不习惯简单地说,给定一个值,该函数能够找出一个索引值,表明这个值所在的范围,这正是我们所需要的。无论分成多少段,上面的程序框图都是适用的,需要修改的就是数组值的问题了,相对于使用CASE结构,肯定是简洁方便多了。--------------------------------------------------------------------------------------------------------------------------------补充:对于这种判断范围的问题,除了中间分段的范围,通常还包括两侧的问题,所以我在下面做一些补充。另外上面的程序框图也存在一个BUG,阙值插值函数返回的是双精度数,而数组的索引是I32数据类型。上图中采用的是自动转换,会出现四舍五入的问题,比如1.6会转换成2,这是错误的,应该采用向下取整,即1.6应该转换为1。我修改了X和Y的范围,增加两侧区间,见下图:在测试时,我发现阙值插值函数的特性,在大于24时,可以返回正确结果,但是在小于0时,函数返回NaN。这个问题很好解决,加一个判断就可以了,完整的程序框图如下图所示:
页: [1]
查看完整版本: 陈树学:LabVIEW中类if else结构的消除Case结构

LabVIEW HALCON图像处理入门教程(第二版)
石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
《LabVIEW Vision函数实例详解》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24