upd version, upd ectoControl

This commit is contained in:
Mit4el
2025-03-29 20:17:18 +03:00
parent 3a2ac1666b
commit 17dadf5745
5 changed files with 104 additions and 67 deletions

View File

@@ -4,7 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" /> <meta name="viewport" content="width=device-width,initial-scale=1" />
<title>IoT Manager 4.5.5</title> <title>IoT Manager 4.6.0</title>
<link rel="icon" type="image/png" href="/favicon.ico" /> <link rel="icon" type="image/png" href="/favicon.ico" />
<link rel="stylesheet" href="/build/bundle.css?4550" /> <link rel="stylesheet" href="/build/bundle.css?4550" />

View File

@@ -4,7 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" /> <meta name="viewport" content="width=device-width,initial-scale=1" />
<title>IoT Manager 4.5.5</title> <title>IoT Manager 4.6.0</title>
<link rel="icon" type="image/png" href="/favicon.ico" /> <link rel="icon" type="image/png" href="/favicon.ico" />
<link rel="stylesheet" href="/build/bundle.css?4550" /> <link rel="stylesheet" href="/build/bundle.css?4550" />

View File

@@ -2,7 +2,7 @@
#include "BuildTime.h" #include "BuildTime.h"
// Версия прошивки // Версия прошивки
#define FIRMWARE_VERSION 457 #define FIRMWARE_VERSION 461
#ifdef esp8266_1mb_ota #ifdef esp8266_1mb_ota
#define FIRMWARE_NAME "esp8266_1mb_ota" #define FIRMWARE_NAME "esp8266_1mb_ota"

View File

