作为得捷电子的应用工程师,我有幸接触各种各样的硬件和软件。我的任务包括在此技术论坛上直接回复客户咨询,以及主动撰写得捷电子客户未来感兴趣的主题文章。偶尔,我会遇到令人惊讶的结果,例如 Arduino Opta 与Schneider Electric Modicon M171 和 M172 可编程逻辑控制器(PLC)之间的兼容性。
本工程简报探讨了用于 Opta 的 Arduino PLC IDE 与用于 Modicon M171 和 172 的Schneider Electric EcoStructure Machine Expert – HVAC 之间的软件共性。我们将看到,这些集成开发环境(IDE)具有共同的结构,允许在不同平台间共享符合 IEC 61131-3 标准的程序组织单元(POU)。这种协同效应使程序员能够轻松地在不同设备之间切换,例如图 1 所示的 Opta WiFi 设备和 Modicon TM172PDG28RI 设备。
本文是DigiKey工业自动化工厂指南的一部分
位置 :教学指导 → PLCs
难度 :
学生 — 难度等级说明
最后更新 :2026 年 3 月 06 日
图 1 :Arduino Opta WiFi 和带集成显示屏的Schneider Modicon M172 的照片。相应的集成开发环境(IDE)具有共同的结构,允许跨系列共享程序组织单元(POU,即软件组件)。
什么是 IEC 61131-3 程序组织单元( POU )?
IEC 61131-3 标准定义了通用的 PLC 编程语言,包括梯形图(LD)、功能块图(FBD)、结构化文本(ST)、指令表(IL)和顺序功能图(SFC)。该标准还描述了程序的组织和结构方式。这些程序组织单元(POU)是构建 PLC 项目的基本模块。它们由程序、功能块和用户自定义功能块(UDFB)组成。
技术提示 :在 IEC 61131-3 标准的语境下,“程序”一词需要进一步解释。在一种情况下,我们指的是安装在 PLC 上的全部软件。这通常由许多独立的程序组织单元(POU)组成。在另一种情况下,我们指的是特定类型的程序组织单元(POU)。通过观察上下文线索,相对容易区分这两种含义。例如,图 2 中的所有组件都用于创建 PLC 的程序。该程序由独立的程序组织单元(POU)组成,例如程序 prgCtrl 和 prgComms。
图 2 :展示 IEC 61131-3 软件命名空间的框图。右侧显示了三种类型的程序组织单元(POU),包括程序、函数和用户自定义功能块。
内置函数与用户提供的函数
所有现代 PLC 开发工具都包含预定义函数。我们可以预期找到适用于梯形图(LD)和功能块图(FBD)的各种图形化块,以及为偏好使用结构化文本(ST)编程的程序员提供的相应文本形式。示例包括定时器、计数器和三角函数。
PLC 程序员通过使用这些内置函数以及自行设计的程序组织单元(POU),将各个部分组合成完整的 PLC 应用程序。在图 2 中,我们可以看到用户编写了两个程序,包括 prgCtrl 和 prgComms。作为分层设计过程的一部分,这些程序随后实例化了各种用户编写的功能块和函数。图 2 中总共有七个程序组织单元(POU)。
技术提示 :用户定义功能块(UDFB)与用户函数是密切相关的程序组织单元(POU)。区别在于,UDFB 包含内存,其返回值会根据状态(过去的交互)而变化;而函数对于给定的一组输入始终返回相同的值。
用户编写的函数和功能块的目的是什么?
每家 PLC 制造商都提供了坚实的基础内置函数,适用于各种各样的 PLC 应用。然而,针对特定应用编写程序组织单元(POU)的工作需由用户完成。例如,程序员可以构建一个函数,根据给定的储罐直径和液位高度计算总加仑数。程序员还可以构建一个用户定义功能块(UDFB),以封装三相电机启动器/接触器的操作。需要带有相关内存的用户定义功能块(UDFB)来跟踪物理机构的状态。
在所有情况下,函数和用户定义功能块(UDFB)均属于程序员的知识产权。当编写得当时,它们会形成一个库,用于解决常见的控制问题。这使得经验丰富的 PLC 程序员能够通过利用经过良好编写和测试的程序组织单元(POU)集合,快速组装应用程序。
技术提示 :PLC 程序员可以从面向对象编程(OOP)所使用的语言中受益。虽然 IEC 61131-3 标准并未包含面向对象编程(OOP)功能,但 PLC 程序员可以采用面向对象编程(OOP)原则。例如,三相电机启动器是一种可由 PLC 控制和监控的物理设备。通过精心的软件设计,程序员可以将电机启动器的功能封装到单个用户定义功能块(UDFB)中。该对象随后充当现实世界的抽象表示。PLC 程序员将这些对象收集到一个库中,从而加快编程过程,同时提供通用结构,便于技术人员进行故障排除并支持未来的快速修改。
哪些软件组件可以在 Opta 和 Modicon 之间共享?
现在我们已经对 IEC 61131-3 程序组织单元(POU)有了扎实的理解,就可以确定哪些内容可以在 Arduino Opta 和Schneider M171/172 之间共享,哪些不能。简而言之,用户编写的程序组织单元(POU)可以共享,包括程序、函数和用户定义功能块(UDFB)。如图 2 所示,我们必须对全局变量使用一致的命名方案。这一点至关重要,因为全局变量是连接图 2 左侧硬件依赖部分与右侧硬件独立部分的桥梁。
请注意,尚未针对所有类型和情况进行全面的兼容性测试。然而,如下文将演示的那样,我们有充分理由相信大多数程序组织单元(POU)可以移植。一个重要的线索是 Opta 与 M171/M172 内置函数之间的重叠。TON 就是一个在两套系统中都常见的内置程序组织单元(POU)示例。因此,包含定时器的用户程序或用户功能数据块(UFDB)预计是可移植的。
技术提示 :Schneider Electric术语"Modicon"指代一大类可编程逻辑控制器(PLC),范围从 Pico TM221C16R 到高性能型号 TM262M35MESS8T。该名称还涵盖专为商用机器设计的一系列控制器,即 Modicon M171/M172 系列。这种与 Arduino Opta 的共性仅限于 M171/172 系列。
为什么全局变量对于可移植程序至关重要?
计算机科学专业的学生被教导要避免使用全局变量。这是一条极好的建议,因为全局变量会使程序复杂化。此外,全局变量以难以排查故障而著称,尤其是当程序跨越多个页面,或分散在多个 .h 和 .cpp 文件中时。
在 IEC 61131-3 环境中,全局变量是不可避免的。即使是最简单的 Opta 或 171/172 程序,仅用一个按钮控制单个输出引脚,也需要两个全局变量。确实如此,因为螺丝端子输入/输出(I/O)被映射到全局变量,这些变量随后可由 PLC 代码结构中的任何程序(小型程序组织单元)访问。
回顾图 2,我们可以认识到,一个较大的 PLC 程序由硬件相关的配置(左侧)和一组硬件无关的程序组织单元(右侧)组成,后者包括内置程序组织单元以及用户编写的程序组织单元。如图 2 所示,PLC 程序的两侧通过这些全局变量进行通信。
这是一个将硬件映射到特定变量名称的问题。Opta 和 M171/M172 使用图 3 所示的机制来执行此操作。例如,我们看到 Opta 的输入 I1 和 I2 分别映射到 gxPB1 和 gxPB2。同样,我们看到 M172 的 DIL1 和 DIL2 输入也映射到 gxPB1 和 gxPB2。
这是一个需要反复强调的关键考虑因素。我们可以拥有不同的硬件,但使用相同的全局变量名称。这些通用名称对于可移植的程序组织单元(如 prgCtrl 或 prgComms)至关重要。该策略构成一个抽象层,为图 2 右侧的程序组织单元提供统一的接口。
技术提示 :在基于标签的 PLC 编程环境(如本工程技术简报所述)中,强烈建议使用匈牙利命名法。使用此表示法时,我们在每个变量前加上数据类型前缀,例如用"x"表示布尔型。我们还添加"g"前缀,以指示该变量具有全局作用域。作为一名教育工作者,我的经验是,这些细节能节省大量的开发和故障排除时间,因为 PLC 程序员必须明确考虑每个变量的作用域和类型。很容易发现不属于此处的内容。请参阅 PLCopen 编码指南,获取更多 PLC 编程建议。
图 3 :Arduino(上)和Schneider(下)的 gxPB1 与 gxPB2 全局变量的硬件特定映射。
POU 如何在不同平台之间传输?
让我们从构建一个简单的 POU 开始,例如图 4 所示的 prgCtrl。这是一个非常简单的程序,用于监控两个按钮。当按下 gxPB2 且 gxPB1 已激活至少 1 秒时,面板灯将点亮。在本示例中,我们将 1 秒延时硬编码到 TON 定时器中。请注意,Opta 的定时器以 1 毫秒为节拍运行。当设定的时间(PT)值为 1000 时,即对应 1 秒的延时。
一旦该程序构建并测试完成,即可将其导出为库。为此,请右键单击该 POU 并选择“导出到库”。这将在您指定的位置创建一个 *.plclib 文件。请注意,许多 POU(包括程序、函数和函数块)都可以放入同一个 *.plclib 文件中。这一点非常理想,因为您的 POU 具有高度的可移植性。
创建库文件后,您可以在下一个 Opta 项目中使用它。要导入 POU,请选择“导入对象”,然后从库中选择所需的 POU。这是一个非常简便的过程,可识别 POU 版本,并支持在项目树中添加或覆盖现有 POU。
图 4 :共享 prgCtrl POU 在 Arduino Opta 上的实现。
Opta 与 Modicon 的跨平台功能
Opta 与 M171/M172 似乎基于同一平台构建。例如,仔细查看图 4(Arduino)和图 5(Schneider)可以发现它们具有相同的程序树结构。我们也在 prgCtrl POU 中看到了相同的元素。
这些实际上是同一个 POU ! 库流程在特定环境内部与跨平台流程是相同的。
在此示例中,prgCtrl 是在 Arduino PLC IDE 中编写的,随后被传递到库中,并导入到Schneider Electric EcoStruxure Machine Expert – HVAC 中。欢迎您亲自尝试,此处可下载所展示的 POU(库):
POUDemo.plclib(2.1 KB)
图 5 :共享 prgCtrl POU 在 Modicon M172 上的实现。
跨平台兼容性会带来哪些影响?
就我个人而言,我认为这是一种令人欣喜的协同效应。声称某款 PLC 可以使用所有 IEC 61131-3 语言进行编程是一回事。而当各个 POU 能够完整无损地在多个平台之间转移时,情况则完全不同。社区具有巨大潜力来构建并共享一个 POU 库。大量相关设备为社区参与提供了激励,因为它不再局限于特定硬件。在某种程度上,这类似于使用 C 语言进行编程,因为我们现在拥有了一个有效的抽象层,提供了备受青睐的硬件独立性。
从教育角度来看,这是有益的。正如我之前所论证的,Arduino 在近二十年来一直为微控制器开发树立标准。Arduino 在高等教育领域广为人知,受到技术人员、技术专家以及工程师的认可,并广泛吸纳了电气和机械方向的学生。
请记住,Opta 独特地具备利用现有微控制器用户群的优势,因为它既可通过传统的 Arduino IDE 进行编程,也可通过新的 Arduino PLC IDE 并使用所有 IEC 61131-3 语言进行编程。从教育角度来看,这种灵活性为 PLC 编程提供了多种入门途径。它还促进了并行编码任务的开展,使学生能够在传统 Arduino IDE 之外,探索各种 IEC 61131-3 语言的优势与挑战。
凭借这种新发现的互操作性,所有这些教育益处和良好声誉将立即转移到Schneider Modicon M171 和 M172 产品上。
回归到基本的 POU 构建模块,我设想由教育工作者和其他利益相关伙伴组成的社区,将为特定应用构建并维护 POU 库。如前所述,其中许多可以以面向对象编程(OOP)对象的形式存在,用于接口连接和控制 PLC Connect 硬件。我们有巨大潜力降低入门门槛,从而将 PLC 编程扩展到更广泛的程序员群体。
欢迎分享您关于 PLC 编程和教育的评论、问题与关切。此外,可能还存在其他尚未被识别的、共享此通用接口的 PLC。提前感谢您扩充该列表。
继续探索工业控制系统
如果本讨论对您有所帮助,您可能还想了解:
DigiKey 导航
- 完整目录 :工业控制与自动化



