西门子博途:ARRAY变量的结构,标积

描述

在非优化块中,ARRAY 变量不得在字限值处开始。即,在偶数地址的字节处开始。ARRAY 变量将使用该存储空间,直到下一个字限值处。

在优化块中,ARRAY 所需的空间与结构中最宽元素所需的空间相同。例如,ARRAY of BYTE 位于一个字节的限值处,而 ARRAY of LREAL 则位于一个 8 字节的限值处。

一维数组中 ARRAY 变量的结构:

数据类型为 BOOL 的元素从最低有效位处开始。数据类型为 BYTE 和 CHAR 的元素从右侧字节处开始。各元素按顺序排列。

多维数组中 ARRAY 变量的结构:

在多维数组中,各元素从第一个维度开始,逐行(逐维)存储。在位和字节元素中,新维度通常从下一个字节处开始。在其它数据类型的元素中,新维度通常从在非优化块中的下一个字(下一个偶数字节)开始。

在优化块中,每个维度所需的空间大小与第一维度的相同。

寻址 ARRAY 元素

ARRAY 元素是使用固定可变下标进行寻址。ARRAY 变量的元素的处理方式与相同数据类型的变量相同。

元素的下标在方括号中指定。该下标包含 ARRAY 各维度的一个整数值(固定下标)或一个变量(可变下标)。

使用固定下标寻址 ARRAY 元素

使用固定下标寻址 ARRAY 元素的具体方式如下所示:

 使用可变下标寻址 ARRAY 元素 也通过一个变量对 ARRAY 元素进行寻址,变量的值仅在运行过程计算。该变量可以是采用绝对地址或符号地址寻址的整型数据类型的全局或局部变量。这种寻址方式也支持多维 ARRAY 和子数组寻址方式。([i, j, k...]) 被调用块中的变量发生更改时,不会影响 in/out 参数处作为实参创建并使用可变下标寻址的 ARRAY 元素。该值将写回与读取时相同的 ARRAY 元素中,并在调用过程中进行传递。 使用下标变量寻址 ARRAY 元素,如下所示: 传递 ARRAY 数据类型的变量 如果 ARRAY 中各元素的数据类型与形参的数据类型相同,则可将其作为实参进行传递 ARRAY 数据类型的变量可作为参数进行传递。如果块中的输入参数为 ARRAY 数据类型,则传递 ARRAY 时的结构必须与实参的相同。即,数据类型、维数和域元素的个数都必须相同。 如果 ARRAY 的结构完全相同,则可相互分配。即,数据类型、维数和数组元素的个数都必须相同。ARRAY 的名称不必相同。

传递 ARRAY [*] 数据类型的变量

ARRAY[*] 可用于声明函数或函数块参数中限值可变的 ARRAY。创建块时,可定义 ARRAY 的限值。之后,在运行过程中调用该数组后之后将对该限值进行传递。

下图显示了使用 ARRAY[*] 数据类型输入参数的两次块调用。在这两次调用中,传递的 ARRAY 长度不同。

 传递灵活限值 ARRAY 时的应用规则 在本示例中,将创建函数“BlockWithArrayStarIn_FC”,从而可在后期进行调用: 如果维数与数据类型都匹配,则可将 ARRAY[*] 指定给 ARRAY[*]。但在此过程中,不能传递单个 ARRAY 元素:

声明函数块“BlockCaller_FB”,并调用函数“BlockWithArrayStarIn_FC”:

  如果维数与数据类型匹配,则可将已知限值的 ARRAY 指定给 ARRAY[*]。在此过程中,也可指定单个的 ARRAY 元素。

声明函数块“BlockCallerFixLimits_FB”,并调用函数“BlockWithArrayStarIn_FC”两次:

可将 ARRAY[*] 指定给 VARIANT。在此过程中,也可指定单个的 ARRAY 元素。 多维数组的寻址示例:

说明

ARRAY 数据类型的变量最多支持 6 维。该规则与一维数组的规则相同。数组维数将写入声明中的方括号内,并使用逗号进行分隔。在多维数组中,各元素从第一维度开始存储。

下表列出了二维 ARRAY 数据类型的变量声明:

名称数据类型值注释
Betr_TempARRAY[1..2, 1..3] of INT1,1,4(0)数据类型为 ARRAY 的二维变量包含有 6 个元素。前两个元素的值为“1”,其余四个元素的值为“0”。

下图显示了声明为 ARRAY 数据类型的变量结构:

访问元素

通过下标,可访问各元素的值。可使用常量或变量作为下标。例如,第一个元素的下标为 [1,1],第四个数组元素的下标为 [2,1]。例如,访问第四个元素的值时,需要在程序中声明“Station[2,1]”。

通过 ARRAY[*] 计算两个矢量标积的示例 明 标积是为两个矢量进行赋值的一种数学运算(标量)。 两个矢量的标积将得到一个标量变量,且定义如下: 这里,∝ 是矢量 和 之间的角度。

标积的计算示例:

在本示例中,结果为数字 22。

在以下编程示例中,可确定如何使用 ARRAY[*] 以及 ARRAY 的灵活边界值计算两个矢量的标积。此处,函数“ScalarProduct_FC”将用作具体标积的计算模板。

在该编程示例中,需要具有以下对象:

两个数据块和和一个 PLC 数据类型 (UDT),用于管理矢量数据。

函数,包含计算标积的程序代码。

指令“LOWER_BOUND”和“UPPER_BOUND”,用于读取 ARRAY 的边界。

组织块,用于计算标积

操作步骤

在本示例中,使用了多个矢量(即,1 维数组)。当然,其它计算(如,矩阵乘法)可使用多维数组。

要计算标积,请执行以下操作步骤:

创建 PLC 数据类型 (UDT)“VectorArrays_UDT”:


两个数组“VectorD5Coordinates”和“VectorE13Coordinates”提供计算标积所需的数据。
基于PLC 数据类型“VectorArrays_UDT”PLC 数据类型创建数据块“VectorArrays1_DB”:


创建第二个“VectorArrays2_DB”数据块。除“VectorArrays_UDT”PLC 数据类型的矢量外,该数据块中还包含两个其它矢量:


现已创建了计算标积所需的数据。
创建函数“ScalarProduct_FC”,作为创建计算标积时计算操作步骤的模板:
块接口:


程序代码:


在第 1 到 4 行中,查询矢量 1 和矢量 2 的 ARRAY 上/下边界。之后,即可确定两个矢量 ARRAY 的关联数。由于仅当待相乘的两个矢量关联数相等时,才能建立标积,因此需使用第 6 行到第 9 行。
如果 ARRAY 的上/下边界不同,则函数“ScalarProduct_FC”将生成函数值“-1”并退出程序块 (RETURN)。
如果 ARRAY 的上/下边界相同,则变量 #Sum 将初始化为值“0”(第 10 行),并执行标积计算操作(第 11 到 13 行)。
使用事件类“Program cycle”,创建“Main_OB”组织块。在第 4 步中创建的函数“ScalarProduct_FC”将作为标积计算“Main_OB”中的模板:
块接口:


程序代码:

 

创建函数“BlockWithVariantIn_FC”,从而可在后期调用:

 

声明函数“BlockWithArrayStarInVariant_FC”,并调用函数“BlockWithVariantIn_FC”:

 审核编辑:汤梓红

 

相关推荐

相关文章