Commit 0f28f3c303cde0d92091ee571c5f807197b8328f
1 parent
73a88a74
Add debug message on unknown function and new unit test
Showing
2 changed files
with
20 additions
and
11 deletions
src/modbus.c
| @@ -1027,7 +1027,8 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -1027,7 +1027,8 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 1027 | 1027 | ||
| 1028 | default: | 1028 | default: |
| 1029 | rsp_length = response_exception( | 1029 | rsp_length = response_exception( |
| 1030 | - ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_FUNCTION, rsp, FALSE, ""); | 1030 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_FUNCTION, rsp, FALSE, |
| 1031 | + "Unknown Modbus function code: 0x%0X\n", function); | ||
| 1031 | break; | 1032 | break; |
| 1032 | } | 1033 | } |
| 1033 | 1034 |
tests/unit-test-client.c
| @@ -457,7 +457,7 @@ int main(int argc, char *argv[]) | @@ -457,7 +457,7 @@ int main(int argc, char *argv[]) | ||
| 457 | uint8_t rsp[MODBUS_RTU_MAX_ADU_LENGTH]; | 457 | uint8_t rsp[MODBUS_RTU_MAX_ADU_LENGTH]; |
| 458 | 458 | ||
| 459 | /* No response in RTU mode */ | 459 | /* No response in RTU mode */ |
| 460 | - printf("1-A/3 No response from slave %d: ", INVALID_SERVER_ID); | 460 | + printf("1-A/4 No response from slave %d: ", INVALID_SERVER_ID); |
| 461 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); | 461 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 462 | 462 | ||
| 463 | /* The slave raises a timeout on a confirmation to ignore because if an | 463 | /* The slave raises a timeout on a confirmation to ignore because if an |
| @@ -472,7 +472,7 @@ int main(int argc, char *argv[]) | @@ -472,7 +472,7 @@ int main(int argc, char *argv[]) | ||
| 472 | modbus_send_raw_request(ctx, raw_rep, RAW_REP_LENGTH * sizeof(uint8_t)); | 472 | modbus_send_raw_request(ctx, raw_rep, RAW_REP_LENGTH * sizeof(uint8_t)); |
| 473 | rc = modbus_receive_confirmation(ctx, rsp); | 473 | rc = modbus_receive_confirmation(ctx, rsp); |
| 474 | 474 | ||
| 475 | - printf("1-B/3 No response from slave %d on indication/confirmation messages: ", | 475 | + printf("1-B/4 No response from slave %d on indication/confirmation messages: ", |
| 476 | INVALID_SERVER_ID); | 476 | INVALID_SERVER_ID); |
| 477 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); | 477 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 478 | 478 | ||
| @@ -480,12 +480,12 @@ int main(int argc, char *argv[]) | @@ -480,12 +480,12 @@ int main(int argc, char *argv[]) | ||
| 480 | modbus_send_raw_request(ctx, raw_invalid_req, RAW_REQ_LENGTH * sizeof(uint8_t)); | 480 | modbus_send_raw_request(ctx, raw_invalid_req, RAW_REQ_LENGTH * sizeof(uint8_t)); |
| 481 | rc = modbus_receive_confirmation(ctx, rsp); | 481 | rc = modbus_receive_confirmation(ctx, rsp); |
| 482 | 482 | ||
| 483 | - printf("1-C/3 No response from slave %d with invalid request: ", | 483 | + printf("1-C/4 No response from slave %d with invalid request: ", |
| 484 | INVALID_SERVER_ID); | 484 | INVALID_SERVER_ID); |
| 485 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); | 485 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 486 | } else { | 486 | } else { |
| 487 | /* Response in TCP mode */ | 487 | /* Response in TCP mode */ |
| 488 | - printf("1/3 Response from slave %d: ", INVALID_SERVER_ID); | 488 | + printf("1/4 Response from slave %d: ", INVALID_SERVER_ID); |
| 489 | ASSERT_TRUE(rc == UT_REGISTERS_NB, ""); | 489 | ASSERT_TRUE(rc == UT_REGISTERS_NB, ""); |
| 490 | } | 490 | } |
| 491 | 491 | ||
| @@ -494,17 +494,25 @@ int main(int argc, char *argv[]) | @@ -494,17 +494,25 @@ int main(int argc, char *argv[]) | ||
| 494 | 494 | ||
| 495 | rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS, | 495 | rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS, |
| 496 | UT_REGISTERS_NB, tab_rp_registers); | 496 | UT_REGISTERS_NB, tab_rp_registers); |
| 497 | - printf("2/3 No reply after a broadcast query: "); | 497 | + printf("2/4 No reply after a broadcast query: "); |
| 498 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); | 498 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 499 | 499 | ||
| 500 | /* Restore slave */ | 500 | /* Restore slave */ |
| 501 | - if (use_backend == RTU) { | ||
| 502 | - modbus_set_slave(ctx, SERVER_ID); | ||
| 503 | - } else { | ||
| 504 | - modbus_set_slave(ctx, MODBUS_TCP_SLAVE); | 501 | + modbus_set_slave(ctx, use_backend == RTU ? SERVER_ID : MODBUS_TCP_SLAVE); |
| 502 | + | ||
| 503 | + { | ||
| 504 | + const int RAW_REQ_LENGTH = 6; | ||
| 505 | + uint8_t raw_req[] = { use_backend == RTU ? SERVER_ID : MODBUS_TCP_SLAVE, 0x42, 0x00, 0x00, 0x00, 0x00 }; | ||
| 506 | + uint8_t rsp[MODBUS_MAX_ADU_LENGTH]; | ||
| 507 | + | ||
| 508 | + rc = modbus_send_raw_request(ctx, raw_req, RAW_REQ_LENGTH * sizeof(uint8_t)); | ||
| 509 | + ASSERT_TRUE(rc != -1, "Unable to send raw request with invalid function code"); | ||
| 510 | + rc = modbus_receive_confirmation(ctx, rsp); | ||
| 511 | + printf("3/4 Raise an exception on unknown function code: "); | ||
| 512 | + ASSERT_TRUE(rc == -1, ""); | ||
| 505 | } | 513 | } |
| 506 | 514 | ||
| 507 | - printf("3/3 Response with an invalid TID or slave: "); | 515 | + printf("4/4 Response with an invalid TID or slave: "); |
| 508 | rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS_INVALID_TID_OR_SLAVE, | 516 | rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS_INVALID_TID_OR_SLAVE, |
| 509 | 1, tab_rp_registers); | 517 | 1, tab_rp_registers); |
| 510 | ASSERT_TRUE(rc == -1, ""); | 518 | ASSERT_TRUE(rc == -1, ""); |