From 4b5e974043c85a73ed0e20011dddbff0e4d362db Mon Sep 17 00:00:00 2001 From: aleks Date: Thu, 8 Jun 2023 09:25:16 +0200 Subject: [PATCH] modbus master fix event loop and kconfig --- Kconfig | 8 +++--- freemodbus/port/port.h | 4 +++ .../modbus_controller/mbc_serial_master.c | 24 ++++++++--------- .../modbus_controller/mbc_tcp_master.c | 27 ++++++++++--------- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/Kconfig b/Kconfig index 4c7eed8..134bad0 100644 --- a/Kconfig +++ b/Kconfig @@ -57,8 +57,8 @@ menu "Modbus configuration" config FMB_MASTER_TIMEOUT_MS_RESPOND int "Slave respond timeout (Milliseconds)" - default 150 - range 50 3000 + default 3000 + range 150 15000 help If master sends a frame which is not broadcast, it has to wait sometime for slave response. if slave is not respond in this time, the master will process timeout error. @@ -66,7 +66,7 @@ menu "Modbus configuration" config FMB_MASTER_DELAY_MS_CONVERT int "Slave conversion delay (Milliseconds)" default 200 - range 50 400 + range 150 2000 help If master sends a broadcast frame, it has to wait conversion time to delay, then master can send next frame. @@ -107,7 +107,7 @@ menu "Modbus configuration" config FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS int "Response timeout for ASCII communication mode (ms)" default 1000 - range 300 2000 + range 200 5000 depends on FMB_COMM_MODE_ASCII_EN help This option defines response timeout of slave in milliseconds for ASCII communication mode. diff --git a/freemodbus/port/port.h b/freemodbus/port/port.h index b5d8858..ffdb3b5 100644 --- a/freemodbus/port/port.h +++ b/freemodbus/port/port.h @@ -91,6 +91,10 @@ #define MB_TCP_SEND_TIMEOUT (pdMS_TO_TICKS(MB_TCP_SEND_TIMEOUT_MS)) #define MB_TCP_PORT_MAX_CONN (CONFIG_FMB_TCP_PORT_MAX_CONN) +// Set the API unlock time to maximum response time +// The actual release time will be dependent on the timer time +#define MB_MAX_RESPONSE_TIME_MS (5000) + #define MB_TCP_FRAME_LOG_BUFSIZE (256) #define MB_PORT_HAS_CLOSE (1) // Define to explicitly close port on destroy diff --git a/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/freemodbus/serial_master/modbus_controller/mbc_serial_master.c index 7d9e716..ae24e04 100644 --- a/freemodbus/serial_master/modbus_controller/mbc_serial_master.c +++ b/freemodbus/serial_master/modbus_controller/mbc_serial_master.c @@ -27,8 +27,8 @@ extern BOOL xMBMasterPortSerialTxPoll(void); /*-----------------------Master mode use these variables----------------------*/ -#define MB_RESPONSE_TICS pdMS_TO_TICKS(CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND + 10) - +// Actual wait time depends on the response timer +#define MB_SERIAL_API_RESP_TICS (pdMS_TO_TICKS(MB_MAX_RESPONSE_TIME_MS)) static mb_master_interface_t* mbm_interface_ptr = NULL; static const char *TAG = "MB_CONTROLLER_MASTER"; @@ -176,7 +176,7 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY; esp_err_t error = ESP_FAIL; - if (xMBMasterRunResTake(MB_RESPONSE_TICS)) { + if (xMBMasterRunResTake(MB_SERIAL_API_RESP_TICS)) { uint8_t mb_slave_addr = request->slave_addr; uint8_t mb_command = request->command; @@ -194,43 +194,43 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi { case MB_FUNC_READ_COILS: mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size , (LONG)MB_RESPONSE_TICS ); + (USHORT)mb_size , (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_WRITE_SINGLE_COIL: mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS ); + *(USHORT*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_WRITE_MULTIPLE_COILS: mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (UCHAR*)data_ptr, (LONG)MB_RESPONSE_TICS); + (USHORT)mb_size, (UCHAR*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS); break; case MB_FUNC_READ_DISCRETE_INPUTS: mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_RESPONSE_TICS ); + (USHORT)mb_size, (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_READ_HOLDING_REGISTER: mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_RESPONSE_TICS ); + (USHORT)mb_size, (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_WRITE_REGISTER: mb_error = eMBMasterReqWriteHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS ); + *(USHORT*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_WRITE_MULTIPLE_REGISTERS: mb_error = eMBMasterReqWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, (USHORT)mb_size, - (USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS ); + (USHORT*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_READWRITE_MULTIPLE_REGISTERS: mb_error = eMBMasterReqReadWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, (USHORT)mb_size, (USHORT*)data_ptr, (USHORT)mb_offset, (USHORT)mb_size, - (LONG)MB_RESPONSE_TICS ); + (LONG)MB_SERIAL_API_RESP_TICS ); break; case MB_FUNC_READ_INPUT_REGISTER: mb_error = eMBMasterReqReadInputRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG) MB_RESPONSE_TICS ); + (USHORT)mb_size, (LONG) MB_SERIAL_API_RESP_TICS ); break; default: ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ", __FUNCTION__, (unsigned)mb_command); diff --git a/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c b/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c index c03e5e8..c24683a 100644 --- a/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c +++ b/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c @@ -29,9 +29,10 @@ /*-----------------------Master mode use these variables----------------------*/ -// The response time is average processing time + data transmission -#define MB_RESPONSE_TIMEOUT pdMS_TO_TICKS(CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND) -#define MB_TCP_CONNECTION_TOUT pdMS_TO_TICKS(CONFIG_FMB_TCP_CONNECTION_TOUT_SEC * 1000) +#define MB_TCP_CONNECTION_TOUT (pdMS_TO_TICKS(CONFIG_FMB_TCP_CONNECTION_TOUT_SEC * 1000)) + +// Actual wait time depends on the response timer +#define MB_TCP_API_RESP_TICS (pdMS_TO_TICKS(MB_MAX_RESPONSE_TIME_MS)) static mb_master_interface_t* mbm_interface_ptr = NULL; static const char *TAG = "MB_CONTROLLER_MASTER"; @@ -257,7 +258,7 @@ static esp_err_t mbc_tcp_master_send_request(mb_param_request_t* request, void* eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY; esp_err_t error = ESP_FAIL; - if (xMBMasterRunResTake(MB_RESPONSE_TIMEOUT)) { + if (xMBMasterRunResTake(MB_TCP_API_RESP_TICS)) { uint8_t mb_slave_addr = request->slave_addr; uint8_t mb_command = request->command; @@ -275,44 +276,44 @@ static esp_err_t mbc_tcp_master_send_request(mb_param_request_t* request, void* { case MB_FUNC_READ_COILS: mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT); + (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_WRITE_SINGLE_COIL: mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT); + *(USHORT *)data_ptr, (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_WRITE_MULTIPLE_COILS: mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, (USHORT)mb_size, (UCHAR *)data_ptr, - (LONG)MB_RESPONSE_TIMEOUT); + (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_READ_DISCRETE_INPUTS: mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT); + (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_READ_HOLDING_REGISTER: mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT); + (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_WRITE_REGISTER: mb_error = eMBMasterReqWriteHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT); + *(USHORT *)data_ptr, (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_WRITE_MULTIPLE_REGISTERS: mb_error = eMBMasterReqWriteMultipleHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, (USHORT)mb_size, - (USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT); + (USHORT *)data_ptr, (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_READWRITE_MULTIPLE_REGISTERS: mb_error = eMBMasterReqReadWriteMultipleHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, (USHORT)mb_size, (USHORT *)data_ptr, (USHORT)mb_offset, (USHORT)mb_size, - (LONG)MB_RESPONSE_TIMEOUT); + (LONG)MB_TCP_API_RESP_TICS); break; case MB_FUNC_READ_INPUT_REGISTER: mb_error = eMBMasterReqReadInputRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT); + (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); break; default: ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ", __FUNCTION__, (unsigned)mb_command);