Commit f639d14fb8b9ffbc289a9c9058a879c3f8d63d66
0 parents
Initial setup
Showing
1 changed file
with
107 additions
and
0 deletions
src/modbus_defines.h
0 → 100644
1 | +++ a/src/modbus_defines.h | ||
1 | +/**************************************************************************** | ||
2 | + * Copyright (c) 2022 Priva B.V. | ||
3 | + ****************************************************************************/ | ||
4 | + | ||
5 | +#pragma once | ||
6 | + | ||
7 | +/* Modbus Function codes as defined in the protocol standard */ | ||
8 | +enum class E_MB_FUNCTION_CODES | ||
9 | +{ | ||
10 | + E_MODBUS_FC_READ_COILS 0x01, | ||
11 | + E_MODBUS_FC_READ_DISCRETE_INPUTS 0x02, | ||
12 | + E_MODBUS_FC_READ_HOLDING_REGISTERS 0x03, | ||
13 | + E_MODBUS_FC_READ_INPUT_REGISTERS 0x04, | ||
14 | + E_MODBUS_FC_WRITE_SINGLE_COIL 0x05, | ||
15 | + E_MODBUS_FC_WRITE_SINGLE_REGISTER 0x06, | ||
16 | + E_MODBUS_FC_READ_EXCEPTION_STATUS 0x07, | ||
17 | + E_MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F, | ||
18 | + E_MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10, | ||
19 | + E_MODBUS_FC_REPORT_SLAVE_ID 0x11, | ||
20 | + E_MODBUS_FC_MASK_WRITE_REGISTERS 0x16, | ||
21 | + E_MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17 | ||
22 | +}; | ||
23 | + | ||
24 | +#define MODBUS_BROADCAST_ADDRESS 0 | ||
25 | + | ||
26 | +/* Modbus Application Protocol V1.1b ( Chapter 6 section 1 page 12 ) | ||
27 | + * Quantity of Coils to read ( 2 bytes ): 1 to 2000 ( 0x7D0 ) | ||
28 | + * ( chapter 6 section 11 page 29 ) | ||
29 | + * Quantity of Coils to write ( 2 bytes ): 1 to 1968 ( 0x7B0 ) | ||
30 | + */ | ||
31 | +#define MODBUS_MAX_READ_BITS 2000 | ||
32 | +#define MODBUS_MAX_WRITE_BITS 1968 | ||
33 | + | ||
34 | +/* Modbus Application Protocol V1.1b ( Chapter 6 section 3 page 12 ) | ||
35 | + * Quantity of Registers to read ( 2 bytes ): 1 to 125 ( 0x7D ) | ||
36 | + * ( chapter 6 section 12 page 31 ) | ||
37 | + * Quantity of Registers to write ( 2 bytes ): 1 to 123 ( 0x7B ) | ||
38 | + * ( chapter 6 section 17 page 38 ) | ||
39 | + * Quantity of Registers to write in R/W registers ( 2 bytes ) 1 to 123 ( 0x79 ) | ||
40 | + */ | ||
41 | +#define MODBUS_MAX_READ_REGISTERS 125 | ||
42 | +#define MODBUS_MAX_WRITE_REGISTERS 123 | ||
43 | +#define MODBUS_MAX_WR_WRITE_REGISTERS 121 | ||
44 | +#define MODBUS_MAX_WR_READ_REGISTERS 125 | ||
45 | + | ||
46 | +/* The MODBUS PDU is 256 bytes maximum. Therefore MODBUS PDU for serial line | ||
47 | + * communication = 256 - Server address ( 1 byte ) - CRC ( 2 bytes ) = 253 bytes | ||
48 | + */ | ||
49 | +#define MODBUS_MAX_PDU_LENGTH 253 | ||
50 | + | ||
51 | +/* Consequently : | ||
52 | + * - RTU MODBUS_ADU = 253 bytes + Server address ( 1 byte ) + CRC ( 2 bytes ) = 256 | ||
53 | + * bytes | ||
54 | + * - TCP MODBUS ADU = 253 bytes + MBAP ( 7 bytes ) = 260 bytes | ||
55 | + * so the maximum of both backends is 260 bytes. This size can be used to allocate | ||
56 | + * an array of bytes to store responses and it will be compatible with the two | ||
57 | + * backends. | ||
58 | + */ | ||
59 | +#define MODBUS_MAX_ADU_LENGTH 260 | ||
60 | + | ||
61 | +/* Random number to avoid errno conflicts */ | ||
62 | +#define MODBUS_ENOBASE 31428571 | ||
63 | + | ||
64 | +/* Protocol exceptions */ | ||
65 | +enum class E_MODBUS_EXCEPTIONS | ||
66 | +{ | ||
67 | + MODBUS_EXCEPTION_ILLEGAL_FUNCTION 0x01, | ||
68 | + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, | ||
69 | + MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, | ||
70 | + MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE, | ||
71 | + MODBUS_EXCEPTION_ACKNOWLEDGE, | ||
72 | + MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY, | ||
73 | + MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE, | ||
74 | + MODBUS_EXCEPTION_MEMORY_PARITY, | ||
75 | + MODBUS_EXCEPTION_NOT_DEFINED, | ||
76 | + MODBUS_EXCEPTION_GATEWAY_PATH, | ||
77 | + MODBUS_EXCEPTION_GATEWAY_TARGET, | ||
78 | + MODBUS_EXCEPTION_MAX | ||
79 | +}; | ||
80 | + | ||
81 | +/* MODBUS Error codes */ | ||
82 | +#define EMBXILFUN ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_FUNCTION ) | ||
83 | +#define EMBXILADD ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS ) | ||
84 | +#define EMBXILVAL ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE ) | ||
85 | +#define EMBXSFAIL ( MODBUS_ENOBASE + MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE ) | ||
86 | +#define EMBXACK ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ACKNOWLEDGE ) | ||
87 | +#define EMBXSBUSY ( MODBUS_ENOBASE + MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY ) | ||
88 | +#define EMBXNACK ( MODBUS_ENOBASE + MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE ) | ||
89 | +#define EMBXMEMPAR ( MODBUS_ENOBASE + MODBUS_EXCEPTION_MEMORY_PARITY ) | ||
90 | +#define EMBXGPATH ( MODBUS_ENOBASE + MODBUS_EXCEPTION_GATEWAY_PATH ) | ||
91 | +#define EMBXGTAR ( MODBUS_ENOBASE + MODBUS_EXCEPTION_GATEWAY_TARGET ) | ||
92 | + | ||
93 | +/* Native modbus error codes */ | ||
94 | +#define EMBBADCRC ( EMBXGTAR + 1 ) | ||
95 | +#define EMBBADDATA ( EMBXGTAR + 2 ) | ||
96 | +#define EMBBADEXC ( EMBXGTAR + 3 ) | ||
97 | +#define EMBUNKEXC ( EMBXGTAR + 4 ) | ||
98 | +#define EMBMDATA ( EMBXGTAR + 5 ) | ||
99 | +#define EMBBADSLAVE ( EMBXGTAR + 6 ) | ||
100 | + | ||
101 | +/* Recovery Modes */ | ||
102 | +enum class MODBUS_ERROR_RECOVERY_MODE | ||
103 | +{ | ||
104 | + MODBUS_ERROR_RECOVERY_NONE = 0, | ||
105 | + MODBUS_ERROR_RECOVERY_LINK = ( 1 << 1 ), | ||
106 | + MODBUS_ERROR_RECOVERY_PROTOCOL = ( 1 << 2 ) | ||
107 | +}; |