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