MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/ModbusAnalogWideOutput.cpp
2024-06-07 11:12:56 +03:00

99 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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