From 917886820dad7caeb9541d4e0b645700229b422c Mon Sep 17 00:00:00 2001 From: dooku Date: Wed, 6 Oct 2021 20:20:51 +0200 Subject: [PATCH] WIP holding register write --- fw/Core/Src/config.c | 2 +- fw/Core/Src/modbus.c | 20 +++++++++----- tests/holding_register_test.py | 49 ++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 7 deletions(-) create mode 100755 tests/holding_register_test.py diff --git a/fw/Core/Src/config.c b/fw/Core/Src/config.c index 676afb2..328e711 100644 --- a/fw/Core/Src/config.c +++ b/fw/Core/Src/config.c @@ -97,7 +97,7 @@ int8_t config_write(config_t *config) } /* Write LED BRIGHTNESS */ - if (eeprom_program_word(CONFIG_EEPROM_ADDR_LED_BRIGHTNESS, config->led_brightness) != EEPROM_OK) + if (eeprom_program_halfword(CONFIG_EEPROM_ADDR_LED_BRIGHTNESS, config->led_brightness) != EEPROM_OK) { return EEPROM_WRITE_ERROR; } diff --git a/fw/Core/Src/modbus.c b/fw/Core/Src/modbus.c index 854c7e8..9c06664 100644 --- a/fw/Core/Src/modbus.c +++ b/fw/Core/Src/modbus.c @@ -180,12 +180,20 @@ int8_t modbus_slave_process_msg(const uint8_t *buffer, int len) return MODBUS_ERROR; } transaction.register_address = (buffer[buffer_pos++] << 8) | buffer[buffer_pos++]; - transaction.register_count = (buffer[buffer_pos++] << 8) | buffer[buffer_pos++]; - if ( - transaction.register_count < 1 || - transaction.register_count > MODBUS_MAX_REGISTERS - ) { - transaction.exception.exception_code = MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE; + if (flags & MODBUS_FLAG_WRITE) { + if (flags & MODBUS_FLAG_SINGLE) { + transaction.holding_registers[0] = (buffer[buffer_pos++] << 8) | buffer[buffer_pos++]; + } else { + // write multiple register - TODO + } + } else { + transaction.register_count = (buffer[buffer_pos++] << 8) | buffer[buffer_pos++]; + if ( + transaction.register_count < 1 || + transaction.register_count > MODBUS_MAX_REGISTERS + ) { + transaction.exception.exception_code = MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE; + } } // add offset to register number transaction.register_number += transaction.register_address; diff --git a/tests/holding_register_test.py b/tests/holding_register_test.py new file mode 100755 index 0000000..007fd7e --- /dev/null +++ b/tests/holding_register_test.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +from time import sleep +import minimalmodbus +import serial + +slave_address = 254 +instrument = minimalmodbus.Instrument('/dev/ttyUSB0', slave_address, close_port_after_each_call=True) # port name, slave address (in decimal) + +instrument.serial.baudrate = 19200 +instrument.serial.bytesize = 8 +instrument.serial.parity = serial.PARITY_EVEN +instrument.serial.stopbits = 1 +instrument.serial.timeout = 0.05 # seconds +instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode +instrument.clear_buffers_before_each_transaction = True + +# holding register numbers +LED_on_register = 0 +LED_brightness_register = 1 +LED_smooth_register = 2 +CO2_alert_limit_1_register = 3 +CO2_alert_limit_2_register = 4 +SCD4x_temperature_offset_register = 5 +MODBUS_address_register = 6 +baudrate_register = 7 +# holding register readout +print('---- Reading from holding registers ----') +#LED_on = int(instrument.read_register(LED_on_register, 1, functioncode=3) * 10) +#LED_brightness = int(instrument.read_register(LED_brightness_register, 1, functioncode=3) * 10) +#LED_smooth = int(instrument.read_register(LED_smooth_register, 1, functioncode=3) * 10) +#CO2_alert_limit_1 = int(instrument.read_register(CO2_alert_limit_1_register, 1, functioncode=3) * 10) +#CO2_alert_limit_2 = int(instrument.read_register(CO2_alert_limit_2_register, 1, functioncode=3) * 10) +#SCD4x_temperature_offset = int(instrument.read_register(SCD4x_temperature_offset_register, 1, functioncode=3) * 10) +#MODBUS_address = int(instrument.read_register(MODBUS_address_register, 1, functioncode=3) * 10) +#baudrate = int(instrument.read_register(baudrate_register, 1, functioncode=3) * 10) +# print +#print( +#f'''LED_on = {LED_on} +#LED_brightness = {LED_brightness} +#LED_smooth = {LED_smooth} +#CO2_alert_limit_1 = {CO2_alert_limit_1} +#CO2_alert_limit_2 = {CO2_alert_limit_2} +#SCD4x_temperature_offset = {SCD4x_temperature_offset} +#MODBUS_address = {MODBUS_address} +#baudrate = {baudrate} +#''') +# write to holding register +print('---- Writing to holding registers ----)') +instrument.write_register(LED_on_register, 0, functioncode=6)