打开SubVI,多次更新,关闭它

时间:2015-09-25 15:10:58

标签: labview

我对LabView中的任务有一个问题,我认为这个问题很简单,很标准,但我还是没有完成它。

任务:我有一个测量VI,可以循环获取数据。这可能需要一段时间,因此我想向用户显示不完整的数据集“随着它的增长”。这应该在一个额外的窗口中完成,所以我想(需要?)使用SubVI。 我希望这个SubVI的前面板在测量开始时打开并在结束时关闭

我将它放在测量循环中,因此在每个新的数据点被捕获后它会被调用,并且可以显示更新的数据集。我将它设置为“在调用时显示前面板”,因此它在测量开始时(循环的第一次迭代)打开,就像我想要的那样。但它没有关闭。如果我检查“如果最初关闭后关闭”它会在循环的每次迭代后关闭,这非常烦人。

此外,我尝试使用Invoke节点调用FP.OpenFP.RunFP.Close,但后来我不知道如何在测量循环中实际调用SubVI并将数据提供给它。

我的方法中是否存在一般误解?或者是否有一个我未能发现的明显解决方案?

3 个答案:

答案 0 :(得分:1)

听起来好像你有SubVI显示你想要的数据,它只是在你被卡住的正确时间关闭前面板。在这种情况下,最简单的方法是将VI保持在测量循环中,并检查public class TextActivity extends AppCompatActivity { public ImageButton monImageBouton; public Button monBouton; public TextView monTextView; public static RadioButton monBoutonRadio; public static String langueChoisie = "francais"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text); // une des solutions pour rendre la zone trado scrollable TextView myXmlContent = (TextView)findViewById(R.id.zone_trado_scrollable); myXmlContent.setMovementMethod(new ScrollingMovementMethod()); verifLangue(); playText(); test("button8"); // indique la langue choisie } public void verifLangue(){ if(langueChoisie == "english"){ monBoutonRadio = (RadioButton)findViewById(R.id.english); monBoutonRadio.setChecked(true); } else if(langueChoisie == "espanol"){ monBoutonRadio = (RadioButton)findViewById(R.id.espanol); monBoutonRadio.setChecked(true); } else if(langueChoisie == "chinois"){ monBoutonRadio = (RadioButton)findViewById(R.id.chinois); monBoutonRadio.setChecked(true); } else{ monBoutonRadio = (RadioButton)findViewById(R.id.francais); monBoutonRadio.setChecked(true); } } public void onRadioButtonClicked(View view) { boolean checked = ((RadioButton) view).isChecked(); // Check which radio button was clicked switch(view.getId()) { case R.id.english: if (checked) langueChoisie = "english"; break; case R.id.francais: if (checked) langueChoisie = "francais"; // checked et définie a priori break; case R.id.espanol: if (checked) langueChoisie = "espanol"; break; case R.id.chinois: if (checked) langueChoisie = "chinois"; break; } }` 设置,并在循环结束时使用Show Front Panel When Called方法关闭前面板:

Use of FP.Close method (VI snippet)

这意味着您每次循环都会将所有获取的数据传递给子VI;如果数据的大小很小,这不是问题,但是如Joe建议的那样,更具可扩展性的方法将是使用队列的生产者/消费者模式。要做到这一点:

  • 在顶级VI中创建队列并将参考传递到您的测量循环
  • 同时将队列引用传递给子VI,该子VI位于外部您的测量循环
  • 您的子VI包含消费者循环,它等待队列中的数据并用它更新子VI的显示
  • 调用时不要将子VI设置为显示其前面板;在您的顶级VI中使用FP.CloseFP.Open方法在需要时打开和关闭其前面板。

当你的顶级VI完成时,你需要给subVI一些知道何时退出的方法;一种方便的方法是强制破坏顶级VI中的队列,这将导致子VI中的FP.Close退出并出错。

另一个选择是将子VI保持在测量循环中,每次循环时只传递新数据,但是使用未初始化的移位寄存器给它一个“存储器”,在该寄存器中累积所获取的数据以供显示。在LabVIEW帮助中搜索功能全局变量,了解有关此方法的更多详细信息。再次,使用顶级VI中的打开/关闭方法来显示或隐藏前面板。

答案 1 :(得分:0)

这两种方法都是可行的,适用于小型项目,不适合更大/更复杂的设置,可以更精确地控制所显示的数据。

使用第一种方法,您必须以某种方式找到对Open VI的引用,以通过引用来操作其前面板状态。比如说,VI引用类型的global variable将起作用。 使用第二种方法,使用所有参数调用vi时缺少的是Call by reference node

对于更可控的方法,我会在程序开始时启动子VI(FP关闭),然后通过firing custom user events将面板打开/关闭和数据更新传递给子VI事件结构。

答案 2 :(得分:0)

如果使用Producer/Consumer模式,则可以使用队列在数据到达另一个VI时发送数据。