mirror of https://github.com/arendst/Tasmota.git
Work in progress...
This commit is contained in:
parent
2c2a73506d
commit
92319eedd2
|
@ -102,7 +102,8 @@ enum class ModbusBridgeError
|
|||
wrongstartaddress = 4,
|
||||
wrongtype = 5,
|
||||
wrongregistercount = 6,
|
||||
wrongcount = 7
|
||||
wrongcount = 7,
|
||||
tomanydata = 8
|
||||
};
|
||||
|
||||
enum class ModbusBridgeFunctionCode
|
||||
|
@ -150,7 +151,6 @@ struct ModbusBridge
|
|||
uint8_t deviceAddress = 0;
|
||||
uint8_t count = 0;
|
||||
bool raw = false;
|
||||
|
||||
};
|
||||
|
||||
ModbusBridge modbusBridge;
|
||||
|
@ -161,8 +161,10 @@ ModbusBridge modbusBridge;
|
|||
//
|
||||
bool ModbusBridgeBegin(void)
|
||||
{
|
||||
if ((Settings->modbus_sbaudrate < 1) || (Settings->modbus_sbaudrate > (115200 / 300))) Settings->modbus_sbaudrate = (uint8_t)((uint32_t)MBR_BAUDRATE / 300);
|
||||
if (Settings->modbus_sconfig > TS_SERIAL_8O2) Settings->modbus_sconfig = TS_SERIAL_8N1;
|
||||
if ((Settings->modbus_sbaudrate < 1) || (Settings->modbus_sbaudrate > (115200 / 300)))
|
||||
Settings->modbus_sbaudrate = (uint8_t)((uint32_t)MBR_BAUDRATE / 300);
|
||||
if (Settings->modbus_sconfig > TS_SERIAL_8O2)
|
||||
Settings->modbus_sconfig = TS_SERIAL_8N1;
|
||||
|
||||
int result = tasmotaModbus->Begin(Settings->modbus_sbaudrate * 300, ConvertSerialConfig(Settings->modbus_sconfig)); // Reinitialize modbus port with new baud rate
|
||||
if (result)
|
||||
|
@ -553,6 +555,12 @@ void CmndModbusBridgeSend(void)
|
|||
// If write data is specified in JSON copy it into writeData array
|
||||
JsonParserArray jsonDataArray = root[PSTR(D_JSON_MODBUS_DATA)].getArray();
|
||||
if (jsonDataArray.isArray())
|
||||
{
|
||||
if (modbusBridge.registerCount > 40)
|
||||
{
|
||||
errorcode = ModbusBridgeError::tomanydata;
|
||||
}
|
||||
else
|
||||
{
|
||||
writeDataSize = jsonDataArray.size();
|
||||
|
||||
|
@ -562,13 +570,14 @@ void CmndModbusBridgeSend(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
writeData = (uint16_t *)malloc(writeDataSize*2);
|
||||
writeData = (uint16_t *)malloc(writeDataSize * 2);
|
||||
for (uint8_t jsonDataArrayPointer = 0; jsonDataArrayPointer < writeDataSize; jsonDataArrayPointer++)
|
||||
{
|
||||
writeData[jsonDataArrayPointer] = jsonDataArray[jsonDataArrayPointer].getUInt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle errorcode and exit function when an error has occured
|
||||
if (errorcode != ModbusBridgeError::noerror)
|
||||
|
@ -579,7 +588,8 @@ void CmndModbusBridgeSend(void)
|
|||
}
|
||||
|
||||
// If writing a single coil or single register, the register count is always 1. We also prevent writing data out of range
|
||||
if ((modbusBridge.functionCode == ModbusBridgeFunctionCode::mb_writeSingleCoil) || (modbusBridge.functionCode == ModbusBridgeFunctionCode::mb_writeSingleRegister)) modbusBridge.registerCount = 1;
|
||||
if ((modbusBridge.functionCode == ModbusBridgeFunctionCode::mb_writeSingleCoil) || (modbusBridge.functionCode == ModbusBridgeFunctionCode::mb_writeSingleRegister))
|
||||
modbusBridge.registerCount = 1;
|
||||
|
||||
tasmotaModbus->Send(modbusBridge.deviceAddress, (uint8_t)modbusBridge.functionCode, modbusBridge.startAddress, modbusBridge.registerCount, writeData);
|
||||
free(writeData);
|
||||
|
|
Loading…
Reference in New Issue