Java 与 GraalVM Native Image:提升制造应用数据库连接性
当今制造业应用格局呈刚性层级:顶层管理用 ERP、规划用 MES、监控用 SCADA、底层控制用 PLC 和现场系统。
管理、规划、监控层多用高级面向对象语言实现,而控制系统完全用低级语言实现,C 语言主导。
从高级到低级层级的突变造成多问题:需完全不同工具和生态系统;实现需完全不同思维方式的开发者;两世界间需定义接口。仅因无法在控制层继续使用监控层熟知的高级语言。现已改变。利用 PLC 等控制层容器技术,我们能在此层级使用 Java 等语言打破刚性层级。
Java 是广泛使用的高级面向对象语言,拥有活跃社区和库框架生态,提供额外功能,利用现有工具解决方案更快高效构建应用。
我们将展示 Java 在 Phoenix Contact PLCnext 上的可用性,简化运行在 PLCnext 上直接与数据库通信检索存储应用相关信息并呈现于 Web 界面的应用开发。最流行 Java 框架之一是 Hibernate。它简化 Java 对象到关系数据库表映射,减少数据库操作样板代码。Hibernate 提供高级抽象,让开发者用对象而非直接写 SQL。可加快开发周期减少工作量。Hibernate 屏蔽不同数据库厂商差异,无需大量代码更改即可切换数据库。本文描述 Hibernate 集成以连接运行在 PLC 上的软件到数据库。
PLCnext 上的现代 Java 应用
为开始实现现代 Java 应用,推荐使用 Quarkus 或 Spring Boot 等应用框架。这些框架简化项目配置、依赖管理。
本例用 Quarkus 的"使用 Hibernate ORM 和 Jakarta Persistence 指南"启动应用。源码示例见 GitHub 项目 hibernate-orm-quickstart。
开始修改应用源码。可将 Java 类 Fruit.java 改为 Event.java 并添加 date 字段。
Event.java 代码示例:
... @Entity @Table(name = "Events") public class Event { @Id @GeneratedValue private Long id; private String title; @Column(name = "eventDate") private LocalDateTime date; ... 可修改 application.properties 配置数据库 URL 和凭据
src/main/resources/application.properties 示例
quarkus.datasource.db-kind=postgresql quarkus.datasource.username=myusername quarkus.datasource.password=mypassword quarkus.datasource.jdbc.url=jdbc:postgresql://myremotehost/mydatabase quarkus.datasource.jdbc.max-size=8 quarkus.datasource.jdbc.min-size=2 quarkus.hibernate-orm.database.generation=create ... 应用启动时数据库将按需创建初始化表。启动后可通过 PLCnext 上 8080 端口运行的 Web 界面与数据库交互:
请记住,这都发生在层级的控制层,中间无任何额外系统。
GraalVM Native Image
许多开发者仍信 Java 需 Java 运行时环境执行字节码且性能不足。这对嵌入式应用不再成立。本例用 GraalVM Native Image 技术将 Java 代码编译为原生应用。GraalVM 提前编译为原生可执行文件,显著减少启动时间和内存开销,相比传统即时 (JIT) 编译,为资源受限嵌入式系统提供引人注目的解决方案。
MicroDoc 的 GraalVM 独特生成嵌入式设备二进制能力。撰写时 GraalVM 支持 32 位和 64 位 ARM 及 x86 处理器。
为针对 PLC AXC F 1152 提前编译 Java 应用,可用 MicroDoc GraalVM 在 application.properties 配置编译器选项。
... quarkus.native.additional-build-args=--target=linux-arm,-H:CompilerBackend=llvm,-H:+PreserveFramePointer,-Dllvm.bin.dir=/llvm/bin,--native-compiler-path=/arm-none-linux-gnueabihf-g++,-H:CAPCacheDir=/cap-cache/armv7a-linux-gnueabihf 交叉编译和调试过程详见:Building and debugging Java native images of MicroDoc GraalVM Embedded
构建应用只需命令:
$ mvn -Pnative package 接着启动 PLCnext 模拟器。模拟器作为 qemu 镜像提供。模拟器问候:
PLCnext Linux 2023.0 sim-axcf1152 ttyAMA0 sim-axcf1152 login: 生成的二进制用 scp 复制到 PLC,打开安全 shell 传输二进制到目标系统。用以下命令启动应用:
$ ./application 用 PLCnext cockpit 客户端查看当前内存和存储使用:
我们也关注单应用启动和内存消耗与 Java 运行时环境如 OpenJDK 对比。测量两值如下表:
启动时间(越小越好),内存使用(越小越好)
GraalVM Native Image: 0.413 s, 87 MB
OpenJDK: 13 s, 128 MB
GraalVM Native Image 在启动时间和内存使用上显著优于 OpenJDK,证明其优化资源消耗实现高效应用部署的有效性。
总结
在控制层如 PLC 使用 Java 多重益处。首先,监控层和控制层无技术断层。同一团队可实现应用并受益 Java 生态和工具。其次,GraalVM 能在嵌入式设备如 32/64 位 ARM 和 x86 处理器上将 Java 代码编译为原生应用。开发者无需关心底层架构可用高级面向对象语言实现应用。第三,得益于 Phoenix Contact PLCnext 容器支持,我们在同一硬件组件直接访问 PLC 接口,打破制造业应用刚性层级。
注意:
Makers Blog 展示社区成员应用和用户故事,未经 Phoenix Contact 测试或审核。使用风险自负。
工业技术
- 航天史上 10 大最惨痛发射失败:血的教训与技术进化
- 敏捷制造与快速原型:新冠疫情下重塑供应链韧性
- 将 5S 管理融入工业 4.0:破解实施难题
- 精密机械臂 DIY 全流程指南:从 Arduino 入门到手势/视觉/无线进阶
- WMEP 助 New Berlin Plastics 通过 ISO 9001:2015 升级实现 1700 万美元销售增长
- 理解查找表:从 ROM 到高级 ALU
- 铝合金压铸件高性能表面处理先进工艺
- 消除异物碎屑(FOD):提升精密机加工车间安全、质量与效率
- 金属制造演进史:从古代工具到现代科技
- 提升气体分配系统安全性与效率的专家指南
- 2019电子创业风口:8大细分赛道从安防到电商的商业蓝图
- Speedgate:首个AI设计的运动革新体育玩法