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.
feature/Modbus
Oleg 3 weeks ago
parent 46d4b79e90
commit 06518a828d

@ -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<Uint16*>(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<DSP28335::SCICharLenght>(_message.mdl.byte.BYTE1);
_modbusConfiguration.config.baudrate = static_cast<DSP28335::SCIBaudRate>(_message.mdl.word.LOW_WORD);
_modbusConfiguration.config.parity = static_cast<DSP28335::SCIParity>(_message.mdh.byte.BYTE4);
_modbusConfiguration.config.stopbits = static_cast<DSP28335::SCIStopBits>(_message.mdh.byte.BYTE5);
// _modbusConfiguration.node_id = _message.mdl.byte.BYTE0;
// _modbusConfiguration.config.lenght = static_cast<DSP28335::SCICharLenght>(_message.mdl.byte.BYTE1);
// _modbusConfiguration.config.baudrate = static_cast<DSP28335::SCIBaudRate>(_message.mdl.word.LOW_WORD);
// _modbusConfiguration.config.parity = static_cast<DSP28335::SCIParity>(_message.mdh.byte.BYTE4);
// _modbusConfiguration.config.stopbits = static_cast<DSP28335::SCIStopBits>(_message.mdh.byte.BYTE5);
// _modbusPort.configure(_modbusConfiguration);
MODBUSRTU::modbusConfiguration.node_id = _message.mdl.byte.BYTE0;
MODBUSRTU::modbusConfiguration.config.lenght = static_cast<DSP28335::SCICharLenght>(_message.mdl.byte.BYTE1);
MODBUSRTU::modbusConfiguration.config.baudrate = static_cast<DSP28335::SCIBaudRate>(_message.mdl.word.LOW_WORD);
MODBUSRTU::modbusConfiguration.config.parity = static_cast<DSP28335::SCIParity>(_message.mdh.byte.BYTE4);
MODBUSRTU::modbusConfiguration.config.stopbits = static_cast<DSP28335::SCIStopBits>(_message.mdh.byte.BYTE5);
_modbusPort.configure(_modbusConfiguration);
_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)){

@ -1,5 +1,6 @@
#pragma once
// #include <cstdint>
#include <stdint.h>
#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;
// //<>
};

@ -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

Loading…
Cancel
Save