Ejemplo de conexión RS-485 usando nuestras librerías

Ejemplo de conexión RS-485 usando nuestras librerías

En este post veremos cómo usar nuestras librerías SimpleComm y cómo usar la conexión RS-485 mediante el sistema Master/Slave. Master/Slave es un modelo de comunicación donde un dispositivo o un proceso (Master) tienen el control unidireccional de uno o más dispositivos (Slave).

¡¡Atención!! No es necesario tener un Master y un Slave, simplemente puedes enviar y recibir datos entre diferentes dispositivos a través de una comunicación (RS-485, RS-232, Ethernet…), el roll de cada dispositivo lo programamos nosotros según nos convenga.

Los requisitos necesarios para poder realizar el ejemplo son:

Ahora procederemos a explicar cómo funciona el ejemplo:

Tenemos dos códigos, un ejemplo de cómo enviar datos y otro de como recibirlos. Emisor y receptor tienen una dirección asociada que se fija en el setup del PLC con la función begin(address). El PLC emisor será el encargado de utilizar la función setData() para llenar un paquete con la información estructurada de forma segura para poder evitar recibir información alterada. Una vez creado este paquete, podemos proceder a enviar la información al receptor.

En el segundo código, el del receptor, veremos cómo leer y como extraer la información que contiene el paquete, lo que realmente nos importa. Tenemos que saber el tamaño (int, long, char…) de esta información que estamos recibiendo para poder aplicar la función get correctamente. Para más información de cómo utilizar la librería SimpleComm ver aquí.

Master code:

#include <RS485.h>
#include <SimpleComm.h>

// Create SimplePacket for sending and receiving data
SimplePacket packet;

// Define master address
uint8_t masterAddress = 0;

// Define slave address to communicate with
uint8_t slaveAddress = 1;

// Value to send as packet data
int value = 0;

////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
	Serial.begin(9600L);

  // Start RS485
  RS485.begin(19200L);
  RS485.setTimeout(20);

  // Start SimpleComm
  SimpleComm.begin(masterAddress);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  static unsigned long lastSent = millis();

  // Send packet periodically: once per second
  if (millis() - lastSent >= 1000) {
    // Set request packet data
    packet.setData(value);

    // Send request to slave
    if (SimpleComm.send(RS485, packet, slaveAddress)) {
      lastSent = millis();

      Serial.print("Sent value: ");
      Serial.println(value);
    }
  }

  // Get responses
  if (SimpleComm.receive(RS485, packet)) {
    // Update value from the response
    value = packet.getInt();

    Serial.print("Received value: ");
    Serial.println(value);
  }
}

 

Slave code:

#include <RS485.h>
#include <SimpleComm.h>

// Create SimplePacket for sending and receiving data
SimplePacket request;
SimplePacket response;

// Define slave address to communicate with
uint8_t slaveAddress = 1;

//////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
	Serial.begin(9600L);

  // Start RS485
  RS485.begin(19200L);
  RS485.setTimeout(20);

  // Start SimpleComm
  SimpleComm.begin(slaveAddress);
}

//////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  // Get requests
  if (SimpleComm.receive(RS485, request)) {
    int value = request.getInt();

    Serial.print("Received value: ");
    Serial.println(value);

    // Process value
    value++;

    // Send response to the request packet source
    response.setData(value);
    if (SimpleComm.send(RS485, response, request.getSource())) {
      Serial.print("Sent value: ");
      Serial.println(value);
    }
  }
}

Ver también:

SimpleComm libraryRS-485 communicationInstaling INDUSTRIAL SHIELDS equipment to the ARDUINO IDEIndustrial Shields Library in ARDUINO IDE

Los comentarios están cerrados