西门子PLC数据类型——STRUCT 数据结构(匿名结构)

有关 STRUCT 的基本信息

说明

STRUCT 数据类型是指一种元素数量固定但数据类型不同的数据结构。在结构中,也可嵌套 STRUCT 或 ARRAY 数据类型的元素。结构可用于根据过程控制系统分组数据以及作为一个数据单元来传送参数。

变量中直接使用的结构声明称为匿名结构。匿名结构可具有以下形式:

所有后续说明都将基于该结构图。

结构的嵌套深度和数量

在嵌套式结构中,包含至少一个附加结构作为元素。此时,可定义 65535 个函数、函数块、数据块和 PLC 数据类型。各 CPU 的具体上限值与块类型和所有块的总数相关。

结构描述(如,DB 或 PLC 数据类型 (UDT))中,每个层级最多可定义 16K 的元素。这些结构中的元素可以同样为 ARRAY 或 STRUCT 数据类型。因此,结构化元素可以源自一个显式声明的 PLC 数据类型,而无任何限制。每个层级可包含 PLC 数据类型 (UDT)/SDT 的 16K 个元素。但一个块中最多可包含 252 个“匿名结构”。

结构 (STRUCT) 的嵌套层级深度为 8 级。具体的嵌套深度取决于所使用的 CPU。

传递 STRUCT 数据类型的参数

STRUCT 数据类型可作为参数进行传递。有关将 STRUCT 作为参数的更多信息,请参见

“传递 STRUCT 数据类型的变量”

匿名结构的缺陷

在这种结构化变量中,元素的寻址方式都相同,而不考虑该元素采用 PLC 数据类型声明,还是采用匿名结构声明。

使用匿名结构具有以下缺点:

  • 维护成本增加:如果对一个匿名结构进行了多次复制,则在更改过程中该匿名结构也必需进行相应的多次更改。
  • 匿名结构与 PLC 数据类型 (UDT) 的相同结构不兼容。
  • 由于系统会检查所有结构元素的类型是否匹配,因而会导致性能下降。
  • 存储空间要求增加:每个匿名结构都是一个单独的对象,其描述信息将加载到 AS 中。

示例

如果在一个 PLC 数据类型 (UDT) 中声明数据类型为 STRUCT 的变量,则使用方式将增加(参见左图)。但是,也可以直接使用数据类型 STRUCT 对变量进行声明(参见右图)。

使用或不使用 PLC 数据类型 (UDT) 对结构化变量“Motor”进行声明:

PLC 数据类型 (UDT) 的结构化变量

非 PLC 数据类型 (UDT) 的结构化变量

复杂结构的处理

指令系列(如,“Serialize:序列化”、“Deserialize:取消序列化”、“CMP”(比较器)和“MOVE:移动值”)可处理大量非常复杂的结构化变量。为此,CPU 需要对变量的结构进行分析,并为总结构中包含的每个子结构或包含的所有基本组件分别执行相应的指令。

如果结构非常复杂,则对结构进行分析可能会导致相应指令的执行时间意外增加。除在运算中指定结构化变量的复杂程度之外,程序中声明的匿名结构总数也会影响指令的运行时间。大量不同的匿名结构定义也会增加指令的运行时间。

解决方法:

  • 避免使用匿名结构,而使用 PLC 数据类型。
  • 避免对结构类似的数据结构进行多次声明。建议将这些结构组合到一个结构声明中。
  • 避免对结构和数据块中相同数据类型的单个变量进行单独声明。此时,如果可能,建议使用 ARRAY 数据类型。

STRUCT 变量的结构

简介

STRUCT 变量通常从一个非优化块的一个字限值处开始(即,偶数地址的字节处)。各元素随后按照存储器中声明的顺序进行排列。STRUCT 变量占用的存储空间直至下一个字限值处。

数据类型为 BOOL 的元素从最低有效位处开始。数据类型为 BYTE 和 CHAR 的元素将从下一个字节处开始。不同数据类型的元素将从一个字限值处开始。在优化块中,结构存储时将根据块的大小进行排序。存储中的顺序与编辑器中的显示顺序不对应。

在嵌套结构中,该结构可作为另一个结构的元素。嵌套深度最多可包含 8 个结构。可在“InOut”部分声明最大嵌套深度为 9 的结构。计算的嵌套深度包括最高结构元素(例如:“Anna.Berta.Carla”对应的嵌套深度为 3)。

所有元素均可单独寻址。各元素的名称之间使用句点进行分隔。

在非优化存储区域中,带有基本数据类型和复杂数据类型的 STRUCT 变量结构:

  • “Motor”STRUCT 变量的声明
  • “Motor”STRUCT 变量的所需存储空间

寻址 STRUCT 元素

寻址结构中的元素

通过以下语法,可访问结构中的各个元素:

"DBname".name1.name2.name3

示例

以下示例显示了对结构化数据类型变量的寻址过程:

寻址

说明

"Global_DB".Motor.Valves[2]

寻址“Global_DB”全局数据块中“Motor”结构内“Valves”元素的第 3 个阀。

传递 STRUCT 数据类型的变量

说明

如果元素与形参的数据类型相对应,则也可将 STRUCT 变量的各元素作为实参进行传递。

也可将整个结构作为参数进行传递。如果块中的输入参数为 STRUCT 数据类型,则必须传递结构相同的 STRUCT 作为实参。即,所有结构元素的名称和数据类型都必须相同。

如果结构和用户自定义 PLC 数据类型的结构相同,则可相互分配。即,所有结构元素的数据类型和顺序都必须相同。在嵌套结构中,低层级的结构及其元素的数据类型和顺序也必须相匹配。

如果所有结构元素(包括低层级结构)的数据类型和顺序均相同,两个不同的 PLC 数据类型也可相互分配。PLC 数据类型的名称不必相同。

用户自定义的 PLC 数据类型和结构不能分配给系统数据类型。

说明

建议采用 PLC 数据类型 (UDT) 的结构。由于 PLC 数据类型 (UDT) 可重复使用并进行统一更改,从而极大简化了编程过程。

原文链接:,转发请注明来源!