2023年11月30日发(作者:)

基于UIMessagesTestStandLabVIEWOI之间实现数据的双向传递

基于UI MessagesTestStandLabVIEW OI之间实现数据的双向传递

问题:

UI Messages可以将TestStand Engine状态、当前Execution的信息传递⾄LabVIEW⽤户界⾯(Operator Interface),UI Messages传递的数据类型

有三种:数值型(Numeric)、字符串(String)、对象引⽤(Object Reference)。如果期望将数组(Numeric ArrayString ArrayBoolean

Array)也从TestStand传递⾄OI;另外,如果期望从LabVIEW OI中将数据传递⾄TestStand,该如何实现。

解答:

在引⼊以上抛出的问题的解决⽅法之前,我们先简单介绍⼀下TestStand的对象模型。TestStand的核⼼是TestStand Engine,它是基于ActiveX/COM

的⾃动化服务器(Automation Server),严格的遵循⾯向对象编程(OOP)的⽅式,通过使⽤⽅法和属性将访问的接⼝提供给客户端,这些接⼝即

TestStand API。通过TestStand API,任何的编程语⾔如LabVIEWLabWindowsC#

/doc/ C++都可以和TestStand Engine进⾏交互,如在LabVIEW Operator Interface(后续简

LabVIEW OI)中,通过TestStand API 连接TestStand Engine,并唤起特定的Sequence执⾏,最后在LabVIEW OI中显⽰结果。OI本⾝并不执⾏

复杂的序列编辑等⼯作。

既然是遵循⾯向对象编程,那么TestStand Engine中所有的对象都将具备封装性、继承性和多态性。⽽TestStand中⼏个⽐较重要的对象是:Engine

ObjectSequenceContext ObjectRunState Subproperty

TestStand EngineTestStand架构的核⼼,Engine Object有许多⽅法,如唤起TestStand Engine、加载⽂件、发起Execution、⽤户登录等,这可

以通过Application Manager对象来完成(在OI中,每⼀个程序都将有⼀个对应的Application Manager)。如果我们要执⾏测试,必须在最开始先创

建⼀个TestStand Engine的实例。

SequenceContext ObjectTestStand API中被访问的最频繁的⼀个对象,因为它代表了⼀个Sequence的所有执⾏状态信息。SequenceContext

Object包含了⼀个特定Sequence在特定时间点的所有状态和背景信息。每⼀个处于执⾏中的Sequence都有⾃⼰独⽴的SequenceContext,所以如果

是有四个Sequences在并⾏执⾏,那将会有四个SequenceContext Objects。理解SequenceContext Object是⾮常重要的,因为通过它可以访问⼀个

Sequence的所有信息,包括Sequence的所有对象、变量和属性。从TestStand API Object的关系图中可以看到,SequenceContext Object是位于

API Object的顶端,通过它可以访问当前已加载到内存中的许多对象。并且,在TestStand中你也可以将SequenceContext做为参数传递⾄某个Step

Code Module

and API Object关系图

ntext的类型和包含的属性

RunState ObjectSequenceContextsubproperty,它包含Sequence运⾏时的状态。如StepIndexStepGroup等。这个Object就不做详细介绍。

好了,前⾯做了这么多的铺垫,就是为了要解决我们在⽂章开头提出的两个问题:

1)如何将Locals数组从TestStand传递⾄LabVIEW OI

2)如何从LabVIEW中将参数传递到TestStand中。

这两个问题的实现⽅法就是通过传递ThisContext。在TestStand Sequence File中添加PostUIMessageEx Step,分别将当前Step名称和ThisContext

做为参数传递到LabVIEW OI

3. PostUIMessageEx Step设置

LabVIEW OI中,需要添加UserMessage回调函数。在这⾥,我们将字符串和⽤户注册事件引⽤作为UserMessage回调函数的输⼊参数:

4. Configure Event Callbacks

UserMessage回调函数的程序框图如下,StringData返回的是NameOf(Step),传递给属性节点并修改StepName字符串控件的值。ActiveXData传递

的是ThisContext引⽤,作为事件数据并产⽣⽤户事件。

5. UserMessage回调函数程序框图

LabVIEW Top-level VI,由于注册了⽤户事件,因此UserMessage回调函数中产⽣⽤户事件激发Top-Level VI事件结构分⽀的执⾏。Variant to

Data函数将变体数据转换为ThisContext,使⽤TestStand – Get Property TestStand – Set Property 函数,结合Lookup String即可

以读取或修改数组。StepName字符串控件的值在UserMessage中被修改,因此⽤来做为条件结构的输⼊端,决定具体对ThisContext执⾏什么操

作。ThisContext引⽤配合StepName字符串控件的⽅式提供了⼀定的灵活性,⼤家可以在这个基础之上做修改和拓展。例如,在Sequence File的任

意位置添加了PostUIMessageEx Step,在LabVIEW Top-level VI中只需要在条件结构分⽀中添加⼀个分⽀,⽽不⽤修改整个框架。

6. LabVIEW Top-level VI事件结构处理分⽀

接下来我们来看⼀下程序的测试:

Main Sequence中,Setup Group中添加⼀个PostUIMessageEx Step,⽤来接收从OI传递的参数,并赋给_Delay数组;MainGroup

也添加⼀个PostUIMessageEx Step,⽤来将

_Delay数组的值从TestStand传回给OI,这样⼀个loop back操作即成功验证TestStandOI之间基于UIMessage双向通讯的可⾏性。

7. Sequence File

Top-level VIConfiguration页⾯中,先设置Step_Delay参数,然后读回参数值。

注意:由于ThisContext是当前执⾏Sequence的引⽤,当从TestStand传递ThisContext LabVIEW之后,LabVIEW通过ThisContext获取局部变量的

值,或者修改局部变量的值。如果ThisContext不存在,例如Sequence已执⾏完毕了,在LabVIEW中任何试图使⽤ThisContext访问Sequence将返回

错误对象不存在。所以推荐的⽅式是在UIMessage后⾯加⼀定的延时(如0.5s)。⽽且,不建议从LabVIEW传递⼤量数据到TestStand,⼤量数据

传递到TestStand请使⽤⽂件加载。

8. LabVIEW Top-level VI运⾏结果