Introducción
En el post anterior, aprendimos cómo conectar un sensor Dallas DS18B20 a un Ardbox, un PLC basado en Arduino.
En este post, vamos a aprender cómo conseguir la temperatura con Arduino IDE usando el protocólo Modbus.
Enlaces relacionados
Explicación
Modbus
Según Wikipedia, Modbus es un protocolo de comunicaciones situado en los niveles 1, 2 y 7 del modelo OSI, basado en la arquitectura maestro/esclavo (RTU) o cliente/servidor (TCP/IP), diseñado en 1979 por Modicon para su gama de controladores lógicos programables (PLC).
Convertido en un protocolo de comunicaciones estándar de facto en la industria, es el de mayor disponibilidad para la conexión de dispositivos electrónicos industriales.
Veamos alguna información relevante sobre Modbus:
- Cada dispositivo de la red Modbus tiene una dirección única.
- Cualquier dispositivo puede enviar comandos Modbus, aunque normalmente sólo lo permite un dispositivo maestro.
- Cada comando Modbus contiene la dirección del dispositivo que recibe la orden.
- Todos los dispositivos reciben la trama, pero sólo el destinatario la ejecuta (excepto en un modo especial llamado "Broadcast").
- Todos los dispositivos reciben la trama, pero sólo el destinatario la ejecuta (excepto en un modo especial llamado "Broadcast").
- Los comandos básicos de Modbus permiten controlar un dispositivo RTU para modificar el valor de cualquiera de sus registros o solicitar el contenido de los mismos.
Librerías Arduino
Ahora que sabemos un poco más sobre Modbus, ¡vamos a programar nuestro PLC basado en Arduino!
Como sabemos, el sensor de temperatura Dallas DS18B20 trabaja con el protocolo 1-Wire, por lo que necesitaremos dos librerías para poder obtener la temperatura:
For the Modbus protocol, we will need the library from Industrial Shields:
Código Arduino
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
#include <RS485.h>
#include <ModbusRTUSlave.h>
//Sensor Pin: 2
#define ONE_WIRE_BUS 2
#define RS485_RATE 9600UL
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensor(&oneWire);
#define numAnalogInputs 1
uint16_t analogInputs[numAnalogInputs];
//Slave Address: 1
ModbusRTUSlave modbus(RS485, 1);
En la función de configuración, vamos a hacer lo siguiente:
· Iniciar el puerto serie, el RS485 y el sensor.
· Establecer los registros de entrada a la instancia esclava.
void setup(void)
{
// Start serial port
Serial.begin(9600);
// Start up the library
sensor.begin();
RS485.begin(RS485_RATE, HALFDUPLEX, SERIAL_8N1);
modbus.begin(RS485_RATE);
modbus.setInputRegisters(analogInputs, numAnalogInputs);
}
Finalmente, en la función de bucle vamos a escribir lo siguiente para solicitar la temperatura cada 10000 milisegundos mientras la instancia Modbus se actualiza constantemente para configurar los registros de entrada.
void loop(void) {
static uint32_t lastStatusTime = millis();
if (millis() - lastStatusTime > 10000) {
sensor.requestTemperatures(); // Send the command to get temperatures
float temp = sensor.getTempCByIndex(0);
analogInputs[0] = temp * 100;
Serial.println(analogInputs[0]);
lastStatusTime = millis();
}
modbus.update();
}
Ahora que tu código está hecho, descarga las placas de Industrial Shields como se muestraAQUÍ >>> . A continuación, sólo tienes que seleccionar tu placa, modelo y puerto en el menú Herramientas.
En nuestro caso:
- Placa: Placas de Industrial Shields > Família Ardbox.
- Modelo: Ardbox Analógico HF+ con HW RS-485.
Una vez que todo esté listo, sube tu sketch, abre el monitor de serie y comprueba la temperatura de tu sensor Dallas.
Tutorial Modbus: Cómo obtener la temperatura con un sensor Dallas