WIP holding register write

This commit is contained in:
dooku 2021-10-06 20:20:51 +02:00
parent 15bc1943ef
commit 917886820d
3 changed files with 64 additions and 7 deletions

View File

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

View File

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

49
tests/holding_register_test.py Executable file
View File

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