getters for data from modbus rtu

pull/2/head
Mateusz Lubecki 2020-09-29 22:46:31 +02:00
rodzic 0ac3a275ab
commit b4ca1ee5bd
5 zmienionych plików z 346 dodań i 8 usunięć

Wyświetl plik

@ -30,6 +30,7 @@
#ifdef _MODBUS_RTU
#include "modbus_rtu/rtu_register_data_t.h"
#include "modbus_rtu/rtu_exception_t.h"
#include "modbus_rtu/rtu_getters.h"
#endif
@ -93,19 +94,19 @@ extern davis_loop_t rte_wx_davis_loop_content;
#ifdef _MODBUS_RTU
#if defined(_RTU_SLAVE_ID_1) && (_RTU_SLAVE_FUNC_1 == 0x03 || _RTU_SLAVE_FUNC_1 == 0x04)
extern rtu_register_data_t rte_wx_modbus_rtu_f1;
extern rtu_register_data_t RTU_GETTERS_F1_NAME;
#endif
#if defined(_RTU_SLAVE_ID_2) && (_RTU_SLAVE_FUNC_2 == 0x03 || _RTU_SLAVE_FUNC_2 == 0x04)
extern rtu_register_data_t rte_wx_modbus_rtu_f2;
extern rtu_register_data_t RTU_GETTERS_F2_NAME;
#endif
#if defined(_RTU_SLAVE_ID_3) && (_RTU_SLAVE_FUNC_3 == 0x03 || _RTU_SLAVE_FUNC_3 == 0x04)
extern rtu_register_data_t rte_wx_modbus_rtu_f3;
extern rtu_register_data_t RTU_GETTERS_F3_NAME;
#endif
#if defined(_RTU_SLAVE_ID_4) && (_RTU_SLAVE_FUNC_4 == 0x03 || _RTU_SLAVE_FUNC_4 == 0x04)
extern rtu_register_data_t rte_wx_modbus_rtu_f4;
extern rtu_register_data_t RTU_GETTERS_F4_NAME;
#endif
extern rtu_exception_t rte_wx_last_modbus_exception;

Wyświetl plik

@ -10,6 +10,7 @@
#include <wx_handler.h>
#include "main.h"
float rte_wx_temperature_dallas = 0.0f, rte_wx_temperature_dallas_valid = 0.0f;
float rte_wx_temperature_dalls_slew_rate = 0.0f;
float rte_wx_temperature_average_dallas_valid = 0.0f;
@ -61,19 +62,19 @@ davis_loop_t rte_wx_davis_loop_content;
#ifdef _MODBUS_RTU
#if defined(_RTU_SLAVE_ID_1) && (_RTU_SLAVE_FUNC_1 == 0x03 || _RTU_SLAVE_FUNC_1 == 0x04)
rtu_register_data_t rte_wx_modbus_rtu_f1;
rtu_register_data_t RTU_GETTERS_F1_NAME;
#endif
#if defined(_RTU_SLAVE_ID_2) && (_RTU_SLAVE_FUNC_2 == 0x03 || _RTU_SLAVE_FUNC_2 == 0x04)
rtu_register_data_t rte_wx_modbus_rtu_f2;
rtu_register_data_t RTU_GETTERS_F2_NAME;
#endif
#if defined(_RTU_SLAVE_ID_3) && (_RTU_SLAVE_FUNC_3 == 0x03 || _RTU_SLAVE_FUNC_3 == 0x04)
rtu_register_data_t rte_wx_modbus_rtu_f3;
rtu_register_data_t RTU_GETTERS_F3_NAME;
#endif
#if defined(_RTU_SLAVE_ID_4) && (_RTU_SLAVE_FUNC_4 == 0x03 || _RTU_SLAVE_FUNC_4 == 0x04)
rtu_register_data_t rte_wx_modbus_rtu_f4;
rtu_register_data_t RTU_GETTERS_F4_NAME;
#endif
rtu_exception_t rte_wx_last_modbus_exception;

Wyświetl plik

