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" #include "Periphery.h"
Periphery::Periphery() : Periphery::Periphery() :
@ -11,16 +5,20 @@ Periphery::Periphery() :
_digitalIO(), _digitalIO(),
_zone6_ptr(reinterpret_cast<Uint16*>(0x100000)), _zone6_ptr(reinterpret_cast<Uint16*>(0x100000)),
_scib(ScibRegs), _scib(ScibRegs),
_modbusSetup(), // _modbusSetup(),
_modbusConfiguration(), // _modbusConfiguration(),
_crc(), // _crc(),
_intervalMeasure(CpuTimer2), // _intervalMeasure(CpuTimer2),
_modbusPort(_scib, _intervalMeasure, _crc), // _modbusPort(_scib, _intervalMeasure, _crc),
_ASUTP(_crc), // _ASUTP(_crc),
_modbusRTU(CpuTimer2, _scib),
_modbusInitFlag(false) _modbusInitFlag(false)
{ {
_softVersion.DSP = 202; _softVersion.DSP = 202;
_softVersion.CPLD = 0; _softVersion.CPLD = 0;
elementCounter = 0;
test = 0;
} }
@ -32,8 +30,8 @@ void Periphery::config(){
// Data Frame MBOX // Data Frame MBOX
_canb.configRxMBox(canSpace::MODBUS_SETTINGS_MBOX, canSpace::MsgID(0x0), canSpace::MsgCtrlReg(0x6)); // Modbus settings _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.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(0x6)); // Receive Modbus data from 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.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 _canb.configRxMBox(canSpace::DIGITAL_OUTPUT_MBOX, canSpace::MsgID(0x31), canSpace::MsgCtrlReg(0x2)); // Send DO
@ -66,14 +64,14 @@ void Periphery::config(){
//------------------------------------------Init Modbus---------------------------------------------------------- //------------------------------------------Init Modbus----------------------------------------------------------
_modbusSetup.gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup; // _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_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set;
_modbusSetup.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear; // _modbusSetup.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear;
_intervalMeasure.reset(); // _intervalMeasure.reset();
_intervalMeasure.set_magic(19); // _intervalMeasure.set_magic(19);
_modbusPort.setup(_modbusSetup); // _modbusPort.setup(_modbusSetup);
// modbus_port_configuration.node_id = 0x5; // modbus_port_configuration.node_id = 0x5;
// modbus_port_configuration.config.baudrate = DSP28335::BR9600; // 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.rxStack, sizeof(hmi.rxStack)/sizeof(uint16_t));
// clear_array((uint16_t *)hmi.txStack, sizeof(hmi.txStack)/sizeof(uint16_t)); // clear_array((uint16_t *)hmi.txStack, sizeof(hmi.txStack)/sizeof(uint16_t));
_modbusPort.setRXBuffer((uint16_t*)_ASUTP.rxStack, &_ASUTP.rxLength); // _modbusPort.setRXBuffer((uint16_t*)_ASUTP.rxStack, &_ASUTP.rxLength);
_modbusPort.setTXBuffer((uint16_t*)_ASUTP.txStack, &_ASUTP.txLength); // _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 if (!_modbusInitFlag && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) { // TODO check for init is incorect here maybe
_canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _message); _canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _message);
_modbusConfiguration.node_id = _message.mdl.byte.BYTE0; // _modbusConfiguration.node_id = _message.mdl.byte.BYTE0;
_modbusConfiguration.config.lenght = static_cast<DSP28335::SCICharLenght>(_message.mdl.byte.BYTE1); // _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.baudrate = static_cast<DSP28335::SCIBaudRate>(_message.mdl.word.LOW_WORD);
_modbusConfiguration.config.parity = static_cast<DSP28335::SCIParity>(_message.mdh.byte.BYTE4); // _modbusConfiguration.config.parity = static_cast<DSP28335::SCIParity>(_message.mdh.byte.BYTE4);
_modbusConfiguration.config.stopbits = static_cast<DSP28335::SCIStopBits>(_message.mdh.byte.BYTE5); // _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 _modbusInitFlag = true; // TODO modbus init function must be here
} }
} }
void Periphery::test_init_hmi_buffers() void Periphery::processExternalModbus(){
{ if(_modbusRTU._dataHandler.inputRegisters.address_range(elementCounter + _modbusRTU.inputRegStartAddr)){
// _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdl.all);
// hmi writeable registers elementCounter++;
_ASUTP.inputRegisters.set(WEINBUS::INPUTREGISTERS, 400); }
_ASUTP.inputRegisters.add( 0, &test_hmi_float_reg_400.f); else {
_ASUTP.inputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f); elementCounter = 0;
_ASUTP.inputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f); _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdl.all);
_ASUTP.inputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f); elementCounter++;
_ASUTP.inputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f); }
//
// hmi readable registers if(_modbusRTU._dataHandler.inputRegisters.address_range(elementCounter + _modbusRTU.inputRegStartAddr)){
_ASUTP.outputRegisters.set(WEINBUS::OUTPUTREGISTERS, 400); _modbusRTU._dataHandler.inputRegisters.get_register_cursor(elementCounter).read(_message.mdh.all);
_ASUTP.outputRegisters.add( 0 , &(float&)test_hmi_float_reg_400.f); elementCounter++;
_ASUTP.outputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f); }
_ASUTP.outputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f); else {
_ASUTP.outputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f); elementCounter = 0;
_ASUTP.outputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f); _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){ // void Periphery::addInputRegFloat(uint16_t addr, float& param){
// // if(_ASUTP.inputRegisters.address_range(addr)){ // // if(_ASUTP.inputRegisters.address_range(addr)){

@ -1,5 +1,6 @@
#pragma once #pragma once
// #include <cstdint>
#include <stdint.h> #include <stdint.h>
#include "DSP28x_Project.h" #include "DSP28x_Project.h"
@ -12,15 +13,17 @@
#include "DSP28335/SCIBase.h" #include "DSP28335/SCIBase.h"
#include "DSP28335/SCIB.h" #include "DSP28335/SCIB.h"
#include "MODBUSRTU/ModbusRTUCRC.h" // #include "MODBUSRTU/ModbusRTUCRC.h"
#include "MODBUSRTU/ModbusRTUDefines.h" // #include "MODBUSRTU/ModbusRTUDefines.h"
#include "MODBUSRTU/ModbusRTUTransceiver.h" // #include "MODBUSRTU/ModbusRTUTransceiver.h"
#include "MODBUSRTU/ModbusRTUVariant.h" // #include "MODBUSRTU/ModbusRTUVariant.h"
#include "MODBUSRTU/ModbusRTUTransceiverBase.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{ struct SoftwareVersion{
@ -42,10 +45,12 @@ public:
void receiveModbusParameters(); void receiveModbusParameters();
void processExternalModbus(); // TODO void processExternalModbus(); // TODO
void processCPUModbus(); // TODO void processCPUModbus(); // TODO
void test_init_hmi_buffers(); // void test_init_hmi_buffers();
void setModbusBuffers(); // void setModbusBuffers();
void addInputRegFloat(uint16_t addr, float& param); // void addInputRegFloat(uint16_t addr, float& param);
void modbusExecute(); // void modbusExecute();
MODBUSRTU::ModbusRTU _modbusRTU;
private: private:
canSpace::CAN _canb; canSpace::CAN _canb;
@ -54,13 +59,13 @@ private:
DSP28335::SCIB _scib; DSP28335::SCIB _scib;
MODBUSRTU::ModbusRTUTransceiverSetup _modbusSetup; // MODBUSRTU::ModbusRTUTransceiverSetup _modbusSetup;
MODBUSRTU::ModbusRTUTransceiverConfiguration _modbusConfiguration; // MODBUSRTU::ModbusRTUTransceiverConfiguration _modbusConfiguration;
MODBUSRTU::ModbusRTUCRC _crc; // MODBUSRTU::ModbusRTUCRC _crc;
DSP28335::MeasureTimeInterval _intervalMeasure; // DSP28335::MeasureTimeInterval _intervalMeasure;
MODBUSRTU::ModbusRTUTransceiver _modbusPort; // MODBUSRTU::ModbusRTUTransceiver _modbusPort;
WEINBUS::WeinbusSlave _ASUTP; // WEINBUS::WeinbusSlave _ASUTP;
SoftwareVersion _softVersion; SoftwareVersion _softVersion;
canSpace::CANMessage _message; canSpace::CANMessage _message;
@ -68,14 +73,16 @@ private:
Uint16 tempIn; Uint16 tempIn;
Uint16 tempOut; Uint16 tempOut;
uint16_t elementCounter;
// Registers to testing HMI interface uint32_t test;
WEINBUS::REGISTER_32 test_hmi_float_reg_400;
WEINBUS::REGISTER_32 test_hmi_float_reg_401; // // Registers to testing HMI interface
WEINBUS::REGISTER_32 test_hmi_float_reg_402; // WEINBUS::REGISTER_32 test_hmi_float_reg_400;
WEINBUS::REGISTER_32 test_hmi_float_reg_403; // WEINBUS::REGISTER_32 test_hmi_float_reg_401;
WEINBUS::REGISTER_32 test_hmi_float_reg_404; // 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; PieCtrlRegs.PIEIER9.bit.INTx8 = 1;
periphery.config(); periphery.config();
periphery._modbusRTU.test_init_hmi_buffers();
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// SCIbSetup.config.baudrate = SCIB_BAUDRATE_DEFAULT; // SCIbSetup.config.baudrate = SCIB_BAUDRATE_DEFAULT;
@ -154,7 +155,7 @@ void main()
// modbus_port_configuration.config.lenght = DSP28335::LEN8; // modbus_port_configuration.config.lenght = DSP28335::LEN8;
// //
// test_init_hmi_buffers(); // test_init_hmi_buffers();
periphery.test_init_hmi_buffers(); // periphery.test_init_hmi_buffers();
// modbus_port.configure(modbus_port_configuration); // modbus_port.configure(modbus_port_configuration);
@ -163,8 +164,8 @@ void main()
// modbus_port.setRXBuffer((uint16_t*)hmi.rxStack, &hmi.rxLength); // modbus_port.setRXBuffer((uint16_t*)hmi.rxStack, &hmi.rxLength);
// modbus_port.setTXBuffer((uint16_t*)hmi.txStack, &hmi.txLength); // modbus_port.setTXBuffer((uint16_t*)hmi.txStack, &hmi.txLength);
periphery.setModbusBuffers(); // periphery.setModbusBuffers();
periphery.addInputRegFloat(5, test); // periphery.addInputRegFloat(5, test);
// interval_measure.set_magic(19); // interval_measure.set_magic(19);
@ -194,7 +195,8 @@ void idle_loop()
// MODBUS RTU HMI Service // MODBUS RTU HMI Service
// //
if (periphery.isModbusInit()){ if (periphery.isModbusInit()){
periphery.modbusExecute(); periphery._modbusRTU.execute();
// periphery.modbusExecute();
// if(modbus_port.compare_state(MODBUSRTU::BREAK)) // if(modbus_port.compare_state(MODBUSRTU::BREAK))
// { // {
// modbus_port.port_reset(); // modbus_port.port_reset();
@ -216,6 +218,7 @@ void idle_loop()
interrupt void cpu_timer0_isr(void) interrupt void cpu_timer0_isr(void)
{ {
periphery.processDigitalOutput(); periphery.processDigitalOutput();
periphery.processExternalModbus();
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}//end }//end

Loading…
Cancel
Save