Commit 53c93ae21370291ee1c0542a359e9260e23cd6a5
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
Showing
2 changed files
with
52 additions
and
55 deletions
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 "C" { | @@ -42,6 +42,10 @@ extern "C" { | ||
| 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 |