开发 XControl 4 – 外观功能VI

    外观功能 VI 用于定义 XControl 的界面,这里可以直接使用我们之前已经设计好的界面。把界面设计技巧 4 – 改进界面实现方法中设计好的棋盘棋子界面拷贝过来就可以了。这个外观功能VI窗口的大小,就是将来XControl控件的大小。所以这个VI的大小要刚好包裹住棋盘。

    外观功能VI的程序框图定义了当有事件发生时,XControl的反应。这是一个典型的事件处理结构。但是大家要注意到它的超时事件处理(下图),程序在这里设置了退出循环。实际上,这个程序框图并不是持续运行的,只有当XControl有事件发生时,LabVIEW才调用这一程序框图,在处理完这个事件后,立即退出这一程序框图。所以千万不要试图在这里添加持续执行的代码,比如控制XControl上的动画等等。

    从上图中还可以看到,外观功能VI有三个输入,和三个输出:
    Data In / Data Out,是XControl的数据,它的数据类型由数据功能控件定义。外观功能VI的程序框图开始运行时,Data In 输入的是XControl当前的值。程序框图运行过程中可以对这一值进行修改。修改后的值由Data Out 输出,返回给LabVIEW。
    Display State In / Display State Out,是XControl运行是用到的内部数据,在这里我们就把它成为状态。它的数据类型由状态功能控件定义。它也可以在程序运行中被改变,的输入输出方式与Data类似。
    Container State,是一个簇,用于表明XControl实例在VI面板上的状态。它有三个元素: Indicator? 表明XControl实例是否是一个显示控件,它的值为假时,表明XControl实例是一个控制控件。Run Mode? 表示XControl实例所在的VI是否处于运行状态。Refnum是指向XControl实例的引用。
    Action 用于通知LabVIEW程序在这次执行中对XControl所做的修改。它有三个元素:Data Changed?,State Changed?,Action Name。如果我们在程序中改变了Data,那么就一定要把Data Changed?设置为真,通知LabVIEW,这样改变的数据才会生效。同样,如果改变了State,则一定要把State Changed?设置为真。Action Name是一个字符串,可以给他输入一个表明这次程序运行的简短文字。这段文字会在LabVIEW的菜单项“编辑->撤销”中出现。

   外观功能VI中的事件处理结构主要处理两类事件,一类是针对XControl的特殊事件,另一类是用户在界面上操作产生的事件。

    针对XControl的特殊事件有4个:数据更改、显示状态更改、方向更改、执行状态更改。

    当把一个数值输入给XControl的实例时,就会触发数据更新事件。对于数据更新事件的处理一般是根据新的数据更新界面上的控件,和XControl的状态(Display State)。下图是黑白棋控件对数据更新事件的处理:根据新的期盼布局,刷新棋盘在界面上的显示;重新计算黑白子可以落下的位置。由于我们在处理这一事件的过程中,更新了XControl的状态,所以一定要把State Changed?设置为真。

     如果通过调用XControl的属性和方法,改变了XControl的状态的值,就会触发显示状态更改事件。对于数据更新事件的处理一般是根据新的状态值更新界面上的控件,XControl的数据和状态。下图是当用户调用黑白棋控件的“走子”这个方法,放下一颗新棋子后,外观功能VI对其的处理:放下新棋子,更新棋盘,计算新布局下黑白棋子可以放置的位置。因为这个操作及更新了黑白棋XControl数据,也更新了它的状态,所以Data Changed?和State Changed?都要被设置为真。

    当XControl实例控件由控制控件变为显示控件,或反过来变化的时候,就会触发方向更改时间。当XControl实例控件所在的VI由运行态变为编辑状态,或反向变化时,就会触发执行状态更改事件。对这两个事件的处理是类似的:在某些状态下,需要禁止用户在界面上的操作。在我们的黑白棋控件中,对这两个事件的处理是相同的。当控件为显示控件,并在运行状态时,禁止用户对界面点击。

    我们的黑白棋XControl只处理一个用户界面事件:当用户在棋盘上合法的位置点击鼠标时,走一步棋。当用户在即面上点击,首先判断这里可否落子,如果可以,则落下一子,更新XControl的数据和和状态,并产生一个事件。

《我和 LabVIEW》目录

Advertisements

One thought on “开发 XControl 4 – 外观功能VI

  1. 阮大侠:
      小弟新用LV,目前遇到一些难题,希望阮大侠能帮组解决。  
       1.程序运行速度的问题。目前做一个电路板的测试,测试项有很多,40多个大项,大项中有30多个小项,
         程序的运行是采用动态调用实现的,刚开机运行速度还可以,但过一会非常慢,
         是否与动态调用的资源释放有关系?
       2.6608板卡测量两个信号跳变的滞后时间,
          基本原理是用LV例程中的TWO EDGE SEPERATION MEASURENT.VI来实现的,硬件上采用先到信号连至AUX端,后发信号连至GATE端。
          测量两个信号上升沿跳变的滞后时间是可行的,但测下降沿时始终是0,实在不知原因为何。
      3.6608测量两个信号跳变的滞后时间的时机问题。
         由于要测的这两个脚(PIN100.PIN101)信号的跳变是因另外一脚(PIN99)加高电平引起的,而这两个信号的跳变滞后时间非常短1MS左右,99脚加电平也是通过一数字板卡实现的(PXI6120),目前采取的方案是测量时间的VI跟99脚加电平并行执行,即将这两个VI的ERROR IN 并联。
          请教阮大侠有没有更好的方案。
           不胜感激。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s