在LV中Xcontrol这一块我发现很少有人用,以前查资料的时候也是不多,今天就我的理解分享一下Xcontrol的使用,这个东西我用的也不是很会,若是有不对的地方还请大方指正。我个人觉得在代码比较小的情况下没必要好用Xcontrol,因为建立起来确实很麻烦,步骤比较多,而且功能的话不是很好调试,因为功能封在了Xcontrol里面没有探针,也没办法用高亮去找问题,所以开始调试Xcontrol功能的时候有点头疼,但是弄好了之后还是很方便的。程序比较多,特别是多通道的时候Xcontrol还是很有优势的,比如你测试10个通道,比如前面板测试表格,按照一般的做法就是拉十个一样的出来,功能的话就写在几个VI里面,这样的话会有几个问题,1:程序10个通道的功能如果单单用那几个功能VI,怎么去区分其对应的通道?2:如果用一组功能VI那么程序跑的时候那几个VI需要设置重入执行,如果不重入执行,那就得复制9组功能VI,就很蠢。3:最主要的就是这个,加入后期因为客户的原因需要在原来的基础上增加功能,那要是有10组一样的功能VI那改起来不是血崩,前面板跟功能VI都要改,那可是很崩溃的。所以在复用这一块Xcontrol还是很有优势的,维护起来也方便,废话不多说下面讲讲怎么创建使用Xcontrol。
首先新建Xcontrol
新建好之后如下界面
可以看到创建后有4个:数据、状态、外观、初始化
数据跟状态其实在我看来没什么太大的区别(个人理解),因为我觉得数据能做的事情,状态也能做,可能是为了区别一下Data跟state才这样做的,这个后面讲,用法是一样的。外观不用说,就是显示在前面板的东西,初始化也好理解,里面可以写一些初始化的功能。
拿个我做好的例子讲吧,我这个是建的是个测试表格的Xcontrol。
如图这个效果。
数据:如图
数据可以理解为到时候传进去的值(Data),这个可以改,想是什么类型就是什么类型,我这里改成了簇,里面有两个元素:DataV和DataR
状态:我个人理解可以把它想成属性,因为用的时候它就在属性节点里面,这个状态其实一开始大概率是写不完的,大部分功能的扩展都在状态上去扩展。
如图,我这里状态也是把它的一些属性用簇打包在了一起,有表格的行、列信息、表格的引用、Reset属性(用于复位用的,比如测试完了之后重新表格上面显示的是上一轮的测试数据,新一轮要清空整个表格或者其它信息,就用这个Reset)定义为布尔,PASS_V和PASS_R两个布尔用于表示测试结果一个是电压结果一个是电阻测试结果、TableData用于表示整个表格数组、Spec这个二位数组表示测试规格(上下限信息)、ClassU18跟ClassStr表示测试的分类,只不过一个是U16表示一个是string表示。
外观:
如图,上面展示过了,这是放的一个表格控件,行首列首定义如图,上面可以看到有电压、内阻、挡位,也就对应数据里面的Data_V和Data_R,也对应状态的PASS_V,PASS_R,ClassU18和ClassStr,这里要注意的是这个前面板的大小到时候就对应整个Xcontrol外观的大小,Xcontrol的大小要在外观里面的更改。
初始化:初始化的话我这里没有写,用的默认的,也可以把一些状态,数据的初始化信息填在里面,我是在外观里面把初始化的东西写进去的,没用这里的。
OK,上面是介绍了Xcontrol基本的四项功能,下面介绍如何去做剩下的工作,接下来主要是介绍三个部分:1,状态部分的完善;2,外观功能的完善;3,Demo运用;
1:状态:上面提到了那些状态,
如图红色方框中可以看到除了那个SVI剩下的全部跟状态里面簇的数据一一对应,鼠标右键-新建-属性
如图拿状态里面的行来说,名称那里写行,方向默认读/写,这里的读写其实就对应到时候属性节点的读写,一般这里读写就好了,如果只用读或者只用写功能也可以单元,但是我喜欢都选,不用可以留着嘛。
点击添加之后如图,有个行读取和行写入,先点进去行读取
如图,可以看到默认的值都会是布尔,但是我们前面状态里面行的类型是值(I32),所以这里要把这个值替换成数值,定义数值I32,
替换好了之后,然后用按名称解绑把行提出来连接值就好了,
然后保存,我一般会建一个对应的文件夹保存这一组属性,如图
对于写属性同样的道理,先替换前面板布尔值然后用按名称捆绑把值连接起来保存,如图:
这样一个状态的其中一个属性就封装好了,剩下的根据这个方法封装就好了,所以我前面说Xcontrol很麻烦,就是这里这个操作很麻烦。全部弄完了之后就像这样了:
这样状态部分就大致这个样子了。
2:外观:其实Xcontrol的核心就在外观的程序面板里面了,打开外观和外观程序面板如图:
可以看到其核心就是一个事件结构,但是不同的是当Xcontrol放在程序的时候,不管代码运不运行这里的事件结构是一值运行的,所以你们看网上Xcontrol那个经典教程的时候就有一个鼠标移到布尔上布尔会变颜色就是这个原因。超时的话一般不用,数据更改促发的条件就是数据值变化的时候(前面提到的数据、状态、外观、初始化),显示状态更改对应的就是状态值变化的时候;方向改变:这个一般用不到,Xcontrol就是一个控件,比如这个Xcontrol是输入,当他变成输出的时候,就会触发这个条件结构。执行状态更改:当代码有调试状态变成运行状态的时候,或者运行状态变为调试状态的时候会执行这里面的程序。
如图红色圈出,Data In就是数据的值,Display State In就是状态的值,最下面那里解析出来时ActionName、Data Changed、StateChanged。ActionName我不用我也不知道干啥的,大部分好像都不用这个,Data Changed这个表示数据是否有改变,这个在数据更改这个事件结构下是T,不变化就是F,既然数据变化这个事件结构要执行所以这个分支下Data Changed肯定是给T。同理Sate Changed在显示状态分支下肯定也是给T的。
核心还是在数据更改和状态显示更改上面。
如图我这个数据更改里面的程序如图,这几个VI是放在新建的一个虚拟SVI文件夹下面的,
具体里面VI怎么建立的就不一一展开了,最后我也会把这个Xcontrol发出来,
第一个就是这个,把表格引用连到了TestTable的属性,这个就是上面状态里面的属性,
它主要是把表格的引用连起来后续使用
第二个P_F.vi如图
这个主要是判断测试的值是否在范围内,SPEC里面就是上下限规格,
Data就是Xcontrol的数据,程序里面那个表格就是SPEC的内容,这里主要是做了个数据进来判断在几档的一个功能。
如图第三个VI讲的就是把Data写进表格里面,这里用TableData属性存着
最后这个就是把分档(Class)写进表格,给分档标颜色,不在11档就为绿色,11档就是红色。
需要注意一下这里,这里在数据更改这个结构里面Data Changed肯定是要给T的,因为要触发这个结构数据肯定是变化了的,由于我们几个VI里面状态的值也有些在改变,所以我这里State Changge也给了T,有时候要是给错,里面对应的功能可能不会执行的,所以这里要注意下。
显示状态更改这里第一个跟数据更改一样就不多说了,第二个
这里主要是写了Reset功能(复位),当Reset为T时,复位。为F时,数据正常流下去。
执行方向这里没有写东西,一般用不上。
执行状态更改:如图上面提到了,这个生效是当程序运行时或者退出时生效的代码。
那个Run Mode?就是选择是哪个模式变化的,我这里没选,所以在运行或者退出的时候会执行这一段代码,如果运行或退出的时候要执行不同的功能,就可以用到Run Mode的这个去区分。
3.Demo演示
如图在SVI虚拟文件夹下建立一个Demo Test.vi,把刚刚建立的Xcontrol放前面板,Xcontrol命名为TestTable,然后创建引用。
然后创建其对应的属性节点发现在最下面就是我们之前封装好的状态里面的属性值,选择SPEC。
这样就把上下限给到SPEC里面了。
然后再给之前Reset下搞个初始化,把里面的属性全部清空,不然到时候第一次运行是好的,第二次就会有问题,总体完成后如下
后面For循环给了一个行信息和Data的信息,然后就可以开始模拟了。运行如底部视频,可以看出随着Data的进入,表格的数据填进去了,分档也进去了,颜色也有了。里面可以看出来我使用和不使用Reset的时候,显示是不同的,就是因为里面的行,TestTable里面的数据没有清空所以导致的。再运行结束后会发现整个表格清空了,就是触发了外观里面的执行状态更改,所以程序停止之后整个表格清空了。
这样以后有需要这方面的控件的直接拿出来用就好了,Xcontrol就相当于一个集成了功能的控件,只需要把接口留出来就好了,至于里面的算法,功能块,封装在外观里面就好了。再以后扩展也方便直接改Xcontrol就好了,多通道多拉几个Xcontrol就好了不会遇到一改动就改动一批的情况,Xcontrol也不单单限制与单控件,也可以把一堆东西整在一起封好成Xcontrol,如图这种,这是个十通道的,其中一个就是用一个Xcontrol封装的。*附件:Xcontrol.rar