@ -0,0 +1,22 @@
/*
* rtu_getters.h
*
* Created on: 29.09.2020
* Author: mateusz
*/
#ifndef INCLUDE_MODBUS_RTU_RTU_GETTERS_H_
#define INCLUDE_MODBUS_RTU_RTU_GETTERS_H_
#define RTU_GETTERS_F1_NAME rte_wx_modbus_rtu_f1
#define RTU_GETTERS_F2_NAME rte_wx_modbus_rtu_f2
#define RTU_GETTERS_F3_NAME rte_wx_modbus_rtu_f3
#define RTU_GETTERS_F4_NAME rte_wx_modbus_rtu_f4
int32_t rtu_get_temperature(float* out);
int32_t rtu_get_pressure(float* out);
int32_t rtu_get_wind_direction(uint16_t* out);
int32_t rtu_get_wind_speed(uint16_t* out);
int32_t rtu_get_humidity(int8_t* out);
#endif /* INCLUDE_MODBUS_RTU_RTU_GETTERS_H_ */

Wyświetl plik

@ -14,5 +14,6 @@
#define MODBUS_RET_WRONG_FUNCTION 2
#define MODBUS_RET_REQUEST_GEN_ERR 3
#define MODBUS_RET_GOT_EXCEPTION 4
#define MODBUS_RET_NOT_AVALIABLE 5
#endif /* INCLUDE_MODBUS_RTU_RTU_RETURN_VALUES_H_ */

Wyświetl plik

@ -0,0 +1,313 @@
/*
* rtu_getters.c
*
* Created on: 29.09.2020
* Author: mateusz
*/
#include "station_config.h"
#include "rtu_getters.h"
#include "rtu_return_values.h"
int32_t rtu_get_temperature(float* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
#ifdef _RTU_SLAVE_TEMPERATURE_SOURCE
#if (_RTU_SLAVE_TEMPERATURE_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_AVALIABLE;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in degrees C
*out = (
scaling_a * (float)raw_register_value * (float)raw_register_value +
scaling_b * (float)raw_register_value +
scaling_c
) /
scaling_d;
retval = MODBUS_RET_OK;
}
return retval;
}
int32_t rtu_get_pressure(float* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
#ifdef _RTU_SLAVE_PRESSURE_SOURCE
#if (_RTU_SLAVE_PRESSURE_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_AVALIABLE;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in degrees C
*out = (
scaling_a * (float)raw_register_value * (float)raw_register_value +
scaling_b * (float)raw_register_value +
scaling_c
) /
scaling_d;
retval = MODBUS_RET_OK;
}
return retval;
}
int32_t rtu_get_wind_direction(uint16_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
#ifdef _RTU_SLAVE_WIND_DIRECTION_SORUCE
#if (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_AVALIABLE;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in degrees C
*out = (
scaling_a * (float)raw_register_value * (float)raw_register_value +
scaling_b * (float)raw_register_value +
scaling_c
) /
scaling_d;
retval = MODBUS_RET_OK;
}
return retval;
}
int32_t rtu_get_wind_speed(uint16_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
#ifdef _RTU_SLAVE_WIND_SPEED_SOURCE
#if (_RTU_SLAVE_WIND_SPEED_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_AVALIABLE;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in .1m/s incremenets
*out = 10 * (
scaling_a * (uint16_t)raw_register_value * (uint16_t)raw_register_value +
scaling_b * (uint16_t)raw_register_value +
scaling_c
) /
scaling_d;
retval = MODBUS_RET_OK;
}
return retval;
}
int32_t rtu_get_humidity(int8_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
#ifdef _RTU_SLAVE_HUMIDITY_SOURCE
#if (_RTU_SLAVE_HUMIDITY_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
#elif (_RTU_SLAVE_HUMIDITY_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
#elif (_RTU_SLAVE_HUMIDITY_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
#elif (_RTU_SLAVE_HUMIDITY_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_AVALIABLE;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in percents
*out = 10 * (
scaling_a * (uint16_t)raw_register_value * (uint16_t)raw_register_value +
scaling_b * (uint16_t)raw_register_value +
scaling_c
) /
scaling_d;
retval = MODBUS_RET_OK;
}
return retval;
}