Java y GraalVM Native Image: Impulsando Conectividad a Bases de Datos en Apps de Manufactura
El panorama actual de aplicaciones en industrias manufactureras está dividido en una jerarquía rígida. Desde Gestión usando sistemas ERP, sistemas de planificación usando MES, sistemas de supervisión usando SCADA, hasta sistemas de control realizados con PLCs y sistemas de campo en la base.
Mientras que la mayoría de sistemas para gestión, planificación y supervisión se implementan en lenguajes de programación orientados a objetos de alto nivel, los sistemas de control se implementan completamente con lenguajes de bajo nivel, siendo C el lenguaje de programación dominante.
Este cambio abrupto de una jerarquía de alto nivel a una de bajo nivel crea varios problemas. Herramientas y ecosistemas completamente diferentes son necesarios. Para la implementación, se deben traer desarrolladores completamente diferentes con una forma de pensar diferente para implementar una tarea. Las interfaces deben definirse entre los dos mundos o sistemas. Solo porque no hay posibilidad de continuar con un lenguaje de programación de alto nivel conocido del nivel de supervisión en el nivel de control. Esto ha cambiado ahora. Usando tecnología de contenedores en el nivel de control en un PLC, por ejemplo, somos capaces de usar lenguajes de programación como Java en este nivel de jerarquía y romper las jerarquías rígidas.
Java es un lenguaje de programación orientado a objetos de alto nivel ampliamente usado. Tiene una comunidad vibrante y ecosistema de bibliotecas y frameworks que proporcionan funcionalidad adicional, permitiéndole aprovechar herramientas y soluciones existentes para construir su aplicación más rápida y eficientemente.
Mostraremos cómo Java está disponible en un PLCnext de Phoenix Contact para simplificar el desarrollo de una aplicación que corre en PLCnext y se comunica directamente con una base de datos para recuperar y almacenar información relevante de la aplicación y presentarla en una interfaz web. Uno de los frameworks más populares en Java es Hibernate. Simplifica el proceso de mapear objetos Java a tablas de bases de datos relacionales, reduciendo la cantidad de código boilerplate necesario para operaciones de base de datos. Hibernate proporciona un alto nivel de abstracción, permitiendo a los desarrolladores trabajar con objetos en lugar de consultas SQL directamente. Esto puede llevar a ciclos de desarrollo más rápidos y menor esfuerzo de desarrollo. Hibernate abstrae las diferencias entre diferentes proveedores de bases de datos, facilitando cambiar entre bases de datos sin cambios significativos de código. Este artículo describe la integración de Hibernate para conectar software corriendo en PLCs a bases de datos.
Aplicación Java Moderna en PLCnext
Para empezar a implementar una aplicación Java moderna, recomendamos usar frameworks de aplicación como Quarkus o Spring Boot. Estos frameworks simplifican la configuración del proyecto, la gestión de dependencias.
Para este ejemplo comenzaremos nuestra aplicación usando la Guía de Quarkus 'Using Hibernate ORM and Jakarta Persistence'. Un ejemplo del código fuente se puede encontrar en el proyecto github hibernate-orm-quickstart.
Comenzaremos modificando el código fuente de la aplicación. Podemos cambiar la clase Java Fruit.java a Event.java y agregar un nuevo campo date.
Ejemplo de código Event.java:
...
@Entity
@Table(name = "Events")
public class Event {
@Id
@GeneratedValue
private Long id;
private String title;
@Column(name = "eventDate")
private LocalDateTime date;
...
Podemos configurar la URL de la base de datos y las credenciales modificando el archivo application.properties
Ejemplo de 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
...
Cuando la aplicación se inicia, una tabla en la base de datos será creada e inicializada si es necesario. Después del inicio, podemos interactuar con la base de datos con una interfaz web corriendo en el puerto 8080 en el PLCnext:
Tenga en cuenta, todo esto sucede en el nivel de control de nuestra jerarquía sin ningún sistema adicional en medio.
GraalVM Native Image
Muchos desarrolladores aún creen que Java requiere un llamado Java Runtime Environment para ejecutar Byte-Code de Java y no proporciona el rendimiento necesario. Esto ya no es el caso para aplicaciones embebidas. En este ejemplo usamos la tecnología GraalVM Native Image para compilar código Java en una aplicación nativa. La compilación de imagen nativa de GraalVM ofrece una solución convincente para abordar los desafíos de tiempo de inicio y consumo de memoria en aplicaciones Java, particularmente en entornos con recursos limitados como sistemas embebidos. Al compilar aplicaciones Java ahead-of-time (anticipadamente) en ejecutables nativos, GraalVM reduce significativamente el tiempo de inicio y la sobrecarga de memoria comparado con la compilación Just-In-Time (JIT) tradicional.
GraalVM de MicroDoc tiene la capacidad única de generar binarios para dispositivos embebidos. Al momento de escribir este tutorial, GraalVM soporta procesadores ARM y x86 de 32-bits y 64-bits.
Para compilar nuestra aplicación Java ahead-of-time apuntando al PLC AXC F 1152, podemos usar GraalVM de MicroDoc y configurar algunas opciones de compilador en el archivo 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
Encontrará más información sobre el proceso de compilación cruzada y depuración en el siguiente artículo: Building and debugging Java native images of MicroDoc GraalVM Embedded
Para construir la aplicación, puede simplemente usar el siguiente comando:
$ mvn -Pnative package
Luego, iniciamos el simulador PLCnext. El simulador se proporciona como imagen qemu. El simulador nos saludará con la siguiente línea:
PLCnext Linux 2023.0 sim-axcf1152 ttyAMA0 sim-axcf1152 login:
Los binarios generados pueden copiarse al PLC con el comando scp que abre un shell seguro al PLC y transfiere el binario al sistema objetivo. Puede iniciar la aplicación usando el siguiente comando:
$ ./application
Usando el cliente PLCnext cockpit también podemos echar un vistazo al uso actual de memoria y almacenamiento:
Sin embargo, también estamos interesados en el inicio y consumo de memoria de nuestra única aplicación comparado con correr la aplicación en un Java Runtime Environment como OpenJDK. Así que medimos ambos valores como se muestra en la siguiente tabla:
Tiempo de inicio (menos es mejor), Uso de memoria (menos es mejor)
GraalVM Native Image: 0.413 s, 87 MB
OpenJDK: 13 s, 128 MB
GraalVM Native Image ofrece rendimiento significativamente mejorado en términos de tanto tiempo de inicio como uso de memoria comparado con OpenJDK, demostrando su efectividad en optimizar consumo de recursos para despliegue eficiente de aplicaciones.
Resumen
Usar Java en el nivel de control como un PLC tiene múltiples beneficios. Primero, no hay corte en tecnología entre el nivel de supervisión y nivel de control. La misma fuerza laboral puede implementar aplicaciones y beneficiarse del ecosistema Java y las herramientas disponibles. Segundo, GraalVM es capaz de compilar código Java como aplicaciones nativas en dispositivos embebidos como procesadores ARM y x86 de 32-bits y 64-bits. Así, sus desarrolladores no necesitan preocuparse de la arquitectura subyacente y pueden implementar su aplicación en un lenguaje orientado a objetos de alto nivel. Tercero, gracias al soporte de contenedores de PLCnext de Phoenix Contact, tenemos acceso a las interfaces del PLC directamente en el mismo componente de hardware y podemos romper las jerarquías rígidas en las aplicaciones de industrias manufactureras actuales.
Nota:
El Makers Blog muestra aplicaciones e historias de usuarios de miembros de la comunidad que no son probadas ni revisadas por Phoenix Contact. Úselas bajo su propio riesgo.
Tecnología Industrial
- Circuitos de CA con Capacitores: Reactancia Capacitiva, Desfase y Comportamiento de Potencia
- Por Qué los Motores Refrigerados por Líquido Ofrecen Rendimiento Superior y Bajo Ruido en Aplicaciones Industriales
- Dominando la Compra Industrial: De la Conciencia de Marca a la Orden de Compra
- Domine el Centro de Intercambio CONNEX™: Herramientas Simples y Potentes para Fabricantes
- Industria 4.0: Habilidades clave para la fuerza laboral de fábrica inteligente
- Metrología Remota: Dominando la Recopilación de Datos para Manufactura de Precisión
- Modelo de IA revolucionario simula el Universo en 30 ms con precisión del 2,8%
- Conexión de Baterías en Serie-Paralelo a un Panel Solar: Guía Paso a Paso
- Maximice resistencia y precisión: Guía profesional de inserts para post-procesado aditivo
- Dominar la fabricación de geometrías complejas: claves y mejores prácticas
- Mejore sus piezas con características personalizadas de moldeo por inyección