我创建了一个SUB VI并在其中定义了一个用户事件。 然后我创建了另一个VI,让它称之为MAIN VI。 我在主VI中放置了一个SUB VI,我想将SUB VI中创建的用户事件注册到MAIN VI中的事件案例,我该怎么办?
答案 0 :(得分:2)
你可以做到这一点,但需要付出努力。你试图做的通常是一个坏主意 - 你可以从下面的步骤中看出你需要做多少与LabVIEW的斗争。但由于它有时(很少)必要,我会告诉你如何做到这一点。但是,一般情况下,当你必须打这么多时,你可能想重新考虑并让调用者VI成为分配事件引用句柄然后将其传递给子VI的人,并且只让子VI生成事件。
无论如何......这就是你要求的......
第一步:在来电者VI中,使用"获取队列"并创建一个用户事件类型的队列(这意味着您需要删除所需的事件引用句柄类型的常量连接到"获取队列"元素类型终端)。
第二步:将队列添加到子VI的连接器窗格,并将创建的队列连接到子VI上的新终端。
第三步:修改子VI,以便在创建用户事件后,使用" Enqueue Element"将该用户事件排入队列。
第四步:回到呼叫者VI,以并行回到对子VI的调用,执行"出队元素"。现在,您在调用者中有了用户事件。
第五步:在调用者VI中使用Release Queue释放队列。
第六步:在来电者VI中,使用"注册活动"注册用户事件。现在您已准备好在事件结构中接收事件。
注意:上述过程提供无保证调用者VI将在子VI开始发送事件之前注册事件。如果子VI在调用Register For Events节点之前开始发送事件,则您将错过这些初始事件。您需要第二个信令机制来告诉子VI"好的,它可以安全地继续进行"。
第一步:在子VI的所有代码周围放置一个巨大的案例结构。电线?具有布尔控件的案例结构的终端。将该布尔控件添加到子VI的连接器窗格。现在,子VI的所有代码都在结构的TRUE情况下。
第二步:在FALSE情况下,输入代码来创建用户事件。创建用户事件的指示器并将其放在连接器窗格上。
第三步:使用案例结构的外部>来存储用户事件。不要提供反馈节点的任何初始化。
第三步:在调用者中,使用连接到其输入的FALSE调用子VI。子VI将分配事件引用句柄并将其返回给您。它还会将引用句柄存储在反馈节点中。
第四步:使用Register For Events节点在呼叫者VI中注册事件。
第五步:第二次调用子VI,这次传递TRUE。它将从反馈节点获取用户事件引用句柄的值。
注意:此版本可以防止错过第一个事件。
答案 1 :(得分:0)
选项2不需要布尔控件(至少在LabVIEW 2018+中)-子VI可以使用First Call函数,并且当返回True时,设置调用者需要的所有内容(也许事件引用句柄不是唯一的事情)需要-也许是一个类型为空的簇,将用于稍后传递数据)并返回-调用者获取并处理所有这些,然后再次调用subVI;然后,第一个调用返回False,并且子VI永远保持活动状态。
一种替代方法是使用两个subVI-:subVI_init和subVI_stay-调用者需要从第一个到第二个调用这两个有线连接,除了“错误输出”行必须通过“事件注册”以确保将在调用subVI_stay之前完成。
或者-如果在子VI中创建用户事件的主要原因是事件所使用的复杂数据结构,例如大型且可能是嵌套的簇(问题是在调用方中创建事件将需要访问空结构,并将其放在调用方中可能会使调用方太大)-使用单独的subVI_typedef。