From c9d28bd48f75a4fd0e7cc2177269c34cc6d00806 Mon Sep 17 00:00:00 2001 From: mj Date: Sun, 9 Jan 2022 18:46:20 +0100 Subject: [PATCH] Fixed MODBUS slave callback when SPS30 is not connected --- fw/Core/Inc/main.h | 1 + fw/Core/Src/main.c | 16 +++++++++++++--- tests/query_device.py | 6 +++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fw/Core/Inc/main.h b/fw/Core/Inc/main.h index 24af6bc..69582ee 100644 --- a/fw/Core/Inc/main.h +++ b/fw/Core/Inc/main.h @@ -99,6 +99,7 @@ int8_t uart_enable_interrupts(void); /* USER CODE BEGIN Private defines */ #define MEASUREMENT_PERIOD_MS 600000 #define RESET_MAGIC_NUMBER 0xABCD +#define MODBUS_ASSERT(x) if (x == 0) return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED extern uint16_t usart2_rx_message_index; extern uint16_t usart2_rx_message_len; diff --git a/fw/Core/Src/main.c b/fw/Core/Src/main.c index d7a138a..4631e38 100644 --- a/fw/Core/Src/main.c +++ b/fw/Core/Src/main.c @@ -125,6 +125,9 @@ uint8_t sensor_config_pending_write = 0; uint8_t baudrate_changed = 0; uint8_t modbus_address_changed = 0; uint8_t co2_valid = 0; +/* dynamic sensor configuration */ +uint8_t scd4x_is_connected = 0; +uint8_t sps30_is_connected = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -251,9 +254,6 @@ int main(void) device_id.object_name.ProductName = "SensCO2"; device_id.object_name.ModelName = "Hugo"; modbus_slave_init_device_id(&device_id); - - uint8_t scd4x_is_connected = 0; - uint8_t sps30_is_connected = 0; /* USER CODE END 2 */ /* Infinite loop */ @@ -863,33 +863,43 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction) transaction->input_registers_signed[i] = (int16_t)T_SCD4x; break; case REGISTER_NUM_PMC_MASS_1_0: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.mass_concentration[PM1_0]; break; case REGISTER_NUM_PMC_MASS_2_5: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.mass_concentration[PM2_5]; break; case REGISTER_NUM_PMC_MASS_4_0: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.mass_concentration[PM4_0]; break; case REGISTER_NUM_PMC_MASS_10_0: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.mass_concentration[PM10_0]; break; case REGISTER_NUM_PMC_NUMBER_0_5: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.number_concentration[PM0_5]; break; case REGISTER_NUM_PMC_NUMBER_1_0: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.number_concentration[PM1_0]; break; case REGISTER_NUM_PMC_NUMBER_2_5: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.number_concentration[PM2_5]; break; case REGISTER_NUM_PMC_NUMBER_4_0: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.number_concentration[PM4_0]; break; case REGISTER_NUM_PMC_NUMBER_10_0: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.number_concentration[PM10_0]; break; case REGISTER_NUM_TYPICAL_PARTICLE_SIZE: + MODBUS_ASSERT(sps30_is_connected); transaction->input_registers[i] = (uint16_t)PM_SPS30.typical_particle_size; break; default: diff --git a/tests/query_device.py b/tests/query_device.py index 98d0662..8ce3528 100755 --- a/tests/query_device.py +++ b/tests/query_device.py @@ -121,9 +121,9 @@ if action == 'read' or action == 'all': reg_name = '' try: result = s.read_register(reg_number) - except ValueError: - print(f'Register number {reg_number} cannot be read (wrong number?)') - exit(-8) + except: + print(f'{reg_number : <10} {"N/A" : <10} Failed to read register') + continue print(f'{reg_number : <10} {int(result) : <10} {reg_name}') elif action == 'write': if len(register_name) > 0: