Adruino Read Selec MF383A

 

Adruino Read Selec MF383A

Adruino read Selec MF383A via RS485 Modbus RTU


#include <ModbusRtu.h>

#include <SoftwareSerial.h>


SoftwareSerial mySerial(10, 11); // RX, TX


uint16_t au16data[16];

uint8_t u8state;

unsigned long time1 = 0;

Modbus master(0,mySerial,0);

modbus_t telegram;


unsigned long u32wait;


void setup() {

  Serial.begin(9600);

  Serial1.begin(9600);

  mySerial.begin(9600);

  master.start();

  master.setTimeOut( 2000 );

  u32wait = millis() + 1000;

  u8state = 0; 

}


void loop() {

  switch( u8state ) {

  case 0: 

    if (millis() > u32wait) u8state++; // wait state

    break;

  case 1: 

    telegram.u8id = 1; // slave address

    telegram.u8fct = 4; // function code (this one is registers read)

    telegram.u16RegAdd = 0; // start address in slave

    telegram.u16CoilsNo = 10; // number of elements (coils or registers) to read

    telegram.au16reg = au16data; // pointer to a memory array in the Arduino


    master.query( telegram ); // send query (only once)

    u8state++;

    break;

  case 2:

    master.poll(); // check incoming messages

    if (master.getState() == COM_IDLE) {

      u8state = 0;

      u32wait = millis() + 100; 

    }

    break;

  }


  if ( (unsigned long) (millis() - time1) > 1000 )

    {

      Serial.print("V1N: ");

      Serial.println(convertFloat(au16data[0], au16data[1]));

      Serial.print("V2N: ");

      Serial.println(convertFloat(au16data[2], au16data[3]));

      Serial.print("V3N: ");

      Serial.println(convertFloat(au16data[4], au16data[5]));

      Serial.print("Average Voltage LN: ");

      Serial.println(convertFloat(au16data[6], au16data[7]));

      

      time1 = millis();

    }


}


float convertFloat(uint16_t reg_low, uint16_t reg_high) {

  uint16_t data[2] = {reg_low, reg_high};

  float value;

  memcpy(&value, data, 4);

  return value;

}

No comments:

Post a Comment