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
thiagoralves@gmail.com
摘要
公司总是在寻找增加产量的方法。高涨的消费主义促使工厂用更少的时间生产更多的产品。工业自动化是提高质量、生产和降低成本的解决方案。自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的硬件可分为五个基本部分:
- 机架
- 电源
- 中央处理器CPU
- 输入
- 输出
像人的脊椎,机架有一个背板在后方允许每个PLC模块之间进行通信。电源插头插入机架,为系统提供一个可调节的直流电源。
CPU可能是PLC中最重要的模块。它负责处理从输入模块接收到的信息,并根据编程逻辑将脉冲发送到输出模块。CPU将其程序保存在永久存储器上,并使用易失性内存执行操作。存储在CPU内存中的逻辑是在无限循环中连续处理的。完成无限循环所需的时间称为扫描时间。更快的CPU可以实现更短的扫描时间。
输入模块用于读取安装在现场的传感器的信号。有许多类型的输入模块,取决于要读取的传感器,但它们通常可以分为两类:模拟和数字。
数字输入模块可以处理由开或关设备产生的离散信号。模拟输入模块将物理量转换为可由CPU处理的数字。这种转换过程通常由模拟输入模块内部的ADC(模拟到数字转换器)完成。要读取的物理量的类型决定了模拟输入模块的类型。例如,根据传感器的不同,物理值可以用电压、电流、电阻或电容来表示。
与输入模块类似,输出模块可以控制安装在现场的设备。数字输出模块可以像开关一样控制设备。模拟输出模块可以将不同的电压或电流值发送到控制位置、功率、压力或任何其他物理参数。
由于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原型,我们构建了四个板:
- 总线板
- CPU板
- 输入板
- 输出板
A. 总线板
总线板的作用像一个机架,与集成的5VDC电源。每个模块通过DB-25连接器连接到总线板。模块之间的通信是通过RS-485总线进行的,总线的线路在总线板上。在路由RS-485线时要小心,以避免通信问题。图3为母线板各插槽的引脚和连接。为了隔离这些线路上的短路,将24V和RS- 485接地与电路的其余部分接地分开。
为了让更多的电流通过电源线,个别的引脚被复制。三个引脚用于物理地址,因此连接在特定插槽上的模块将知道它在总线板上的物理位置。这些大头针被称为D0、D1和D2,在二进制序列中用逻辑1或0进行硬编码,在0到7之间创建不同的数字,每个插槽一个数字。
B. CUP板
OpenPLC的大脑是CPU卡。使用便宜、足够快的处理器来处理所有PLC操作是很重要的,最重要的是,它得到了开源社区的积极支持。经过一些研究,选择的处理器是AVR ATmega2560。这个单片机是一种高性能,低功耗Atmel 8位AVR基于risc微控制器相结合的256 kb ISP闪存,8 kb SRAM, 4 kb eepm, 86年通用I / O线,32个通用寄存器工作,实时计数器,六个灵活的定时器/计数器与比较模式,PWM, 4 USARTs,面向字节的2线串行接口,16 - 10位a / D转换器,频道和JTAG接口——芯片调试。该设备在16mhz时达到16mips的吞吐量,工作电压在4.5-5.5伏之间。
做出这一选择的最大原因是,ATmega2560用于Arduino家族,这是一个用于快速电子原型制作的大型开源社区,拥有一种称为Wiring的高级编程语言。通过使用这个处理器,我们使OpenPLC与Arduino代码兼容,包括为它编写的数百个库。
CPU卡还包括另一个重要的IC(集成电路),Wiznet W5100,负责以太网通信。Wiznet W5100支持硬连接的TCP/IP协议,如TCP、UDP、ICMP、IPv4 ARP、IGMP、PPPoE和以太网10BaseT/100BaseTX,有16KB的内部内存用于Tx/Rx缓冲区,可以接受串行(通过SPI)或并行接口。这也是Arduino Ethernet Shield的官方IC,使我们能够重用在OpenPLC上为它编写的所有代码。
为了与PC机通信和下载程序,OpenPLC使用一个USB端口。FTDI设备的FT232RL将串行Rx/Tx线路转换为USB标准。Arduino Mega引导加载程序用于通过USB电路将代码上传到CPU。
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电路有五种保护方式:
- PPTC限流保护[聚合正温系数]
- TVS过压保护[瞬态电压抑制二极管]
- 地面隔离
- 极性反接保护
- 噪声滤波器
每个输入和输出(包括母线板上的电源输入)都有过压和短路保护。这些保护是通过PPTC串联电路输入和TVS二极管并联来实现的。
当高电流流过PPTC时,它会以低保持电流达到高电阻,从而串联保护电路。当电流被移除时,它会循环回到导电状态,使电路能够正常工作。
光电耦合器和继电器用于将大功率电路与控制逻辑隔离。填充区域连接到地面,只填充了板的低功率区域。为了隔离通信和24V接地从填充区,零欧姆电阻使用。
为了防止输入端的极性反转,二极管被串联起来,只允许电流朝一个方向流动。此外,电容器被用于与地面平行,以过滤来自敏感设备的噪声。
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个功能:
- 0x01 :询问板卡类型
- 0x02 :改变板卡的逻辑地址
- 0x03 :读离散输入
- 0x04 :建立离散输出
- 0x05 :错误消息
地址字段可以有板卡的逻辑或物理地址,根据要求的功能。例如,函数0x01和0x02被定位到物理地址,因为它们与低级命令相关,比如获取卡片信息或更改逻辑地址。
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应用于现场,评估其健壮性、通用性和易用性。