Add modbus.

Init with CPU data. If COMM is removed and then installed back -
modbus will not work because CPU board will not send config data.
CPU board should detect reinstalling/reprogramming of COMM board and
send config data again (with asking software version)

Modbus here just work itself. There is no connection btw COMM and CPU
except sending config data
feature/Modbus
Oleg 3 weeks ago
parent 4606a25db4
commit 46d4b79e90

@ -34,10 +34,10 @@ struct SCIConfiguration
DSP28335::SCIStopBits stopbits;
DSP28335::SCICharLenght lenght;
SCIConfiguration():
baudrate(DSP28335::BR9600),
baudrate(DSP28335::BR19200),
parity(DSP28335::ODD),
stopbits(DSP28335::ONE),
lenght(DSP28335::LEN8)
lenght(DSP28335::LEN1)
{}
};//
@ -46,10 +46,10 @@ struct SCISetup
{
SCIConfiguration config;
pGPIO_FUNCTION gpio_setup;
SCISetup():
config(),
gpio_setup(0)
{}
// SCISetup():
// config(),
// gpio_setup(0)
// {}
};//

@ -50,7 +50,7 @@ struct ModbusRTUTransceiverConfiguration
uint16_t node_id;
DSP28335::SCIConfiguration config;
ModbusRTUTransceiverConfiguration():
node_id(0),
node_id(1234),
config()
{
//config.baudrate = SCIRS485_BAUDRATE_DEFAULT;

@ -10,8 +10,14 @@ Periphery::Periphery() :
_canb(canSpace::CANA),
_digitalIO(),
_zone6_ptr(reinterpret_cast<Uint16*>(0x100000)),
_modbusSettingsMsg(),
_modbusInit(false)
_scib(ScibRegs),
_modbusSetup(),
_modbusConfiguration(),
_crc(),
_intervalMeasure(CpuTimer2),
_modbusPort(_scib, _intervalMeasure, _crc),
_ASUTP(_crc),
_modbusInitFlag(false)
{
_softVersion.DSP = 202;
_softVersion.CPLD = 0;
@ -47,6 +53,42 @@ void Periphery::config(){
_digitalIO.setup(_zone6_ptr);
_digitalIO.setMemoryOffset(interface::DISCRETE_DATA_OFFSET);
//---------------------------------------Init SCI interface----------------------------------------------------------
DSP28335::SCISetup sciBSetup;
sciBSetup.config.baudrate = SCIB_BAUDRATE_DEFAULT;
sciBSetup.config.parity = SCIB_PARITY_DEFAULT;
sciBSetup.config.stopbits = SCIB_STOPBITS_DEFAULT;
sciBSetup.config.lenght = SCIB_LENGHT_DEFAULT;
sciBSetup.gpio_setup = SCIB_GPIO_SETUP_DEFAULT;
_scib.setup(sciBSetup);
//------------------------------------------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;
_intervalMeasure.reset();
_intervalMeasure.set_magic(19);
_modbusPort.setup(_modbusSetup);
// modbus_port_configuration.node_id = 0x5;
// modbus_port_configuration.config.baudrate = DSP28335::BR9600;
// modbus_port_configuration.config.parity = DSP28335::NO;
// modbus_port_configuration.config.stopbits = DSP28335::ONE;
// modbus_port_configuration.config.lenght = DSP28335::LEN8;
// modbus_port.configure(modbus_port_configuration);
// 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);
}
@ -58,7 +100,7 @@ Uint16 Periphery::getVersionFPGA(){
void Periphery::updateVersionFPGA(){
_softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023 (9.9.9) should be limit
_softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023. (9.9.9) should be limit
_message.mdl.word.LOW_WORD = _softVersion.DSP;
_message.mdl.word.HI_WORD = _softVersion.CPLD;
_canb.updateTXMessage(canSpace::COMM_VERSION_MBOX, _message);
@ -81,9 +123,73 @@ void Periphery::processDigitalOutput(){
}
void Periphery::initExternalModbus(){
if (!_modbusInit && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) {
_canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _modbusSettingsMsg);
_modbusInit = true; // TODO modbus init function must be here
bool Periphery::isModbusInit() const{
return _modbusInitFlag;
}
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);
_modbusPort.configure(_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::addInputRegFloat(uint16_t addr, float& param){
// // if(_ASUTP.inputRegisters.address_range(addr)){
// // return;
// // }
// _ASUTP.inputRegisters.add( addr, &param);
// _ASUTP.outputRegisters.add( addr, &param);
// }
// void Periphery::modbusExecute(){
// if(_modbusPort.compare_state(MODBUSRTU::BREAK))
// {
// _modbusPort.port_reset();
// //
// }
// else
// {
// _modbusPort.execute();
// _ASUTP.execute();
// //
// }//if else
// }
// void Periphery::setModbusBuffers(){
// _modbusPort.setRXBuffer((uint16_t*)_ASUTP.rxStack, &_ASUTP.rxLength);
// _modbusPort.setTXBuffer((uint16_t*)_ASUTP.txStack, &_ASUTP.txLength);
// }

@ -1,5 +1,7 @@
#pragma once
#include <stdint.h>
#include "DSP28x_Project.h"
#include "DSP2833x_Device.h"
#include "Protocol/CAN.h"
@ -7,6 +9,19 @@
#include "Protocol/DigitalIO.h"
#include "Protocol/MemoryMap.h"
#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 "DSP28335/MeasureTimeInterval.h"
#include "WEINBUS/HeaderWeinbus.h"
struct SoftwareVersion{
Uint16 DSP;
@ -19,22 +34,49 @@ public:
void config();
Uint16 getVersionFPGA();
void updateVersionFPGA();
void processDigitalInput();
void processDigitalOutput();
void initExternalModbus();
bool isModbusInit() const;
void receiveModbusParameters();
void processExternalModbus(); // TODO
void processCPUModbus(); // TODO
void test_init_hmi_buffers();
void setModbusBuffers();
void addInputRegFloat(uint16_t addr, float& param);
void modbusExecute();
private:
canSpace::CAN _canb;
interface::DigitalIO _digitalIO;
Uint16* _zone6_ptr;
DSP28335::SCIB _scib;
MODBUSRTU::ModbusRTUTransceiverSetup _modbusSetup;
MODBUSRTU::ModbusRTUTransceiverConfiguration _modbusConfiguration;
MODBUSRTU::ModbusRTUCRC _crc;
DSP28335::MeasureTimeInterval _intervalMeasure;
MODBUSRTU::ModbusRTUTransceiver _modbusPort;
WEINBUS::WeinbusSlave _ASUTP;
SoftwareVersion _softVersion;
canSpace::CANMessage _modbusSettingsMsg;
canSpace::CANMessage _message;
bool _modbusInit;
bool _modbusInitFlag;
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;
//<>
};

@ -18,7 +18,7 @@ void DigitalIO::setMemoryOffset(Uint16 offset){
void DigitalIO::readDigitalIO(Uint16& data){
asm(" NOP");
asm(" NOP"); // TODO Add normal NOP
asm(" NOP");
asm(" NOP");
data = *m_pointer;

@ -17,15 +17,15 @@
#include "DSP28335/SCIB.h"
#include "DSP28335/SCIBase.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"
@ -37,32 +37,32 @@ interrupt void cpu_timer1_isr(void);
interrupt void canb_isr(void);
interrupt void canb_box_isr(void);
// Periphery periphery;
Periphery periphery;
//----------------------------------------------------------------------------------------
DSP28335::SCISetup SCIbSetup;
DSP28335::SCIB scib(ScibRegs);
// DSP28335::SCISetup SCIbSetup;
// DSP28335::SCIB scib(ScibRegs);
DSP28335::MeasureTimeInterval interval_measure(CpuTimer2);
// DSP28335::MeasureTimeInterval interval_measure(CpuTimer2);
// MODBUS RTU - PORT & HMI
MODBUSRTU::ModbusRTUTransceiverSetup modbus;
MODBUSRTU::ModbusRTUCRC crc;
MODBUSRTU::ModbusRTUTransceiver modbus_port(scib, interval_measure, crc);
// MODBUSRTU::ModbusRTUTransceiverSetup modbus;
// MODBUSRTU::ModbusRTUCRC crc;
// MODBUSRTU::ModbusRTUTransceiver modbus_port(scib, interval_measure, crc);
WEINBUS::WeinbusSlave hmi(crc);
MODBUSRTU::ModbusRTUTransceiverConfiguration modbus_port_configuration;
// WEINBUS::WeinbusSlave hmi(crc);
// MODBUSRTU::ModbusRTUTransceiverConfiguration modbus_port_configuration;
// Registers to testing HMI interface
WEINBUS::REGISTER_32 test_hmi_float_reg_400 = WEINBUS::REGISTER_32(0);
WEINBUS::REGISTER_32 test_hmi_float_reg_401 = WEINBUS::REGISTER_32(0);
WEINBUS::REGISTER_32 test_hmi_float_reg_402 = WEINBUS::REGISTER_32(0);
WEINBUS::REGISTER_32 test_hmi_float_reg_403 = WEINBUS::REGISTER_32(0);
WEINBUS::REGISTER_32 test_hmi_float_reg_404 = WEINBUS::REGISTER_32(0);
//<>
// // Registers to testing HMI interface
// WEINBUS::REGISTER_32 test_hmi_float_reg_400 = WEINBUS::REGISTER_32(0);
// WEINBUS::REGISTER_32 test_hmi_float_reg_401 = WEINBUS::REGISTER_32(0);
// WEINBUS::REGISTER_32 test_hmi_float_reg_402 = WEINBUS::REGISTER_32(0);
// WEINBUS::REGISTER_32 test_hmi_float_reg_403 = WEINBUS::REGISTER_32(0);
// WEINBUS::REGISTER_32 test_hmi_float_reg_404 = WEINBUS::REGISTER_32(0);
// //<>
void test_init_hmi_buffers();
// void test_init_hmi_buffers();
void clear_array(uint16_t *pointer, uint16_t sizearray);
//----------------------------------------------------------------------------------------
@ -79,6 +79,8 @@ volatile bool sendRemote = false;
Uint16 modbusInit = 0;
int32 testVar = 0;
float test = 55;
void main()
{
ServiceDog();
@ -114,54 +116,57 @@ void main()
PieCtrlRegs.PIEIER9.bit.INTx7 = 1; // from 5 to 8
PieCtrlRegs.PIEIER9.bit.INTx8 = 1;
// periphery.config();
periphery.config();
//----------------------------------------------------------------------------------------
SCIbSetup.config.baudrate = SCIB_BAUDRATE_DEFAULT;
SCIbSetup.config.parity = SCIB_PARITY_DEFAULT;
SCIbSetup.config.stopbits = SCIB_STOPBITS_DEFAULT;
SCIbSetup.config.lenght = SCIB_LENGHT_DEFAULT;
SCIbSetup.gpio_setup = SCIB_GPIO_SETUP_DEFAULT;
// SCIbSetup.config.baudrate = SCIB_BAUDRATE_DEFAULT;
// SCIbSetup.config.parity = SCIB_PARITY_DEFAULT;
// SCIbSetup.config.stopbits = SCIB_STOPBITS_DEFAULT;
// SCIbSetup.config.lenght = SCIB_LENGHT_DEFAULT;
// SCIbSetup.gpio_setup = SCIB_GPIO_SETUP_DEFAULT;
modbus.gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup;
modbus.gpio_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set;
modbus.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear;
// modbus.gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup;
// modbus.gpio_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set;
// modbus.gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear;
scib.setup(SCIbSetup);
// scib.setup(SCIbSetup);
interval_measure.set_magic((Uint32)0);
interval_measure.reset();
// interval_measure.set_magic((Uint32)0);
// interval_measure.reset();
modbus_port.setup(modbus);
// modbus_port.setup(modbus);
//----------------------------------------------------------------------------------------
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// periphery.updateVersionFPGA();
periphery.updateVersionFPGA();
//----------------------------------------------------------------------------------------
// MODBUS RTU
//
modbus_port_configuration.node_id = 0x5;
modbus_port_configuration.config.baudrate = DSP28335::BR9600;
modbus_port_configuration.config.parity = DSP28335::NO;
modbus_port_configuration.config.stopbits = DSP28335::ONE;
modbus_port_configuration.config.lenght = DSP28335::LEN8;
// modbus_port_configuration.node_id = 0x5;
// modbus_port_configuration.config.baudrate = DSP28335::BR9600;
// modbus_port_configuration.config.parity = DSP28335::NO;
// modbus_port_configuration.config.stopbits = DSP28335::ONE;
// modbus_port_configuration.config.lenght = DSP28335::LEN8;
//
test_init_hmi_buffers();
// test_init_hmi_buffers();
periphery.test_init_hmi_buffers();
modbus_port.configure(modbus_port_configuration);
// modbus_port.configure(modbus_port_configuration);
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.rxStack, sizeof(hmi.rxStack)/sizeof(uint16_t));
// clear_array((uint16_t *)hmi.txStack, sizeof(hmi.txStack)/sizeof(uint16_t));
modbus_port.setRXBuffer((uint16_t*)hmi.rxStack, &hmi.rxLength);
modbus_port.setTXBuffer((uint16_t*)hmi.txStack, &hmi.txLength);
// modbus_port.setRXBuffer((uint16_t*)hmi.rxStack, &hmi.rxLength);
// modbus_port.setTXBuffer((uint16_t*)hmi.txStack, &hmi.txLength);
periphery.setModbusBuffers();
periphery.addInputRegFloat(5, test);
interval_measure.set_magic(19);
// interval_measure.set_magic(19);
//----------------------------------------------------------------------------------------
@ -180,24 +185,29 @@ void idle_loop()
{
infCounter++;
// periphery.initExternalModbus();
if (!periphery.isModbusInit()){
periphery.receiveModbusParameters();
// modbus_port.configure(modbus_port_configuration);
}
//
// MODBUS RTU HMI Service
//
if(modbus_port.compare_state(MODBUSRTU::BREAK))
{
modbus_port.port_reset();
//
if (periphery.isModbusInit()){
periphery.modbusExecute();
// if(modbus_port.compare_state(MODBUSRTU::BREAK))
// {
// modbus_port.port_reset();
// //
// }
// else
// {
// modbus_port.execute();
// hmi.execute();
// //
// }//if else
}
else
{
modbus_port.execute();
hmi.execute();
//
}//if else
//<>
}//end while
}//end idle_loop()
@ -205,7 +215,7 @@ void idle_loop()
interrupt void cpu_timer0_isr(void)
{
// periphery.processDigitalOutput();
periphery.processDigitalOutput();
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}//end
@ -214,7 +224,7 @@ interrupt void cpu_timer0_isr(void)
interrupt void cpu_timer1_isr(){
CpuTimer1.InterruptCount++;
// periphery.processDigitalInput();
periphery.processDigitalInput();
}
@ -267,28 +277,27 @@ interrupt void canb_box_isr(void){
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}
void test_init_hmi_buffers()
{
//
// hmi writeable registers
hmi.inputRegisters.set(WEINBUS::INPUTREGISTERS, 400);
hmi.inputRegisters.add( 0, &(float&)test_hmi_float_reg_400.f);
hmi.inputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f);
hmi.inputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f);
hmi.inputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f);
hmi.inputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f);
//
// hmi readable registers
hmi.outputRegisters.set(WEINBUS::OUTPUTREGISTERS, 400);
hmi.outputRegisters.add( 0 , &(float&)test_hmi_float_reg_400.f);
hmi.outputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f);
hmi.outputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f);
hmi.outputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f);
hmi.outputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f);
//
}//
//
// void test_init_hmi_buffers()
// {
// //
// // hmi writeable registers
// hmi.inputRegisters.set(WEINBUS::INPUTREGISTERS, 400);
// hmi.inputRegisters.add( 0, &test_hmi_float_reg_400.f);
// hmi.inputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f);
// hmi.inputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f);
// hmi.inputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f);
// hmi.inputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f);
// //
// // hmi readable registers
// hmi.outputRegisters.set(WEINBUS::OUTPUTREGISTERS, 400);
// hmi.outputRegisters.add( 0 , &(float&)test_hmi_float_reg_400.f);
// hmi.outputRegisters.add( 1, &(float&)test_hmi_float_reg_401.f);
// hmi.outputRegisters.add( 2, &(float&)test_hmi_float_reg_402.f);
// hmi.outputRegisters.add( 3, &(float&)test_hmi_float_reg_403.f);
// hmi.outputRegisters.add( 4, &(float&)test_hmi_float_reg_404.f);
// //
// }//
// //
void clear_array(uint16_t *pointer, uint16_t sizearray)
{

Loading…
Cancel
Save