使用 UDT 在 PLC 程序中强制实施结构

本工程技术简报介绍用户自定义数据类型(UDT)作为 PLC 程序组织的基础要素。它是将数据块(DB)内存与函数及功能块绑定的关键。这并非学术练习,而是从单纯编写 PLC 代码迈向系统架构的必经之路。这是一种摆脱无序标签所导致的时间浪费的出路。


本文是 DigiKey 工业自动化现场指南的一部分

位置 :程序入门 → 数据结构(UDT/DB)
难度:classical_building: 系统集成商 — 难度级别说明
最后更新:2026 年 3 月 6 日


什么是 UDT

UDT 是对我们数据形态的权威描述。它可以简单到单个布尔量,也可以复杂到结构体数组。

虽然 UDT 常被描述为蓝图,但我更倾向于从硬件角度来理解它。UDT 如同物理连接器规范,描述了哪些程序元件可以或不可以相互连接。采用相同 UDT 规范构建的块可以轻松互连。不匹配的电缆会导致编译时错误。

UDT 是 PLC 编程中被低估的工具。如果我们将以 UDT 为核心的思维应用于 PLC 编程,结构将变得一致。我们不再将 PLC 标签视为松散的集合,而是从结构及其程序元素间的关系完整性角度进行思考。UDT 是约定性的“电缆规范”,描述了内存与程序块如何契合。

何时使用 UDT?

当我们构建程序组织单元(POU),包括数据块(DB)、函数和功能块时,会使用 UDT。

  • 数据块 :当应用于 DB 时,UDT 描述内存结构。这是通过在 DB 中实例化 UDT 来实现的。

  • 函数与功能块 :当应用于 FC 或 FB 时,UDT 描述块的接口形态,该接口随后接受 DB。

综合来看,UDT 是在块接口层级的一种链接机制。通过各自输入输出(InOut)接口绑定到 UDT 的块,可通过 DB 无缝互连。这种绑定由编译器严格执行。

UDT 是与程序员签订的契约

UDT 是由程序员定义并由编译器强制执行的契约。从程序员的角度来看,该契约涉及:

  • 自身 :程序员承诺在接口层面定义所有标签交互。这是对侧向标签走私的明确拒绝,因为在这种做法中,很容易将随机的全局标签引入块中。

  • 未来的程序员和技术人员 :如果原始程序员在块的 InOut 接口处使用 UDT,那么未来的程序员和技术人员无需深入程序内部。相反,他们可以在 DB 调试窗口中检查这些块。

如果 DB 是块的唯一真实来源,那么 DB 本身就充当了一种人机界面(HMI)。这一思路也延伸至如图 1 所示的跟踪工具。我们再次注意到,点号表示法被用来自然地描述标签,例如:"DB_IO_REMOTE".IO_Remote.Out.xCR1

破坏此契约最快的方式是将隐藏的全局变量走私到各个块中。

图 1 :使用跟踪工具检查 DB 标签。

UDT 是与原始设备制造商(OEM)签订的契约

设备供应商通常提供 PLC 代码。一个例子是用于操作 IO-Link 设备的库。OEM 高度依赖 UDT。典型的“库”包括 UDT 以及依赖于该 UDT 的块。我们经常被要求构建一个 DB 以及 OEM 块之间的通道。

UDT 的结构是什么样的?

UDT 通常是分层的,数据元素包含在结构体中。图 2 提供了一个示例,其中 UDT 描述了 PLC 的本地 I/O。请注意,InOut 结构体用于自然地分组数据。

UDT 可以嵌套。当控制许多类似的现场设备时(例如 10 台相同的电机),这种做法非常有益。每台电机的数据可以存储在结构体的索引数组中。

在所有情况下,标签都从松散的浮动名称转变为强组织结构,其中功能定义为与用户自定义类型(UDT)主体的关系。这一点最好通过标签名称中隐含的点记法来理解。例如,考虑图 2 中的输入开关。在程序中,它被优雅地引用为 #IO_Local.In.xSW1

图 2 :PLC 输入/输出的 UDT 封装。

UDT 有哪些替代方案?

切勿忘记,UDT 会影响数据块(DB)层面和程序块接口层面的设计。UDT 是一种快捷方式,可确保程序组织单元(POU)正确接口。UDT 说明了系统是什么,而不仅仅是其行为方式。

当然,所有 UDT 功能都可以在数据块(DB)层面手动执行,并在程序接口层面进行相应映射。然而,由于程序员现在必须独立构建每个程序组织单元(POU),UDT 的单一真实来源特性便丧失了。换句话说,一处的变更必须小心地在所有地方复制;祝您调试愉快!这与在 UDT 中进行单一变更形成对比。因此,我认为,若要在所有程序组织单元(POU)中维持单一真实来源,则不存在可扩展的 UDT 替代方案。

请注意,这并不能消除程序员的挫败感,因为 UDT 的变更可能需要修改所有受该 UDT 影响的程序组织单元(POU)。然而,这并不改变以下事实:UDT 是系统内的单一真实来源点,所有程序块都必须遵循它。在实践中,我们先修改程序块,然后从主程序 [OB1] 开始实例化它们,并沿程序层次结构向下进行。

还有另一种“替代方案”,即侧向偷运全局 PLC 标签。在实践中,超过一定限度后,这种做法过于痛苦。封装被破坏,依赖关系被隐藏。我们花费太多时间深挖程序组织单元(POU)。

抵制使用全局变量的诱惑。

不要这样做!

后续步骤

  • 绑定您的本地输入/输出 :请参阅本文,了解关于使用 ET 200SP 探索本地输入/输出和分布式输入/输出的指南。

  • 对运行中工厂的影响 :某些内容可以在线更改,而其他内容则不能。添加新的限位开关非常复杂,因为基于 UDT 的绑定涉及许多程序块。我们得到的不是令人满意的绿色圆圈,而是蓝色和橙色的圆圈。这是一次完整的下载操作,就生产线停机时间而言,意味着实实在在的金钱损失。

  • 风格指南 :试图查看 %I0.0 的技术人员会感到沮丧,因为标签是在数据块抽象层内设置的。为 PLC 编制一份风格指南(路线图)文档。该文档应包含说明,指导用户在诸如 DB_IO-LOCAL 等位置查找输入/输出点。

:books: 继续探索工业控制系统

如果本讨论对您有帮助,您可能还想了解:

:world_map: DigiKey 导航

:japanese_symbol_for_beginner: 相关基础文章