我对LabView中的任务有一个问题,我认为这个问题很简单,很标准,但我还是没有完成它。
任务:我有一个测量VI,可以循环获取数据。这可能需要一段时间,因此我想向用户显示不完整的数据集“随着它的增长”。这应该在一个额外的窗口中完成,所以我想(需要?)使用SubVI。 我希望这个SubVI的前面板在测量开始时打开并在结束时关闭。
我将它放在测量循环中,因此在每个新的数据点被捕获后它会被调用,并且可以显示更新的数据集。我将它设置为“在调用时显示前面板”,因此它在测量开始时(循环的第一次迭代)打开,就像我想要的那样。但它没有关闭。如果我检查“如果最初关闭后关闭”它会在循环的每次迭代后关闭,这非常烦人。
此外,我尝试使用Invoke节点调用FP.Open
,FP.Run
和FP.Close
,但后来我不知道如何在测量循环中实际调用SubVI并将数据提供给它。
我的方法中是否存在一般误解?或者是否有一个我未能发现的明显解决方案?
答案 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
方法关闭前面板:
这意味着您每次循环都会将所有获取的数据传递给子VI;如果数据的大小很小,这不是问题,但是如Joe建议的那样,更具可扩展性的方法将是使用队列的生产者/消费者模式。要做到这一点:
FP.Close
和FP.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时发送数据。