指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。

有关引用的基本知识

说明

引用是一种变量,不含任何值却指向其它变量的存储位置。

通过引用,可在块外进行变量传递。因此,可直接修改变量的值,而无需创建变量副本。

对引用进行声明时,需指定被引用变量的数据类型。引用为类型安全。尤其是在需要避免发生运行系统错误的控制系统中,这种操作方式非常重要。按照 IEC 中规定的限制条件,引用必须指向临时数据元素,从而进一步提高数据的可靠性。这样就可以避免运行系统发生故障。

为此,需确保引用所指向的数据类型正确且存储空间有效,或为引用赋值 NULL。

在程序中使用引用

要使用引用,要求 S7-1500 系列 CPU 的固件版本为 V2.5 或更高版本。

下图简要描述了引用的使用方式。

西门子plc变量表是怎么来的(西门子PLC数据类型)(1)

引用于 VARIANT 的不同之处

VARIANT 数据类型的变量与一个指向任意数据类型的其它变量类似。因此,在程序创建时,无需定义 VARIANT 变量所指向的数据类型。即,在运行过程中无需定义该数据类型。在不同的程序循环中,一个 VARIANT 变量甚至可以定义不同的数据类型。数据类型 VARIANT 适用于创建通用程序和间接寻址。但如需要在程序代码中对 VARIANT 变量进行进一步处理,则需使用特定指令确定当前的数据类型。不能直接读写 VARIANT 变量。而必须使用 VariantGet 和 VariantPut 等特殊指令进行读写。

如果使用引用,则在创建程序时需指定该数据类型。因为运行过程中该数据类型无需确认,因此程序的执行更为高效且结构更为清晰明了。凭借引用,可直接写入或读取被引用的变量,而无需在程序中增加其它指令。

与 VARIANT 不同,引用只能指向位于优化存储区中的数据。

示例

在以下示例中,显示了各种不同的引用应用。

在该块的接口中,包含一个声明为引用的“myRefInt”变量。

西门子plc变量表是怎么来的(西门子PLC数据类型)(2)

下图显示了该变量在 SCL 中的具体应用:

西门子plc变量表是怎么来的(西门子PLC数据类型)(3)

声明引用

西门子plc变量表是怎么来的(西门子PLC数据类型)(4)

说明

引用可在函数或函数块的块接口中声明。为此,可使用以下声明区域:

要进行引用声明,可使用关键字“REF_TO”并指定被引用变量所需的数据类型。但是,无需指定该引用指向的特定变量:

引用可指向以下元素:

如果某个数据块的初始数据类型为 PLC 数据类型 (UDT) 或系统数据类型 (SDT),则只能指向整个数据块。

初始化

在创建一个引用变量时,系统将使用值 NULL 对其进行初始化。即,引用虽然存在,但未指向任何有效的存储器。如果在运行过程中对 ZERO 引用进行访问,则将输出一个编程错误。用户无法在块接口中进行初始化。

使用指令“REF ()”,可对引用进行初始化。

另请参见引用

保持性

引用不具有保持性,但可以指向保持性数据。

说明

每个块中引用参数的最大数量

块中数据类型为“REF_TO”参数的最大数量取决于各种不同因素。如,块类型、使用结构化数据类型(ARRAY、PLC 数据类型等)声明的其它参数数量,以及声明的实例数量。

如果超出最大数量,则在编译过程中将显示一条消息。此时,可将多个参数组合为一个 PLC 数据类型 (UDT) 或组合为一个全局数据块 (DB),并作为块参数进行传递。

引用

西门子plc变量表是怎么来的(西门子PLC数据类型)(5)

说明

使用关键字“REF()”,可指定先前所声明引用将指向的变量。即,通过参数指定待引用的变量。该变量的数据类型必须与所声明引用的数据类型完全匹配。即,数据类型为“REF_TO Int”的引用只能指向数据类型为“Int”的变量。系统不会进行数据类型转换。

说明

在块调用过程中将“REF()”作为实参进行传递

“REF()”可作为实参传递到一个接口引用已声明的被调用块中。

另请参见“将引用作为块参数进行传递”

规则

以下规则适用于“引用”:

示例

以下示例说明了块的接口:接口中可包含多个声明为数据类型“REF_TO”的参数。在声明引用的过程中,被引用变量只能定义该数据类型,而无法指定该引用将指向的变量。

西门子plc变量表是怎么来的(西门子PLC数据类型)(6)

在程序代码中,指定所声明的引用参数将指向的特定变量。

SCL 中的示例:

西门子plc变量表是怎么来的(西门子PLC数据类型)(7)

LAD 中的示例:

西门子plc变量表是怎么来的(西门子PLC数据类型)(8)

STL 中的示例:

西门子plc变量表是怎么来的(西门子PLC数据类型)(9)

取消引用

西门子plc变量表是怎么来的(西门子PLC数据类型)(10)

说明

要读取或写入一个被引用变量的值,则可使用插入符号“^”。这种访问方式又称为“取消引用”

说明

在访问某个引用的值之前,需使用指令“REF()”指定该引用将指向的变量。

示例

以下示例说明了块的接口:该接口中包含一个声明为引用的“myRefInt”参数,以及已初始化为某个值的一些静态参数:

西门子plc变量表是怎么来的(西门子PLC数据类型)(11)

下图显示了如何通过“REF()”指令将“myRefInt”指定为指向“#a"”,以及如何在 SCL 的计算中使用“#a"”。

西门子plc变量表是怎么来的(西门子PLC数据类型)(12)

带有引用的标准指令

带有引用的标准指令

西门子plc变量表是怎么来的(西门子PLC数据类型)(13)

引用可用作赋值或比较指令的输入/输出参数。

如果数据类型正确,则可将所有指令中已取消引用的值用作参数。

赋值

引用可相互赋值。此时,将该引用的地址而非值分配给第二个引用。仅引用的数据类型相同时,引用才能相互赋值,而不进行隐式数据类型转换。

对 PLC 数据类型的引用也必须为同一数据类型。两种 PLC 数据类型具有相同结构还不足以满足要求。

此外,也可将引用赋值给 VARIANT。此时,必须将 VARIANT 声明为一个临时变量 (Temp)。

比较

比较指令中支持引用操作。通过与 NULL 进行比较,确定变量是否已指定给一个引用。当程序流程无法显示确保引用已初始化时,通常建议执行以上操作。

此时,不支持其它比较操作。

示例

以下示例说明了 SCL 赋值和比较指令中引用的使用方式:

西门子plc变量表是怎么来的(西门子PLC数据类型)(14)

以下示例显示的是在 LAD 中的使用:

西门子plc变量表是怎么来的(西门子PLC数据类型)(15)

,