From 46d4b79e90d2b2a80e44ecca2167c90746300adc Mon Sep 17 00:00:00 2001 From: Oleg Date: Fri, 28 Mar 2025 14:32:35 +0300 Subject: [PATCH] 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 --- DSP28335/SCIBase.h | 12 +- MODBUSRTU/ModbusRTUTransceiverBase.h | 2 +- Periphery.cpp | 122 ++++++++++++++++-- Periphery.h | 48 ++++++- Protocol/DigitalIO.cpp | 2 +- main2.cpp | 181 ++++++++++++++------------- 6 files changed, 262 insertions(+), 105 deletions(-) diff --git a/DSP28335/SCIBase.h b/DSP28335/SCIBase.h index 47387b3..936486d 100644 --- a/DSP28335/SCIBase.h +++ b/DSP28335/SCIBase.h @@ -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) + // {} };// diff --git a/MODBUSRTU/ModbusRTUTransceiverBase.h b/MODBUSRTU/ModbusRTUTransceiverBase.h index c062577..62d473e 100644 --- a/MODBUSRTU/ModbusRTUTransceiverBase.h +++ b/MODBUSRTU/ModbusRTUTransceiverBase.h @@ -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; diff --git a/Periphery.cpp b/Periphery.cpp index 74a9bcb..759c1e3 100644 --- a/Periphery.cpp +++ b/Periphery.cpp @@ -10,8 +10,14 @@ Periphery::Periphery() : _canb(canSpace::CANA), _digitalIO(), _zone6_ptr(reinterpret_cast(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; @@ -36,7 +42,7 @@ void Periphery::config(){ // Interrupts _canb.configSystemIsr(canSpace::I0EN_ENABLE | - canSpace::EPIM_ENABLE | canSpace::WLIM_ENABLE | canSpace::AAIM_ENABLE); + canSpace::EPIM_ENABLE | canSpace::WLIM_ENABLE | canSpace::AAIM_ENABLE); //--------------------------------------Init XINTF interface---------------------------------------------------------- @@ -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(_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); + + _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, ¶m); +// _ASUTP.outputRegisters.add( addr, ¶m); +// } + +// 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); +// } diff --git a/Periphery.h b/Periphery.h index e592ea3..738bb46 100644 --- a/Periphery.h +++ b/Periphery.h @@ -1,5 +1,7 @@ #pragma once +#include + #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; + //<> }; + + + diff --git a/Protocol/DigitalIO.cpp b/Protocol/DigitalIO.cpp index 24d7147..37e3a63 100644 --- a/Protocol/DigitalIO.cpp +++ b/Protocol/DigitalIO.cpp @@ -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; diff --git a/main2.cpp b/main2.cpp index f68ec0b..08667f4 100644 --- a/main2.cpp +++ b/main2.cpp @@ -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) {