diff --git a/README.md b/README.md index 822f437..ddfec48 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ +Read/Write Multiple Coil/Inputs Fixed! (8 bit bug) Modbus Library for Arduino ========================== +Bugs in main repo are fixed regarding to read/write for more than 8 coils. + This library allows your Arduino to communicate via Modbus protocol. The Modbus is a master-slave protocol used in industrial automation and can be used in other areas, such as home automation. diff --git a/libraries/Modbus/Modbus.cpp b/libraries/Modbus/Modbus.cpp index 6e9c7da..fd82671 100644 --- a/libraries/Modbus/Modbus.cpp +++ b/libraries/Modbus/Modbus.cpp @@ -326,7 +326,7 @@ void Modbus::readCoils(word startreg, word numregs) { byte bitn = 0; word totregs = numregs; word i; - while (numregs--) { + while (numregs) { i = (totregs - numregs) / 8; if (this->Coil(startreg)) bitSet(_frame[2+i], bitn); @@ -337,6 +337,7 @@ void Modbus::readCoils(word startreg, word numregs) { if (bitn == 8) bitn = 0; //increment the register startreg++; + numregs--; } _reply = MB_REPLY_NORMAL; @@ -377,7 +378,7 @@ void Modbus::readInputStatus(word startreg, word numregs) { byte bitn = 0; word totregs = numregs; word i; - while (numregs--) { + while (numregs) { i = (totregs - numregs) / 8; if (this->Ists(startreg)) bitSet(_frame[2+i], bitn); @@ -388,6 +389,7 @@ void Modbus::readInputStatus(word startreg, word numregs) { if (bitn == 8) bitn = 0; //increment the register startreg++; + numregs--; } _reply = MB_REPLY_NORMAL; @@ -496,7 +498,7 @@ void Modbus::writeMultipleCoils(byte* frame,word startreg, word numoutputs, byte byte bitn = 0; word totoutputs = numoutputs; word i; - while (numoutputs--) { + while (numoutputs) { i = (totoutputs - numoutputs) / 8; this->Coil(startreg, bitRead(frame[6+i], bitn)); //increment the bit index @@ -504,6 +506,7 @@ void Modbus::writeMultipleCoils(byte* frame,word startreg, word numoutputs, byte if (bitn == 8) bitn = 0; //increment the register startreg++; + numoutputs--; } _reply = MB_REPLY_NORMAL; diff --git a/libraries/ModbusIP/ModbusIP.cpp b/libraries/ModbusIP/ModbusIP.cpp index c2caffb..1460967 100644 --- a/libraries/ModbusIP/ModbusIP.cpp +++ b/libraries/ModbusIP/ModbusIP.cpp @@ -82,4 +82,4 @@ void ModbusIP::task() { _len = 0; } } -} +} \ No newline at end of file diff --git a/libraries/ModbusIP/ModbusIP.h b/libraries/ModbusIP/ModbusIP.h index 29882e5..4bd26a5 100644 --- a/libraries/ModbusIP/ModbusIP.h +++ b/libraries/ModbusIP/ModbusIP.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include #ifndef MODBUSIP_H #define MODBUSIP_H @@ -13,7 +13,7 @@ #define MODBUSIP_PORT 502 #define MODBUSIP_MAXFRAME 200 -//#define TCP_KEEP_ALIVE +#define TCP_KEEP_ALIVE class ModbusIP : public Modbus { private: @@ -30,5 +30,4 @@ class ModbusIP : public Modbus { void task(); }; -#endif //MODBUSIP_H - +#endif //MODBUSIP_H \ No newline at end of file