提出背景:为解决工业互联的IT系统与控制系统的通信问题
**提出原因:**业界的可编程逻辑控制器(PLC)大多采用大量不兼容的协议进行通信。这使得创建将这些系统与新世界(IT/互联网)集成的应用程序变得很困难。这,就是PLC4X项目的用武之地。
项目提出:
项目愿景:“我们的目标是创建一组库,允许统一访问任何类型的PLC”
总的来说,这个项目正在努力实现OPC-UA(大名鼎鼎的通用工控通信协议)试图解决的相同目标,但PLC4X试图通过走一条完全不同的路径来实现这一目标。
OPC-UA的痛点
使用OPC-UA时,每个设备都必须进行“改造”,工程师们通过修改程序让PLC们能够“说出”新协议(OPC-UA),并使用通用客户端与这些设备对话。整个改造无疑是复杂而艰巨的,并且由于存在风险,通常是客户难以接受的。
PLC4X的新方法
PLC4X项目致力于提供统一的API,这些API实现与大多数PLC通过其原生通信协议进行通信的驱动程序。这些驱动程序中的每一个都是根据规范或逆向工程协议实现的(合法的),以便完全获得Apache 2.0许可。
从我们的观点来看,PLC4X相对于OPC-UA的主要优点是:
无需修改现有硬件上的软件不增加硬件计算负担(在现有PLC上激活OPC-UA支持会大大增加PLC的负载)无需支付激活OPC-UA支持的许可证
PLC4X目前支持的原生通信协议:
图例
√ 实施并得到全面支持
? 仿真实现和支持
! 尚未实施
语言支持
PLC4X目前支持Java语言,并计划后期支持Scala和C++。
实现原理
OPM:PLC对象映射
对象PLC映射(OPM)受Java Persistence API(JPA)的启发。PLC4X项目的主要目标之一是使与PLC设备的通信变得容易,以便开发与PLC交互的应用程序。由于许多(甚至大多数)应用程序员都不是PLC通信和协议方面的专家,因此在没有太多领域知识的情况下,应尽可能轻松地与PLC进行交互。这正是多年前JPA初始化以允许通过简单地调用POJO(Plain old Java Object)上的方法来与数据库交互的原因。这正是OPM模块的用途,通过简单地与POJO交互来实现PLC通信。
以下简短代码片段显示了如何通过OPM从PLC中读取一个数值。
首先,实例化PlcEntityManager,然后为给定的PLC连接地址提取连接的实体。已连接意味着实体的所有方法调用都被交叉并由PLC调用替换。然后将这个值打印到控制台。
在第二个片段中,您可以看到Entity类的外观。@PlcField注释中给出了读取可变压力的地址。
MyEntity类的实现
总结
总体来说,PLC4X是一个新的工业互联网开源项目,在于解决工业控制设备与IT系统的协议通信问题。
这个项目最大的特点是:不是设计一种新的“通用协议”,而是引入一种适配器和编程模型。适配器解决协议互通问题,而编程模型这帮助程序员更方便的开发业务应用。另外值得一提的是,在解决通信协议开发方面,这个项目是符合Apache 2.0协议的。
当然,作为一个新兴的Apache孵化项目(目前的版本是0.3.0),PLC4X目前还不够成熟:一方面支持的PLC通信协议种类还不够丰富、测试也不够完毕;另一方面,功能总体还比较单薄、文档也比较简陋。
Apache-Plc4x-OPC UA-Tcp学习记录
opcua:tcp://127.0.0.1:4840,表示采用OPC UA协议,通过Tcp通道连接127.0.0.1地址的4840端口来发送和接收指令。
Code: 表示协议编码,对应opcua:tcp://127.0.0.1:4840中的opcua;
Name: 表示协议的名称标记,记录协议的名称;
Default Transport: 表示协议的默认通道为Tcp;
Supported Operations: 表示协议支持的操作。read:设备是否支持读取数据功能;write:是否支持写入数据功能;
这四项信息在源码中的OpcuaDriver类中配置,可以根据需求重写。
Discover:
控制OPC UA服务器发现端点的功能,每台服务器将通过“<地址>/发现”端点传播该功能。这里最常见的问题是大多数服务器没有正确配置,传播了错误的外部IP或URL地址。如果是这种情况,可以通过将其配置为false值来禁用发现。
The OPC UA drivers uses the connection string
opcua:{transport}😕/{ip-address}:{port}?{options}
An example of this connection string would be
opcua:tcp://127.0.0.1:12686?discovery=true&username=admin&password=password
地址格式
为了读取、写入和订阅数据,OPC UA驱动程序使用其所连接的OPC UA服务器的变量声明字符串。它包括层次结构树的命名空间(ns),后跟标识符字符串的类型、数字(i)、二进制(b)或guid(g)及其地址。数据类型是可选字段,如果未包含该字段,则会根据返回值的数据类型选择默认数据类型。对于未签名的数据类型,则需要将其包括在内。
支持的数据类型
BOOL (boolean) SINT (int 8) USINT (uint 8) BYTE (uint 8) INT (int 16) UINT (uint 16) WORD (uint 16) DINT (int 32) UDINT (uint 32) DWORD (uint 32) LINT (int 64) ULINT (uint 64) LWORD (uint 64) REAL (float) LREAL (double) CHAR (char) WCHAR (2 byte char) STRING (utf-8) WSTRING (utf-16)
String address:
ns=2;s=HelloWorld/ScalarTypes/Boolean
ns=2;s=HelloWorld/ScalarTypes/Boolean;BOOL
Numeric address
ns=1;i=1337
ns=1;i=1337;DINT
GUID address:
ns=2;g=09087e75-8e5e-499b-954f-f2a8624db28a
ns=2;g=09087e75-8e5e-499b-954f-f2a8624db28a;REAL