diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index c8c7e1f2..660269d2 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -329,11 +329,11 @@ public: bool writeFunctionModBus(const uint16_t ®, uint16_t &data) { // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - node.setTransmitBuffer(1, lowWord(data)); + //node.setTransmitBuffer(1, lowWord(data)); // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - node.setTransmitBuffer(0, highWord(data)); + //node.setTransmitBuffer(0, highWord(data)); // slave: write TX buffer to (2) 16-bit registers starting at register 0 - uint8_t result = node.writeMultipleRegisters(0, 2); + uint8_t result = node.writeSingleRegister(reg, data); if (_debug > 2) { SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); @@ -585,7 +585,8 @@ public: bool setTypeConnect(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_SetTypeConnect, data16)) { // TODO запросить результат записи у адаптера ret = true; @@ -631,7 +632,8 @@ public: bool setMinCH(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMinCH, data16)) { ret = true; } @@ -645,7 +647,8 @@ public: bool setMaxCH(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMaxCH, data16)) { ret = true; } @@ -659,7 +662,8 @@ public: bool setMinDHW(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMinDHW, data16)) { ret = true; } @@ -673,7 +677,8 @@ public: bool setMaxDHW(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMaxDHW, data16)) { ret = true; } @@ -687,7 +692,8 @@ public: bool setTDHW(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetDHW, data16)) { ret = true; } @@ -701,7 +707,8 @@ public: bool setMaxModLevel(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_SetMaxModLevel, data16)) { ret = true; } diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp index dd88f86c..029e448b 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp @@ -253,6 +253,28 @@ uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, return ModbusMasterTransaction(ku8MBReadHoldingRegisters); } +/** +Modbus function 0x06 Write Single Register. + +This function code is used to write a single holding register in a +remote device. The request specifies the address of the register to be +written. Registers are addressed starting at zero. + +@param u16WriteAddress address of the holding register (0x0000..0xFFFF) +@param u16WriteValue value to be written to holding register (0x0000..0xFFFF) +@return 0 on success; exception number on failure +@ingroup register +*/ +uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, + uint16_t u16WriteValue) +{ + _u16WriteAddress = u16WriteAddress; + _u16WriteQty = 0; + _u16TransmitBuffer[0] = u16WriteValue; + return ModbusMasterTransaction(ku8MBWriteSingleRegister); +} + + /** Modbus function 0x10 Write Multiple Registers. diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.h b/src/modules/exec/EctoControlAdapter/ModbusEC.h index 0f5f1f79..c9cd6fb0 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.h +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.h @@ -52,7 +52,7 @@ public: uint8_t readHoldingRegisters(uint16_t, uint16_t); uint8_t writeMultipleRegisters(uint16_t, uint16_t); uint8_t writeMultipleRegisters(); - + uint8_t writeSingleRegister(uint16_t, uint16_t); uint8_t readAddresEctoControl(); uint8_t writeAddresEctoControl(uint8_t); @@ -76,7 +76,7 @@ private: // Modbus function codes for 16 bit access static const uint8_t ku8MBReadHoldingRegisters = 0x03; ///< Modbus function 0x03 Read Holding Registers static const uint8_t ku8MBWriteMultipleRegisters = 0x10; ///< Modbus function 0x10 Write Multiple Registers - + static const uint8_t ku8MBWriteSingleRegister = 0x06; ///< Modbus function 0x06 Write Single Register static const uint8_t ku8MBProgRead46 = 0x46; ///< EctoControl function 0x46 Устройство возвращает в ответе свой текущий адрес ADDR static const uint8_t ku8MBProgWrite47 = 0x47; ///< EctoControl function 0x47 высылается ведущим устройством ведомому с указанием сменить свой имеющийся адрес на заданный // высылается ведущим устройством единственному устройству на шине с неизвестным адресом