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;
|
|
|
|
}
|