@@ -8,7 +8,6 @@
// #include "Stream.h" // #include "Stream.h"
#include <vector> #include <vector>
// class ModbusUart; // class ModbusUart;
Stream *_modbusUART = nullptr; Stream *_modbusUART = nullptr;
@@ -21,7 +20,6 @@ uint8_t _DIR_PIN = 0;
#define MODBUS_TX_PIN 19 // Tx pin #define MODBUS_TX_PIN 19 // Tx pin
#define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication #define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication
void modbusPreTransmission() void modbusPreTransmission()
{ {
// delay(500); // delay(500);
@@ -52,7 +50,7 @@ private:
int protocol = SERIAL_8N1; int protocol = SERIAL_8N1;
uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247
uint8_t _type = 0x14; // Тип устройства: 0x14 адаптер OpenTherm (вторая версия); 0x11 адаптер OpenTherm (первая версия, снята с производства) uint8_t _type = 0x14; // Тип устройства: 0x14 адаптер OpenTherm (вторая версия); 0x11 адаптер OpenTherm (первая версия, снята с производства)
bool _debugLevel; // Дебаг uint8_t _debugLevel; // Дебаг
ModbusMaster node; ModbusMaster node;
uint8_t _debug; uint8_t _debug;
@@ -136,36 +134,39 @@ public:
{ {
SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX));
} }
getModelVersion();
getBoilerInfo();
getBoilerStatus();
} }
else if (_addr == 0) else if (_addr == 0)
{ // если адреса нет, то шлем широковещательный запрос адреса { // если адреса нет, то шлем широковещательный запрос адреса
uint8_t addr = node.readAddresEctoControl(); uint8_t addr = node.readAddresEctoControl();
SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration");
} }
getModelVersion();
getBoilerInfo();
getBoilerStatus();
} }
void doByInterval() void doByInterval()
{ {
// readBoilerInfo(); if (_addr > 0)
getBoilerStatus(); {
// readBoilerInfo();
getBoilerStatus();
getCodeError(); getCodeError();
getCodeErrorExt(); getCodeErrorExt();
if (info.adapterType == 0) if (info.adapterType == 0)
getFlagErrorOT(); getFlagErrorOT();
// getFlowRate(); // getFlowRate();
// getMaxSetCH(); // getMaxSetCH();
// getMaxSetDHW(); // getMaxSetDHW();
// getMinSetCH(); // getMinSetCH();
// getMinSetDHW(); // getMinSetDHW();
getModLevel(); getModLevel();
getPressure(); getPressure();
getTempCH(); getTempCH();
getTempDHW(); getTempDHW();
getTempOutside(); getTempOutside();
}
} }
void loop() void loop()
@@ -176,10 +177,6 @@ public:
IoTValue execute(String command, std::vector<IoTValue> &param) IoTValue execute(String command, std::vector<IoTValue> &param)
{ {
if (command == "getModelVersion")
{
getModelVersion();
}
if (command == "getModelVersion") if (command == "getModelVersion")
{ {
getModelVersion(); getModelVersion();
@@ -324,13 +321,12 @@ public:
tlgrmItem->sendTelegramMsg(false, msg); tlgrmItem->sendTelegramMsg(false, msg);
} }
~EctoControlAdapter() { ~EctoControlAdapter(){};
};
bool writeFunctionModBus(const uint16_t &reg, uint16_t &data) bool writeFunctionModBus(const uint16_t &reg, uint16_t &data)
{ {
// set word 0 of TX buffer to least-significant word of counter (bits 15..0) // 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) // set word 1 of TX buffer to most-significant word of counter (bits 31..16)
node.setTransmitBuffer(0, data); node.setTransmitBuffer(0, data);
// slave: write TX buffer to (2) 16-bit registers starting at register 0 // slave: write TX buffer to (2) 16-bit registers starting at register 0
@@ -348,6 +344,7 @@ public:
bool readFunctionModBus(const uint16_t &reg, uint16_t &reading) bool readFunctionModBus(const uint16_t &reg, uint16_t &reading)
{ {
if (_addr == 0) return false;
// float retValue = 0; // float retValue = 0;
if (_modbusUART) if (_modbusUART)
{ {

View File

@@ -1,6 +1,9 @@
#include "ModbusEC.h" #include "ModbusEC.h"
#define COUNT_BIT_AVAIL 5
#define COUNT_BIT_AVAIL_46F 4
ModbusMaster::ModbusMaster(void) ModbusMaster::ModbusMaster(void)
{ {
_idle = 0; _idle = 0;
@@ -256,8 +259,8 @@ uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress,
/** /**
Modbus function 0x06 Write Single Register. Modbus function 0x06 Write Single Register.
This function code is used to write a single holding register in a 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 remote device. The request specifies the address of the register to be
written. Registers are addressed starting at zero. written. Registers are addressed starting at zero.
@param u16WriteAddress address of the holding register (0x0000..0xFFFF) @param u16WriteAddress address of the holding register (0x0000..0xFFFF)
@@ -266,7 +269,7 @@ written. Registers are addressed starting at zero.
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress,
uint16_t u16WriteValue) uint16_t u16WriteValue)
{ {
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16WriteQty = 0; _u16WriteQty = 0;
@@ -274,7 +277,6 @@ uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress,
return ModbusMasterTransaction(ku8MBWriteSingleRegister); return ModbusMasterTransaction(ku8MBWriteSingleRegister);
} }
/** /**
Modbus function 0x10 Write Multiple Registers. Modbus function 0x10 Write Multiple Registers.
@@ -308,7 +310,8 @@ uint8_t ModbusMaster::readAddresEctoControl()
{ {
_u16ReadAddress = 0x00; _u16ReadAddress = 0x00;
_u16ReadQty = 1; _u16ReadQty = 1;
return ModbusMasterTransaction(ku8MBProgRead46); ModbusMasterTransaction(ku8MBProgRead46);
return getResponseBuffer(0x00);
} }
uint8_t ModbusMaster::writeAddresEctoControl(uint8_t addr) uint8_t ModbusMaster::writeAddresEctoControl(uint8_t addr)
{ {
@@ -393,8 +396,17 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
{ {
u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); 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++] = lowByte(u16CRC);
u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC);
// }
u8ModbusADU[u8ModbusADUSize] = 0; u8ModbusADU[u8ModbusADUSize] = 0;
// flush receive buffer before transmitting request // flush receive buffer before transmitting request
@@ -427,7 +439,9 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
#if __MODBUSMASTER_DEBUG__ #if __MODBUSMASTER_DEBUG__
digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, true); digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, true);
#endif #endif
u8ModbusADU[u8ModbusADUSize++] = _serial->read(); uint8_t req = _serial->read();
u8ModbusADU[u8ModbusADUSize++] = req;
Serial.print(req, HEX);
u8BytesLeft--; u8BytesLeft--;
#if __MODBUSMASTER_DEBUG__ #if __MODBUSMASTER_DEBUG__
digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, false); 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 // 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 (u8MBFunction != ku8MBProgRead46 && u8MBFunction != ku8MBProgWrite47)
if (u8ModbusADU[0] != _u8MBSlave)
{ {
// Serial.print(u8ModbusADU[0], HEX); // verify response is for correct Modbus slave
// Serial.print(" != "); if (u8ModbusADU[0] != _u8MBSlave)
// Serial.println(_u8MBSlave, HEX); {
// Serial.print(u8ModbusADU[0], HEX);
u8MBStatus = ku8MBInvalidSlaveID; // Serial.print(" != ");
break; // Serial.println(_u8MBSlave, HEX);
}
// verify response is for correct Modbus function code (mask exception bit 7) u8MBStatus = ku8MBInvalidSlaveID;
if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) break;
{ }
u8MBStatus = ku8MBInvalidFunction;
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 // check whether Modbus exception occurred; return Modbus Exception Code
if (bitRead(u8ModbusADU[1], 7)) if (bitRead(u8ModbusADU[1], 7))
{ {
@@ -485,6 +507,16 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
case ku8MBWriteMultipleRegisters: case ku8MBWriteMultipleRegisters:
u8BytesLeft = 3; u8BytesLeft = 3;
break; break;
case ku8MBProgRead46:
u8BytesLeft = 1;
break;
case ku8MBProgWrite47:
u8BytesLeft = 1;
break;
default:
} }
} }
if ((millis() - u32StartTime) > ku16MBResponseTimeout) if ((millis() - u32StartTime) > ku16MBResponseTimeout)
@@ -493,24 +525,26 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
} }
} }
// verify response is large enough to inspect further if (u8MBFunction != ku8MBProgRead46 && u8MBFunction != ku8MBProgWrite47)
if (!u8MBStatus && u8ModbusADUSize >= 5)
{ {
// calculate CRC // verify response is large enough to inspect further
u16CRC = 0xFFFF; if (!u8MBStatus && u8ModbusADUSize >= COUNT_BIT_AVAIL)
for (i = 0; i < (u8ModbusADUSize - 2); i++)
{ {
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 // verify CRC
if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] ||
highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1]))
{ {
u8MBStatus = ku8MBInvalidCRC; u8MBStatus = ku8MBInvalidCRC;
}
} }
} }
// disassemble ADU into words // disassemble ADU into words
if (!u8MBStatus) if (!u8MBStatus)
{ {
@@ -530,6 +564,12 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
} }
break; break;
case ku8MBProgRead46: case ku8MBProgRead46:
Serial.print("ku8MBProgRead46");
for (i = 0; i < (u8ModbusADUSize); i++)
{
Serial.println(u8ModbusADU[i], HEX);
}
_u16ResponseBuffer[0] = (uint16_t)u8ModbusADU[2]; _u16ResponseBuffer[0] = (uint16_t)u8ModbusADU[2];
_u8ResponseBufferLength = 1; _u8ResponseBufferLength = 1;
break; break;