PLC教程1 软件工程
1 PLC软件工程
自动化工程存在一个核心问题,那就是大多数PLC(Programmable Logic Controller)项目通常被视为硬件优先。许多书籍、研讨会等都将PLC项目视为硬件优先的系统。通常情况下,编程对于系统的整体硬件设计来说是次要的。换句话说,软件是用来操作硬件的。
许多PLC程序员并没有受过正规的软件开发培训,他们的背景从电工到电气和机械工程师不等。尽管PLC开发人员不是受过正规培训的程序员并没有错,但编程课程中通常会教授一些技术,而这些技术在未经正规培训的程序员尝试对PLC编程时往往会丢失。本书旨在教授软件工程实践并将其应用于PLC编程。通过学习这些技术,PLC开发人员可以充分利用IEC61131-3 标准,更快、更简洁地创建高级软件。
当今快节奏工业世界的热门话题是人工智能(AI Artificial Intelligence)和自动化。简而言之,机器正在变得越来越智能,而其中的一个重要组成部分就是控制系统的软件。第一台PLC大约在 20 世纪60年代末和70年代初问世;因此,PLC(以及由此延伸的自动化)并不是什么新鲜事物。然而,发生变化的是PLC所控制的系统的复杂性。随着PLC成本的降低和计算能力的提高,PLC 所控制的应用似乎变得越来越复杂。PLC程序员仅凭基本编程技术和梯形图逻辑就能应付自如的时代正在迅速成为过去。要想在当今市场上生存并具有竞争力,就需要一种新的PLC代码思维方式。当今世界需要能胜任软件工程师工作的PLC程序员。
在本章中,我们将介绍以下主题:
- PLC的软件工程
- IEC 61131-3 标准
- PLC 编程方法
- CODESYS
- 测试CODESYS安装的梯形图逻辑程序 Hello, World!
1.1 技术要求
Windows计算机和一个名为CODESYS的免费程序。CODESYS 是一体化的 PLC 开发环境,包含一个内置模拟器,无需物理硬件即可运行 PLC 代码。CODESYS 可在此处免费下载:https://www.codesys.com/download.html
要启动并运行 CODESYS,建议具备以下规格:
- Windows 8 或更高版本(32/64 位)
- 12 GB 可用硬盘空间
- 8GB 内存
CODESYS 的安装非常简单。您只需点击链接,创建一个账户,然后按照安装向导进行操作即可。稍后我们将进一步探讨 CODESYS,但目前您只需下载并安装软件即可。
本书的所有代码示例都将放在 GitHub 上。虽然您不需要 GitHub 账户来获取代码,但建议您创建一个账户并下载 GitHub 桌面工具。在本书的示例中,我们鼓励你对示例进行自己的修改。因此,GitHub 允许你提交代码,而不必担心丢失过去的迭代。这个项目的源代码可以在这里找到:https://github.com/PacktPublishing/Mastering-PLC-programming。
1.2 PLC 的软件工程
软件工程不仅仅是编写程序。软件工程是一门有效解决问题的艺术。当前工业编程思想的一个主要问题是,软件往往被视为硬件的二等公民。换句话说,PLC 软件被视为硬件的补充。软件往往被视为可有可无的组件。在自动化编程中,软件实践被抛到九霄云外的情况并不少见。因此,可以轻松修改并使用多年的代码库往往不得不早早丢弃。许多书籍和培训课程都以这种方式对待 PLC 软件,这反过来又延续了将 PLC 软件作为 PLC 硬件补充的循环。总的来说,这是一种有缺陷的理念。软件与硬件同等重要(在某些程度上甚至比硬件更重要)。总之,如果程序编写得当,机器将更容易修改和修正。这样,软件就可以移植到其他机器上,从而最大限度地减少编码缺陷,实现成功的生产运营。
对于许多非传统软件开发人员来说,一种非常糟糕的理念已经深入人心。许多开发人员认为,可行的解决方案就是好的解决方案。然而,想象一下,你是一名汽车修理工。把引擎盖焊上,这样每次需要换机油时,就必须用等离子切割机把引擎盖切下来,这样做明智吗?从技术上讲,引擎盖的功能与现在汽车上的引擎盖相同。它仍然可以保护发动机,但代价是需要在日常维护时将其打开。虽然将引擎盖焊接到汽车上也可行,但这并不是明智的工程选择。软件开发也应如此。仅仅因为一个解决方案可行,并不意味着它就是一个好的解决方案。
软件工程师应该如何处理问题?这个问题的答案与任何其他类型的工程师处理问题的方式相同:首先了解问题,然后制定有效的解决方案。当软件工程师处理问题时,他们需要尝试实施一种解决方案,以尽可能简单、高效和易于维护的方式解决问题。就像电气或机械工程师设计产品一样,软件开发人员也需要这样做。软件工程师必须学会开发既能满足原始问题要求,又能在未来轻松修改的解决方案。软件工程师在开发软件时必须牢记以下几点:
- 解决方案能解决问题吗?
- 解决方案是否过于复杂?
- 如果需要更改,解决方案是否易于修改?
- 能否对解决方案进行验证以确保其工作正常(能否方便地进行测试)?
PLC 程序员往往不具备这种思维。许多PLC程序员并不认为自己是软件工程师,但必须明白,当触摸键盘或鼠标并打算编程解决问题时,程序员就成为了软件工程师。当以这种心态开发代码时,就像电气工程师用同样的心态来实现他们的设计一样,这样创建的代码库就会简洁、易于维护、易于升级,并能通过时间的考验,适应未来的需要。
现代软件的一个重要特征和高质量软件开发人员的一个重要特征就是可重用性。高质量的代码可以用于许多不同的项目,而无需重写。在自动化领域,这可能有点困难,因为每个 PLC 生产商都有自己的 PLC 开发软件。不过,许多 PLC 都遵循所谓的 IEC 61131-3 标准,这为 PLC 平台提供了一定的统一性。
1.3 了解 IEC 61131-3 标准
PLC 一般不交叉兼容。大多数 PLC 编程环境都是针对特定供应商的,这意味着为一种设备编写的程序,即使是同一制造商生产的,也无法在另一制造商生产的设备上编译和运行。这就意味着,如果没有标准化,就可能导致现场完全混乱。每种 PLC 不仅有自己独特的编程环境,而且还有自己的一套规则来管理该环境。从一个 PLC 品牌迁移到另一个品牌的开发人员可能需要花费额外的时间来学习新的编程系统。然而,61131-3 的目的是提供一种标准,使开发人员可以轻松地从一种品牌的 PLC 转换到另一种品牌的 PLC,而无需学习全新的编程系统。简而言之,IEC 61131-3 标准使从一种符合标准的 PLC 移植到另一种符合标准的 PLC 变得非常简单,就像在新环境中编写代码一样。
这就是 IEC 61131-3 标准发挥作用的地方。IEC 61131-3 是一种供应商中立、独立于硬件的 PLC 编程标准。IEC 61131-3 的目标是为所有遵循该标准的 PLC 提供统一性。IEC 61131-3 标准之于 PLC,就如同 ECMAScript 之于 JavaScript。换句话说,将该标准视为管理不同供应商的 PLC 编程接口的一系列规则的最佳方式。因此,通过学习一种设备上的规则,开发人员可以相对轻松地将其知识移植到另一种符合标准的设备上。这样,开发 PLC 程序所需的总成本和时间将大大减少,因为开发人员无需学习新的编程语法。
重要的是要明白,PLC 遵循 IEC 61131-3 标准并不意味着代码是交叉兼容的。如前所述,PLC 代码通常是不交叉兼容的。为 RSLogix 设备编写的程序无法在 Beckhoff 设备上运行。这主要是由于硬件结构、编译过程等原因造成的。不过,考虑到设备是兼容的,可以通过创建一个新项目、将代码复制到新文件中并调整代码以满足新设备的要求来移植代码。
IEC 61131-3 标准不是一种语言,缺乏经验的 PLC 开发人员有时会将其与语言混淆。IEC 61131-3 只是一套符合标准的 PLC 用于开发软件的规则。并非每个 PLC 都符合 61131-3 标准,也并非每个符合 61131-3 标准的 PLC 都能利用该标准的所有功能。常见的符合 IEC 61131-3 标准的 PLC 如下:
- Beckhoff
- Wago
- Allen-Bradley
- Omron
- Siemens
此列表并非详尽无遗,不同品牌的可用功能也不尽相同。符合标准的 PLC 还有很多。在大多数情况下,所有主要的 PLC 制造商都符合 61131-3 标准,尤其是较新的设备。不过,如果您需要确保设备符合标准,只需向制造商查询即可。通常,制造商的网站上会公布是否符合标准。
采用标准并不是质量的标志,不符合标准的 PLC 不应被视为比符合标准的 PLC 差。有很多不符合标准的 PLC 是非常优秀和可靠的设备。许多不符合标准的设备在基本层面上也与标准有相似之处。不过,由于 IEC 61131-3 编程实践具有互操作性,使用符合标准的设备最终会降低教育的管理成本。因此,符合标准的设备通常是工业自动化项目的首选。不过,需要注意的是,符合标准的 PLC 通常比不符合标准的 PLC 成本要高。
1.3.1 IEC 61131-3 标准化了什么?
既然已经了解了 IEC 61131-3 标准的一些背景,那么就有必要了解一下该标准的规范内容。IEC 61131-3 标准化 PLC 编程的最大方面是语言语法、数据类型和支持的编程接口(编程语言)。如果您曾用梯形图逻辑、结构化文本或其他接口对 RSLogix PLC 进行编程,然后再对欧姆龙、Beckhoff 或其他兼容的 PLC 进行编程,您可能会注意到,一般语法、数据类型等都非常相似。通常,唯一不同的编程组件是功能块等,因为许多功能块只是制造商在编程环境中内置和包含的罐装功能。换句话说,大同小异就是标准在起作用。
最近,IEC 61131-3 标准引入了所谓的面向对象编程。可以说,这一概念的引入是相当具有革命性的,因为它意味着用于开发传统程序的先进技术现在可以应用到自动化领域。如果您熟悉 C++、Java、C#、Python 等语言或任何现代传统编程语言,那么您很可能熟悉面向对象编程。因此,理解 PLC 的面向对象编程就像学习语法一样简单,因为 PLC 编程也适用同样的规则。不过,如果您的背景不包括面向对象编程,那么从第 6 章开始,我们将在后面详细探讨该范例的原理。
1.3.2 PLC 编程 - 五种 IEC 语言
IEC 61131-3 标准包括几种不同类型的语言接口,用于对PLC进行编程。简而言之,您可以选择多种接口对PLC进行编程。这些接口类似于不同的语言,每种接口都有其优势。其中一些界面在图形上类似于 LabView 等系统,而另一些界面则基于文本,类似于C++或BASIC 等编程系统。按照 61131-3 标准的设置方式,所有系统都是相互兼容的,这意味着在一个接口中可以完成的事情也可以在另一个接口中完成,而且在一个接口中编写的函数等模块也可以在另一个接口中使用。下文将介绍五种 IEC 语言。让我们一起来看看。
- 梯形图逻辑(Ladder logic)
如果您正在阅读本书,那么您很可能了解梯形图逻辑,而且对它非常熟悉。梯形图逻辑是PLC编程的不言而喻的标准。梯形图逻辑是一种编程接口,开发这种接口的目的是让编程人员无需笨重的硬件或数英里长的电线,就能对复杂的继电器逻辑电路进行编程。在所有PLC编程方法中,梯形图逻辑可能是最常见的一种。要成为一名PLC程序员,必须对梯形图逻辑有基本的了解。
梯形图逻辑是一种出色且非常重要的 PLC 编程接口。不过,梯形图逻辑也有一些缺点。那些需要对复杂系统(如运动控制系统、复杂状态机等)进行编程的人都知道,梯形图很容易成为无法维护的噩梦。梯形图对于相对简单的应用或刚刚开始编程的初学者来说是一个非常好的工具。然而,随着软件变得越来越复杂,机器学习等新功能越来越多地集成到日常自动化系统中,梯形图将成为越来越难以使用的工具。
- 顺序流程图(Sequential Flow Charts)
与梯形图逻辑类似,顺序流程图(SFC)是另一种用于 PLC 编程的图形工具。不过,SFC 并非模拟继电器逻辑,而是让程序员使用流程图对 PLC 进行编程。SFC 最适合用于对可分解为多个步骤的过程进行编程。SFC 可以将复杂的程序分解成较小的模块,并控制模块之间的流程。SFC 的最大优势在于它能以图形方式显示程序的流程。这对于开发流程驱动型项目的开发人员来说是一大优势。
- 功能块图(Function Block Diagrams)
功能块图 (FBD) 接口是 IEC 61131-3 标准支持的图形编程语言的最后一种形式。与 SFC 和梯形图逻辑程序一样,FBD 也是一种广泛使用的 PLC 编程语言。FBD 的核心优势在于,它们可用于简化闭合反馈回路的编程,因为这些回路大多通过输入和输出工作,并能为自身提供反馈。对于大多数 IEC 系统来说,块与块之间用线相互连接,这些线代表了从一个块到另一个块的数据流。
对于从事高级项目的开发人员来说,FBD 语言是一种极佳的语言选择。例如,假设您正在为一家水处理厂编写 PLC 程序。您可能有一个称为取水、净水器和收集过程的流程。作为开发人员,您可能已经具备了这些流程的功能,因此您的工作就是将它们串联起来。对于这样的应用,使用 FBD 绘制流程图作为 PLC 编程的一种手段是非常容易的。
- 指令列表(Instruction List)
指令表(通常称为 IL)是一种基于文本的语言,受 IEC 61131-3 标准的约束。IL 是一种非传统语言,在 PLC 编程中使用不多。用户必须将其作为 CODESYS 的一项功能打开。这种语言本身类似于古老的汇编语言。
可以说,IL 是 IEC 61131-3 标准中最不受欢迎的语言。它使用起来非常复杂,而且需要对细节给予高度关注。它很容易产生无限循环、计算错误等。调试也非常困难。不过,用 IL 语言编写的程序通常被认为更快,所需的内存也更少。现在这种语言已不再受欢迎,只有在必要时才可使用。
- 结构化文本(Structured Text)
结构化文本可以说是 IEC 标准中第二流行的编程语言。结构化文本是最接近传统的、基于文本的编程语言,可用来对 PLC 进行编程。其语法在很大程度上借鉴了 PASCAL 和 Ada 等语言。我过去接触过的许多 PLC 程序员看到结构化文本语言时总是有些恐惧。然而,结构化文本没什么可怕的。事实上,结构化文本能让事情变得更简单。任何一个曾在数以百计的梯形逻辑代码中进行过筛选的人都会知道,要弄清哪个梯级做什么以及掌握整个程序的流程往往是很困难的,尤其是当代码的文档记录不完善以及程序中使用了很多跳转时。
简而言之,结构化文本将是未来的发展趋势。随着 PLC 技术的不断进步和应用的日益广泛,结构化文本将逐渐成为 PLC 编程的新标准。换句话说,简单地在特定时间间隔打开或关闭机器的时代即将结束。现代世界正在向复杂的机器学习和运动控制领域迈进,这意味着仅靠梯形图逻辑来完全实现这些新的复杂系统将是困难的,甚至是不可能的。虽然可以用梯形图逻辑、SFC、FDB 等实现面向对象编程等新概念,但可能会很笨拙。总之,由于新型自动化系统的复杂性不断提高,学习结构化文本及其提供的高级功能是非常值得的。
结构化文本语言是本书的重点。要从本书中获得最大的收获,你应该对结构化文本有一个基本的了解。不过,结构化文本非常容易掌握,因为它是一种简单、人类可读的格式。本书中的示例将是高级的结构化文本概念,但也很容易理解。如果你觉得自己对结构化文本掌握得不是很好,我建议你先复习一些基础知识,如循环、if 语句、开关语句和基本数据类型。开始时,你只需粗略掌握这些概念即可。
可以看出,PLC 有许多不同的编程方法。既然已经掌握了不同 PLC 编程语言的背景知识,我们就可以开始尝试编写一些基本代码。为此,我们需要一个开发环境。我们将使用的开发环境名为 CODESYS。
1.4 CODESYS 简介
学习IEC 61131-3标准全部内容的最常用工具是CODESYS。CODESYS是一个可免费下载和使用的PLC编程环境,由德国 CODESYS公司开发。该编程系统具有内置编辑器、语法检查工具和内置模拟器,可让您虚拟编译和运行代码。不仅如此,CODESYS还有一个内置的人机界面开发工具,我们将在本书后面的章节中使用它来开发可完全正常工作的人机界面。因此,您可以学习IEC 61131-3标准的全部内容,而无需花费一分钱购买昂贵的硬件或软件,同时还能开发并观察代码的运行情况。
CODESYS 不仅仅是一个虚拟开发工具。目前,CODESYS 可对各种 PLC 进行编程,也是其他开发环境的基础。CODESYS 可被视为真正的 PLC 集成开发环境 (IDE)。CODESYS 附带许多高级工具,如调试器、库管理工具等,用于加快开发过程。熟悉 Visual Studio 等集成开发环境的用户应该对 CODESYS 的总体要点有所了解。最重要的是,CODESYS 全面支持 IEC 61131-3 协议,包括面向对象编程。
Beckhoff 的 TwinCat 和 Wago 的 e!COCKPIT 等系统都是在 CODESYS 的基础上构建的。简而言之,CODESYS 是学习 PLC 软件开发以及为支持的 PLC 创建生产代码的主要工具。因此,在完成本书的学习后,您不仅可以很好地掌握 IEC 61131-3 标准,还可以很好地了解如何使用其他多种 PLC 开发环境。
如果您还没有安装 CODESYS,请务必立即安装。本书的其余部分需要安装该软件。安装链接可在本章的技术要求部分找到。安装非常简单。您只需按照提供的链接,按照向导进行操作即可。由于 CODESYS 是一家德国公司,下载网站将使用德语。我建议使用 Chrome 浏览器翻译文本。在撰写本书时,你需要提供一些信息,如电子邮件,以创建一个账户,从而下载软件。除此之外,CODESYS 是一个相当庞大的软件包,因此下载可能需要一些时间。
1.5 测试CODESYS
通常,用新语言编写的第一个程序叫做 "Hello, World!"。这是一个在屏幕上显示 Hello 和 World 的简单程序。PLC 相当于关闭和打开一个线圈。为了熟悉并测试 CODESYS 的安装,我们将创建这个简单的梯形图逻辑程序:
- CODESYS 安装完成后,启动程序,你会看到一个页面,在这个页面上你可以创建一个新项目。该页面称为 "起始页"页面,上面有一个 "新建工程"链接。
单击 "新建工程",您将看到一个 "新建工程 "窗口。在这里,单击标准工程,将项目命名为Chapter1,然后单击确定。
项目创建后,屏幕左侧的设备选项卡中将出现文件树。双击PLC_PRG,你将看到梯形逻辑开发屏幕。
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
1.5.1 创建程序
我们要实现逻辑的文件名为 PLC_PRG。这是PLC程序运行时调用的第一个文件。我们将在这个文件中开发Hello, World!梯形逻辑程序。在右侧工具箱中可以找到所有梯形图逻辑命令:
这是声明程序所需的所有变量的完整代码:
PROGRAM PLC_PRG
VAR
input : BOOL;
output: BOOL;
END_VAR
这段代码创建了两个布尔变量,分别称为输入和输出。点击"??",将输入变量分配给触点,将输出变量分配给线圈,然后点击三个点,选择相应的变量。也可以直接输入变量名来代替? 输入变量将用于改变输出变量的状态。简而言之,我们的 Hello, World! 程序的目的就是让输出变量反映输入变量的状态。
点击"在线"->"仿真"启用仿真。
要测试模拟器以查看程序运行情况,请单击屏幕顶部功能区中的 "登录"
登录
登录将激活程序,但不一定能运行程序。要运行程序,必须按下启动按钮。
所有变量都处于 FALSE 或关闭状态:
要打开输出变量,需要将输入变量的假变量值改为真值。为此,请双击输入行中的准备值字段,直到显示TRUE。一旦单元格中出现写有TRUE的蓝色方框,右键单击该单元格并按下 '写入设备的所有值'。
再执行
当输入变量设置为TRUE"时,整行变为蓝色,输出触点的内方格也变为蓝色。这意味着梯级被激活并处于打开状态。从本质上讲,当你看到蓝色时,这意味着梯级处于激活状态,正在执行你所编程的任何逻辑。
也可以将输入切换回"FALSE"。将输入变量切换为"FALSE"状态的步骤与此类似。
1.6 总结
作为一名PLC程序员,了解 IEC 61131-3 标准是绝对重要的。同样绝对重要的是,不要把PLC软件当作可有可无的组件。任何基于PLC的系统的核心和灵魂都是软件。在软件开发之初,必须对其进行精心设计。正如我们所看到的,许多语言都可以用来开发PLC程序。但是,对于复杂的软件,如本书将要探讨的软件,结构化文本将是主要使用的语言。因此,下一章将专门介绍结构化文本语言的高级概念。
至此,你应该已经安装了 CODESYS 并开始工作。如果一切按计划进行,你应该可以运行之前探索过的 Hello, World! 程序。程序并不重要,其真正目的是测试CODESYS的安装情况,并让您熟悉在 CODESYS 环境中运行程序。总之,本章的主要收获是,一个精心设计的 PLC 程序从长远来看将最终节省时间和金钱,因为它足够灵活和稳定,能够支持项目中可能出现的任何变化。