From da91f4010bc2af00eed0d2f8471a4c916925214b Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 13 May 2025 16:58:17 +0300 Subject: [PATCH] Fix comm-cpu and cpu-comm communication problems COMM-CPU 1. Expand read method for any data types 2. Change intrnal counter behaviour CPU-COMM 1. Add check for address existance in table before message processing 2. Change getting table register method for get_register_address(). Now it's slow but works --- Periphery.cpp | 46 ++++++++++++++++++++++++++++++++------------- Protocol/CAN_data.h | 1 - 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/Periphery.cpp b/Periphery.cpp index da14d34..92efd66 100644 --- a/Periphery.cpp +++ b/Periphery.cpp @@ -169,24 +169,43 @@ void Periphery::processDigitalOutput(){ #pragma CODE_SECTION("ramfuncs"); void Periphery::sendModbusDataToCPU(){ - _message.mdl.all = 0; // TODO delete maybe? - _message.mdh.all = 0; - WEINBUS::WeinbusTableRegister reg; reg = modbusRTU.dataHandler.outputRegisters.get_register_cursor(_modbusRegCounter); - if(modbusRTU.dataHandler.outputRegisters.address_range(reg.get_address())){ - _message.mdl.all = reg.get_address(); - reg.read(_message.mdh.all); + _message.mdl.all = reg.get_address(); + switch(reg.get_type()){ + case WEINBUS::DATA_UINT16: + { + reg.read(reinterpret_cast(_message.mdh.all)); + break; + } + case WEINBUS::DATA_INT16: + { + reg.read(reinterpret_cast(_message.mdh.all)); + break; + } + case WEINBUS::DATA_UINT32: + { + reg.read(reinterpret_cast(_message.mdh.all)); + break; + } + case WEINBUS::DATA_INT32: + { + reg.read(reinterpret_cast(_message.mdh.all)); + break; + } + case WEINBUS::DATA_FLOAT: + { + reg.read(reinterpret_cast(_message.mdh.all)); + break; + } + default:{} } - else { - _modbusRegCounter = 0; - reg = modbusRTU.dataHandler.outputRegisters.get_register_cursor(_modbusRegCounter); - _message.mdl.all = reg.get_address(); - reg.read(_message.mdh.all); - } _modbusRegCounter++; + if (_modbusRegCounter >= modbusRTU.dataHandler.outputRegisters.get_quantity()){ + _modbusRegCounter = 0; + } _cana.transmitMsg(can_space::MODBUS_DATA_COMM_TO_CPU_MBOX, _message); } @@ -200,7 +219,8 @@ void Periphery::receiveCpuModbusData(){ WEINBUS::WeinbusTableRegister reg; uint32_t addr = _message.mdl.all; - reg = modbusRTU.dataHandler.inputRegisters.get_register_cursor(addr - modbusRTU.dataHandler.inputRegisters.get_start_address()); + if(modbusRTU.dataHandler.inputRegisters.is_address_exists(addr)) return; + reg = modbusRTU.dataHandler.inputRegisters.get_register_address(addr); reg.write_data(_message.mdh.all); } } diff --git a/Protocol/CAN_data.h b/Protocol/CAN_data.h index c2f5d08..03b5e60 100644 --- a/Protocol/CAN_data.h +++ b/Protocol/CAN_data.h @@ -22,7 +22,6 @@ enum CAN_VARIANT{ }; enum configFlags{ - NONE = 0, MSB_ENABLE = 1u << 0, STM_ENABLE = 1u << 1 };