Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
huytranthanh1508 opened this issue Dec 18, 2017 · 0 comments
Open

Comments

@huytranthanh1508
Copy link

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

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant