OpenPLC:自动化的开源替代品
by:Thiago Rodrigues Alves, Mario Buratto, Flavio Mauricio de Souza, Thelma Virginia Rodrigues
Departamento de Engenharia Eletrônica e de Telecomunicações
PUC Minas
Belo Horizonte, Brazil
[email protected]
摘要
公司总是在寻找增加产量的方法。高涨的消费主义促使工厂用更少的时间生产更多的产品。工业自动化是提高质量、生产和降低成本的解决方案。自70年代初以来,PLC(可编程逻辑控制器)取代了继电器逻辑电路,主导了工业自动化。然而,由于其高昂的成本,世界上许多地方仍然无法实现自动化。本文描述了一种低成本开放源码的创建可编程控制器,与那些已经在工业自动化中使用的可编程控制器相比较,具有模块化和简化的体系结构和扩展功能。我们这个项目的目标是创建第一个完全功能标准化的开放源码PLC。我们相信,在开源社区的足够帮助下,它将成为一个低成本的解决方案,以加快欠发达国家的发展和工业生产。
关键词:PLC; OpenPLC; Automation; MODBUS; Open source
I. 介绍
60年代早期,工业自动化通常由继电器、凸轮定时器和滚筒定时器等机电部件组成。它们被连接在电路中以执行对机器的逻辑控制。改变一个机器的逻辑就是对它的电路进行干预,这是一个漫长而复杂的过程。
1968年,通用汽车公司的液压马达公司要求用电子设备代替硬线中继系统。获胜的提案来自贝德福德与他们的084项目相关。084是一个数字控制器,使宽容的工厂地面条件,后来被称为可编程逻辑控制器,或简单的PLC。
在几年之内,PLC开始遍布整个汽车工业,取代了继电器逻辑机,成为一种更简单、更便宜的解决方案,并成为工业自动化的标准。
自动化和开发之间有严格的联系。在欠发达国家,最大的障碍是知识和成本。工业控制器仍然很贵。公司没有提供关于这些控制器内部如何工作的详细信息,因为它们都是闭源的。
OpenPLC的创建就是为了打破这两个障碍,因为它是完全开源和开放的硬件。这意味着任何人都可以免费访问所有的项目文件和信息。这类项目有助于将技术和知识传播到最需要的地方。此外,OpenPLC采用了廉价的组件来降低成本,为以前不可能实现的自动化打开了大门。
II. PLC架构
PLC作为一种数字控制器,与典型的pc机有共同的术语,如CPU、内存、总线、扩展等。但是PLC有两个方面与标准计算机不同。首先,它的硬件必须足够坚固,才能在恶劣的工业环境中生存下来。其次,它的软件必须是实时的。
A. 硬件
除了非模块化的“砖式PLC”外,一般PLC的硬件可分为五个基本部分:
B. 软件
根据设计,个人电脑可以同时处理不同的任务。然而,他们很难处理实时事件。为了进行有效的控制,plcs必须是实时的。实时的一个很好的定义是“任何信息处理活动或系统必须在有限和指定的周期内响应外部生成的输入刺激”。实时系统并不一定意味着快。他们只需要在最后期限之前给出答案。没有实时设施的系统不能保证在任何时间段内响应。PLC的最后期限是它的扫描周期,所以所有的响应必须在扫描到达循环的末端之前或那一刻给出。
有许多公认的编程语言来进行PLC的编程,但最广泛使用的是梯形逻辑,它遵循IEC 61131-3标准。
梯形逻辑(见图1)最初是用来记录继电器逻辑电路的设计和构造的。这个名字来自于观察到这些图表类似于梯子,两个竖条代表轨道,在它们之间有许多水平的梯级。这些电气原理图在PLC诞生后很快就演变成了一种编程语言,使得技术人员和电气工程师无需进行学习C语言、BASIC语言或FORTRAN语言等计算机语言等额外培训就能开发软件。
阶梯逻辑中的每个梯级代表程序的一条规则。当使用继电器和其他机电设备时,所有规则同时执行。然而,当图是在软件中使用PLC实现的时候,每一个横档都是在一个连续的循环(扫描)中依次处理的。扫描由三个阶段组成:1)读取输入,2)处理梯形图,3)激活输出。为了达到同时执行和立即执行的效果,在扫描周期结束时同时切换输出。
III. OPENPLC硬件架构
OpenPLC(见图2)是根据市场上实际plc的架构创建的。它是一个模块化的系统,具有扩展功能,是一个RS-485总线,用于模块之间的通信和硬件保护。
为了创建第一个OpenPLC原型,我们构建了四个板:
C. 输入板卡
输入板卡是OpenPLC的数字输入模块。为了处理调理信号电路读取的数字输入并将其发送到CPU卡,输入卡使用AVR ATm ega328P,这是一个与CPU卡具有相同核心的微控制器。这使得为CPU卡编写的部分代码的重用成为可能,特别是与RS-485总线通信相关的代码。
输入信号调理电路主要由光耦构成,用来隔离输入信号和控制信号。各输入端电路如图4所示。
当刺激E1+和E1-之间,电流通过输入电阻,激活光耦的内部LED。内部LED发出的光子由光电晶体管感知,光电晶体管为5VCD到地面的电流创建一条路径,将逻辑0发送到逆变器的输入端。由于逆变器必须反转逻辑信号,因此微控制器接收逻辑1,表示在输入端有数字刺激。输入卡有8个独立的输入电路,因此每个模块可以同时读取8个数字信号。每个输入的状态都通过RS-485总线发送到CPU卡上,然后根据梯形逻辑进行处理。
D. 输出板卡
每个输出卡有8个基于继电器的输出,同时驱动多达8个负载。它有双隔离输出,因为它们是由光耦合器(就像输入卡)和继电器本身隔离的,这就提供了一个额外的隔离层。图5所示为输出卡的一个隔离输出的电路。
由于数字处理器的下沉电流比源电流更好,光电耦合器的内部LED阴极连接到ATmega328P上的输出管脚。当输出引脚与逻辑1保持一致时,没有电流通过LED。如果输出引脚进入逻辑0,则在该引脚上绘制电流,激活光耦合器的内部LED。内部光电晶体管以Darlington配置连接到外部BC817晶体管以增加增益。当内部光电晶体管感知到光子时,两个晶体管都极化,为继电器线圈提供能量。如果没有光子,线圈中就不会有任何电流通过,继电器也会保持关闭状态。
E. 保护
OpenPLC电路有五种保护方式:
IV. OPENPLC软件架构
PLC与其他健壮的数字控制器的不同之处在于它可以用一些标准语言进行编程。根据[3],IEC 61131-3标准定义了五种plc编程语言:
FBD:功能框图
LD:梯形图
ST:结构化文本
IL:指令表
SFC:程序功能图
在PLC中使用最广泛的语言是梯形图。来自不同制造商的plc可能没有五种可用的编程语言,但它们肯定有梯形图作为选项之一。
因此,开发一种能够将梯形图编译成OpenPLC的CPU可以理解的代码的软件是很重要的。解决方案部分基于LDmicro,这是一个开源的梯子编辑器、模拟器和编译器,用于8位微控制器。它从梯形图生成Atmel AVR和Microchip PIC16 cpu的本地代码。
不幸的是,OpenPLC CPU使用的是原来的LDmicro软件不支持的ATmega2560。此外,生成的代码只包含转换为组装指令的梯形逻辑。OpenPLC还具有许多其他功能,如用于MODBUS-TCP监控系统的以太网通信、RS-485和USB、单个模块控制、错误消息生成等。
由于这个原因,有必要在最终编译之前创建一个中间步骤,在这个步骤中,梯形图必须与OpenPLC固件相结合。这样,最后的程序将包含梯形逻辑和OpenPLC函数。LDmicro为梯形图生成的输出之一是ANSI C代码。因此,生成的不是针对特定处理器的机器码,而是可以针对任何平台编译的ANSI C代码。使用此方法必须提供的惟一内容是一个C标头,用于链接生成的ANSI C函数和目标系统。
创建OpenPLC梯形编辑器(图6)来完成这些任务。基本上,OpenPLC阶梯LDmicro编辑器修改版本,与减少指令(处理器的指令必须被删除),不支持直接编译(它只生成ANSI C代码)和一个工具,可以自动链接与OpenPLC固件生成的ANSI C代码,编译所有使用AVR OpenPLC GCC和上传编译软件。
每次单击compile按钮时,都会调用编译器工具。LDmicro的代码是使用c++创建的,而编译工具是使用c# .net创建的,c# .net是一种非常健壮的现代语言。
最终的结果是一个上传至OpenPLC CPU的二进制程序,包含了梯形逻辑和OpenPLC固件的功能。
A. Modbus通讯
MODBUS是自动化设备的行业标准协议。尽管保留了消息格式,但根据将在其上使用的物理接口,此协议有一些变体。由于OpenPLC通过TCP-IP拥有以太网,因此实现了对MODBUS-TCP协议的支持。只实现了协议中最常用的功能,如下所示:
FC01:读保持线圈状态
FC02:读开关量输入
FC03:读保持寄存器
FC05:写单个线圈
FC015:写多线圈
B. 板卡的通讯
要成为一个模块化系统,OpenPLC的每个模块都必须有与cpu通信的方式。RS-485总线是发送消息的物理协议。但是有必要在应用层创建协议,以标准化发送和接收的消息。
创建的协议称为OPLC协议。它是一个简单的协议,封装了发送或接收的每个消息,其中包含关于目的地、消息大小和要执行的功能的信息。
每个消息都以一个起始字节开始,该字节总是0x7E。接收方只会在接收到开始字节后处理消息。size字段必须只包含数据字段的大小(以字节为单位)。函数字段与数据字段相关。这意味着接收方将如何处理接收到的数据取决于函数。OPLC协议实现了5个功能:
V. 结果
要将OpenPLC评估为真正的PLC,必须将它与另一个控制器进行基准比较。这是通过一个五层建筑的模型实现的,电梯最初由西门子S7-200 PLC控制。对模型进行了修改,使其能够方便地将plc用于测试。电梯由安装在它上面的直流电动机驱动。每层楼都有限位开关,指示电梯的位置。此外,在电梯的顶部和底部安装了限位开关,以防止电梯超出允许的范围。每层楼的灯光指示灯用来直观地指示电梯何时停在相应的楼层。5个按钮被用来呼叫电梯到需要的楼层。
该任务的梯形图已经使用Siemens Step 7平台为Siemens PLC编写。它使用13个数字输入和10个数字输出来完全控制模型。使用相同的逻辑块打印图表并为OpenPLC编写完全相同的图表,见图10。使用OpenPLC梯形编辑器对图形进行编译、仿真并上传至OpenPLC。
在测试期间,发现了梯形图上的一个错误。如果用户按住与电梯所在楼层相关的按钮,同时按下另一个按钮将其发送到另一楼层,系统就会挂起一个无限循环。正如预期的那样,OpenPLC的表现与西门子PLC完全一样,出现了同样的问题。在校正了两个控制器上的梯子后,每个控制器都完美地运行。不同刺激对每个PLC的响应在每个测试情境下都是相同的。
VI. 结论
开源社区每天都在壮大。有许多项目,从软件到硬件,都有来自世界各地的人们的贡献。从头创建一个开源的工业控制器是一个非常大胆的任务。但是多亏了开源社区如Arduino和LDmicro的支持,才有可能创建一个功能可编程控制器的原型,与一个标准化的工业控制器相媲美。在测试过程中,给定相同的输入脉冲,OpenPLC的表现与其他控制器完全相同。使用来自不同供应商的SCADA软件对MODBUS-TCP通信进行了测试。它可以读取输入输出和强制输出,就像在任何其他PLC上一样。
我们的下一个重要步骤是将OpenPLC应用于现场,评估其健壮性、通用性和易用性。