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