使用LabVIEW编写程序时,工程师都会将自己程序中的部分代码封装为子VI,而封装的部分可能是某个经典的算法,也可能是调用某个设备的专用代码,还可能是实现某个功能的模块。总之,为了提高程序的整洁度和可阅读性,使用模块化思想去封装子VI是开发过程中十分重要的步骤。
而在封装子VI的过程中有时会遇到功能实现相类似但输入数据类型不同的情况,这时可能需要封装多个子VI以满足所有的需求,LabVIEW其实提供了更适用的方法,今天小编为大家带来的子VI设计中的多态VI和自适应VI就是为此而生,进一步简化程序并提高可阅读性。
一、多态VI 多态VI的概念: 多态VI最早是在LabVIEW 6.0被引入的,它能够在指定的输入以及输出端口上接受不同的数据类型。不同的数据类型可以是指不同的数据表示法或不同的数据维数大小。一个多态VI是一组子VI的集合,这些子VI都有一个共同的特点,它们的连线板模式都是类似的,每一个子VI对应着多态VI中的一个VI实例。LabVIEW中有很多多态VI,比如NI-DAQmx驱动库中的读取、写入、定时、触发等。
多态VI的使用场景:
当我们想要对不同数据类型的数据执行类似或相同的操作的时候,就可以使用多态VI。根据连接在输入接线端上数据的类型不同,多态VI会自动选择对应的实例子VI。多态VI允许用户将它应用到功能类似的不同应用实例中去, 并且这些不同的应用实例处理了不同的数据类型的数据。这样就可以让用户把数据类型不同所造成的VI结构差异在VI的内部就自动处理掉,从而不需要为不同的数据类型放置多个不同的处理VI。
创建多态VI:
1、创建不同的子VI实例,小编创建了几个不同数据类型简单计算的实例,;
2、在LabVIEW的新建模板界面选择新建多态VI;
3、在创建的多态VI中选择添加刚才创建的几个实例VI,添加完成后可以给它们分别自定义菜单名称(在程序框图面板右键多态VI>>选择类型中显示的名称)和选择器名称(多态VI选择器显示的名称);
4、根据需要勾选对应的配置,其中程序框图外观勾选“绘制多态VI图标”和“绘制实例VI图标”会决定多态VI显示的图标。“默认显示选择器”选项决定在使用时图标下方是否显示多态VI选择器(举例说明:NI-DAQmx的定时API就是一个多态VI,而它图标下面的下拉列表框其实就是多态VI选择器)。“允许多态VI自动匹配数据类型”选项可以让多态VI自动识别输入的数据类型并选择对应的实例;
5、多态VI就制作完成后测试其功能。如下图所示,连接不同数据类型时多态VI会自动选择并执行对应的实例,后续如果要扩展其兼容的数据类型,可以向多态VI中添加新的实例VI;
二、自适应VI
自适应VI的概念:
自适应VI可以自动适应输入的数据类型,它的所有接线端均为多态。用户每次将输入数据连线至接线端时,自适应VI将自动检查连线的数据类型是否可以接受。如可以接受该类型,自适应VI会将接线端自动调整为该输入数据类型;如果不接受该类型则会显示断线。通过自适应VI可以对任意可接收的数据类型执行相同的操作,而无需为每种数据类型保存单独的VI副本。
自适应VI的使用场景:
自适应VI和多态VI的使用场景相类似,需要对不同数据类型进行相似处理的时候使用,为了提高灵活性,自适应VI也可以支持对某些特定数据类型进行特殊处理。LabVIEW 2020就加入了一些自适应VI,它们的图标都是以橙色为背景,比如数组选板中的“排序二维数组”。
创建自适应VI:
1、在LabVIEW的新建模板界面选择新建自适应VI,也可以新建一个普通VI后将其后缀名更改为.vim,这个VI就会变为一个自适应VI;
2、使用“类型专用结构”编写自适应VI的功能,如果有特殊数据类型需要做特殊处理,可以单独为其创建分支来处理该数据。小编创建了一个数组求和的自适应VI,该VI可以对一维数组进行求和。其中一维布尔数组要先经过“布尔至0,1转换”之后再求和;一维字符串数组要先进行“分数/指数字符串至数值转换”后再求和。
一维数组求和
对布尔数组进行特殊处理
对字符串数组进行特殊处理
3、自适应VI创建完成后测试其功能。如下图所示,该自适应VI可以自动适配输入的一维数组数据类型并且执行对应功能,如果后续有要扩展的数据类型,也可以直接打开自适应VI为它创建专用的分支。
三、两者对比
多态VI与自适应VI都可以为不同输入数据类型执行其对应的功能,但他们并不是完全相同的,它们之间也有一些不同点,下面这个表格可以清晰地看到两种VI之间的一些对比:
多态VI | 自适应VI | |
实现方式 | 带一组预定义的可接受数据类型的实例VI组。 | 自动计算实现是否接受某种数据类型的单个VI。 |
连线板 | 不同实例VI可以自定义不同的连线板。 | 所有数据类型的连线板相同。 |
生成 | 为每种数据类型创建一个实例VI,并将实例VI包含在多态VI中。 | 创建带.vim文件扩展名的VI,或通过将VI扩展名更改为.vim以将标准VI转换为自适应VI。 |
自定义 | 在不同实例VI中实现不同的代码,以此对不同数据类型定义不同行为。 | 使用类型专用结构在自适应VI中为特定数据类型自定义代码。 |
自适应类? | 否,调用类A方法a的多态VI只接受类A或类A的子孙类。 | 是,如果自适应VI调用类A方法a,则其可接受任何具有与类A方法a相同名称、连线板模式、接线端方向的公共方法的类。 |
在封装子VI时,工程师应该在什么情况下选择使用多态VI?在什么情况下使用自适应VI呢?下面这个表格可以带给我们答案:
类型 | 适用场景 |
多态VI |
1、对于不同的数据类型,操作的实现不同。 2、不同数据类型的连线板不同。 |
自适应VI |
1、可对不同数据类型以相似方式实现操作而无需针对特定数据进行大量自定义。 2、面向对象编程时可以自动适应输入类。 |
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !