99 lines
2.2 KiB
C++
99 lines
2.2 KiB
C++
/*
|
||
* ModbusAnalogWideOutput.cpp
|
||
*
|
||
* Created on: 17 апр. 2023 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
#include "ModbusAnalogWideOutput.hh"
|
||
|
||
#include <cstring>
|
||
|
||
bool driver::modbus::ModbusAnalogWideOutput::update() {
|
||
|
||
if( format_signed ) {
|
||
|
||
int32_t signed_input;
|
||
memcpy( &signed_input, data, sizeof(int32_t) );
|
||
|
||
if( signed_input >= down_limit and signed_input <= up_limit ) {
|
||
|
||
value = ( signed_input * coeff + offset );
|
||
|
||
return true;
|
||
|
||
} else
|
||
return false;
|
||
|
||
} else {
|
||
|
||
uint32_t unsigned_input;
|
||
memcpy( &unsigned_input, data, sizeof(uint32_t) );
|
||
|
||
if( unsigned_input >= down_limit and unsigned_input <= up_limit ) {
|
||
|
||
value = (unsigned_input * coeff + offset );
|
||
|
||
return true;
|
||
|
||
} else
|
||
return false;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
driver::modbus::ModbusAnalogWideOutput::Part::Status driver::modbus::ModbusAnalogWideOutput::Part::read(
|
||
uint16_t & reg ) {
|
||
|
||
reg = *data;
|
||
|
||
return Done;
|
||
|
||
}
|
||
|
||
driver::modbus::ModbusAnalogWideOutput::Part::Status driver::modbus::ModbusAnalogWideOutput::Part::write(
|
||
uint16_t reg ) {
|
||
|
||
*data = reg;
|
||
|
||
return Done;
|
||
|
||
}
|
||
|
||
|
||
driver::modbus::ModbusAnalogWideOutput::PartUpdater::Status driver::modbus::ModbusAnalogWideOutput::PartUpdater::write(
|
||
uint16_t reg ) {
|
||
|
||
*data = reg;
|
||
|
||
return self.update() ? Done : Failure;
|
||
|
||
}
|
||
|
||
driver::modbus::ModbusAnalogWideOutput::ModbusAnalogWideOutput(
|
||
float coeff, float offset, float invalid, bool sign, float initial,
|
||
float up_limit, float down_limit, WordSequence sequnece) :
|
||
coeff(coeff), offset(offset), invalid(invalid), format_signed(sign),
|
||
up_limit(up_limit), down_limit(down_limit), value(initial),
|
||
one( sequnece == LowFirstHighSecond ? &data[1] : &data[0] ),
|
||
two( *this, sequnece == HighFirstLowSecond ? &data[1] : &data[0] ) {}
|
||
|
||
driver::modbus::IModBusDispatch & driver::modbus::ModbusAnalogWideOutput::first() {
|
||
|
||
return one;
|
||
|
||
}
|
||
|
||
driver::modbus::IModBusDispatch & driver::modbus::ModbusAnalogWideOutput::second() {
|
||
|
||
return two;
|
||
|
||
}
|
||
|
||
const float & driver::modbus::ModbusAnalogWideOutput::signal() const {
|
||
|
||
return value;
|
||
|
||
}
|