Commit bbcc2438bc23954815c2a3cdcc848050671c2b0d
1 parent
ee012c8a
Fix #211460 reported by Todd Denniston
With TCP, automatic reconnect on error may not be desired. It's now possible to adjust the error handling mode.
Showing
3 changed files
with
66 additions
and
5 deletions
NEWS
| 1 | +libmodbus 1.9.x | ||
| 2 | +- Slave API | ||
| 3 | + https://blueprints.launchpad.net/libmodbus/+spec/slave-api | ||
| 4 | +- Waf build support | ||
| 5 | + https://blueprints.launchpad.net/libmodbus/+spec/waf-support | ||
| 6 | +- MacOS X support by Matthew Butch | ||
| 7 | + https://blueprints.launchpad.net/libmodbus/+spec/macosx-support | ||
| 8 | +- No more glib dependency | ||
| 9 | + https://blueprints.launchpad.net/libmodbus/+spec/glib-dependency | ||
| 10 | +- Fix #159443 reported by Stefan Bisanz | ||
| 11 | + Index of incoming data in force multiple coils function | ||
| 12 | +- Fix #161989 reported by Konstantinos Togias | ||
| 13 | + Serial device paths more than 10 chars long (eg. /dev/ttyUSB0) don't | ||
| 14 | + fit to modbus_param_t -> device char[11] var. | ||
| 15 | +- Fix #188189 reported by Chris Hellyar | ||
| 16 | + Compute_response_size() no entry for read_input_status() | ||
| 17 | +- Fix #191039 reported by Todd Denniston | ||
| 18 | + modbus.h is not installed at prefix. | ||
| 19 | +- Fix #211460 reported by Todd Denniston | ||
| 20 | + With TCP, automatic reconnect on error may not be desired. | ||
| 21 | + | ||
| 1 | libmodbus 1.2.4 (2008-03-14) | 22 | libmodbus 1.2.4 (2008-03-14) |
| 2 | - Fix #191039 reported by Todd Denniston | 23 | - Fix #191039 reported by Todd Denniston |
| 3 | modbus.h is not installed at prefix. | 24 | modbus.h is not installed at prefix. |
| @@ -9,18 +30,18 @@ libmodbus 1.2.3 (2008-02-03) | @@ -9,18 +30,18 @@ libmodbus 1.2.3 (2008-02-03) | ||
| 9 | Slave address in build_request_packet_tcp() is hardcoded as 0xFF. | 30 | Slave address in build_request_packet_tcp() is hardcoded as 0xFF. |
| 10 | 31 | ||
| 11 | libmodbus 1.2.2 (2007-11-12) | 32 | libmodbus 1.2.2 (2007-11-12) |
| 12 | -- Fix #161989 (Konstantinos Togias) | 33 | +- Fix #161989 reported by Konstantinos Togias |
| 13 | Serial device paths more than 10 chars long (eg. /dev/ttyUSB0) don't | 34 | Serial device paths more than 10 chars long (eg. /dev/ttyUSB0) don't |
| 14 | fit to modbus_param_t -> device char[11] var. | 35 | fit to modbus_param_t -> device char[11] var. |
| 15 | - Structure is also bit better 'packed' to conserve memory (see the | 36 | - Structure is also bit better 'packed' to conserve memory (see the |
| 16 | trunk for a real enhancement). | 37 | trunk for a real enhancement). |
| 17 | 38 | ||
| 18 | libmodbus 1.2.1 (2007-11-02) | 39 | libmodbus 1.2.1 (2007-11-02) |
| 19 | -- Fix #159443 (Stefan Bisanz) | 40 | +- Fix #159443 reported by Stefan Bisanz |
| 20 | Index of incoming data in force multiple coils function | 41 | Index of incoming data in force multiple coils function |
| 21 | - Deleted useless code in check_crc16() | 42 | - Deleted useless code in check_crc16() |
| 22 | - Untabify source code | 43 | - Untabify source code |
| 23 | -- Changed author's email (Stéphane Raimbault) | 44 | +- Changed author's email to Stéphane Raimbault |
| 24 | 45 | ||
| 25 | libmodbus 1.2.0 (2007-05-10) | 46 | libmodbus 1.2.0 (2007-05-10) |
| 26 | - FIX Compilation GCC-4.0 | 47 | - FIX Compilation GCC-4.0 |
modbus/modbus.c
| @@ -148,8 +148,10 @@ static void error_treat(int ret, const char *string, modbus_param_t *mb_param) | @@ -148,8 +148,10 @@ static void error_treat(int ret, const char *string, modbus_param_t *mb_param) | ||
| 148 | if (mb_param->type_com == RTU) { | 148 | if (mb_param->type_com == RTU) { |
| 149 | tcflush(mb_param->fd, TCIOFLUSH); | 149 | tcflush(mb_param->fd, TCIOFLUSH); |
| 150 | } else { | 150 | } else { |
| 151 | - modbus_close(mb_param); | ||
| 152 | - modbus_connect(mb_param); | 151 | + if (mb_param->error_handling == RECONNECT_ON_ERROR) { |
| 152 | + modbus_close(mb_param); | ||
| 153 | + modbus_connect(mb_param); | ||
| 154 | + } | ||
| 153 | } | 155 | } |
| 154 | } | 156 | } |
| 155 | 157 | ||
| @@ -1168,6 +1170,28 @@ void modbus_init_tcp(modbus_param_t *mb_param, char *ip, uint16_t port) | @@ -1168,6 +1170,28 @@ void modbus_init_tcp(modbus_param_t *mb_param, char *ip, uint16_t port) | ||
| 1168 | mb_param->type_com = TCP; | 1170 | mb_param->type_com = TCP; |
| 1169 | mb_param->header_length = HEADER_LENGTH_TCP; | 1171 | mb_param->header_length = HEADER_LENGTH_TCP; |
| 1170 | mb_param->checksum_size = CHECKSUM_SIZE_TCP; | 1172 | mb_param->checksum_size = CHECKSUM_SIZE_TCP; |
| 1173 | + mb_param->error_handling = RECONNECT_ON_ERROR; | ||
| 1174 | +} | ||
| 1175 | + | ||
| 1176 | +/* By default, the error handling mode used is RECONNECT_ON_ERROR. | ||
| 1177 | + | ||
| 1178 | + With RECONNECT_ON_ERROR, the library will attempt an immediate | ||
| 1179 | + reconnection which may hang for several seconds if the network to | ||
| 1180 | + the remote target unit is down. | ||
| 1181 | + | ||
| 1182 | + With NOP_ON_ERROR, it is expected that the application will | ||
| 1183 | + check for network error returns and deal with them as necessary. | ||
| 1184 | + | ||
| 1185 | + This function is only useful in TCP mode. | ||
| 1186 | +*/ | ||
| 1187 | +void modbus_set_error_handling(modbus_param_t *mb_param, error_handling_t error_handling) | ||
| 1188 | +{ | ||
| 1189 | + if (error_handling == RECONNECT_ON_ERROR || | ||
| 1190 | + error_handling == NOP_ON_ERROR) { | ||
| 1191 | + mb_param->error_handling = error_handling; | ||
| 1192 | + } else { | ||
| 1193 | + printf("Invalid setting for error handling (not changed)\n"); | ||
| 1194 | + } | ||
| 1171 | } | 1195 | } |
| 1172 | 1196 | ||
| 1173 | 1197 |
modbus/modbus.h
| @@ -108,6 +108,7 @@ | @@ -108,6 +108,7 @@ | ||
| 108 | #define MSG_SIZE_UNDEFINED -1 | 108 | #define MSG_SIZE_UNDEFINED -1 |
| 109 | 109 | ||
| 110 | typedef enum { RTU, TCP } type_com_t; | 110 | typedef enum { RTU, TCP } type_com_t; |
| 111 | +typedef enum { RECONNECT_ON_ERROR, NOP_ON_ERROR } error_handling_t; | ||
| 111 | 112 | ||
| 112 | /* This structure is byte-aligned */ | 113 | /* This structure is byte-aligned */ |
| 113 | typedef struct { | 114 | typedef struct { |
| @@ -148,6 +149,8 @@ typedef struct { | @@ -148,6 +149,8 @@ typedef struct { | ||
| 148 | int header_length; | 149 | int header_length; |
| 149 | /* Checksum size RTU = 2 and TCP = 0 */ | 150 | /* Checksum size RTU = 2 and TCP = 0 */ |
| 150 | int checksum_size; | 151 | int checksum_size; |
| 152 | + /* In error_treat with TCP, do a reconnect or just dump the error */ | ||
| 153 | + error_handling_t error_handling; | ||
| 151 | } modbus_param_t; | 154 | } modbus_param_t; |
| 152 | 155 | ||
| 153 | typedef struct { | 156 | typedef struct { |
| @@ -229,6 +232,19 @@ void modbus_init_rtu(modbus_param_t *mb_param, char *device, | @@ -229,6 +232,19 @@ void modbus_init_rtu(modbus_param_t *mb_param, char *device, | ||
| 229 | */ | 232 | */ |
| 230 | void modbus_init_tcp(modbus_param_t *mb_param, char *ip_address, uint16_t port); | 233 | void modbus_init_tcp(modbus_param_t *mb_param, char *ip_address, uint16_t port); |
| 231 | 234 | ||
| 235 | +/* By default, the error handling mode used is RECONNECT_ON_ERROR. | ||
| 236 | + | ||
| 237 | + With RECONNECT_ON_ERROR, the library will attempt an immediate | ||
| 238 | + reconnection which may hang for several seconds if the network to | ||
| 239 | + the remote target unit is down. | ||
| 240 | + | ||
| 241 | + With NOP_ON_ERROR, it is expected that the application will | ||
| 242 | + check for network error returns and deal with them as necessary. | ||
| 243 | + | ||
| 244 | + This function is only useful in TCP mode. | ||
| 245 | + */ | ||
| 246 | +void modbus_set_error_handling(modbus_param_t *mb_param, error_handling_t error_handling); | ||
| 247 | + | ||
| 232 | /* Sets up a serial port for RTU communications to modbus or a TCP | 248 | /* Sets up a serial port for RTU communications to modbus or a TCP |
| 233 | connexion */ | 249 | connexion */ |
| 234 | int modbus_connect(modbus_param_t *mb_param); | 250 | int modbus_connect(modbus_param_t *mb_param); |