Commit 9be43128074c94a40231d5bd11265025eb61d5bd

Authored by Stéphane Raimbault
1 parent 02f16fd4

Enhance error management.

Showing 1 changed file with 33 additions and 24 deletions
modbus/modbus.c
... ... @@ -136,18 +136,24 @@ static int read_reg_response(modbus_param_t *mb_param,
136 136 /* Treats errors and flush or close connection if necessary */
137 137 static void error_treat(int code, const char *string, modbus_param_t *mb_param)
138 138 {
139   - if (code == -1)
140   - perror(string);
141   - printf("\n\nERROR %s\n\n", string);
142   -
143   - // FIXME Filter on code
  139 + // FIXME restore perror management
  140 + // if (code 0)
  141 + // perror(string);
  142 + printf("\n\nERROR %s (%.2X)\n\n", string, code);
144 143  
145 144 if (mb_param->error_handling == FLUSH_OR_RECONNECT_ON_ERROR) {
146   - if (mb_param->type_com == RTU) {
147   - tcflush(mb_param->fd, TCIOFLUSH);
148   - } else {
149   - modbus_close(mb_param);
150   - modbus_connect(mb_param);
  145 + switch (code) {
  146 + case ILLEGAL_DATA_VALUE:
  147 + case ILLEGAL_DATA_ADDRESS:
  148 + case ILLEGAL_FUNCTION:
  149 + break;
  150 + default:
  151 + if (mb_param->type_com == RTU) {
  152 + tcflush(mb_param->fd, TCIOFLUSH);
  153 + } else {
  154 + modbus_close(mb_param);
  155 + modbus_connect(mb_param);
  156 + }
151 157 }
152 158 }
153 159 }
... ... @@ -337,8 +343,8 @@ int check_crc16(modbus_param_t *mb_param,
337 343 char s_error[64];
338 344 sprintf(s_error, "invalid crc received %0X - crc_calc %0X",
339 345 crc_received, crc_calc);
340   - error_treat(0, s_error, mb_param);
341 346 ret = INVALID_CRC;
  347 + error_treat(ret, s_error, mb_param);
342 348 }
343 349 } else {
344 350 /* In TCP, the modbus CRC is not present (see HDLC level) */
... ... @@ -380,8 +386,8 @@ static int modbus_send(modbus_param_t *mb_param, uint8_t *query,
380 386 /* Return the number of bytes written (0 to n)
381 387 or PORT_SOCKET_FAILURE on error */
382 388 if ((write_ret == -1) || (write_ret != query_size)) {
383   - error_treat(write_ret, "Write port/socket failure", mb_param);
384 389 write_ret = PORT_SOCKET_FAILURE;
  390 + error_treat(write_ret, "Write port/socket failure", mb_param);
385 391 }
386 392  
387 393 return write_ret;
... ... @@ -434,7 +440,7 @@ static uint8_t compute_query_size_data(modbus_param_t *mb_param, uint8_t *msg)
434 440 FD_ZERO(&rfds); \
435 441 FD_SET(mb_param->fd, &rfds); \
436 442 } else { \
437   - error_treat(select_ret, "Select failure", mb_param); \
  443 + error_treat(SELECT_FAILURE, "Select failure", mb_param); \
438 444 return SELECT_FAILURE; \
439 445 } \
440 446 } \
... ... @@ -511,7 +517,7 @@ int receive_msg(modbus_param_t *mb_param,
511 517 read_ret = recv(mb_param->fd, p_msg, size_to_read, 0);
512 518  
513 519 if (read_ret == -1) {
514   - error_treat(read_ret, "Read port/socket failure", mb_param);
  520 + error_treat(PORT_SOCKET_FAILURE, "Read port/socket failure", mb_param);
515 521 return PORT_SOCKET_FAILURE;
516 522 } else if (read_ret == 0) {
517 523 printf("Connection closed\n");
... ... @@ -521,7 +527,7 @@ int receive_msg(modbus_param_t *mb_param,
521 527 /* Sums bytes received */
522 528 (*msg_size) += read_ret;
523 529 if ((*msg_size) > MAX_PACKET_SIZE) {
524   - error_treat(0, "Too many datas", mb_param);
  530 + error_treat(TOO_MANY_DATAS, "Too many datas", mb_param);
525 531 return TOO_MANY_DATAS;
526 532 }
527 533  
... ... @@ -641,30 +647,33 @@ static int modbus_check_response(modbus_param_t *mb_param,
641 647 if (ret != 0)
642 648 return ret;
643 649  
644   - /* Check for exception response
645   - 0x80 + function */
  650 + /* Check for exception response.
  651 + 0x80 + function is stored in the exception
  652 + response. */
646 653 if (0x80 + query[offset + 1] == response[offset + 1]) {
647 654  
648   - if (response[offset + 2] < NB_TAB_ERROR_MSG) {
649   - error_treat(0,
  655 + int exception_code = response[offset + 2];
  656 + // FIXME check test
  657 + if (exception_code < NB_TAB_ERROR_MSG) {
  658 + error_treat(-exception_code,
650 659 TAB_ERROR_MSG[response[offset + 2]],
651 660 mb_param);
652   - /* Modbus error code (negative) */
653   - return -response[offset + 2];
  661 + /* Modbus error code is negative */
  662 + return -exception_code;
654 663 } else {
655 664 /* The chances are low to hit this
656 665 case but can avoid a vicious
657 666 segfault */
658 667 char s_error[64];
659 668 sprintf(s_error, "Invalid exception code %d", response[offset + 2]);
660   - error_treat(0, s_error, mb_param);
  669 + error_treat(INVALID_EXCEPTION_CODE, s_error, mb_param);
661 670 free(s_error);
662 671 return INVALID_EXCEPTION_CODE;
663 672 }
664 673 }
665 674 } else if (ret == COMM_TIME_OUT) {
666   - error_treat(0, "Communication time out", mb_param);
667   - return COMM_TIME_OUT;
  675 + error_treat(ret, "Communication time out", mb_param);
  676 + return ret;
668 677 } else {
669 678 return ret;
670 679 }
... ...