74 lines
1.4 KiB
C++
74 lines
1.4 KiB
C++
/*
|
||
* ModbusAnalogOutput.cpp
|
||
*
|
||
* Created on: 19 мар. 2021 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
#include "ModbusAnalogOutput.hh"
|
||
#include <cstring>
|
||
|
||
driver::modbus::ModbusAnalogOutput::ModbusAnalogOutput( float coeff, float offset, float invalid, bool sign,
|
||
float initial, float up_limit, float down_limit ) :
|
||
coeff(coeff), offset(offset), invalid(invalid), sign(sign),
|
||
up_limit(up_limit), down_limit(down_limit), value(initial) {}
|
||
|
||
const float & driver::modbus::ModbusAnalogOutput::signal() const {
|
||
|
||
return value;
|
||
|
||
}
|
||
|
||
driver::modbus::ModbusAnalogOutput::Status driver::modbus::ModbusAnalogOutput::read( uint16_t & output ) {
|
||
|
||
output = reg;
|
||
|
||
return Done;
|
||
|
||
}
|
||
|
||
driver::modbus::ModbusAnalogOutput::Status driver::modbus::ModbusAnalogOutput::write( uint16_t input ) {
|
||
|
||
if( sign ) {
|
||
|
||
int16_t signed_input;
|
||
std::memcpy( &signed_input, &input, sizeof(input) );
|
||
|
||
if( signed_input >= down_limit and signed_input <= up_limit ) {
|
||
|
||
reg = input;
|
||
|
||
value = signed_input * coeff + offset;
|
||
|
||
return Done;
|
||
|
||
} else {
|
||
|
||
value = invalid;
|
||
|
||
return Failure;
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
if( input >= down_limit and input <= up_limit ) {
|
||
|
||
reg = input;
|
||
|
||
value = input * coeff + offset;
|
||
|
||
return Done;
|
||
|
||
} else {
|
||
|
||
value = invalid;
|
||
|
||
return Failure;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|