Commit 53c93ae21370291ee1c0542a359e9260e23cd6a5

Authored by Stéphane Raimbault
1 parent 10263cd1

Fix - Check the return value of modbus_check_response

- reduce the number of variables to store return values (status,
  query_ret and response_ret -> ret)
- add some comments
modbus/modbus.c
@@ -453,7 +453,8 @@ static int compute_query_length_data(modbus_param_t *mb_param, uint8_t *msg) @@ -453,7 +453,8 @@ static int compute_query_length_data(modbus_param_t *mb_param, uint8_t *msg)
453 from a modbus master. 453 from a modbus master.
454 This function blocks for timeout seconds if there is no reply. 454 This function blocks for timeout seconds if there is no reply.
455 455
456 - msg_length_computed must be set to MSG_LENGTH_COMPUTED if undefined 456 + - msg is an array of uint8_t to receive the message
  457 + - msg_length_computed must be set to MSG_LENGTH_UNDEFINED if undefined
457 458
458 Returns a negative number if an error occured. 459 Returns a negative number if an error occured.
459 The variable msg_length is assigned to the number of characters 460 The variable msg_length is assigned to the number of characters
@@ -491,7 +492,7 @@ int receive_msg(modbus_param_t *mb_param, @@ -491,7 +492,7 @@ int receive_msg(modbus_param_t *mb_param,
491 /* The message length is undefined (query receiving) so 492 /* The message length is undefined (query receiving) so
492 * we need to analyse the message step by step. 493 * we need to analyse the message step by step.
493 * At the first step, we want to reach the function 494 * At the first step, we want to reach the function
494 - * code because all packets have this information. */ 495 + * code because all packets have that information. */
495 msg_length_computed = mb_param->header_length + 2; 496 msg_length_computed = mb_param->header_length + 2;
496 state = FUNCTION; 497 state = FUNCTION;
497 } else { 498 } else {
@@ -588,7 +589,7 @@ int receive_msg(modbus_param_t *mb_param, @@ -588,7 +589,7 @@ int receive_msg(modbus_param_t *mb_param,
588 } 589 }
589 590
590 591
591 -/* Checks whether the right response is returned with good checksum. 592 +/* Checks the right response is returned with good checksum.
592 593
593 Returns: 594 Returns:
594 - the numbers of values (bits or word) if success 595 - the numbers of values (bits or word) if success
@@ -609,7 +610,8 @@ static int modbus_check_response(modbus_param_t *mb_param, @@ -609,7 +610,8 @@ static int modbus_check_response(modbus_param_t *mb_param,
609 ret = receive_msg(mb_param, response_length_computed, 610 ret = receive_msg(mb_param, response_length_computed,
610 response, &response_length); 611 response, &response_length);
611 if (ret == 0) { 612 if (ret == 0) {
612 - /* Good response */ 613 + /* GOOD RESPONSE */
  614 +
613 switch (response[offset + 1]) { 615 switch (response[offset + 1]) {
614 case FC_READ_COIL_STATUS: 616 case FC_READ_COIL_STATUS:
615 case FC_READ_INPUT_STATUS: 617 case FC_READ_INPUT_STATUS:
@@ -637,6 +639,8 @@ static int modbus_check_response(modbus_param_t *mb_param, @@ -637,6 +639,8 @@ static int modbus_check_response(modbus_param_t *mb_param,
637 639
638 } else if (ret == COMM_TIME_OUT && 640 } else if (ret == COMM_TIME_OUT &&
639 response_length == offset + 3 + mb_param->checksum_length) { 641 response_length == offset + 3 + mb_param->checksum_length) {
  642 + /* EXCEPTION CODE RECEIVED */
  643 +
640 /* Optimization allowed because exception response is 644 /* Optimization allowed because exception response is
641 the smallest trame in modbus protocol (3) so always 645 the smallest trame in modbus protocol (3) so always
642 raise a timeout error */ 646 raise a timeout error */
@@ -675,9 +679,11 @@ static int modbus_check_response(modbus_param_t *mb_param, @@ -675,9 +679,11 @@ static int modbus_check_response(modbus_param_t *mb_param,
675 } 679 }
676 } 680 }
677 } else if (ret == COMM_TIME_OUT) { 681 } else if (ret == COMM_TIME_OUT) {
  682 + /* COMMUNICATION TIME OUT */
678 error_treat(mb_param, ret, "Communication time out"); 683 error_treat(mb_param, ret, "Communication time out");
679 return ret; 684 return ret;
680 } else { 685 } else {
  686 + /* OTHER */
681 return ret; 687 return ret;
682 } 688 }
683 689
@@ -929,9 +935,8 @@ int modbus_listen(modbus_param_t *mb_param, uint8_t *query, int *query_length) @@ -929,9 +935,8 @@ int modbus_listen(modbus_param_t *mb_param, uint8_t *query, int *query_length)
929 static int read_io_status(modbus_param_t *mb_param, int slave, int function, 935 static int read_io_status(modbus_param_t *mb_param, int slave, int function,
930 int start_addr, int nb, uint8_t *data_dest) 936 int start_addr, int nb, uint8_t *data_dest)
931 { 937 {
  938 + int ret;
932 int query_length; 939 int query_length;
933 - int query_ret;  
934 - int response_ret;  
935 940
936 uint8_t query[MIN_QUERY_LENGTH]; 941 uint8_t query[MIN_QUERY_LENGTH];
937 uint8_t response[MAX_MESSAGE_LENGTH]; 942 uint8_t response[MAX_MESSAGE_LENGTH];
@@ -939,18 +944,21 @@ static int read_io_status(modbus_param_t *mb_param, int slave, int function, @@ -939,18 +944,21 @@ static int read_io_status(modbus_param_t *mb_param, int slave, int function,
939 query_length = build_query_basis(mb_param, slave, function, 944 query_length = build_query_basis(mb_param, slave, function,
940 start_addr, nb, query); 945 start_addr, nb, query);
941 946
942 - query_ret = modbus_send(mb_param, query, query_length);  
943 - if (query_ret > 0) { 947 + ret = modbus_send(mb_param, query, query_length);
  948 + if (ret > 0) {
944 int i, temp, bit; 949 int i, temp, bit;
945 int pos = 0; 950 int pos = 0;
946 int processed = 0; 951 int processed = 0;
947 int offset; 952 int offset;
948 int offset_length; 953 int offset_length;
949 954
950 - response_ret = modbus_check_response(mb_param, query, response); 955 + ret = modbus_check_response(mb_param, query, response);
  956 + if (ret < 0)
  957 + return ret;
  958 +
951 offset = mb_param->header_length; 959 offset = mb_param->header_length;
952 960
953 - offset_length = offset + response_ret; 961 + offset_length = offset + ret;
954 for (i = offset; i < offset_length; i++) { 962 for (i = offset; i < offset_length; i++) {
955 /* Shift reg hi_byte to temp */ 963 /* Shift reg hi_byte to temp */
956 temp = response[3 + i]; 964 temp = response[3 + i];
@@ -962,11 +970,9 @@ static int read_io_status(modbus_param_t *mb_param, int slave, int function, @@ -962,11 +970,9 @@ static int read_io_status(modbus_param_t *mb_param, int slave, int function,
962 } 970 }
963 971
964 } 972 }
965 - } else {  
966 - response_ret = query_ret;  
967 } 973 }
968 974
969 - return response_ret; 975 + return ret;
970 } 976 }
971 977
972 /* Reads the boolean status of coils and sets the array elements 978 /* Reads the boolean status of coils and sets the array elements
@@ -1017,9 +1023,8 @@ int read_input_status(modbus_param_t *mb_param, int slave, int start_addr, @@ -1017,9 +1023,8 @@ int read_input_status(modbus_param_t *mb_param, int slave, int start_addr,
1017 static int read_registers(modbus_param_t *mb_param, int slave, int function, 1023 static int read_registers(modbus_param_t *mb_param, int slave, int function,
1018 int start_addr, int nb, uint16_t *data_dest) 1024 int start_addr, int nb, uint16_t *data_dest)
1019 { 1025 {
  1026 + int ret;
1020 int query_length; 1027 int query_length;
1021 - int status;  
1022 - int query_ret;  
1023 uint8_t query[MIN_QUERY_LENGTH]; 1028 uint8_t query[MIN_QUERY_LENGTH];
1024 1029
1025 if (nb > MAX_REGISTERS) { 1030 if (nb > MAX_REGISTERS) {
@@ -1031,13 +1036,11 @@ static int read_registers(modbus_param_t *mb_param, int slave, int function, @@ -1031,13 +1036,11 @@ static int read_registers(modbus_param_t *mb_param, int slave, int function,
1031 query_length = build_query_basis(mb_param, slave, function, 1036 query_length = build_query_basis(mb_param, slave, function,
1032 start_addr, nb, query); 1037 start_addr, nb, query);
1033 1038
1034 - query_ret = modbus_send(mb_param, query, query_length);  
1035 - if (query_ret > 0)  
1036 - status = read_reg_response(mb_param, data_dest, query);  
1037 - else  
1038 - status = query_ret; 1039 + ret = modbus_send(mb_param, query, query_length);
  1040 + if (ret > 0)
  1041 + ret = read_reg_response(mb_param, data_dest, query);
1039 1042
1040 - return status; 1043 + return ret;
1041 } 1044 }
1042 1045
1043 /* Reads the holding registers in a slave and put the data into an 1046 /* Reads the holding registers in a slave and put the data into an
@@ -1116,21 +1119,18 @@ static int preset_response(modbus_param_t *mb_param, uint8_t *query) @@ -1116,21 +1119,18 @@ static int preset_response(modbus_param_t *mb_param, uint8_t *query)
1116 static int set_single(modbus_param_t *mb_param, int slave, int function, 1119 static int set_single(modbus_param_t *mb_param, int slave, int function,
1117 int addr, int value) 1120 int addr, int value)
1118 { 1121 {
1119 - int status; 1122 + int ret;
1120 int query_length; 1123 int query_length;
1121 - int query_ret;  
1122 uint8_t query[MAX_MESSAGE_LENGTH]; 1124 uint8_t query[MAX_MESSAGE_LENGTH];
1123 1125
1124 query_length = build_query_basis(mb_param, slave, function, 1126 query_length = build_query_basis(mb_param, slave, function,
1125 addr, value, query); 1127 addr, value, query);
1126 1128
1127 - query_ret = modbus_send(mb_param, query, query_length);  
1128 - if (query_ret > 0)  
1129 - status = preset_response(mb_param, query);  
1130 - else  
1131 - status = query_ret; 1129 + ret = modbus_send(mb_param, query, query_length);
  1130 + if (ret > 0)
  1131 + ret = preset_response(mb_param, query);
1132 1132
1133 - return status; 1133 + return ret;
1134 } 1134 }
1135 1135
1136 1136
@@ -1166,12 +1166,11 @@ int force_multiple_coils(modbus_param_t *mb_param, int slave, @@ -1166,12 +1166,11 @@ int force_multiple_coils(modbus_param_t *mb_param, int slave,
1166 int start_addr, int nb, 1166 int start_addr, int nb,
1167 const uint8_t *data_src) 1167 const uint8_t *data_src)
1168 { 1168 {
  1169 + int ret;
1169 int i; 1170 int i;
1170 int byte_count; 1171 int byte_count;
1171 int query_length; 1172 int query_length;
1172 int coil_check = 0; 1173 int coil_check = 0;
1173 - int status;  
1174 - int query_ret;  
1175 int pos = 0; 1174 int pos = 0;
1176 1175
1177 uint8_t query[MAX_MESSAGE_LENGTH]; 1176 uint8_t query[MAX_MESSAGE_LENGTH];
@@ -1205,13 +1204,11 @@ int force_multiple_coils(modbus_param_t *mb_param, int slave, @@ -1205,13 +1204,11 @@ int force_multiple_coils(modbus_param_t *mb_param, int slave,
1205 query_length++; 1204 query_length++;
1206 } 1205 }
1207 1206
1208 - query_ret = modbus_send(mb_param, query, query_length);  
1209 - if (query_ret > 0)  
1210 - status = preset_response(mb_param, query);  
1211 - else  
1212 - status = query_ret; 1207 + ret = modbus_send(mb_param, query, query_length);
  1208 + if (ret > 0)
  1209 + ret = preset_response(mb_param, query);
1213 1210
1214 - return status; 1211 + return ret;
1215 } 1212 }
1216 1213
1217 /* Copies the values in the slave from the array given in argument */ 1214 /* Copies the values in the slave from the array given in argument */
@@ -1219,11 +1216,10 @@ int preset_multiple_registers(modbus_param_t *mb_param, int slave, @@ -1219,11 +1216,10 @@ int preset_multiple_registers(modbus_param_t *mb_param, int slave,
1219 int start_addr, int nb, 1216 int start_addr, int nb,
1220 const uint16_t *data_src) 1217 const uint16_t *data_src)
1221 { 1218 {
  1219 + int ret;
1222 int i; 1220 int i;
1223 int query_length; 1221 int query_length;
1224 int byte_count; 1222 int byte_count;
1225 - int status;  
1226 - int query_ret;  
1227 1223
1228 uint8_t query[MAX_MESSAGE_LENGTH]; 1224 uint8_t query[MAX_MESSAGE_LENGTH];
1229 1225
@@ -1244,22 +1240,19 @@ int preset_multiple_registers(modbus_param_t *mb_param, int slave, @@ -1244,22 +1240,19 @@ int preset_multiple_registers(modbus_param_t *mb_param, int slave,
1244 query[query_length++] = data_src[i] & 0x00FF; 1240 query[query_length++] = data_src[i] & 0x00FF;
1245 } 1241 }
1246 1242
1247 - query_ret = modbus_send(mb_param, query, query_length);  
1248 - if (query_ret > 0)  
1249 - status = preset_response(mb_param, query);  
1250 - else  
1251 - status = query_ret; 1243 + ret = modbus_send(mb_param, query, query_length);
  1244 + if (ret > 0)
  1245 + ret = preset_response(mb_param, query);
1252 1246
1253 - return status; 1247 + return ret;
1254 } 1248 }
1255 1249
1256 /* Returns the slave id! */ 1250 /* Returns the slave id! */
1257 int report_slave_id(modbus_param_t *mb_param, int slave, 1251 int report_slave_id(modbus_param_t *mb_param, int slave,
1258 uint8_t *data_dest) 1252 uint8_t *data_dest)
1259 { 1253 {
  1254 + int ret;
1260 int query_length; 1255 int query_length;
1261 - int query_ret;  
1262 - int response_ret;  
1263 1256
1264 uint8_t query[MIN_QUERY_LENGTH]; 1257 uint8_t query[MIN_QUERY_LENGTH];
1265 uint8_t response[MAX_MESSAGE_LENGTH]; 1258 uint8_t response[MAX_MESSAGE_LENGTH];
@@ -1270,26 +1263,26 @@ int report_slave_id(modbus_param_t *mb_param, int slave, @@ -1270,26 +1263,26 @@ int report_slave_id(modbus_param_t *mb_param, int slave,
1270 /* start_addr and count are not used */ 1263 /* start_addr and count are not used */
1271 query_length -= 4; 1264 query_length -= 4;
1272 1265
1273 - query_ret = modbus_send(mb_param, query, query_length);  
1274 - if (query_ret > 0) { 1266 + ret = modbus_send(mb_param, query, query_length);
  1267 + if (ret > 0) {
1275 int i; 1268 int i;
1276 int offset; 1269 int offset;
1277 int offset_length; 1270 int offset_length;
1278 1271
1279 /* Byte count, slave id, run indicator status, 1272 /* Byte count, slave id, run indicator status,
1280 additional data */ 1273 additional data */
1281 - response_ret = modbus_check_response(mb_param, query, response);  
1282 - 1274 + ret = modbus_check_response(mb_param, query, response);
  1275 + if (ret < 0)
  1276 + return ret;
  1277 +
1283 offset = mb_param->header_length; 1278 offset = mb_param->header_length;
1284 - offset_length = offset + response_ret; 1279 + offset_length = offset + ret;
1285 1280
1286 for (i = offset; i < offset_length; i++) 1281 for (i = offset; i < offset_length; i++)
1287 data_dest[i] = response[i]; 1282 data_dest[i] = response[i];
1288 - } else {  
1289 - response_ret = query_ret;  
1290 } 1283 }
1291 1284
1292 - return response_ret; 1285 + return ret;
1293 } 1286 }
1294 1287
1295 /* Initializes the modbus_param_t structure for RTU 1288 /* Initializes the modbus_param_t structure for RTU
modbus/modbus.h
@@ -42,6 +42,10 @@ extern &quot;C&quot; { @@ -42,6 +42,10 @@ extern &quot;C&quot; {
42 /* 8 + HEADER_LENGTH_TCP */ 42 /* 8 + HEADER_LENGTH_TCP */
43 #define MIN_QUERY_LENGTH 14 43 #define MIN_QUERY_LENGTH 14
44 44
  45 +/* Page 102, Application Notes of PI–MBUS–300:
  46 + * The maximum length of the entire message must not exceed 256
  47 + * bytes.
  48 + */
45 #define MAX_MESSAGE_LENGTH 256 49 #define MAX_MESSAGE_LENGTH 256
46 50
47 #define MAX_STATUS 800 51 #define MAX_STATUS 800