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

指针变量是用来存放内存地址的变量,在同一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)

说明

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

  • FC:Input, Output, Temp, Return
  • FB:Temp
  • OB:Temp

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

引用可指向以下元素:

  • 位字符串
    • 不支持 BOOL 引用。
  • 整数
  • 浮点数
  • 字符串
    • 不支持针对字符串的长度声明。
  • IEC 定时器
    • 支持 IEC_TIMER 和 IEC_LTIMER 引用。
    • 不支持派生数据类型引用,例如 TON。
  • IEC 计数器
    • 支持 IEC_COUNTER/IEC_UCOUNTER、IEC_SCOUNTER/IEC_USCOUNTER、IEC_DCOUNTER/IEC_UDCOUNTER 引用。
    • 不支持派生数据类型引用,例如 CTU。
  • PLC 数据类型 (UDT)
  • 系统数据类型 (SDT)
  • 已命名的数据类型的 ARRAY
    • 不支持 ARRAY[*] 引用。
    • 在最新版本的 TIA Portal 中,不能声明 ARRAY 引用。因此,不支持以下声明:
    • ARRAY of 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()”可作为实参传递到一个接口引用已声明的被调用块中。

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

规则

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

  • 引用所指向的数据需位于一个优化存储空间内。
  • 该引用只能指向全局 DB 或静态变量中的数据。
  • 该引用不能引用以下数据:
    • 临时局部数据
    • PLC 变量表中的全局变量
    • 块参数
    • 常量
    • 设置写保护的变量
  • 以下规则适用于引用数组:
    • 数组限值、引用维数以及被引用的变量数必须相同。
    • 不能创建对具有动态限制的数组的引用 (Array[*])。
    • 必须使用以下语句创建基于 PLC 数据类型的 ARRAY DB 引用:
    • REF("my_ArrayDB_UDT"."THIS")
    • REF("my_ArrayDB_UDT"."THIS"[i])

示例

以下示例说明了块的接口:接口中可包含多个声明为数据类型“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)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页