diff --git a/data_full/index.html b/data_full/index.html index bbcd166f..407b5bd5 100644 --- a/data_full/index.html +++ b/data_full/index.html @@ -4,7 +4,7 @@ - IoT Manager 4.5.5 + IoT Manager 4.6.0 diff --git a/data_svelte/index.html b/data_svelte/index.html index bbcd166f..407b5bd5 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,7 +4,7 @@ - IoT Manager 4.5.5 + IoT Manager 4.6.0 diff --git a/include/Const.h b/include/Const.h index 691983f0..6ac1c62e 100644 --- a/include/Const.h +++ b/include/Const.h @@ -2,7 +2,7 @@ #include "BuildTime.h" // Версия прошивки -#define FIRMWARE_VERSION 457 +#define FIRMWARE_VERSION 461 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index ea4700cc..18511cc6 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -8,7 +8,6 @@ // #include "Stream.h" #include - // class ModbusUart; Stream *_modbusUART = nullptr; @@ -21,7 +20,6 @@ uint8_t _DIR_PIN = 0; #define MODBUS_TX_PIN 19 // Tx pin #define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication - void modbusPreTransmission() { // delay(500); @@ -52,7 +50,7 @@ private: int protocol = SERIAL_8N1; uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 uint8_t _type = 0x14; // Тип устройства: 0x14 – адаптер OpenTherm (вторая версия); 0x11 – адаптер OpenTherm (первая версия, снята с производства) - bool _debugLevel; // Дебаг + uint8_t _debugLevel; // Дебаг ModbusMaster node; uint8_t _debug; @@ -136,36 +134,39 @@ public: { SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); } + getModelVersion(); + getBoilerInfo(); + getBoilerStatus(); } else if (_addr == 0) { // если адреса нет, то шлем широковещательный запрос адреса uint8_t addr = node.readAddresEctoControl(); SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); } - getModelVersion(); - getBoilerInfo(); - getBoilerStatus(); } void doByInterval() { - // readBoilerInfo(); - getBoilerStatus(); + if (_addr > 0) + { + // readBoilerInfo(); + getBoilerStatus(); - getCodeError(); - getCodeErrorExt(); - if (info.adapterType == 0) - getFlagErrorOT(); - // getFlowRate(); - // getMaxSetCH(); - // getMaxSetDHW(); - // getMinSetCH(); - // getMinSetDHW(); - getModLevel(); - getPressure(); - getTempCH(); - getTempDHW(); - getTempOutside(); + getCodeError(); + getCodeErrorExt(); + if (info.adapterType == 0) + getFlagErrorOT(); + // getFlowRate(); + // getMaxSetCH(); + // getMaxSetDHW(); + // getMinSetCH(); + // getMinSetDHW(); + getModLevel(); + getPressure(); + getTempCH(); + getTempDHW(); + getTempOutside(); + } } void loop() @@ -176,10 +177,6 @@ public: IoTValue execute(String command, std::vector ¶m) { - if (command == "getModelVersion") - { - getModelVersion(); - } if (command == "getModelVersion") { getModelVersion(); @@ -324,13 +321,12 @@ public: tlgrmItem->sendTelegramMsg(false, msg); } - ~EctoControlAdapter() { - }; + ~EctoControlAdapter(){}; 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, data); // slave: write TX buffer to (2) 16-bit registers starting at register 0 @@ -348,6 +344,7 @@ public: bool readFunctionModBus(const uint16_t ®, uint16_t &reading) { + if (_addr == 0) return false; // float retValue = 0; if (_modbusUART) { diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp index 029e448b..d9d0818e 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp @@ -1,6 +1,9 @@ #include "ModbusEC.h" +#define COUNT_BIT_AVAIL 5 +#define COUNT_BIT_AVAIL_46F 4 + ModbusMaster::ModbusMaster(void) { _idle = 0; @@ -256,8 +259,8 @@ uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, /** 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 +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) @@ -266,7 +269,7 @@ written. Registers are addressed starting at zero. @ingroup register */ uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, - uint16_t u16WriteValue) + uint16_t u16WriteValue) { _u16WriteAddress = u16WriteAddress; _u16WriteQty = 0; @@ -274,7 +277,6 @@ uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, return ModbusMasterTransaction(ku8MBWriteSingleRegister); } - /** Modbus function 0x10 Write Multiple Registers. @@ -308,7 +310,8 @@ uint8_t ModbusMaster::readAddresEctoControl() { _u16ReadAddress = 0x00; _u16ReadQty = 1; - return ModbusMasterTransaction(ku8MBProgRead46); + ModbusMasterTransaction(ku8MBProgRead46); + return getResponseBuffer(0x00); } uint8_t ModbusMaster::writeAddresEctoControl(uint8_t addr) { @@ -393,8 +396,17 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) { u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); } + // if (u8MBFunction == ku8MBProgRead46 || u8MBFunction == ku8MBProgWrite47) + // { + // u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); + // u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); + // } + // else + // { u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); + // } + u8ModbusADU[u8ModbusADUSize] = 0; // flush receive buffer before transmitting request @@ -427,7 +439,9 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) #if __MODBUSMASTER_DEBUG__ digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, true); #endif - u8ModbusADU[u8ModbusADUSize++] = _serial->read(); + uint8_t req = _serial->read(); + u8ModbusADU[u8ModbusADUSize++] = req; + Serial.print(req, HEX); u8BytesLeft--; #if __MODBUSMASTER_DEBUG__ digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, false); @@ -448,26 +462,34 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) } // evaluate slave ID, function code once enough bytes have been read - if (u8ModbusADUSize == 5) + uint8_t count; + if (u8MBFunction == ku8MBProgRead46 || u8MBFunction == ku8MBProgWrite47) + count = COUNT_BIT_AVAIL_46F; + else + count = COUNT_BIT_AVAIL; + + if (u8ModbusADUSize == count) { - // verify response is for correct Modbus slave - if (u8ModbusADU[0] != _u8MBSlave) + if (u8MBFunction != ku8MBProgRead46 && u8MBFunction != ku8MBProgWrite47) { - // Serial.print(u8ModbusADU[0], HEX); - // Serial.print(" != "); - // Serial.println(_u8MBSlave, HEX); - - u8MBStatus = ku8MBInvalidSlaveID; - break; - } + // verify response is for correct Modbus slave + if (u8ModbusADU[0] != _u8MBSlave) + { + // Serial.print(u8ModbusADU[0], HEX); + // Serial.print(" != "); + // Serial.println(_u8MBSlave, HEX); - // verify response is for correct Modbus function code (mask exception bit 7) - if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) - { - u8MBStatus = ku8MBInvalidFunction; - break; - } + u8MBStatus = ku8MBInvalidSlaveID; + break; + } + // verify response is for correct Modbus function code (mask exception bit 7) + if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) + { + u8MBStatus = ku8MBInvalidFunction; + break; + } + } // check whether Modbus exception occurred; return Modbus Exception Code if (bitRead(u8ModbusADU[1], 7)) { @@ -485,6 +507,16 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) case ku8MBWriteMultipleRegisters: u8BytesLeft = 3; break; + + case ku8MBProgRead46: + u8BytesLeft = 1; + break; + + case ku8MBProgWrite47: + u8BytesLeft = 1; + break; + + default: } } if ((millis() - u32StartTime) > ku16MBResponseTimeout) @@ -493,24 +525,26 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) } } - // verify response is large enough to inspect further - if (!u8MBStatus && u8ModbusADUSize >= 5) + if (u8MBFunction != ku8MBProgRead46 && u8MBFunction != ku8MBProgWrite47) { - // calculate CRC - u16CRC = 0xFFFF; - for (i = 0; i < (u8ModbusADUSize - 2); i++) + // verify response is large enough to inspect further + if (!u8MBStatus && u8ModbusADUSize >= COUNT_BIT_AVAIL) { - u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); - } + // calculate CRC + u16CRC = 0xFFFF; + for (i = 0; i < (u8ModbusADUSize - 2); i++) + { + u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); + } - // verify CRC - if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || - highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) - { - u8MBStatus = ku8MBInvalidCRC; + // verify CRC + if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || + highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) + { + u8MBStatus = ku8MBInvalidCRC; + } } } - // disassemble ADU into words if (!u8MBStatus) { @@ -530,6 +564,12 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) } break; case ku8MBProgRead46: + Serial.print("ku8MBProgRead46"); + for (i = 0; i < (u8ModbusADUSize); i++) + { + Serial.println(u8ModbusADU[i], HEX); + } + _u16ResponseBuffer[0] = (uint16_t)u8ModbusADU[2]; _u8ResponseBufferLength = 1; break;