Fixed MODBUS slave callback when SPS30 is not connected

This commit is contained in:
mj 2022-01-09 18:46:20 +01:00
parent 7e1e71a912
commit c9d28bd48f
3 changed files with 17 additions and 6 deletions

View File

@ -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;

View File

@ -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:

View File

@ -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: