MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/ModbusAnalogWideValue.hh

95 lines
2.1 KiB
C++

/*
* ModbusAnalogWideValue.hh
*
* Created on: 17 àïð. 2023 ã.
* Author: titov
*/
#ifndef UMLIBRARY_DRIVER_MODBUSANALOGWIDEVALUE_HH_
#define UMLIBRARY_DRIVER_MODBUSANALOGWIDEVALUE_HH_
#include <stdint.h>
#include "../systemic/IValueAsync.hpp"
#include "IModBus.hh"
namespace driver {
namespace modbus {
//!
class ModbusAnalogWideValue {
typedef IModBusDispatch::Status Status;
float write_coeff;
float write_offset;
float read_coeff;
float read_offset;
bool format_signed;
float up_limit;
float down_limit;
systemic::IValueType<float> & tech_value;
const uint32_t nan_out_of_range; //!< Ñîïîñòàâëåíèå äëÿ çíà÷åíèÿ NAN ñèãíàëà
bool extract();
bool update();
mutable uint16_t data[2];
struct PartShower : public IModBusDispatch {
ModbusAnalogWideValue & self;
uint16_t * const data;
Status read( uint16_t & reg );
Status write( uint16_t reg );
PartShower( ModbusAnalogWideValue & self, uint16_t * data ) : data(data), self(self) {}
};
struct PartUpdater : public IModBusDispatch {
ModbusAnalogWideValue & self;
uint16_t * const data;
Status read( uint16_t & reg );
Status write( uint16_t reg );
PartUpdater( ModbusAnalogWideValue & self, uint16_t * data ) : data(data), self(self) {}
};
PartShower one;
PartUpdater two;
public:
//!Ïîñëåäîâàòåëüíîñòü ñëîâ â ðåãèñòðàõ
enum WordSequence {
HighFirstLowSecond, //!<Ïåðâûé ñòàðøèé, âòîðîé ìëàäøèé.
LowFirstHighSecond //!<Ïåðâûé ìëàäøèé, âòîðîé ñòàðøèé.
};
ModbusAnalogWideValue( systemic::IValueType<float> & value,
float write_coeff, float write_offset, float read_coeff, float read_offset,
bool sign, float up_limit, float down_limit, uint32_t nan_register, WordSequence sequnece );
//!Ïåðâûé èç ïàðû ðåãèñòðîâ.
IModBusDispatch & first();
//!Âòîðîé èç ïàðû ðåãèñòðîâ.
IModBusDispatch & second();
};
}
}
#endif /* UMLIBRARY_DRIVER_MODBUSANALOGWIDEVALUE_HH_ */