MODBUS write multiple registers done
This commit is contained in:
parent
0bfc93d3ea
commit
33e70f5baf
@ -176,6 +176,6 @@ int8_t modbus_slave_set_address(uint8_t address);
|
|||||||
/* modbus callback function type - should be implemented by user (e.g. in main.c) */
|
/* modbus callback function type - should be implemented by user (e.g. in main.c) */
|
||||||
int8_t modbus_slave_callback(modbus_transaction_t *transaction);
|
int8_t modbus_slave_callback(modbus_transaction_t *transaction);
|
||||||
/* UART transmit function type - should be implemented by user (e.g. in main.c) */
|
/* UART transmit function type - should be implemented by user (e.g. in main.c) */
|
||||||
int8_t modbus_transmit_function(uint8_t *buffer, int data_len);
|
int8_t modbus_transmit_function(uint8_t *buffer, uint16_t data_len);
|
||||||
|
|
||||||
#endif /* SRC_MODBUS_H_ */
|
#endif /* SRC_MODBUS_H_ */
|
||||||
|
@ -110,6 +110,7 @@ uint16_t sps30_measured_data[10];
|
|||||||
config_t sensor_config;
|
config_t sensor_config;
|
||||||
uint8_t sensor_config_pending_write = 0;
|
uint8_t sensor_config_pending_write = 0;
|
||||||
uint8_t baudrate_changed = 0;
|
uint8_t baudrate_changed = 0;
|
||||||
|
uint8_t modbus_address_changed = 0;
|
||||||
/* USER CODE END PV */
|
/* USER CODE END PV */
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
@ -119,9 +120,7 @@ static void MX_I2C1_Init(void);
|
|||||||
static void MX_LPUART1_UART_Init(void);
|
static void MX_LPUART1_UART_Init(void);
|
||||||
static void MX_TIM21_Init(void);
|
static void MX_TIM21_Init(void);
|
||||||
/* USER CODE BEGIN PFP */
|
/* USER CODE BEGIN PFP */
|
||||||
int8_t modbus_slave_callback(modbus_transaction_t *transaction);
|
void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint16_t buffer_tx_len);
|
||||||
int8_t modbus_transmit_function(uint8_t *buffer, int data_len);
|
|
||||||
void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint8_t buffer_tx_len);
|
|
||||||
/* USER CODE END PFP */
|
/* USER CODE END PFP */
|
||||||
|
|
||||||
/* Private user code ---------------------------------------------------------*/
|
/* Private user code ---------------------------------------------------------*/
|
||||||
@ -259,12 +258,16 @@ int main(void)
|
|||||||
if (sensor_config_pending_write) {
|
if (sensor_config_pending_write) {
|
||||||
// config_write(&sensor_config);
|
// config_write(&sensor_config);
|
||||||
}
|
}
|
||||||
if (baudrate_changed == 1)
|
if (modbus_address_changed)
|
||||||
|
{
|
||||||
|
modbus_slave_set_address(sensor_config.modbus_addr);
|
||||||
|
}
|
||||||
|
if (baudrate_changed)
|
||||||
{
|
{
|
||||||
/* TODO: TEST */
|
/* TODO: TEST */
|
||||||
LL_LPUART_Disable(LPUART1);
|
// LL_LPUART_Disable(LPUART1);
|
||||||
MX_LPUART1_UART_Init();
|
// MX_LPUART1_UART_Init();
|
||||||
LL_LPUART_Enable(LPUART1);
|
// LL_LPUART_Enable(LPUART1);
|
||||||
baudrate_changed = 0;
|
baudrate_changed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,10 +607,10 @@ static void MX_GPIO_Init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 4 */
|
/* USER CODE BEGIN 4 */
|
||||||
void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint8_t buffer_tx_len)
|
void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint16_t buffer_tx_len)
|
||||||
{
|
{
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
for (uint8_t i = 0; i < buffer_tx_len; i++)
|
for (uint16_t i = 0; i < buffer_tx_len; i++)
|
||||||
{
|
{
|
||||||
LL_LPUART_TransmitData9(LPUART1, buffer_tx[i]);
|
LL_LPUART_TransmitData9(LPUART1, buffer_tx[i]);
|
||||||
while (!LL_LPUART_IsActiveFlag_TXE(LPUART1));
|
while (!LL_LPUART_IsActiveFlag_TXE(LPUART1));
|
||||||
@ -693,30 +696,31 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
|
|||||||
switch (register_number)
|
switch (register_number)
|
||||||
{
|
{
|
||||||
case REGISTER_NUM_LED_ON:
|
case REGISTER_NUM_LED_ON:
|
||||||
sensor_config.led_on = (uint8_t) transaction->holding_registers[0];
|
sensor_config.led_on = (uint8_t) transaction->holding_registers[i];
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_LED_BRIGHTNESS:
|
case REGISTER_NUM_LED_BRIGHTNESS:
|
||||||
sensor_config.led_brightness = (uint16_t) transaction->holding_registers[0];
|
sensor_config.led_brightness = (uint16_t) transaction->holding_registers[i];
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_LED_SMOOTH:
|
case REGISTER_NUM_LED_SMOOTH:
|
||||||
sensor_config.led_smooth = (uint16_t) transaction->holding_registers[0];
|
sensor_config.led_smooth = (uint16_t) transaction->holding_registers[i];
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_CO2_ALERT_LIMIT1:
|
case REGISTER_NUM_CO2_ALERT_LIMIT1:
|
||||||
sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[0];
|
sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[i];
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_CO2_ALERT_LIMIT2:
|
case REGISTER_NUM_CO2_ALERT_LIMIT2:
|
||||||
sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[0];
|
sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[i];
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_SCD4x_T_OFFSET:
|
case REGISTER_NUM_SCD4x_T_OFFSET:
|
||||||
sensor_config.scd4x_t_offset = (int16_t) transaction->holding_registers[0];
|
sensor_config.scd4x_t_offset = (int16_t) transaction->holding_registers[i];
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_MODBUS_ADDR:
|
case REGISTER_NUM_MODBUS_ADDR:
|
||||||
sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[0];
|
sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[i];
|
||||||
|
modbus_address_changed = 1;
|
||||||
break;
|
break;
|
||||||
case REGISTER_NUM_BAUDRATE:
|
case REGISTER_NUM_BAUDRATE:
|
||||||
if (transaction->holding_registers[0] < config_baudrates_length)
|
if (transaction->holding_registers[0] < config_baudrates_length)
|
||||||
{
|
{
|
||||||
sensor_config.baudrate_index = (uint16_t) (transaction->holding_registers[0]);
|
sensor_config.baudrate_index = (uint16_t) (transaction->holding_registers[i]);
|
||||||
baudrate_changed = 1;
|
baudrate_changed = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -735,7 +739,7 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
|
|||||||
return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; /* nothing implemented yet! TODO */
|
return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; /* nothing implemented yet! TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t modbus_transmit_function(uint8_t *buffer, int data_len)
|
int8_t modbus_transmit_function(uint8_t *buffer, uint16_t data_len)
|
||||||
{
|
{
|
||||||
/* TODO */
|
/* TODO */
|
||||||
LPUART1_TX_Buffer(buffer, data_len);
|
LPUART1_TX_Buffer(buffer, data_len);
|
||||||
|
@ -93,7 +93,7 @@ int8_t modbus_copy_reply_to_buffer(uint8_t *buffer, uint8_t *msg_len, modbus_tra
|
|||||||
buffer[4] = (uint8_t) (transaction->register_count >> 8);
|
buffer[4] = (uint8_t) (transaction->register_count >> 8);
|
||||||
buffer[5] = (uint8_t) transaction->register_count;
|
buffer[5] = (uint8_t) transaction->register_count;
|
||||||
*msg_len = 8;
|
*msg_len = 8;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
crc16 = modbus_CRC16(buffer, *msg_len - 2); /* last two bytes is the checksum itself */
|
crc16 = modbus_CRC16(buffer, *msg_len - 2); /* last two bytes is the checksum itself */
|
||||||
|
@ -32,7 +32,7 @@ CO2_alert_limit_1 = 1000
|
|||||||
CO2_alert_limit_2 = 2000
|
CO2_alert_limit_2 = 2000
|
||||||
SCD4x_temperature_offset = 0
|
SCD4x_temperature_offset = 0
|
||||||
MODBUS_address = 254
|
MODBUS_address = 254
|
||||||
baudrate = 0
|
baudrate = 1
|
||||||
registers = [LED_on, LED_brightness, LED_smooth, CO2_alert_limit_1, CO2_alert_limit_2, SCD4x_temperature_offset, MODBUS_address, baudrate]
|
registers = [LED_on, LED_brightness, LED_smooth, CO2_alert_limit_1, CO2_alert_limit_2, SCD4x_temperature_offset, MODBUS_address, baudrate]
|
||||||
# write to holding registers
|
# write to holding registers
|
||||||
print('---- Writing to multiple holding registers ----')
|
print('---- Writing to multiple holding registers ----')
|
||||||
|
Loading…
Reference in New Issue
Block a user