Java & GraalVM Native Image: Datenbankkonnektivität in Fertigungs-Apps beschleunigen
Die heutige Landschaft von Applikationen in der Fertigungsindustrie ist in eine starre Hierarchie unterteilt. Beginnend beim Management mit ERP-Systemen über Planungssysteme mit MES bis hin zu Überwachungssystemen mit SCADA und ganz unten Steuerungssysteme, die mit SPS und Feldebenen realisiert sind.
Während die meisten Systeme für Management, Planung und Überwachung in hohen, objektorientierten Programmiersprachen implementiert sind, werden Steuerungssysteme vollständig mit Low-Level-Sprachen implementiert, wobei C die dominierende Programmiersprache ist.
Dieser abrupte Wechsel von einer hohen auf eine niedrige Hierarchieebene schafft mehrere Probleme. Für die Implementierung werden komplett unterschiedliche Tools und Ökosysteme benötigt. Für die Implementierung müssen komplett unterschiedliche Entwickler mit einer anderen Denkweise hinzugezogen werden, um eine Aufgabe zu implementieren. Schnittstellen müssen zwischen den beiden Welten oder Systemen definiert werden. Nur weil es keine Möglichkeit gibt, mit einer hohen Programmiersprache, die von der Überwachungsebene bekannt ist, auf der Steuerungsebene fortzufahren. Dies hat sich nun geändert. Durch Container-Technologie auf der Steuerungsebene in einer SPS beispielsweise können wir Programmiersprachen wie Java auf dieser Hierarchieebene verwenden und die starren Hierarchien aufbrechen.
Java ist eine weit verbreitete, hochwertige, objektorientierte Programmiersprache. Sie hat eine lebendige Community und ein Ökosystem aus Bibliotheken und Frameworks, die zusätzliche Funktionalität bieten und es ermöglichen, bestehende Tools und Lösungen zu nutzen, um Ihre Applikation schneller und effizienter zu entwickeln.
Wir zeigen, wie Java auf einer Phoenix Contact PLCnext verfügbar ist, um die Entwicklung einer Applikation zu vereinfachen, die auf PLCnext läuft und direkt mit einer Datenbank kommuniziert, um anwendungsrelevante Informationen abzurufen und zu speichern und diese auf einem Web-Interface darzustellen. Eines der beliebtesten Frameworks in Java ist Hibernate. Es vereinfacht den Prozess der Abbildung von Java-Objekten auf relationale Datenbanktabellen und reduziert den Boilerplate-Code für Datenbankoperationen. Hibernate bietet eine hohe Abstraktionsebene, die es Entwicklern ermöglicht, mit Objekten statt direkt mit SQL-Abfragen zu arbeiten. Dies kann zu schnelleren Entwicklungszyklen und reduziertem Entwicklungsaufwand führen. Hibernate abstrahiert die Unterschiede zwischen verschiedenen Datenbankanbietern, was den Wechsel zwischen Datenbanken ohne signifikante Codeänderungen erleichtert. Dieser Artikel beschreibt die Integration von Hibernate für die Verbindung von Software, die auf SPS läuft, mit Datenbanken.
Moderne Java-Applikation auf PLCnext
Um mit der Implementierung einer modernen Java-Applikation zu beginnen, empfehlen wir die Verwendung von Applikations-Frameworks wie Quarkus oder Spring Boot. Diese Frameworks vereinfachen die Projektkonfiguration und das Abhängigkeitsmanagement.
Für dieses Beispiel starten wir unsere Applikation mit dem Quarkus-Leitfaden „Using Hibernate ORM and Jakarta Persistence“. Ein Beispiel für den Quellcode findet sich im GitHub-Projekt hibernate-orm-quickstart.
Wir beginnen mit der Modifikation des Quellcodes der Applikation. Wir können die Java-Klasse Fruit.java in Event.java umbenennen und ein neues Feld date hinzufügen.
Beispiel für Code Event.java:
... @Entity @Table(name = "Events") public class Event { @Id @GeneratedValue private Long id; private String title; @Column(name = "eventDate") private LocalDateTime date; ...
Wir können die Datenbank-URL und die Zugangsdaten in der Datei application.properties konfigurieren.
Beispiel für 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 ...
Beim Start der Applikation wird eine Tabelle in der Datenbank erstellt und bei Bedarf initialisiert. Nach dem Start können wir über ein Web-Interface, das auf Port 8080 auf der PLCnext läuft, mit der Datenbank interagieren:
Beachten Sie, dass all dies auf der Steuerungsebene unserer Hierarchie passiert, ohne ein zusätzliches System dazwischen.
GraalVM Native Image
Viele Entwickler glauben immer noch, dass Java eine sogenannte Java Runtime Environment zur Ausführung von Java Bytecode benötigt und nicht die notwendige Leistung bietet. Dies ist für eingebettete Applikationen nicht mehr der Fall. In diesem Beispiel verwenden wir die GraalVM Native Image Technologie, um Java-Code in eine native Applikation zu kompilieren. GraalVMs Native Image Kompilierung bietet eine überzeugende Lösung für die Herausforderungen von Startzeit und Speicherverbrauch in Java-Applikationen, insbesondere in ressourcenbeschränkten Umgebungen wie eingebetteten Systemen. Durch die Ahead-of-Time-Kompilierung von Java-Applikationen in native Executables reduziert GraalVM die Startzeit und den Speicherüberhang im Vergleich zur traditionellen Just-In-Time (JIT) Kompilierung erheblich.
MicroDocs GraalVM hat die einzigartige Fähigkeit, Binaries für eingebettete Geräte zu generieren. Zum Zeitpunkt dieses Tutorials unterstützt GraalVM 32-Bit- und 64-Bit-ARM- und x86-Prozessoren.
Um unsere Java-Applikation ahead-of-time für die SPS AXC F 1152 zu kompilieren, können wir MicroDocs GraalVM verwenden und einige Compiler-Optionen in der Datei application.properties konfigurieren.
... 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
Weitere Informationen zum Cross-Kompilieren und Debuggen finden Sie im folgenden Artikel: Building and debugging Java native images of MicroDoc GraalVM Embedded.
Um die Applikation zu bauen, können Sie einfach den folgenden Befehl verwenden:
$ mvn -Pnative package
Als Nächstes starten wir den PLCnext Simulator. Der Simulator wird als qemu-Image bereitgestellt. Der Simulator begrüßt uns mit der folgenden Zeile:
PLCnext Linux 2023.0 sim-axcf1152 ttyAMA0 sim-axcf1152 login:
Die generierten Binaries können mit dem Befehl scp auf die SPS kopiert werden, der eine sichere Shell zur SPS öffnet und das Binary auf das Zielsystem überträgt. Sie können die Applikation mit dem folgenden Befehl starten:
$ ./application
Mit dem PLCnext Cockpit Client können wir uns auch den aktuellen Speicher- und Speicherplatzverbrauch ansehen:
Wir sind jedoch auch an der Startzeit und dem Speicherverbrauch unserer einzelnen Applikation im Vergleich zur Ausführung in einer Java Runtime Environment wie OpenJDK interessiert. Daher haben wir beide Werte gemessen, wie in der folgenden Tabelle gezeigt:
Startzeit (weniger ist besser), Speicherverbrauch (weniger ist besser)
GraalVM Native Image: 0,413 s, 87 MB
OpenJDK: 13 s, 128 MB
GraalVM Native Image bietet eine deutlich verbesserte Leistung in Bezug auf Startzeit und Speicherverbrauch im Vergleich zu OpenJDK und demonstriert seine Effektivität bei der Optimierung des Ressourcenverbrauchs für effiziente Applikationsbereitstellung.
Zusammenfassung
Die Verwendung von Java auf der Steuerungsebene wie einer SPS hat mehrere Vorteile. Erstens gibt es keinen Technologiebruch zwischen Überwachungs- und Steuerungsebene. Derselbe Mitarbeiterkreis kann Applikationen implementieren und vom Java-Ökosystem und den verfügbaren Tools profitieren. Zweitens kann GraalVM Java-Code als native Applikationen auf eingebetteten Geräten wie 32-Bit- und 64-Bit-ARM- und x86-Prozessoren kompilieren. Somit müssen sich Ihre Entwickler nicht um die zugrunde liegende Architektur kümmern und können Ihre Applikation in einer hochwertigen objektorientierten Sprache implementieren. Drittens ermöglicht der Container-Support von Phoenix Contacts PLCnext den direkten Zugriff auf die Schnittstellen der SPS in derselben Hardwarekomponente und bricht die starren Hierarchien in den aktuellen Fertigungsindustrien auf.
Hinweis:
Der Makers Blog zeigt Anwendungen und Benutzerberichte von Community-Mitgliedern, die nicht von Phoenix Contact getestet oder überprüft wurden. Verwendung auf eigenes Risiko.
Industrietechnik
- Groupe Beneteau reduziert manuelle Arbeit um 60 % durch automatisiertes Bootsfräsen
- Eigenbau LED-Taschenlampe: Schritt-für-Schritt Schaltungsanleitung
- Den richtigen Metallfertiger finden: Schlüsseleigenschaften und wie man sie erkennt
- NADCAP-Zertifizierung: Qualität und Vertrauen in der Präzisionsbearbeitung steigern
- Warum eine Werkstatt mit CNC-Bohrwerk für Ihre Präzisionsfertigung wählen?
- IMMP vs. CMMS: Wichtige Unterschiede & Vorteile für modernes Wartungsmanagement
- Low-Volume PCB Assembly: Komplettleitfaden zu Qualität, Kosteneinsparung & Produktionserfolg
- Alte CNC-Vakuum-Pods wiederverwenden: Kosten sparen & Abfall reduzieren
- jQuery 3 enthüllt: 17 leistungsstarke neue Features & Nutzung
- MUTCD-Retroreflexions-Frist rückt näher: Sorgen Sie bis zum 14. Juni 2014 dafür, dass Ihre Verkehrszeichen den Standards entsprechen