在实时应用程序中使用LabVIEW MathScript的规范(MathScript RT模块)

LabVIEW 2012 MathScript RT模块帮助

版本日期:June 2012

产品编号:373123C-0118

»查看产品信息
下载帮助
(仅限Windows)

用户可将LabVIEW MathScript节点下载至RT终端使用。MathScript节点中可包含用户自定义函数及部分内置MathScript函数。但是,根据使用的函数、数据类型语法,LabVIEW在运行时执行代码可能会使实时应用程序产生较大的抖动和无法确定的执行时间。当应用程序的执行确定性较为重要时,请遵循下列规范。经NI测试,这些规范能有效减少应用程序执行时的抖动并增强执行时间的确定性。

除此处提及的MathScript规范外,还需熟练掌握减少LabVIEW应用程序抖动的技巧。用户可使用MathScript函数的rt类的成员对RT终端上引起抖动的源进行调试和隔离。

设置MathScript节点

实时VI定时结构中放置一个MathScript节点。

详细信息

必须将MathScript节点放置在实时VI、定时循环定时顺序结构中,以保证MathScript节点以合适的优先级执行。VI的实时优先级高于所有其他优先级。同理,使用定时结构可控制MathScript节点执行的优先级与程序框图上其他定时结构优先级的高低。也可将包含MathScript节点的子VI放置在定时结构中。

如在定时结构中使用MathScript节点,必须将结构配置为为各个实例预分配副本。右键单击定时结构,从快捷菜单中选择共享副本分配»预分配,启用副本预分配。定时循环或定时顺序结构将显示一个图标,表示LabVIEW为结构中的任何重入VI分配副本。如将包含MathScript节点的子VI放置在定时结构中,必须将子VI和层次结构中的所有其他VI配置为可重入。可重入属性在VI属性对话框的执行页配置。例如,如在定时结构中放置一个子VI,该子VI调用了一个包含MathScript的VI,则必须将两个VI都配置为可重入。

禁用包含MathScript节点VI的非关键性选项,例如,调试选项。

详细信息

在包含MathScript节点的VI中,选择文件»VI属性,打开VI属性对话框,从类别下拉菜单中选择执行。取消勾选允许调试运行时自动处理菜单。可在项目浏览器窗口中右键单击VI,并从快捷菜单中选择属性,打开VI属性对话框。禁用上述选项后,VI占用的内存更少,编译速度更快,引发的抖动也更小。

避免在MathScript节点的输出端使用强制转换点

详细信息

LabVIEW在编辑时确定MathScript节点中变量的数据类型。如手动将变量的输出接线端配置为LabVIEW确定数据类型之外的其它数据类型,如有可能LabVIEW将把值强制为选中数据类型,并在输出接线端上显示强制转换点。强制转换点所在的位置表示代码占用了更多的内存且延长了运行时间。

要减少强制转换点,右键单击输出端,从快捷菜单中选择选择数据类型»自动选择类型,将接线端配置为LabVIEW确定的数据类型。如LabVIEW只能在运行时确定某个变量的数据类型,自动选择类型选项会被禁用,表示该变量的数据类型不适合确定性应用程序。

编写MathScript脚本

每行结束使用分号。

详细信息

在脚本行末尾添加分号时,MathScript不会显示命令的输出结果。不使用分号会增加执行时间的不确定性。

Note 注:  不必在for、while、if-else语句的首行,以及elseend中的脚本行末尾使用分号。
请使用推荐的语法在实时VI和定时结构中编写脚本和用户定义函数。

详细信息

NI测试了可在MathScript中使用的部分语法,例如,矩阵运算、循环。如按照本文所列的规范使用这些语法,执行所需的时间通常较为确定。其它语法可能会导致应用程序的较大抖动,执行时间更为不确定。

确保输入和运算符是最小可能的数据类型。此外,替换向量和矩阵中的部分元素时,确保替换部分是最小可能的大小。

详细信息

对于某些运算,LabVIEW可能不返回最小的数据类型。例如,将行向量乘以列向量,LabVIEW可能返回一个单元素矩阵,而不是一个标量,因为两个向量相乘的结果可以是一个矩阵。按照下例所示,通过索引对单元素矩阵进行运算:

