2023年11月30日发(作者:)
基于UIMessages在TestStand和LabVIEWOI之间实现数据的双向传递
基于UI Messages在TestStand和LabVIEW OI之间实现数据的双向传递
问题:
UI Messages可以将TestStand Engine状态、当前Execution的信息传递⾄LabVIEW⽤户界⾯(Operator Interface),UI Messages传递的数据类型
有三种:数值型(Numeric)、字符串(String)、对象引⽤(Object Reference)。如果期望将数组(Numeric Array,String Array,Boolean
Array)也从TestStand传递⾄OI;另外,如果期望从LabVIEW OI中将数据传递⾄TestStand,该如何实现。
解答:
在引⼊以上抛出的问题的解决⽅法之前,我们先简单介绍⼀下TestStand的对象模型。TestStand的核⼼是TestStand Engine,它是基于ActiveX/COM
的⾃动化服务器(Automation Server),严格的遵循⾯向对象编程(OOP)的⽅式,通过使⽤⽅法和属性将访问的接⼝提供给客户端,这些接⼝即
TestStand API。通过TestStand API,任何的编程语⾔如LabVIEW、LabWindows、C#、
/doc/ 、C++都可以和TestStand Engine进⾏交互,如在LabVIEW Operator Interface(后续简
称LabVIEW OI)中,通过TestStand API 连接TestStand Engine,并唤起特定的Sequence执⾏,最后在LabVIEW OI中显⽰结果。OI本⾝并不执⾏
复杂的序列编辑等⼯作。
既然是遵循⾯向对象编程,那么TestStand Engine中所有的对象都将具备封装性、继承性和多态性。⽽TestStand中⼏个⽐较重要的对象是:Engine
Object、SequenceContext Object、RunState Subproperty。
TestStand Engine是TestStand架构的核⼼,Engine Object有许多⽅法,如唤起TestStand Engine、加载⽂件、发起Execution、⽤户登录等,这可
以通过Application Manager对象来完成(在OI中,每⼀个程序都将有⼀个对应的Application Manager)。如果我们要执⾏测试,必须在最开始先创
建⼀个TestStand Engine的实例。
SequenceContext Object是TestStand 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 Object是SequenceContext的subproperty,它包含Sequence运⾏时的状态。如StepIndex,StepGroup等。这个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操作即成功验证TestStand和OI之间基于UIMessage双向通讯的可⾏性。
图7. Sequence File
在Top-level VI的Configuration页⾯中,先设置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运⾏结果


发布评论