Busca en nuestro Blog. Encontrarás múltiples aplicaciones, soluciones, ejemplos de código. Navega utilizando la nube de etiquetas o busca utilizando criterios específicos

Comunicación mediante MODBUS RTU a través de una interfaz serial RS485 (módulo Seneca Z-D-in)

Introducción


Modbus RTU

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 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 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.








¿ Qué significa Modbus RTU ?

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 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 or 20 I/Os industrial arduino :
Ethernet PLC
20 IOs PLC
Z-D-IN 5 Modbus RTU Module:
Visite el sitio web
Industrial Shields boards:
Cómo usar pines de mapeo en nuestras boards 
Tools40 library installed (include Modbus libraries):
Tools 40 at GitHub


Descripción

Módulo Z-D-In 5 Modbus RTU:


El módulo Z-D-IN Seneca Modbus RTU se utiliza para interconectar 5 señales digitales (PUSH BUTTON, LIMIT SWITCH, REMOTE, CONTROL SWITCH, RELAYS, etc.)  con todos los sistemas de control que son capaces de comunicarse por el protocolo MODBUS RTU a través de la interfaz serie RS485.

Un contador de 16 bits está disponible en cada entrada, la entrada de frecuencia máxima es de 100 Hz y es posible configurar una entrada como contador rápido con una frecuencia máxima de 10 kHz. El módulo es ModBUS Slave y se puede acoplar con cualquier dispositivo ModBUS Master. Un aislamiento galvánico de 3 vías entre los circuitos power supply // input // RS485 asegura la integridad de sus datos. 







Características 









Fuente de alimentación10..40 Vdc; 19..28 Vac (50-60 Hz)
 








Entradas 5 CH(reed, proximity, pnp, npn, contact) con negativo común, autoalimentado 24 Vcc, aislado, protegido de transitorios de hasta 600 W/ms 









Contadores 4 a 16 bits, frecuencia máxima 100 Hz; 1 a 32 bits, frecuencia máxima 10 KHz










Filtro anti-rebote Configurable de 5 a 250 ms









ComunicaciónRS485 a 2 fili, protocolo esclavo ModBUS RTU










Dimensiones17,5 x 100 x 112 [mm]










Guía de montaje35 mm guía DIN 46277





La siguiente imagen muestra las entradas y salidas del Z-D-IN:


Conexiones 

 




 Final Connection: 



Software

En este boceto, estamos controlando cada entrada (5 en total) utilizando interruptores digitales. 
La comunicación entre el PLC basado en Arduino y el módulo Modbus RTU Z-D-in es por RS485 en dúplex medio, por lo que es muy importante que descargue y utilice la biblioteca RS485.h, así como la biblioteca ModbusRTUSlave.h para trabajar en este protocolo.

El módulo Z-D-in actúa como esclavo y el PLC basado en Arduino actuará como el maestro del sistema. 

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. 

El boceto completo se muestra a continuación:

/*

   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();

}

¿Quieres más información?

Con la tecnología Open Source, puedes ejecutar tus propias instalaciones.

Rellena el formulario y contactaremos contigo lo más pronto posible.

Enviar  Por favor, completa el formulario correctamente.