Librerías Industrial Shields: Módulos esenciales para dispositivos Arduino y ESP32, en entornos industriales
Las librerías Industrial Shields proporcionan un conjunto de funciones y módulos esenciales diseñados para firmware de entorno industrial, específicamente adaptados para dispositivos basados en Arduino y ESP32.
ADVERTENCIA: Tanto ModbusTCPMaster como ModbusTCPSlave solo estan disponibles para dispositivos Industrial Shields. También la librería Pulses solo está disponible para dispositivos Industrial Shields, basados en Arduino.
¿Cómo instalar una librería en Arduino?
Estos son los requisitos previos a la instalación:
- Uno de los módulos que ofrecemos con nuestros PLC es la librería SimpleComm. Esta librería te permite enviar datos a través de cualquier flujo de datos: RS-485, RS-232, Ethernet... La flexibilidad de esta permite adaptarse a diferentes tipos de comunicación como Ad-Hoc, Maestro-Esclavo, Cliente-Servidor, etc. utilizando una API fácil de usar. Arduino IDE 1.8.19.
- Uno de los módulos que ofrecemos con nuestros PLC es la librería SimpleComm. Esta librería te permite enviar datos a través de cualquier flujo de datos: RS-485, RS-232, Ethernet... La flexibilidad de esta permite adaptarse a diferentes tipos de comunicación como Ad-Hoc, Maestro-Esclavo, Cliente-Servidor, etc. utilizando una API fácil de usar. Las placas Industrial Shields Arduino Uno de los módulos que ofrecemos con nuestros PLC es la librería SimpleComm. Esta librería te permite enviar datos a través de cualquier flujo de datos: RS-485, RS-232, Ethernet... La flexibilidad de esta permite adaptarse a diferentes tipos de comunicación como Ad-Hoc, Maestro-Esclavo, Cliente-Servidor, etc. utilizando una API fácil de usar. las placas Industrial Shields ESP32 equivalentes (opcionales, utilizadas en ejemplos).
Instalación paso a paso de cualquier biblioteca de Industrial Shields
Comience su viaje por las bibliotecas industriales de Shields siguiendo estos sencillos pasos:
1. Descarga alguna de estas librerías (Modbus, SimpleComm, Pulses, Counter, Filter, TimerGitHub como archivo "ZIP".
2. Desde el IDE de Arduino, selecciona el archivo "ZIP" descargado en el menú "Sketch/Include library/Add .ZIP library".
Comprender la comunicación Modbus: La columna vertebral de los sistemas de control modernos
¿Qué es Modbus? Modbus es un protocolo de comunicación, situado en varios niveles del Modelo OSI (1, 2 y 7). Desarrollado inicialmente en 1979 por Modicon para su línea de PLC, sigue una arquitectura maestro/esclavo. Esta arquitectura requiere un dispositivo como maestro, para iniciar la comunicación con uno o más dispositivos (los esclavos). El dispositivo maestro envía solicitudes para leer o escribir datos en posiciones de memoria específicas (registros) dentro de los dispositivos esclavos. En respuesta, los dispositivos esclavos proporcionan los datos solicitados o acusan recibo de la orden recibida.
Modbus puede funcionar a través de diferentes medios de comunicación física, incluida la comunicación serie (Modbus RTU y Modbus ASCII) y Ethernet (Modbus TCP). Las versiones serie suelen utilizarse en sistemas heredados, mientras que Modbus TCP ha ganado popularidad con la creciente adopción de redes industriales basadas en Ethernet.
Este protocolo abierto facilita a los distintos fabricantes la incorporación de la compatibilidad con Modbus en sus dispositivos. Debido a su larga historia y probada fiabilidad, Modbus sigue siendo un estándar de comunicación fundamental y ampliamente utilizado para aplicaciones industriales. Permitiendo que varios dispositivos de diferentes fabricantes se comuniquen sin problemas dentro de una red.
Nuestra biblioteca es compatible tanto con ModbusRTU (RS-485/RS-232, UART...) como con ModbusTCP (WiFi o Ethernet). Para demostraciones prácticas, puedes explorar los ejemplos proporcionados en los siguientes enlaces:
- Librería PLC Modbus RTU Master para automatización industrial
- Modbus TCP Master con Arduino Industrial & ESP32 PLCs
- Cómo utilizar Modbus TCP Slave Library con un controlador PLC Arduino
Librería SimpleComm: Agilización de la transferencia de datos a través de múltiples protocolos
Uno de los módulos que ofrecemos con nuestros PLC es la librería SimpleComm. Esta librería te permite enviar datos a través de cualquier flujo de datos: RS-485, RS-232, Ethernet... La flexibilidad de esta permite adaptarse a diferentes tipos de comunicación como Ad-Hoc, Maestro-Esclavo, Cliente-Servidor, etc. utilizando una API fácil de usar.
Usos de SimpleComm
El módulo SimpleComm permite la transmisión bidireccional y no bloqueante de datos a través de todos los flujos disponibles (como UARTS, RS-485, WiFi...). Y para optimizar la encapsulación de datos, SimplePacket Packs se utiliza para empaquetar los datos en una estructura eficiente.
Para almacenar datos en un paquete, puedes utilizar la función setData, que soporta una amplia gama de tipos de datos, incluyendo bool, char, unsigned char, int, unsigned int, long, unsigned long, double, string e incluso tipos de datos personalizados. Además, la SimplePacket class incluye funciones "getter" para recuperar los datos almacenados en el paquete, atendiendo a tipos de datos específicos. Si se especifica la longitud máxima, devuelve la longitud de los datos en bytes.
SimpleComm singleton es la interfaz para enviar y recibir paquetes a través del flujo de datos deseado. El sistema de comunicación se inicia y configura mediante la función "begin(address)". Esta función no sólo activa el proceso de comunicación, sino que también establece un identificador único o dirección para cada dispositivo. Cada dispositivo tiene su propia dirección única, lo que le permite recibir selectivamente paquetes destinados a su dirección mientras que los paquetes destinados a otros dispositivos.
Se pueden utilizar los siguientes métodos para enviar un paquete a un destino:
SimpleComm.send(stream, packet, destination)
SimpleComm.send(stream, packet, destination, type)
La función también acepta un tipo de paquete, que sirve para informar al receptor sobre cómo interpretar y leer con precisión el contenido del paquete.
La función de recepción se encarga de obtener un paquete de otro dispositivo a través del flujo designado:
SimpleComm.receive(stream, rxPacket)
Si se recibe un paquete, la función devuelve true, lo que indica que la recepción se ha realizado correctamente; en caso contrario, devuelve false.
Compatibilidad entre arquitecturas
Esta librería se basa en tipos C++ estándar (por ejemplo, unsigned long, int) que funcionarán correctamente si las arquitecturas que se comunican mantienen tamaños de tipo consistentes. Sin embargo, pueden surgir problemas cuando se intenta comunicar entre diferentes arquitecturas de CPU, como ESP32 y Arduino. Los tipos C++ definidos en cada arquitectura tienen tamaños diferentes, lo que provocará errores de comunicación.
Para garantizar una comunicación adecuada entre diferentes arquitecturas y solucionar los posibles problemas de tamaño de los tipos, la biblioteca ofrece una solución a través del archivo de cabecera SimplePacketConfig.h. Este archivo permite al usuario personalizar los tipos utilizados en la biblioteca, fijando así el tamaño de los tipos para una comunicación adecuada:
- Si utilizas "#define UNIVERSAL_CPP", los tipos utilizados tendrán el tamaño mínimo según el estándar C++.
- Si descomentas "#define CUSTOM_TYPES", los tipos utilizados serán del tamaño de lo que definas.
Dominio del módulo Filtro: Suavizar señales analógicas en tus proyectos
El módulo de filtro es un componente de software diseñado para suavizar eficazmente las entradas analógicas inestables. Esto resulta muy útil cuando se trabaja con señales analógicas erráticas. Para definir un filtro analógico, es necesario especificar dos parámetros, el número de muestras y el periodo de muestreo. Por ejemplo:
AnalogFilter<10, 2> aFilter;
En este ejemplo, el tiempo de muestreo se fija en 2 ms y el número de muestras en 10.
También, puedes inicializar el constructor del filtro con un valor inicial, de la siguiente manera:
AnalogFilter<10, 2> aFilter(24000);
Aquí, el filtro se inicializa con un valor inicial de 24000 en lugar del valor por defecto de 0. Para obtener el valor filtrado basado en la entrada, puede utilizar la función de actualización de la siguiente manera:
int input = analogRead(I0_0); int filteredInput = aFilter.update(input);
La función de actualización toma el valor de entrada como argumento y devuelve el valor filtrado correspondiente.
Precisión del tiempo simple: Aprovecha la potencia del módulo Timer
El módulo Timer proporciona tres tipos diferentes de temporizador, cada uno siguiendo esquemas de temporizador estándar:
- PulseTimer: cuando hay un flanco ascendente en el valor de entrada, PulseTimer activa la salida durante el tiempo seleccionado.
int in = digitalRead(I0_0);if (PT.update(in) == HIGH) { // Enter here during 1000ms after in is rised }
- OnDelayTimer: Cuando la entrada está ALTA durante el tiempo definido, la salida relacionada estará ALTA. La salida sólo se desactivará cuando la entrada vuelva a estar BAJA.
int in = digitalRead(I0_0); if (TON.update(in) == HIGH) { // Enter here after I0.0 is HIGH during 1000ms and until it becomes LOW }
- OffDelayTimer: Cuando la entrada está BAJA durante el tiempo definido, la salida relacionada estará ALTA. La salida sólo se desactivará cuando la entrada vuelva a estar en ALTO.
int in = digitalRead(I0_0); if (TOFF.update(in) == HIGH) { // Enter here after I0.0 is LOW during 1000ms and until it becomes HIGH }
¿Cómo el módulo Counter lo simplifica todo?
El módulo Counter ofrece un método de recuento de flancos ascendentes, hasta que se alcanza un valor predefinido definido por el usuario.
Counter C(100);
El módulo Counter devuelve HIGH cuando el contador interno es igual al valor prefijado. A continuación se muestra un ejemplo para demostrar su uso:
int up = digitalRead(I0_0);
int down = digitalRead(I0_1);
int reset = digitalRead(I0_2); if (C.update(up, down, reset, preset) == HIGH) {
// Enter here when the counter is equal to 100
// The counter counts up when I0.0 rises
// The counter counts down when I0.1 rises
// The counter is set to zero when I0.2 is HIGH
}
¿Por qué elegir el módulo Pulses, exclusivo de Arduino para el control de frecuencia?
El módulo Pulses proporciona funciones para iniciar y detener una serie de pulsos a una frecuencia definida por el usuario. La función startPulses(pin, frecuencia, precisión) inicia una secuencia de pulsos con la frecuencia y precisión dadas. Los valores por defecto son 1kHz para la frecuencia y 3 para la precisión si no se especifican.
En Ardbox Analog es posible utilizar estas funciones en las salidas:
- TIMER0: Q0.1 and Q0.6
- TIMER1: Q0.2 and Q0.3
- TIMER3: Q0.5
En MDUINO-21, MDUINO-42 y MDUINO-58 es posible utilizar estas funciones en las salidas:
- TIMER0: Q0.5 and Q2.6
- TIMER1: Q2.5
- TIMER2: Q1.5 (Multiply the frequency x2)
- TIMER3: PIN2, PIN3 and Q0.6
- TIMER4: Q0.7, Q1.6 and Q1.7
- TIMER5: Q1.3, Q1.4 and Q2.0
Hay 5 niveles de precisión en total, y cada nivel corresponde a un rango de frecuencia específico. Para obtener una alta precisión para la frecuencia deseada, debe seleccionar el nivel de precisión más bajo que tenga un rango en el que pueda encajar la frecuencia deseada. Los rangos son:
- Precision = 1: from 30Hz to 150Hz
- Precision = 2: from 150Hz to 500Hz
- Precision = 3: from 500Hz to 4kHz
- Precision = 4: from 4kHz to 32kHz
- Precision = 5: from 32kHz to 4MHz
IMPORTANTE: Las salidas que comparten el mismo temporizador no pueden utilizar frecuencias diferentes.
¡ATENCIÓN! Cuando se utilizan los pines TIMER0, todas las funciones relacionadas con el tiempo perderán su funcionalidad. Esto incluye funciones como "delay()", "millis()", "micros()", "delayMicroseconds()" y otras.
Aumentar la eficacia de los proyectos con Arduino y ESP32
En conclusión, las librerías Industrial Shields surgen como un recurso esencial para la automatización industrial en dispositivos Arduino y equipos basados en ESP32. Su amplia gama de módulos y funciones simplifica el desarrollo de proyectos, ofreciendo versatilidad y compatibilidad con diversos protocolos de comunicación. Con ejemplos prácticos que facilitan su implementación, las librerías se presentan como un aliado fundamental para proyectos industriales, permitiendo un control preciso y eficiente en entornos Arduino y ESP32. Simplifique su próximo proyecto industrial y descubra todo el potencial de su PLC.
Las librerías de Industrial Shields, herramientas útiles con nuestros equipos