Introduction
Modbus RTU Arduino PLC
El protocolo Modbus RTU es un medio de comunicación que permite el intercambio de datos entre controladores lógicos programables (PLC) y ordenadores. Los dispositivos electrónicos pueden intercambiar información a través de líneas serial utilizando el protocolo Modbus.
Ha sido ampliamente aceptado y ampliamente utilizado en la construcción de Sistemas de Gestión de Edificios (BMS) y Sistemas de Automatización Industrial (IAS). Su adopción ha sido impulsada por su facilidad de uso, fiabilidad, y el hecho de que es de código abierto y se puede utilizar sin regalías en cualquier dispositivo o aplicación.
El protocolo Modbus fue desarrollado y publicado por Modicon® en 1979 para su uso con sus controladores lógicos programables. Está construido utilizando una arquitectura maestra / esclava y es compatible con dispositivos serial que utilizan los protocolos Arduino RS232/ RS485/ RS422. Modbus se utiliza a menudo en escenarios donde los dispositivos de control e instrumentación transmiten señales a un controlador o sistema central para recopilar y analizar datos. Los sistemas de automatización y supervisión de control y adquisición de datos (SCADA) a menudo utilizan el protocolo Modbus.
What does Modbus RTU mean
Modbus RTU (Remote Terminal Unit) es uno de los dos modos de transmisión definidos en la especificación Modbus original. Los dos modos son Modbus RTU y ASCII y están diseñados para ser utilizados con dispositivos serie que admiten los protocolos de Modbus Arduino RS232, RS485 y RS422. Una característica distintiva de Modbus RTU es su uso de codificación binaria y fuerte comprobación de errores CRC.
Modbus RTU es la implementación del protocolo Modbus que se utiliza con mayor frecuencia en aplicaciones industriales y en instalaciones de producción automatizadas.
Requisitos | ||
Ethernet PLC o 20 I/Os industrial Arduino | Ethernet PLC | 20 IOs PLC |
Z-D-IN 5 Modbus RTU Módulo | Visit website | |
Placas de Industrial Shields | Mapping pins on our boards | |
Librería Tools40 instalada (incluidas librerías Modbus) | Tools 40 at GitHub |
Description
Z-D-In 5 Modbus RTU Module
Características | |||||||||||
Fuente de alimentación | 10..40 Vdc; 19..28 Vac (50-60 Hz) | ||||||||||
Entradas | 5 CH (reed, proximidad, pnp, npn, contacto) con negativo común, autoalimentado 24 Vdc, aislado, protegido de transitorios de hasta 600 W/ms | ||||||||||
Contadores | 4 a 16 bit, frecuencia máxima 100 Hz; 1 a 32 bit, frecuencia máxima 10 KHz | ||||||||||
Filtro Anti-rebote | Configurable desde 5 a 250 ms | ||||||||||
Comunicación | RS485 a 2 fili, protocolo esclavo ModBUS RTU | ||||||||||
Dimensiones | 17,5 x 100 x 112 [mm] | ||||||||||
Guía de montaje | 35 mm guía DIN 46277 |
La siguiente imagen muestra las entradas y salidas del Z-D-IN:
Connections
Final Connection
Software
En este boceto, estamos controlando cada entrada (5 en total) usando interruptores digitales. La comunicación entre el PLC Arduino y el módulo ZD-in Modbus RTU es mediante RS485 en Half Duplex, por lo que es muy importante que descargue y use la biblioteca RS485.h así como la biblioteca ModbusRTUSlave.h (Librería Modbus RTU Arduino) para trabajar en este protocolo.
The Z-D-in module acts as a slave and the Arduino controller will act as the master of the system.
En este boceto, las solicitudes de lectura de las entradas se envían cada segundo y los cambios se muestran en la pantalla.Cada entrada ha asociado un contador que se incrementará para cada cambio que se puede leer en la entrada.
The full sketch is shown below:
/*
Copyright (c) 2019 Boot&Work Corp., S.L. All rights reserved
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <ModbusRTUMaster.h>
#include <RS485.h>
const uint8_t slaveAddress = 1;
const uint32_t serialRate = 38400UL;
const int serialConfig = SERIAL_8N1;
const uint32_t requestPeriod = 1000UL; // ms
const int numInputs = 5;
ModbusRTUMaster modbus(RS485);
uint8_t inputStates[numInputs];
uint16_t inputCounters[numInputs];
////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600L);
Serial.println("seneca-z-d-in-module started");
RS485.begin(serialRate, HALFDUPLEX, serialConfig);
modbus.begin(serialRate);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
static uint32_t lastRequestTime = millis();
// Send a request every 1000ms
if (!modbus.isWaitingResponse()) {
if (millis() - lastRequestTime > requestPeriod) {
// Send a Read Holding Registers request to the slave with address 1
// IMPORTANT: all read and write functions start a Modbus transmission, but they are not
// blocking, so you can continue the program while the Modbus functions work. To check for
// available responses, call modbus.available() function often.
if (!modbus.readHoldingRegisters(slaveAddress, 1, 6)) {
// TODO Failure treatment
}
lastRequestTime = millis();
}
}
// Check available responses often
ModbusResponse response = modbus.available();
if (response) {
if (response.hasError()) {
// TODO Response failure treatment. You can use response.getErrorCode()
// to get the error code.
} else {
uint16_t states = response.getRegister(0);
for (int i = 0; i < numInputs; ++i) {
inputStates[i] = (states >> i) & 0x01;
inputCounters[i] = response.getRegister(i + 1);
}
printInputs();
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void printInputs() {
Serial.println();
Serial.print("Inputs: ");
for (int i = 0; i < numInputs; ++i) {
Serial.print(inputStates[i] ? "HIGH" : "LOW ");
Serial.print(' ');
}
Serial.println();
Serial.print("Counters: ");
for (int i = 0; i < numInputs; ++i) {
Serial.print(inputCounters[i]);
Serial.print(' ');
}
Serial.println();
}
Related Posts about Modbus TCP, WiFi, HTTP Server, with Arduino
HTTP Server in an M-Duino (Enable/Disable outputs through a website)
How to connect Arduino based industrial controller using Modbus TCP/IP
How to use Modbus TCP Slave library with Arduino based industrial PLC