如果一直再搞 PLC数据采集,基本上都会遇到一个坑:
每次接入一个新的设备都要重新写一遍驱动程序。
Modbus 还可以接受,但是到 S7、EtherNet/IP、BACnet 等协议的时候就完全不同了。
通信方式不同、报文格式不同、地址规则也不一样。
项目里的设备一多,驱动代码很快就会堆成一座山。
后面不管是维护、升级还是排查问题,都会变得越来越麻烦。
Apache PLC4X 就是为了解决这样的问题而存在的。
把各种工业协议的不同之处都封装在了底层,给开发者提供了一个统一的访问接口。
你只需要关注要读取的数据和要写入的数据是什么就可以了,不需要去反复研究各种协议之间的通信细节。
简单来说:
Apache PLC4X 就相当于给各种 PLC 协议加上了一个统一的适配器,使开发者可以用一套 API 来访问各种品牌的、不同的协议的设备。
它还是 Apache 软件基金会的一个顶级项目,在 2019 年正式成立之后就一直发展了七年。
目前它所支持的协议有Modbus、S7(西门子)、AB/EtherNet/IP(罗克韦尔)、BACnet、CANopen、KNX等十多种主要的工业协议。
详细支持清单大家可以自行查阅。
总之不管你的设备是用哪种协议,从代码层面来说就只需要调用一个接口。
不需要改造现有设备就能直接连接。
它并不需要你去修改现有的设备。
很多工业现场都有使用了十多年的旧设备,这些老设备本身不支持以太网,或者协议很封闭。
传统的方法是换设备或加协议转换网关,但是两种方法成本都很高。
PLC4X通过在软件层面实现各种协议的驱动来解决该问题,设备本身不需要进行任何修改。
对从事工业数据采集的人而言,这个能力很实用。
不需要向老板申请预算去换设备,也不需要等设备厂家开放接口。
知道设备使用的协议之后就可以直接开始写代码去读取数据了。
性能比传统OPC-UA更强。
从性能上来说,PLC4X的设计也考虑到工业场景下的特殊情况。
传统的OPC-UA标准做的不错,但是在高频数据采集的情况下表现一般。
PLC4X 的驱动更轻巧一些,能够以比较高的频率去获取数据。
安全设计上提供了"被动模式"驱动。
在这种模式下,驱动只监听总线上的数据,并不主动给设备发任何请求。
对一些重要的设备采用只读不写的模式可以防止由于误操作而造成的问题。
多语言支持,生态完整。
项目本身的生态也很完整。
除了提供Java版的实现(PLC4J)之外,还为Go(PLC4Go)、C(PLC4C)、Python(PLC4Py)等其他多种语言提供了支持。
也就是说不管上面的系统是用什么语言开发的,都有对应的客户端库。
更关键的是,它和Apache生态的其他项目有很好的集成。
可以使用Apache Camel做数据路由,用Apache Kafka做消息队列,用Apache NiFi做数据流处理,用Apache IoTDB来做时序存储。
这些都是已经存在的,不需要自己从头开始搭建整个数据管道。
社区活跃,持续更新。
项目目前有21个提交者和14个PMC成员,最近几个版本都在持续更新。
2025年8月发布的版本是0.13.0,在9月份又修复了一些bug之后发布了0.13.1。
开发组正在进行第三轮SPI(服务提供者接口)重构工作,主要目标是减少对其他模块的依赖程度、提升执行速度。
上手门槛低,文档齐全。
上手门槛也不高。
如果用Java来开发的话,在Maven里加上依赖之后,只需要写几行代码就能连到设备上了。
Maven 依赖:
连接设备读数据示例代码:
更多细节参考官方文档,说的很细。
当然,它也不是万能的。
遇到比较冷门的协议,目前没有现成的驱动,那就只能依靠社区的支持来解决,或者是自己去开发。
好的一点是 PLC4X 已经提供了一个完整的开发框架以及示例代码,如果有协议开发的经验的话,添加一个新的驱动也很简单。
需要的朋友可以去试试看。
开源地址:https://github.com/apache/plc4x 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!