传递 ARRAY [*] 数据类型的变量 ARRAY[*] 可用于声明函数或函数块参数中限值可变的 ARRAY。创建块时,可定义 ARRAY 的 限值。之后,在运行过程中调用该数组后之后将对该限值进行传递。 下图显示了使用 ARRAY[*] 数据类型输入参数的两次块调用。在这两次调用中,传递的 ARRAY 长度不同。传递灵活限值 ARRAY 时的应用规则 在本示例中,将创建函数“BlockWithArrayStarIn_FC”,从而可在后期进行调用: 如果维数与数据类型都匹配,则可将 ARRAY[*] 指定给 ARRAY[*]。但在此过程中,不能传递 单个 ARRAY 元素: 1. 声明函数块“BlockCaller_FB”,并调用函数“BlockWithArrayStarIn_FC”:如果维数与数据类型匹配,则可将已知限值的 ARRAY 指定给 ARRAY[*]。在此过程中,也可 指定单个的 ARRAY 元素。 1. 声明函数块“BlockCallerFixLimits_FB”,并调用函数“BlockWithArrayStarIn_FC”两次: 可将 ARRAY[*] 指定给 VARIANT。在此过程中,也可指定单个的 ARRAY 元素。 1. 创建函数“BlockWithVariantIn_FC”,从而可在后期调用: 2. 声明函数“BlockWithArrayStarInVariant_FC”,并调用函数“BlockWithVariantIn_FC”:多维数组的寻址示例 说明 ARRAY 数据类型的变量Zui多支持 6 维。该规则与一维数组的规则相同。数组维数将写入声 明中的方括号内,并使用逗号进行分隔。在多维数组中,各元素从第一维度开始存储。 下表列出了二维 ARRAY 数据类型的变量声明:访问元素 通过下标,可访问各元素的值。可使用常量或变量作为下标。例如,第一个元素的下标为 [1,1],第四个数组元素的下标为 [2,1]。例如,访问第四个元素的值时,需要在程序中声明 “Station[2,1]”。 通过 ARRAY[*] 计算两个矢量标积的示例 说明 标积是为两个矢量进行赋值的一种数学运算(标量)。 两个矢量的标积将得到一个标量变量,且定义如下:在本示例中,结果为数字 22。 在以下编程示例中,可确定如何使用 ARRAY[*] 以及 ARRAY 的灵活边界值计算两个矢量的标 积。此处,函数“ScalarProduct_FC”将用作具体标积的计算模板。 在该编程示例中,需要具有以下对象: • 两个数据块和和一个 PLC 数据类型 (UDT),用于管理矢量数据。 • 函数,包含计算标积的程序代码。
• 指令“LOWER_BOUND”和“UPPER_BOUND”,用于读取 ARRAY 的边界。 • 组织块,用于计算标积 操作步骤 在本示例中,使用了多个矢量(即,1 维数组)。当然,其它计算(如,矩阵乘法)可使用 多维数组。 要计算标积,请执行以下操作步骤: 1. 创建 PLC 数据类型 (UDT)“VectorArrays_UDT”:两个数组“VectorD5Coordinates”和“VectorE13Coordinates”提供计算标积所需的数据。 2. 基于 PLC 数据类型“VectorArrays_UDT”PLC 数据类型创建数据块“VectorArrays1_DB”:3. 创建第二个“VectorArrays2_DB”数据块。除“VectorArrays_UDT”PLC 数据类型的矢量外,该数 据块中还包含两个其它矢量: 现已创建了计算标积所需的数据。在第 1 到 4 行中,查询矢量 1 和矢量 2 的 ARRAY 上/下边界。之后,即可确定两个矢量 ARRAY 的关联数。由于仅当待相乘的两个矢量关联数相等时,才能建立标积,因此需使用第 6 行到第 9 行。 如果 ARRAY 的上/下边界不同,则函数“ScalarProduct_FC”将生成函数值“-1”并退出程序块 (RETURN)。 如果 ARRAY 的上/下边界相同,则变量 #Sum 将初始化为值“0”(第 10 行),并执行标积计算 操作(第 11 到 13 行)。 5. 使用事件类“Program cycle”,创建“Main_OB”组织块。在第 4 步中创建的函数 “ScalarProduct_FC”将作为标积计算“Main_OB”中的模板: 块接口:有关引用的基本知识 (S7-1500) 说明 引用是一种变量,不含任何值却指向其它变量的存储位置。 通过引用,可在块外进行变量传递。因此,可直接修改变量的值,而无需创建变量副本。对引用进行声明时,需指定被引用变量的数据类型。引用为类型安全。尤其是在需要避免发 生运行系统错误的控制系统中,这种操作方式非常重要。按照 IEC 中规定的限制条件,引用 必须指向临时数据元素,从而进一步提高数据的可靠性。这样就可以避免运行系统发生故障。 为此,需确保引用所指向的数据类型正确且存储空间有效,或为引用赋值 NULL。 在程序中使用引用 要使用引用,要求 S7-1500 系列 CPU 的固件版本为 V2.5 或更高版本。 下图简要描述了引用的使用方式。
引用与 VARIANT 的不同之处 VARIANT 数据类型的变量与一个指向任意数据类型的其它变量类似。因此,在程序创建时, 无需定义 VARIANT 变量所指向的数据类型。即,在运行过程中无需定义该数据类型。在不 同的程序循环中,一个 VARIANT 变量甚至可以定义不同的数据类型。数据类型 VARIANT 适 用于创建通用程序和间接寻址。但如需要在程序代码中对 VARIANT 变量进行进一步处理,则 需使用特定指令确定当前的数据类型。不能直接读写 VARIANT 变量。而必须使用 VariantGet 和 VariantPut 等特殊指令进行读写。 如果使用引用,则在创建程序时需指定该数据类型。因为运行过程中该数据类型无需确认, 因此程序的执行更为高效且结构更为清晰明了。凭借引用,可直接写入或读取被引用的变量, 而无需在程序中增加其它指令。 与 VARIANT 不同,引用只能指向位于优化存储区中的数据。 示例 在以下示例中,显示了各种不同的引用应用。 在该块的接口中,包含一个声明为引用的“myRefInt”变量。声明引用 (S7-1500) 说明 引用可在函数或函数块的块接口中声明。为此,可使用以下声明区域: • FC:Input, Output, Temp, Return • FB:Temp • OB:Temp 结构中不支持引用声明。 要进行引用声明,可使用关键字“REF_TO”并指定被引用变量所需的数据类型。但是,无需指 定该引用指向的特定变量:引用的元素 注释 位字符串 可引用 BYTE、WORD、DWORD 和 LWORD。 不支持 BOOL 引用。 整数 可引用整数。 浮点数 可引用浮点数。 字符串 可引用字符串。 不支持针对字符串的长度声明。 IEC 定时器 支持 IEC_TIMER 和 IEC_LTIMER 引用。 不支持派生数据类型引用,例如 TON。 IEC 计数器 支持 IEC_COUNTER / IEC_UCOUNTER、IEC_SCOUNTER / IEC_USCOUNTER、 IEC_DCOUNTER / IEC_UDCOUNTER 引用。 不支持派生数据类型引用,例如 CTU。 PLC 数据类型 (UDT) 可引用 PLC 数据类型。 系统数据类型 (SDT) 可引用系统数据类型。引用的元素 注释 ARRAY 可引用上文中所列数据类型的 ARRAY。 不支持 ARRAY[*] 引用。 不支持引用中的 ARRAY。 因此,不支持以下声明: ARRAY of REF_TO <数据类型> 工艺对象 自固件版本 V3.0 起,可以引用“Motion”和“SIMATIC Ident”类别的工艺对象。 不支持引用工艺对象的 ARRAY。 因此,不支持以下声明: REF_TO ARRAY of <工艺对象> 数据块 仅当数据块的初始数据类型为 PLC 数据类型 (UDT) 或系统数据类型 (SDT) 时,才能引用 整个数据块。 初始化 在创建一个引用变量时,系统将使用值 NULL 对其进行初始化。即,引用虽然存在,但未指 向任何有效的存储器。如果在运行过程中对 ZERO 引用进行访问,则将输出一个编程错误。 用户无法在块接口中进行初始化。 使用指令“REF ()”,可对引用进行初始化。 另请参见“引用 (页 347)” 保持性 引用不具有保持性,但可以指向保持性数据。 说明 每个块中引用参数的Zui大数量 块中数据类型为“REF_TO”参数的Zui大数量取决于各种不同因素。如,块类型、使用结构化数 据类型(ARRAY、PLC 数据类型等)声明的其它参数数量,以及声明的实例数量。 如果超出Zui大数量,则在编译时将收到一条消息。此时,可将多个参数组合为一个 PLC 数据 类型 (UDT) 或组合为一个全局数据块 (DB),作为块参数进行传递。引用 (S7-1500) 说明 关键字“REF()”用于指定先前所声明引用将指向的变量。即,通过参数指定待引用的变量。该 变量的数据类型必须与所声明引用的数据类型完全匹配。即,数据类型为“REF_TO Int”的引 用只能指向数据类型为“Int”的变量。系统不会进行数据类型转换。 说明 在块调用过程中将“REF()”作为实参进行传递 “REF()”可作为实参传递到一个接口引用已声明的被调用块中。 另请参见“将引用作为块参数进行传递 (页 358)” 规则 以下规则适用于“引用”: • 引用所指向的数据需位于一个优化存储空间内。 • 该引用只能指向全局 DB 或静态变量中的数据。 • 该引用不能引用以下数据: – 临时本地数据 – PLC 变量表中的全局变量 – 块参数 – 常量 – 设置写保护的变量 • 以下规则适用于引用数组: – 数组限值、引用维数以及被引用的变量数必须相同。 – 不能创建对具有动态限制的数组的引用 (Array[*])。 – 必须使用以下语句创建基于 PLC 数据类型的 ARRAY DB 引用。