Провёл серию экспериментов и выяснил, что некорректно работает на версии ядра 2.5.1 и 2.5.2. На остальных нормально.Sancho писал(а): 16 ноя 2019, 23:25 [ref]andy[/ref],[ref]dekorator[/ref], и все желаающие.
Есть мысли, касательно ядер, новых, для 8266 и их работы с модбас tcp.
Огромная просьба для теста:
установить последнюю версию ядра для esp8266;
в сгенерированном коде найти функцию и заменить на:
[spoiler][/spoiler]Код: Выделить всё
void _modbusSlaveSendTxBuffer() { if(_modbusSlaveBuffer[0] == 0) {_modbusSlaveTCPClient.stop();return;} _modbusSlaveMBAPBuffer[4] = highByte(_modbusSlaveBufferSize); _modbusSlaveMBAPBuffer[5] = lowByte(_modbusSlaveBufferSize); _modbusSlaveTCPClient.write(_modbusSlaveMBAPBuffer, 6); _modbusSlaveTCPClient.write(_modbusSlaveBuffer, _modbusSlaveBufferSize); _modbusSlaveBufferSize = 0; }
Отписаться о результатах.
Если на неработающем варианте (ядро 2.5.1 или 2.5.2) в скетче заменить код:
[spoiler]void _modbusSlaveSendTxBuffer()
{
if(_modbusSlaveBuffer[0] == 0) {_modbusSlaveTCPClient.stop();return;}
String stringBuffer = "";
_modbusSlaveMBAPBuffer[4] = highByte(_modbusSlaveBufferSize);
_modbusSlaveMBAPBuffer[5] = lowByte(_modbusSlaveBufferSize);
for (int i=0; i <6; i++){stringBuffer.concat(char( _modbusSlaveMBAPBuffer ));}
for (int i=0; i <_modbusSlaveBufferSize; i++){stringBuffer.concat(char( _modbusSlaveBuffer));}
_modbusSlaveTCPClient.print(stringBuffer);
_modbusSlaveBufferSize = 0;
}[/spoiler]
на предложенный [ref]Sancho [/ref]:
[spoiler]void _modbusSlaveSendTxBuffer()
{
if(_modbusSlaveBuffer[0] == 0) {_modbusSlaveTCPClient.stop();return;}
_modbusSlaveMBAPBuffer[4] = highByte(_modbusSlaveBufferSize);
_modbusSlaveMBAPBuffer[5] = lowByte(_modbusSlaveBufferSize);
_modbusSlaveTCPClient.write(_modbusSlaveMBAPBuffer, 6);
_modbusSlaveTCPClient.write(_modbusSlaveBuffer, _modbusSlaveBufferSize);
_modbusSlaveBufferSize = 0;
}[/spoiler], то обмен по modbus TCP работает нормально.