74 lines
1.4 KiB
C++
74 lines
1.4 KiB
C++
|
|
/*
|
|||
|
|
* ModbusAnalogOutput.cpp
|
|||
|
|
*
|
|||
|
|
* Created on: 19 <EFBFBD><EFBFBD><EFBFBD>. 2021 <EFBFBD>.
|
|||
|
|
* 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;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|