fix ecto writeRegister

This commit is contained in:
Mit4el
2025-02-24 19:50:42 +03:00
parent 36ea71c270
commit 67a6eba882
3 changed files with 41 additions and 12 deletions

View File

@@ -329,11 +329,11 @@ public:
bool writeFunctionModBus(const uint16_t &reg, 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;
}

View File

@@ -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.

View File

@@ -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 высылается ведущим устройством ведомому с указанием сменить свой имеющийся адрес на заданный
// высылается ведущим устройством единственному устройству на шине с неизвестным адресом