Skip to content

Change SLAVE ADDRESS during void setup #85

Description

@pietrozanc

Hi guys, what i would like to do is change the SLAVE_ID during the void setup. This because i would like to set the slave address with 5 dip switch. At the moment the SLAVE_ID is declared at the beginning and i don't kwon how to solve this problem.
The SLAVE_DIP is the int variable that i want to use as a SLAVE_ID

Below my code:

//Testato con QModMaster
//https://github.com/yaacov/ArduinoModbusSlave

// https://en.wikipedia.org/wiki/Modbus

#include <ModbusSlave.h>
#include <SoftwareSerial.h>
SoftwareSerial RS485Serial(10, 11); // RX, TX

#define SLAVE_ID 10           // The Modbus slave ID, change to the ID you want to use.
#define SERIAL_BAUDRATE 9600 // Change to the baudrate you want to use for Modbus communication.
// Comment out the following line if your not using RS485
#define RS485_CTRL_PIN 2 // Change to the pin the RE/DE pin of the RS485 controller is connected to.

#define command_open 8  
#define command_close 9  
#define command_rocking 12

#define feedback_open 3
#define feedback_close 4  
#define WatchDog 5

#define DIP_1 A0
#define DIP_2 A1
#define DIP_3 A2
#define DIP_4 A3
#define DIP_5 A4

boolean SET_1;
boolean SET_2;
boolean SET_3;
boolean SET_4;
boolean SET_5;


// Modbus object declaration
Modbus slave(RS485Serial, SLAVE_ID, RS485_CTRL_PIN);

void setup() {

    // RS485 control pin must be output
    pinMode(2, OUTPUT);

    //OUTPUT
    pinMode(command_open, OUTPUT);
    pinMode(command_close, OUTPUT);
    pinMode(command_rocking, OUTPUT);

    //INPUT
    pinMode(feedback_open, INPUT);
    pinMode(feedback_close, INPUT);
    pinMode(WatchDog, INPUT);

    //DIPSWITCH
    pinMode(DIP_1, INPUT);
    pinMode(DIP_2, INPUT);
    pinMode(DIP_3, INPUT);
    pinMode(DIP_4, INPUT);
    pinMode(DIP_5, INPUT);

    SET_1 = digitalRead(DIP_1);
    SET_2 = digitalRead(DIP_2);
    SET_3 = digitalRead(DIP_3);
    SET_4 = digitalRead(DIP_4);
    SET_5 = digitalRead(DIP_5);

    int SLAVE_DIP = (SET_1*1)+(SET_2*2)+(SET_3*4)+(SET_4*8)+(SET_5*16)+1;
    Serial.println(SLAVE_DIP);

    // Register functions to call when a certain function code is received.
    slave.cbVector[CB_WRITE_COILS] = writeDigitalOut;
    slave.cbVector[CB_READ_DISCRETE_INPUTS] = readDigitalIn;
    
    // Set the serial port and slave to the given baudrate.
    RS485Serial.begin(SERIAL_BAUDRATE);
    slave.begin(SERIAL_BAUDRATE);
    Serial.begin(9600);
}

void loop() {
    /* listen for modbus commands con serial port.
     *
     * on a request, handle the request.
     * if the request has a user handler function registered in cbVector.
     * call the user handler function.
     */ 
    slave.poll();
}


/**
 * Handle Force Single Coil (FC=05) and Force Multiple Coils (FC=15)
 * set digital output pins (coils).
 * 
 * Dalla pagina di wikipedia addr: Coil  Read-write  1 bit   00001 - 09999 
 */
uint8_t writeDigitalOut(uint8_t fc, uint16_t address, uint16_t length) {
  Serial.print("FC= ");
  Serial.println(fc);
  Serial.print("ADDRES= ");
  Serial.println(address);
  Serial.print("LENGHT= ");
  Serial.println(length);

  if (address == 3) {
    digitalWrite(command_open, slave.readCoilFromBuffer(0));

    digitalWrite(command_close, slave.readCoilFromBuffer(1));

    digitalWrite(command_rocking, slave.readCoilFromBuffer(2));
  }

    return STATUS_OK;
}


// Handle the function code Read Input Status (FC=02) and write back the values from the digital input pins (discreet input).
uint8_t readDigitalIn(uint8_t fc, uint16_t address, uint16_t length)
{       
  Serial.print("FC= ");
  Serial.println(fc);
  Serial.print("ADDRES= ");
  Serial.println(address);
  Serial.print("LENGHT= ");
  Serial.println(length);


  if (address == 0) {
    // Write the state of the digital pin to the response buffer.
        slave.writeCoilToBuffer(0, digitalRead(feedback_open));

    // Write the state of the digital pin to the response buffer.
        slave.writeCoilToBuffer(1, digitalRead(feedback_close));

    // Write the state of the digital pin to the response buffer.
        slave.writeCoilToBuffer(2, digitalRead(WatchDog));
  }
  
    return STATUS_OK;
}

Thanks
Pietro

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions