andresarmento / modbus-arduino

A library that allows your Arduino to communicate via Modbus protocol, acting as a slave (master in development). Supports serial (RS-232, RS-485) and IP via Ethernet (Modbus IP).
BSD 3-Clause "New" or "Revised" License
453 stars 267 forks source link

Register 4th and 5th are corrupt when writing multiple registers #31

Open huytranthanh1508 opened 6 years ago

huytranthanh1508 commented 6 years ago

Hi, Could you please help us to fix the issue? we are connecting our micro controller to Ethernet Shield V2 using ModbusIP and Modbus libraries. We tried to write values to 12 registers from 106 to 116. 4th byte and 5th byte got a different value that we wrote from our software. However, the other registers had right values. We test with chatserver program to read raw data and compared with data that we wrote down. It showed right value when we read raw data. So when we use Modbus library. we have these 2 bytes with wrong value. Here is the code! Thank you for your help!

include

include

include

include

int tanklevel; int tanklevel_old; int vfdspeed; word vfdspeed106; word vfdspeed107; word vfdspeed108; word vfdspeed109; word vfdspeed110; word vfdspeed111; word vfdspeed112; word vfdspeed113; word vfdspeed114; word vfdspeed115; word vfdspeed116; int vfdspeed_old; bool valvepos; bool valvepos_old; bool pump; bool pump_old;

const int tanklevel_ir = 100; const int vfdspeed_hr = 105; const word vfdspeed_hr106 = 106; const word vfdspeed_hr107 = 107; const word vfdspeed_hr108 = 108; const word vfdspeed_hr109 = 109; const word vfdspeed_hr110 = 110; const word vfdspeed_hr111 = 111; const word vfdspeed_hr112 = 112; const word vfdspeed_hr113 = 113; const word vfdspeed_hr114 = 114; const word vfdspeed_hr115 = 115; const word vfdspeed_hr116 = 116; const int valvepos_is = 110; const int pump_cl = 115;

//Modbus IP Object ModbusIP mb;

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

// The media access control (ethernet hardware) address for the shield byte mac[] = { 0x90, 0xA2, 0xDA, 0x11, 0x15, 0x66 };
// The IP address for the shield byte ip[] = { 192, 168, 1, 138 };
//Config Modbus IP mb.config(mac, ip);

mb.addIreg(tanklevel_ir); mb.addHreg(vfdspeed_hr); mb.addHreg(vfdspeed_hr106); mb.addHreg(vfdspeed_hr107); mb.addHreg(vfdspeed_hr108); mb.addHreg(vfdspeed_hr109); mb.addHreg(vfdspeed_hr110); mb.addHreg(vfdspeed_hr111); mb.addHreg(vfdspeed_hr112); mb.addHreg(vfdspeed_hr113); mb.addHreg(vfdspeed_hr114); mb.addHreg(vfdspeed_hr115); mb.addHreg(vfdspeed_hr116); mb.addIsts(valvepos_is); mb.addCoil(pump_cl);

tanklevel = 12; tanklevel_old = 12; vfdspeed = 150; vfdspeed_old = 150; valvepos = true; valvepos_old = true; pump = false; pump_old = false;

mb.Ireg (tanklevel_ir, tanklevel); mb.Hreg (vfdspeed_hr, vfdspeed); mb.Ists (valvepos_is, valvepos); mb.Coil (pump_cl, pump);

DisplayCurrentValues();

}

void loop() {

mb.task();

vfdspeed = mb.Hreg (vfdspeed_hr); vfdspeed106 = mb.Hreg (vfdspeed_hr106); vfdspeed107 = mb.Hreg (vfdspeed_hr107); vfdspeed108 = mb.Hreg (vfdspeed_hr108); vfdspeed109 = mb.Hreg (vfdspeed_hr109); vfdspeed110 = mb.Hreg (vfdspeed_hr110); vfdspeed111 = mb.Hreg (vfdspeed_hr111); vfdspeed112 = mb.Hreg (vfdspeed_hr112); vfdspeed113 = mb.Hreg (vfdspeed_hr113); vfdspeed114 = mb.Hreg (vfdspeed_hr114); vfdspeed115 = mb.Hreg (vfdspeed_hr115); vfdspeed116 = mb.Hreg (vfdspeed_hr116); pump = mb.Coil (pump_cl);

// send updated values CheckForDataChange();

}

void CheckForDataChange() {

boolean data_has_changed = false;

if (tanklevel_old != tanklevel) { data_has_changed = true; tanklevel_old = tanklevel; }

if (vfdspeed_old != vfdspeed) { data_has_changed = true; vfdspeed_old = vfdspeed; }

if (valvepos_old != valvepos) { data_has_changed = true; valvepos_old = valvepos; }

if (pump_old != pump) { data_has_changed = true; pump_old = pump; }

if (data_has_changed == true) { DisplayCurrentValues(); }

}

void DisplayCurrentValues() {

String tmpstr; String pos; String pstat;

if (valvepos == true) { pos = "Closed"; } else { pos = "Open"; }

if (pump == true) { pstat = "Run"; } else { pstat = "Stop"; }

tmpstr = "Tank Level: " + String(tanklevel) + " ft"; tmpstr = tmpstr + " | VFD Speed: " + vfdspeed + " rpm"; tmpstr = tmpstr + " | Valve: " + pos; tmpstr = tmpstr + " | Pump: " + pstat; tmpstr = tmpstr + " | Register106: " + vfdspeed106; tmpstr = tmpstr + " | Register107: " + vfdspeed107; tmpstr = tmpstr + " | Register108: " + vfdspeed108; tmpstr = tmpstr + " | Register109: " + vfdspeed109; tmpstr = tmpstr + " | Register110: " + vfdspeed110; tmpstr = tmpstr + " | Register111: " + vfdspeed111; tmpstr = tmpstr + " | Register112: " + vfdspeed112; tmpstr = tmpstr + " | Register113: " + vfdspeed113; tmpstr = tmpstr + " | Register114: " + vfdspeed114; tmpstr = tmpstr + " | Register115: " + vfdspeed115; tmpstr = tmpstr + " | Register116: " + vfdspeed116; Serial.println(tmpstr);

}