Commit f5e2f2c97117ea5e974973917d066c5e4ec746d9
1 parent
535e696f
Conformance of the TCP trame length
The maximum length of the ADU is 260 in TCP not 256.
Showing
2 changed files
with
22 additions
and
13 deletions
src/modbus.c
| ... | ... | @@ -146,6 +146,11 @@ static const int TAB_CHECKSUM_LENGTH[2] = { |
| 146 | 146 | CHECKSUM_LENGTH_TCP |
| 147 | 147 | }; |
| 148 | 148 | |
| 149 | +static const int TAB_MAX_ADU_LENGTH[2] = { | |
| 150 | + MAX_ADU_LENGTH_RTU, | |
| 151 | + MAX_ADU_LENGTH_TCP, | |
| 152 | +}; | |
| 153 | + | |
| 149 | 154 | /* Treats errors and flush or close connection if necessary */ |
| 150 | 155 | static void error_treat(modbus_param_t *mb_param, int code, const char *string) |
| 151 | 156 | { |
| ... | ... | @@ -561,8 +566,7 @@ static int receive_msg(modbus_param_t *mb_param, |
| 561 | 566 | case BYTE: |
| 562 | 567 | length_to_read = compute_query_length_data(mb_param, msg); |
| 563 | 568 | msg_length_computed += length_to_read; |
| 564 | - /* FIXME Wrong length */ | |
| 565 | - if (msg_length_computed > MAX_MESSAGE_LENGTH) { | |
| 569 | + if (msg_length_computed > TAB_MAX_ADU_LENGTH[mb_param->type_com]) { | |
| 566 | 570 | error_treat(mb_param, TOO_MANY_DATA, "Too many data"); |
| 567 | 571 | return TOO_MANY_DATA; |
| 568 | 572 | } | ... | ... |
src/modbus.h
| ... | ... | @@ -26,7 +26,7 @@ |
| 26 | 26 | extern "C" { |
| 27 | 27 | #endif |
| 28 | 28 | |
| 29 | -#define MODBUS_TCP_DEFAULT_PORT 502 | |
| 29 | +#define MODBUS_TCP_DEFAULT_PORT 502 | |
| 30 | 30 | |
| 31 | 31 | /* Slave index */ |
| 32 | 32 | #define HEADER_LENGTH_RTU 1 |
| ... | ... | @@ -37,8 +37,8 @@ extern "C" { |
| 37 | 37 | #define PRESET_QUERY_LENGTH_TCP 12 |
| 38 | 38 | #define PRESET_RESPONSE_LENGTH_TCP 8 |
| 39 | 39 | |
| 40 | -#define CHECKSUM_LENGTH_RTU 2 | |
| 41 | -#define CHECKSUM_LENGTH_TCP 0 | |
| 40 | +#define CHECKSUM_LENGTH_RTU 2 | |
| 41 | +#define CHECKSUM_LENGTH_TCP 0 | |
| 42 | 42 | |
| 43 | 43 | /* It's not really the minimal length (the real one is report slave ID |
| 44 | 44 | * in RTU (4 bytes)) but it's a convenient size to use in RTU or TCP |
| ... | ... | @@ -47,25 +47,30 @@ extern "C" { |
| 47 | 47 | * - HEADER_LENGTH_TCP (7) + function (1) + address (2) + number (2) |
| 48 | 48 | * - HEADER_LENGTH_RTU (1) + function (1) + address (2) + number (2) + CRC (2) |
| 49 | 49 | */ |
| 50 | -#define MIN_QUERY_LENGTH 12 | |
| 50 | +#define MIN_QUERY_LENGTH 12 | |
| 51 | 51 | |
| 52 | -/* Page 102, Application Notes of PI–MBUS–300: | |
| 53 | - * The maximum length of the entire message must not exceed 256 | |
| 54 | - * bytes. | |
| 52 | +/* Modbus_Application_Protocol_V1_1b.pdf Chapter 4 Section 1 Page 5: | |
| 53 | + * - RS232 / RS485 ADU = 253 bytes + slave (1 byte) + CRC (2 bytes) = 256 bytes | |
| 54 | + * - TCP MODBUS ADU = 253 bytes + MBAP (7 bytes) = 260 bytes | |
| 55 | 55 | */ |
| 56 | -#define MAX_MESSAGE_LENGTH 256 | |
| 56 | +#define MAX_PDU_LENGTH 253 | |
| 57 | +#define MAX_ADU_LENGTH_RTU 256 | |
| 58 | +#define MAX_ADU_LENGTH_TCP 260 | |
| 59 | + | |
| 60 | +/* Kept for compatibility reasons (deprecated) */ | |
| 61 | +#define MAX_MESSAGE_LENGTH 260 | |
| 57 | 62 | |
| 58 | 63 | /* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 1 page 12) |
| 59 | 64 | * Quantity of Coils (2 bytes): 1 to 2000 (0x7D0) |
| 60 | 65 | */ |
| 61 | -#define MAX_STATUS 2000 | |
| 66 | +#define MAX_STATUS 2000 | |
| 62 | 67 | |
| 63 | 68 | /* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 3 page 15) |
| 64 | 69 | * Quantity of Registers (2 bytes): 1 to 125 (0x7D) |
| 65 | 70 | */ |
| 66 | -#define MAX_REGISTERS 125 | |
| 71 | +#define MAX_REGISTERS 125 | |
| 67 | 72 | |
| 68 | -#define REPORT_SLAVE_ID_LENGTH 75 | |
| 73 | +#define REPORT_SLAVE_ID_LENGTH 75 | |
| 69 | 74 | |
| 70 | 75 | /* Time out between trames in microsecond */ |
| 71 | 76 | #define TIME_OUT_BEGIN_OF_TRAME 500000 | ... | ... |