From 06518a828df01e7e70826440d1b7ce22bfb181d5 Mon Sep 17 00:00:00 2001 From: Oleg Date: Mon, 31 Mar 2025 11:18:17 +0300 Subject: [PATCH] Add modbus lib instead of original one 1. All modbus classes are united in one (modbusRTU) class with easier and clearier user interface 2. Temp variable for registers start address are created (should be replaced for some getter function later) 3. 2 modbus register are sending in one message now without its address. This requires some synchronization to be implemented 4. There is a lot of garbage from previous modbus here. --- Periphery.cpp | 131 ++++++++++++++++++++++++++++++++------------------ Periphery.h | 57 ++++++++++++---------- main2.cpp | 11 +++-- 3 files changed, 122 insertions(+), 77 deletions(-) diff --git a/Periphery.cpp b/Periphery.cpp index 759c1e3..e8dec12 100644 --- a/Periphery.cpp +++ b/Periphery.cpp @@ -1,9 +1,3 @@ -#include "DSP2833x_Device.h" -#include "DSP28x_Project.h" -#include "Protocol/CAN.h" -#include "Protocol/CAN_data.h" -#include "Protocol/DigitalIO.h" -#include "Protocol/MemoryMap.h" #include "Periphery.h" Periphery::Periphery() : @@ -11,16 +5,20 @@ Periphery::Periphery() : _digitalIO(), _zone6_ptr(reinterpret_cast(0x100000)), _scib(ScibRegs), - _modbusSetup(), - _modbusConfiguration(), - _crc(), - _intervalMeasure(CpuTimer2), - _modbusPort(_scib, _intervalMeasure, _crc), - _ASUTP(_crc), + // _modbusSetup(), + // _modbusConfiguration(), + // _crc(), + // _intervalMeasure(CpuTimer2), + // _modbusPort(_scib, _intervalMeasure, _crc), + // _ASUTP(_crc), + _modbusRTU(CpuTimer2, _scib), _modbusInitFlag(false) { _softVersion.DSP = 202; _softVersion.CPLD = 0; + + elementCounter = 0; + test = 0; } @@ -32,8 +30,8 @@ void Periphery::config(){ // Data Frame MBOX _canb.configRxMBox(canSpace::MODBUS_SETTINGS_MBOX, canSpace::MsgID(0x0), canSpace::MsgCtrlReg(0x6)); // Modbus settings - // _canb.configTxMBox(canSpace::MODBUS_DATA_COMM_TO_CPU_MBOX, canSpace::MsgID(0x29), canSpace::MsgCtrlReg(0x26)); // Send Modbus data to CPU - // _canb.configRxMBox(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX, canSpace::MsgID(0x28), canSpace::MsgCtrlReg(0x6)); // Receive Modbus data from CPU + _canb.configTxMBox(canSpace::MODBUS_DATA_COMM_TO_CPU_MBOX, canSpace::MsgID(0x29), canSpace::MsgCtrlReg(0x28)); // Send Modbus data to CPU + // _canb.configRxMBox(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX, canSpace::MsgID(0x28), canSpace::MsgCtrlReg(0x8)); // Receive Modbus data from CPU _canb.configTxMBox(canSpace::DIGITAL_INPUT_MBOX, canSpace::MsgID(0x30), canSpace::MsgCtrlReg(0x2)); // Receive DI _canb.configRxMBox(canSpace::DIGITAL_OUTPUT_MBOX, canSpace::MsgID(0x31), canSpace::MsgCtrlReg(0x2)); // Send DO @@ -66,14 +64,14 @@ void Periphery::config(){ //------------------------------------------Init Modbus---------------------------------------------------------- - _modbusSetup.gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup; - _modbusSetup.gpio_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set; - _modbusSetup.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear; + // _modbusSetup.gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup; + // _modbusSetup.gpio_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set; + // _modbusSetup.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear; - _intervalMeasure.reset(); - _intervalMeasure.set_magic(19); + // _intervalMeasure.reset(); + // _intervalMeasure.set_magic(19); - _modbusPort.setup(_modbusSetup); + // _modbusPort.setup(_modbusSetup); // modbus_port_configuration.node_id = 0x5; // modbus_port_configuration.config.baudrate = DSP28335::BR9600; @@ -86,9 +84,13 @@ void Periphery::config(){ // clear_array((uint16_t *)hmi.rxStack, sizeof(hmi.rxStack)/sizeof(uint16_t)); // clear_array((uint16_t *)hmi.txStack, sizeof(hmi.txStack)/sizeof(uint16_t)); - _modbusPort.setRXBuffer((uint16_t*)_ASUTP.rxStack, &_ASUTP.rxLength); - _modbusPort.setTXBuffer((uint16_t*)_ASUTP.txStack, &_ASUTP.txLength); + // _modbusPort.setRXBuffer((uint16_t*)_ASUTP.rxStack, &_ASUTP.rxLength); + // _modbusPort.setTXBuffer((uint16_t*)_ASUTP.txStack, &_ASUTP.txLength); + MODBUSRTU::modbusSetup.gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup; + MODBUSRTU::modbusSetup.gpio_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set; + MODBUSRTU::modbusSetup.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear; + _modbusRTU.setup(MODBUSRTU::modbusSetup); } @@ -132,39 +134,72 @@ void Periphery::receiveModbusParameters(){ if (!_modbusInitFlag && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) { // TODO check for init is incorect here maybe _canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _message); - _modbusConfiguration.node_id = _message.mdl.byte.BYTE0; - _modbusConfiguration.config.lenght = static_cast(_message.mdl.byte.BYTE1); - _modbusConfiguration.config.baudrate = static_cast(_message.mdl.word.LOW_WORD); - _modbusConfiguration.config.parity = static_cast(_message.mdh.byte.BYTE4); - _modbusConfiguration.config.stopbits = static_cast(_message.mdh.byte.BYTE5); + // _modbusConfiguration.node_id = _message.mdl.byte.BYTE0; + // _modbusConfiguration.config.lenght = static_cast(_message.mdl.byte.BYTE1); + // _modbusConfiguration.config.baudrate = static_cast(_message.mdl.word.LOW_WORD); + // _modbusConfiguration.config.parity = static_cast(_message.mdh.byte.BYTE4); + // _modbusConfiguration.config.stopbits = static_cast(_message.mdh.byte.BYTE5); + + // _modbusPort.configure(_modbusConfiguration); - _modbusPort.configure(_modbusConfiguration); + MODBUSRTU::modbusConfiguration.node_id = _message.mdl.byte.BYTE0; + MODBUSRTU::modbusConfiguration.config.lenght = static_cast(_message.mdl.byte.BYTE1); + MODBUSRTU::modbusConfiguration.config.baudrate = static_cast(_message.mdl.word.LOW_WORD); + MODBUSRTU::modbusConfiguration.config.parity = static_cast(_message.mdh.byte.BYTE4); + MODBUSRTU::modbusConfiguration.config.stopbits = static_cast(_message.mdh.byte.BYTE5); + + _modbusRTU.configure(MODBUSRTU::modbusConfiguration); _modbusInitFlag = true; // TODO modbus init function must be here } } -void Periphery::test_init_hmi_buffers() -{ - // - // hmi writeable registers - _ASUTP.inputRegisters.set(WEINBUS::INPUTREGISTERS, 400); - _ASUTP.inputRegisters.add( 0, &test_hmi_float_reg_400.f); - _ASUTP.inputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f); - _ASUTP.inputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f); - _ASUTP.inputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f); - _ASUTP.inputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f); - // - // hmi readable registers - _ASUTP.outputRegisters.set(WEINBUS::OUTPUTREGISTERS, 400); - _ASUTP.outputRegisters.add( 0 , &(float&)test_hmi_float_reg_400.f); - _ASUTP.outputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f); - _ASUTP.outputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f); - _ASUTP.outputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f); - _ASUTP.outputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f); - // -}// +void Periphery::processExternalModbus(){ + if(_modbusRTU._dataHandler.inputRegisters.address_range(elementCounter + _modbusRTU.inputRegStartAddr)){ + _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdl.all); + elementCounter++; + } + else { + elementCounter = 0; + _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdl.all); + elementCounter++; + } + + if(_modbusRTU._dataHandler.inputRegisters.address_range(elementCounter + _modbusRTU.inputRegStartAddr)){ + _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdh.all); + elementCounter++; + } + else { + elementCounter = 0; + _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdh.all); + elementCounter++; + } + + _canb.transmitMsg(canSpace::MODBUS_DATA_COMM_TO_CPU_MBOX, _message); +} + + +// void Periphery::test_init_hmi_buffers() +// { +// // +// // hmi writeable registers +// _ASUTP.inputRegisters.set(WEINBUS::INPUTREGISTERS, 400); +// _ASUTP.inputRegisters.add( 0, &test_hmi_float_reg_400.f); +// _ASUTP.inputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f); +// _ASUTP.inputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f); +// _ASUTP.inputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f); +// _ASUTP.inputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f); +// // +// // hmi readable registers +// _ASUTP.outputRegisters.set(WEINBUS::OUTPUTREGISTERS, 400); +// _ASUTP.outputRegisters.add( 0 , &(float&)test_hmi_float_reg_400.f); +// _ASUTP.outputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f); +// _ASUTP.outputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f); +// _ASUTP.outputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f); +// _ASUTP.outputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f); +// // +// }// // void Periphery::addInputRegFloat(uint16_t addr, float& param){ // // if(_ASUTP.inputRegisters.address_range(addr)){ diff --git a/Periphery.h b/Periphery.h index 738bb46..437fe1b 100644 --- a/Periphery.h +++ b/Periphery.h @@ -1,5 +1,6 @@ #pragma once +// #include #include #include "DSP28x_Project.h" @@ -12,15 +13,17 @@ #include "DSP28335/SCIBase.h" #include "DSP28335/SCIB.h" -#include "MODBUSRTU/ModbusRTUCRC.h" -#include "MODBUSRTU/ModbusRTUDefines.h" -#include "MODBUSRTU/ModbusRTUTransceiver.h" -#include "MODBUSRTU/ModbusRTUVariant.h" -#include "MODBUSRTU/ModbusRTUTransceiverBase.h" +// #include "MODBUSRTU/ModbusRTUCRC.h" +// #include "MODBUSRTU/ModbusRTUDefines.h" +// #include "MODBUSRTU/ModbusRTUTransceiver.h" +// #include "MODBUSRTU/ModbusRTUVariant.h" +// #include "MODBUSRTU/ModbusRTUTransceiverBase.h" -#include "DSP28335/MeasureTimeInterval.h" +// #include "DSP28335/MeasureTimeInterval.h" -#include "WEINBUS/HeaderWeinbus.h" +// #include "WEINBUS/HeaderWeinbus.h" + +#include "ModbusRTU.h" struct SoftwareVersion{ @@ -42,10 +45,12 @@ public: void receiveModbusParameters(); void processExternalModbus(); // TODO void processCPUModbus(); // TODO - void test_init_hmi_buffers(); - void setModbusBuffers(); - void addInputRegFloat(uint16_t addr, float& param); - void modbusExecute(); + // void test_init_hmi_buffers(); + // void setModbusBuffers(); + // void addInputRegFloat(uint16_t addr, float& param); + // void modbusExecute(); + + MODBUSRTU::ModbusRTU _modbusRTU; private: canSpace::CAN _canb; @@ -54,13 +59,13 @@ private: DSP28335::SCIB _scib; - MODBUSRTU::ModbusRTUTransceiverSetup _modbusSetup; - MODBUSRTU::ModbusRTUTransceiverConfiguration _modbusConfiguration; - MODBUSRTU::ModbusRTUCRC _crc; - DSP28335::MeasureTimeInterval _intervalMeasure; - MODBUSRTU::ModbusRTUTransceiver _modbusPort; + // MODBUSRTU::ModbusRTUTransceiverSetup _modbusSetup; + // MODBUSRTU::ModbusRTUTransceiverConfiguration _modbusConfiguration; + // MODBUSRTU::ModbusRTUCRC _crc; + // DSP28335::MeasureTimeInterval _intervalMeasure; + // MODBUSRTU::ModbusRTUTransceiver _modbusPort; - WEINBUS::WeinbusSlave _ASUTP; + // WEINBUS::WeinbusSlave _ASUTP; SoftwareVersion _softVersion; canSpace::CANMessage _message; @@ -68,14 +73,16 @@ private: Uint16 tempIn; Uint16 tempOut; - - // Registers to testing HMI interface - WEINBUS::REGISTER_32 test_hmi_float_reg_400; - WEINBUS::REGISTER_32 test_hmi_float_reg_401; - WEINBUS::REGISTER_32 test_hmi_float_reg_402; - WEINBUS::REGISTER_32 test_hmi_float_reg_403; - WEINBUS::REGISTER_32 test_hmi_float_reg_404; - //<> + uint16_t elementCounter; + uint32_t test; + + // // Registers to testing HMI interface + // WEINBUS::REGISTER_32 test_hmi_float_reg_400; + // WEINBUS::REGISTER_32 test_hmi_float_reg_401; + // WEINBUS::REGISTER_32 test_hmi_float_reg_402; + // WEINBUS::REGISTER_32 test_hmi_float_reg_403; + // WEINBUS::REGISTER_32 test_hmi_float_reg_404; + // //<> }; diff --git a/main2.cpp b/main2.cpp index 08667f4..0807f28 100644 --- a/main2.cpp +++ b/main2.cpp @@ -117,6 +117,7 @@ void main() PieCtrlRegs.PIEIER9.bit.INTx8 = 1; periphery.config(); + periphery._modbusRTU.test_init_hmi_buffers(); //---------------------------------------------------------------------------------------- // SCIbSetup.config.baudrate = SCIB_BAUDRATE_DEFAULT; @@ -154,7 +155,7 @@ void main() // modbus_port_configuration.config.lenght = DSP28335::LEN8; // // test_init_hmi_buffers(); - periphery.test_init_hmi_buffers(); + // periphery.test_init_hmi_buffers(); // modbus_port.configure(modbus_port_configuration); @@ -163,8 +164,8 @@ void main() // modbus_port.setRXBuffer((uint16_t*)hmi.rxStack, &hmi.rxLength); // modbus_port.setTXBuffer((uint16_t*)hmi.txStack, &hmi.txLength); - periphery.setModbusBuffers(); - periphery.addInputRegFloat(5, test); + // periphery.setModbusBuffers(); + // periphery.addInputRegFloat(5, test); // interval_measure.set_magic(19); @@ -194,7 +195,8 @@ void idle_loop() // MODBUS RTU HMI Service // if (periphery.isModbusInit()){ - periphery.modbusExecute(); + periphery._modbusRTU.execute(); + // periphery.modbusExecute(); // if(modbus_port.compare_state(MODBUSRTU::BREAK)) // { // modbus_port.port_reset(); @@ -216,6 +218,7 @@ void idle_loop() interrupt void cpu_timer0_isr(void) { periphery.processDigitalOutput(); + periphery.processExternalModbus(); PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; }//end