a = ones(1, 3);
b = ones(3, 1);
c = a * b;
d = c(1) + 1.5;

要显示变量的数据类型,启用数据类型高亮显示,并在MathtScript节点之外单击,将鼠标移至脚本中变量所在的位置,即时帮助窗口将显示变量的数据类型。

预分配循环中定义的数组,避免在循环中改变数组的大小。

详细信息

不要在for循环和while循环中改变数组的大小。例如,避免在循环中改变数组大小,如下例所示:

a = [];
for i = 1:5
     a = [a, i];
end

使用oneszeros函数预分配可能需要的最大元素数量,然后按下例所示的方法替换元素的值,而不是在循环中创建数组:

a = zeros(1, 5);
for i = 1:5
     a(i) = i;
end

如确有需要在循环中创建数组,不要在循环之外或后续循环中继续使用该数组。例如,在下列脚本中,第一次循环定义了temp,第二和第三次循环继续使用了该数组。

a = zeros(2, 5);
for i = 1:3
     if i == 1
          temp = [2; 2];
     else
          temp = 2 * temp;
          a(:, i) = temp;
     end
end

但是,可使用与下例相似的语法,每次循环均重新定义和使用temp,而不是在多次循环中使用同一个数组:

a = zeros(2, 5);
for i = 1:3
     temp = [i; i + 1];
     a(:, i) = temp;
end

仅使用标量元素来定义矩阵。不要使用向量或其它矩阵来定义矩阵。

详细信息

例如,变换矩阵列顺序时,不要使用原矩阵的列向量重新定义矩阵,如下例所示:

a = [1, 4, 7; 2, 5, 8; 3, 6, 9];
a = [a(:, 2:3), a(:, 1)];

相反的,可先索引原矩阵的列,然后重构矩阵,如下例所示:

a = [1, 4, 7; 2, 5, 8; 3, 6, 9];
temp = a(:, 1);
a(:, 1:2) = a(:, 2:3);
a(:, 3) = temp;

指定start:stop范围来索引向量或矩阵,明确指定范围,而不是通过变量定义范围。

详细信息

例如,不要使用下列语法返回向量中第2-4个元素。

a = [1, 4, 8, 3, 9, 12];
b = 2:4;
a(b);

相反的,使用语法a(2:4);或下列范例,返回向量中相同位置的三个元素:

a = [1, 4, 8, 3, 9, 12];
b = 2;
a(b:b + 2);

避免逻辑索引运算。

详细信息

例如,不要使用下列语法,将矩阵中所有小于5的值替换为1:

a = [1, 4, 8; 3, 9, 12];
a(a < 5) = 1;

相反的,使用下列语法进行相同操作,但是避免了逻辑索引:

a = [1, 4, 8; 3, 9, 12];
[n, m] = size(a);
for(i = 1:(n * m))
     if(a(i) < 5)
          a(i) = 1;
     end
end

在替换索引操作时不要改变矩阵大小。

详细信息

不要在矩阵之外索引以增加矩阵大小。例如,不要使用下列语法。此语法在现有的3 × 3矩阵中增加第四列。

a = zeros(3, 3);
a(:, 4) = 0;

同理,也不要使用[]符号缩小矩阵。不要使用下列语法,此语法在现有矩阵中删除第二列:

b = [4, 2; 7, 3];
b(2, :) = [];

使用内置MathScript函数

在实时VI和定时结构中,只调用适用于确定性应用的MathScript函数,并且使用合适的数据类型作为函数输入。

详细信息

NI测试了部分MathScript函数。按照本文所列的规范使用这些函数能有效减少应用程序执行时的抖动并在规定时间内完成执行。确保使用帮助文档中推荐的数据类型作为函数的输入,这样,LabVIEW就不必对输入值进行强制转换。

避免在RT终端上使用导致执行时间不确定的函数

详细信息

虽然可将部分函数下载至RT终端,但是运行这些函数会增加实时应用程序的抖动和执行确定性。不要在MathScript节点和用户定义函数中使用这些函数。

文章是否对您有帮助?

没有帮助