85 lines
1.6 KiB
C++
85 lines
1.6 KiB
C++
/*
|
|
* ModbusAnalogWideOutput.hh
|
|
*
|
|
* Created on: 17 àïð. 2023 ã.
|
|
* Author: titov
|
|
*/
|
|
|
|
#ifndef UMLIBRARY_DRIVER_MODBUSANALOGWIDEOUTPUT_HH_
|
|
#define UMLIBRARY_DRIVER_MODBUSANALOGWIDEOUTPUT_HH_
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "IModBus.hh"
|
|
|
|
namespace driver {
|
|
namespace modbus {
|
|
|
|
//!
|
|
class ModbusAnalogWideOutput {
|
|
|
|
typedef IModBusDispatch::Status Status;
|
|
|
|
const float coeff;
|
|
const float offset;
|
|
const float invalid;
|
|
|
|
float value;
|
|
|
|
bool format_signed;
|
|
|
|
float up_limit;
|
|
float down_limit;
|
|
|
|
bool update();
|
|
|
|
mutable uint16_t data[2];
|
|
|
|
struct Part : public IModBusDispatch {
|
|
|
|
uint16_t * data;
|
|
|
|
Status read( uint16_t & reg );
|
|
Status write( uint16_t reg );
|
|
|
|
Part( uint16_t * data ) : data(data) {}
|
|
};
|
|
|
|
struct PartUpdater : public Part {
|
|
|
|
ModbusAnalogWideOutput & self;
|
|
|
|
Status write( uint16_t reg );
|
|
|
|
PartUpdater( ModbusAnalogWideOutput & self, uint16_t * data ) : Part(data), self(self) {}
|
|
};
|
|
|
|
Part one;
|
|
PartUpdater two;
|
|
|
|
public:
|
|
//!Ïîñëåäîâàòåëüíîñòü ñëîâ â ðåãèñòðàõ
|
|
enum WordSequence {
|
|
HighFirstLowSecond, //!<Ïåðâûé ñòàðøèé, âòîðîé ìëàäøèé.
|
|
LowFirstHighSecond //!<Ïåðâûé ìëàäøèé, âòîðîé ñòàðøèé.
|
|
};
|
|
|
|
ModbusAnalogWideOutput( float coeff, float offset, float invalid, bool sign,
|
|
float initial, float up_limit, float down_limit , WordSequence sequnece );
|
|
|
|
//!Ïåðâûé èç ïàðû ðåãèñòðîâ.
|
|
IModBusDispatch & first();
|
|
//!Âòîðîé èç ïàðû ðåãèñòðîâ.
|
|
IModBusDispatch & second();
|
|
|
|
const float & signal() const;
|
|
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#endif /* UMLIBRARY_DRIVER_MODBUSANALOGWIDEOUTPUT_HH_ */
|