andresarmento/modbus-arduino

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

huytranthanh1508 opened this issue · 0 comments

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 <ModbusIP.h>
#include <Modbus.h>
#include <Ethernet2.h>
#include <SPI.h>

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);

}