From a7c47444b25fc3761138a3bd30770d711b83835e Mon Sep 17 00:00:00 2001 From: woodsnake Date: Sat, 12 Mar 2022 22:39:01 +0100 Subject: [PATCH 01/12] Update modbus.c --- src/modbus.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index e13bd0df7..780ce9a06 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -207,7 +207,7 @@ static int send_msg(modbus_t *ctx, uint8_t *msg, int msg_length) return rc; } -int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) +int modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length, int as_response) { sft_t sft; uint8_t req[MAX_MESSAGE_LENGTH]; @@ -228,8 +228,13 @@ int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_l sft.slave = raw_req[0]; sft.function = raw_req[1]; - /* The t_id is left to zero */ - sft.t_id = 0; + + if (as_response) { + sft.t_id = ctx->backend->prepare_response_tid(req, &req_length); + }else { + /* The t_id is left to zero */ + sft.t_id = 0; + } /* This response function only set the header so it's convenient here */ req_length = ctx->backend->build_response_basis(&sft, req); @@ -242,6 +247,16 @@ int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_l return send_msg(ctx, req, req_length); } +int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) +{ + return modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length, FALSE); +} + +int modbus_send_raw_response(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) +{ + return modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length, TRUE); +} + /* * ---------- Request Indication ---------- * | Client | ---------------------->| Server | From 4c8d2b5ab5d5cc682d6e855cd7bbdcf9bc02e612 Mon Sep 17 00:00:00 2001 From: woodsnake Date: Sat, 12 Mar 2022 22:54:10 +0100 Subject: [PATCH 02/12] Update modbus.c --- src/modbus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index 780ce9a06..4c3dc4a1a 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -249,12 +249,12 @@ int modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_lengt int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) { - return modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length, FALSE); + return modbus_send_raw_msg(ctx, raw_req, raw_req_length, FALSE); } int modbus_send_raw_response(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) { - return modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length, TRUE); + return modbus_send_raw_msg(ctx, raw_req, raw_req_length, TRUE); } /* From a57a01479ac257ecb02c4219001bde53ac0e5881 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 12:46:02 +0100 Subject: [PATCH 03/12] Update modbus.c --- src/modbus.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index 4c3dc4a1a..e09e2a27c 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -249,12 +249,13 @@ int modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_lengt int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) { - return modbus_send_raw_msg(ctx, raw_req, raw_req_length, FALSE); + uint8_t *req; + return modbus_send_raw_msg(ctx, req, raw_req, raw_req_length, FALSE); } -int modbus_send_raw_response(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) +int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_resp, int raw_resp_length) { - return modbus_send_raw_msg(ctx, raw_req, raw_req_length, TRUE); + return modbus_send_raw_msg(ctx, req, raw_resp, raw_resp_length, TRUE); } /* From e97229a95a25cf1a7d015519dfad2ac7b885f9e8 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 14:49:22 +0100 Subject: [PATCH 04/12] Update modbus.c --- src/modbus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modbus.c b/src/modbus.c index e09e2a27c..be414540f 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -207,7 +207,7 @@ static int send_msg(modbus_t *ctx, uint8_t *msg, int msg_length) return rc; } -int modbus_send_raw_msg(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length, int as_response) +int modbus_send_raw_msg(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length, int as_response) { sft_t sft; uint8_t req[MAX_MESSAGE_LENGTH]; From 78a4fa717d35b22a3e2754f5490a71daccec9f98 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 14:57:03 +0100 Subject: [PATCH 05/12] Update modbus.c --- src/modbus.c | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index be414540f..464a55f6b 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -207,7 +207,7 @@ static int send_msg(modbus_t *ctx, uint8_t *msg, int msg_length) return rc; } -int modbus_send_raw_msg(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length, int as_response) +int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) { sft_t sft; uint8_t req[MAX_MESSAGE_LENGTH]; @@ -228,13 +228,8 @@ int modbus_send_raw_msg(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int sft.slave = raw_req[0]; sft.function = raw_req[1]; - - if (as_response) { - sft.t_id = ctx->backend->prepare_response_tid(req, &req_length); - }else { - /* The t_id is left to zero */ - sft.t_id = 0; - } + /* The t_id is left to zero */ + sft.t_id = 0; /* This response function only set the header so it's convenient here */ req_length = ctx->backend->build_response_basis(&sft, req); @@ -247,15 +242,39 @@ int modbus_send_raw_msg(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int return send_msg(ctx, req, req_length); } -int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length) +int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length) { - uint8_t *req; - return modbus_send_raw_msg(ctx, req, raw_req, raw_req_length, FALSE); -} + sft_t sft; + uint8_t req[MAX_MESSAGE_LENGTH]; + int req_length; -int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_resp, int raw_resp_length) -{ - return modbus_send_raw_msg(ctx, req, raw_resp, raw_resp_length, TRUE); + if (ctx == NULL) { + errno = EINVAL; + return -1; + } + + if (raw_req_length < 2 || raw_req_length > (MODBUS_MAX_PDU_LENGTH + 1)) { + /* The raw request must contain function and slave at least and + must not be longer than the maximum pdu length plus the slave + address. */ + errno = EINVAL; + return -1; + } + + sft.t_id = ctx->backend->prepare_response_tid(req, &req_length) + sft.slave = raw_req[0]; + sft.function = raw_req[1]; + + /* This response function only set the header so it's convenient here */ + req_length = ctx->backend->build_response_basis(&sft, req); + + if (raw_req_length > 2) { + /* Copy data after function code */ + memcpy(req + req_length, raw_req + 2, raw_req_length - 2); + req_length += raw_req_length - 2; + } + + return send_msg(ctx, req, req_length); } /* From ecf1895c49f3713c4c743ef4bb8481d6d997aa09 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 15:47:19 +0100 Subject: [PATCH 06/12] Update modbus.h --- src/modbus.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modbus.h b/src/modbus.h index 24808ead5..58929deec 100644 --- a/src/modbus.h +++ b/src/modbus.h @@ -229,6 +229,8 @@ MODBUS_API void modbus_mapping_free(modbus_mapping_t *mb_mapping); MODBUS_API int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length); +MODBUS_API int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length); + MODBUS_API int modbus_receive(modbus_t *ctx, uint8_t *req); MODBUS_API int modbus_receive_confirmation(modbus_t *ctx, uint8_t *rsp); From 82a0558fcf9f092ba222a28f05cf839fb13b50ff Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 18:47:26 +0100 Subject: [PATCH 07/12] Update modbus.c --- src/modbus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modbus.c b/src/modbus.c index 464a55f6b..a78aa26df 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -261,7 +261,7 @@ int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req return -1; } - sft.t_id = ctx->backend->prepare_response_tid(req, &req_length) + sft.t_id = ctx->backend->prepare_response_tid(req, &req_length); sft.slave = raw_req[0]; sft.function = raw_req[1]; From 12eb689b18aa11d66737d99dd1ff2d1052481de7 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 18:53:52 +0100 Subject: [PATCH 08/12] Update modbus.c --- src/modbus.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modbus.c b/src/modbus.c index a78aa26df..ca59ef5d4 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -245,7 +245,6 @@ int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_l int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length) { sft_t sft; - uint8_t req[MAX_MESSAGE_LENGTH]; int req_length; if (ctx == NULL) { From 5af5cd4a8e86e4ff6d8ea678f41bd3b437da3b4e Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 22:49:46 +0100 Subject: [PATCH 09/12] Update modbus.c --- src/modbus.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index ca59ef5d4..6a5a142b6 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -242,9 +242,10 @@ int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_l return send_msg(ctx, req, req_length); } -int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length) +int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_resp, int raw_resp_length) { sft_t sft; + uint8_t resp[MAX_MESSAGE_LENGTH]; int req_length; if (ctx == NULL) { @@ -252,7 +253,7 @@ int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req return -1; } - if (raw_req_length < 2 || raw_req_length > (MODBUS_MAX_PDU_LENGTH + 1)) { + if (raw_resp_length < 2 || raw_resp_length > (MODBUS_MAX_PDU_LENGTH + 1)) { /* The raw request must contain function and slave at least and must not be longer than the maximum pdu length plus the slave address. */ @@ -261,19 +262,19 @@ int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req } sft.t_id = ctx->backend->prepare_response_tid(req, &req_length); - sft.slave = raw_req[0]; - sft.function = raw_req[1]; + sft.slave = raw_resp[0]; + sft.function = raw_resp[1]; /* This response function only set the header so it's convenient here */ - req_length = ctx->backend->build_response_basis(&sft, req); + resp_length = ctx->backend->build_response_basis(&sft, resp); - if (raw_req_length > 2) { + if (raw_resp_length > 2) { /* Copy data after function code */ - memcpy(req + req_length, raw_req + 2, raw_req_length - 2); - req_length += raw_req_length - 2; + memcpy(resp + resp_length, raw_resp + 2, raw_resp_length - 2); + resp_length += raw_resp_length - 2; } - return send_msg(ctx, req, req_length); + return send_msg(ctx, resp, resp_length); } /* From 6613efaec9ee0f07f736f4de09ac8f052f86a248 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 22:55:56 +0100 Subject: [PATCH 10/12] Update modbus.h --- src/modbus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modbus.h b/src/modbus.h index 58929deec..66b9475cc 100644 --- a/src/modbus.h +++ b/src/modbus.h @@ -229,7 +229,7 @@ MODBUS_API void modbus_mapping_free(modbus_mapping_t *mb_mapping); MODBUS_API int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length); -MODBUS_API int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_req, int raw_req_length); +MODBUS_API int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_resp, int raw_resp_length) MODBUS_API int modbus_receive(modbus_t *ctx, uint8_t *req); From 08bca1da03612e006f62d7a047bd92a61c0e0f44 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 23:11:20 +0100 Subject: [PATCH 11/12] Update modbus.h --- src/modbus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modbus.h b/src/modbus.h index 66b9475cc..fa8c678e6 100644 --- a/src/modbus.h +++ b/src/modbus.h @@ -229,7 +229,7 @@ MODBUS_API void modbus_mapping_free(modbus_mapping_t *mb_mapping); MODBUS_API int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length); -MODBUS_API int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_resp, int raw_resp_length) +MODBUS_API int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_resp, int raw_resp_length); MODBUS_API int modbus_receive(modbus_t *ctx, uint8_t *req); From 589147102100a88147a86304fbf2fe971fc595e0 Mon Sep 17 00:00:00 2001 From: woodsnake-joe Date: Mon, 14 Mar 2022 23:16:19 +0100 Subject: [PATCH 12/12] Update modbus.c --- src/modbus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modbus.c b/src/modbus.c index 6a5a142b6..5509af797 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -246,6 +246,7 @@ int modbus_send_raw_response(modbus_t *ctx, uint8_t *req, const uint8_t *raw_res { sft_t sft; uint8_t resp[MAX_MESSAGE_LENGTH]; + int resp_length; int req_length; if (ctx == NULL) {