Commit d5512d9b684f1580e21b660b188e5e58fa1b7b84

Authored by Stéphane Raimbault
1 parent 59d34d20

Improve doc about slave ID in RTU

docs/modbus_new_rtu.md
... ... @@ -35,9 +35,24 @@ values are 5, 6, 7 and 8.
35 35 The `stop_bits` argument specifies the bits of stop, the allowed values are 1
36 36 and 2.
37 37  
38   -Once the `modbus_t` structure is initialized, you must set the slave of your
39   -device with [modbus_set_slave](modbus_set_slave.md) and connect to the serial bus with
40   -[modbus_connect](modbus_connect.md).
  38 +Once the `modbus_t` structure is initialized, you can connect to the serial bus
  39 +with [modbus_connect](modbus_connect.md).
  40 +
  41 +In RTU, your program can act as server or client:
  42 +
  43 +- **server** is called *slave* in Modbus terminology, your program will expose
  44 + data to the network by processing and answering the requests of one of several
  45 + clients. It up to you to define the slave ID of your service with
  46 + [modbus_set_slave](modbus_set_slave.md), this ID should be used by the client
  47 + to communicate with your program.
  48 +
  49 +- **client** is called *master* in Modbus terminology, your program will send
  50 + requests to servers to read or write data from them. Before issuing the
  51 + requests, you should define the slave ID of the remote device with
  52 + [modbus_set_slave](modbus_set_slave.md). The slave ID is not an argument of
  53 + the read/write functions because it's very frequent to talk with only one
  54 + server so you can set it once and for all. The slave ID it not used in TCP
  55 + communications so this way the API is common to both.
41 56  
42 57 ## Return value
43 58  
... ... @@ -53,8 +68,16 @@ defined below.
53 68  
54 69 ## Example
55 70  
  71 +In this example, the program will open a serial communication on USB. All
  72 +subsequent calls such as read or write of registers will be sent on the wire and
  73 +the request will be visible to all connected devices. According to the Modbus
  74 +protocol, only the master associated to slave ID 10 will process and answer your
  75 +requests.
  76 +
56 77 ```c
  78 +const int REMOTE_ID = 10;
57 79 modbus_t *ctx;
  80 +uint16_t tab_reg[10];
58 81  
59 82 ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
60 83 if (ctx == NULL) {
... ... @@ -62,13 +85,16 @@ if (ctx == NULL) {
62 85 return -1;
63 86 }
64 87  
65   -modbus_set_slave(ctx, YOUR_DEVICE_ID);
66   -
67 88 if (modbus_connect(ctx) == -1) {
68 89 fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
69 90 modbus_free(ctx);
70 91 return -1;
71 92 }
  93 +
  94 +modbus_set_slave(ctx, REMOTE_ID);
  95 +
  96 +// Read 2 registers from address 0 of server ID 10.
  97 +modbus_read_registers(ctx, 0, 2, tab_reg);
72 98 ```
73 99  
74 100 ## See also
... ...
docs/modbus_read_bits.md
... ... @@ -17,7 +17,7 @@ to the address `addr` of the remote device. The result of reading is stored in
17 17 `dest` array as unsigned bytes (8 bits) set to `TRUE` or `FALSE`.
18 18  
19 19 You must take care to allocate enough memory to store the results in `dest`
20   -(at least `nb` * sizeof(uint8_t)).
  20 +(at least `nb * sizeof(uint8_t)`).
21 21  
22 22 The function uses the Modbus function code 0x01 (read coil status).
23 23  
... ...
docs/modbus_read_input_bits.md
... ... @@ -17,7 +17,7 @@ bits to the address `addr` of the remote device. The result of reading is store
17 17 in `dest` array as unsigned bytes (8 bits) set to `TRUE` or `FALSE`.
18 18  
19 19 You must take care to allocate enough memory to store the results in `dest`
20   -(at least `nb` * sizeof(uint8_t)).
  20 +(at least `nb * sizeof(uint8_t)`).
21 21  
22 22 The function uses the Modbus function code 0x02 (read input status).
23 23  
... ...
docs/modbus_read_input_registers.md
... ... @@ -17,7 +17,7 @@ input registers to address `addr` of the remote device. The result of the
17 17 reading is stored in `dest` array as word values (16 bits).
18 18  
19 19 You must take care to allocate enough memory to store the results in `dest` (at
20   -least `nb` * sizeof(uint16_t)).
  20 +least `nb * sizeof(uint16_t)`).
21 21  
22 22 The function uses the Modbus function code 0x04 (read input registers). The
23 23 holding registers and input registers have different historical meaning, but
... ...
docs/modbus_read_registers.md
... ... @@ -17,7 +17,7 @@ holding registers to the address `addr` of the remote device. The result of
17 17 reading is stored in `dest` array as word values (16 bits).
18 18  
19 19 You must take care to allocate enough memory to store the results in `dest`
20   -(at least `nb` * sizeof(uint16_t)).
  20 +(at least `nb * sizeof(uint16_t)`).
21 21  
22 22 The function uses the Modbus function code 0x03 (read holding registers).
23 23  
... ...
docs/modbus_set_slave.md
... ... @@ -15,17 +15,22 @@ int modbus_set_slave(modbus_t *ctx, int slave);
15 15 The *modbus_set_slave()* function shall set the slave number in the libmodbus
16 16 context.
17 17  
18   -The behavior depends of network and the role of the device:
19   -
20   -*RTU*::
21   -Define the slave ID of the remote device to talk in master mode or set the
22   -internal slave ID in slave mode. According to the protocol, a Modbus device must
23   -only accept message holding its slave number or the special broadcast number.
24   -
25   -*TCP*::
26   -The slave number is only required in TCP if the message must reach a device on a
27   -serial network. Some not compliant devices or software (such as modpoll) uses
28   -the slave ID as unit identifier, that's incorrect (cf page 23 of Modbus
  18 +It is usually only required to set the slave ID in **RTU**. The meaning of this
  19 +ID will be different if your program acts as client (master) or server (slave).
  20 +
  21 +As **RTU client**, *modbus_set_slave()* sets the ID of the remote device you
  22 +want to communicate. Be sure to set the slave ID before issuing any Modbus
  23 +requests on the serial bus. If you communicate with several servers (slaves),
  24 +you can set the slave ID of the remote device before each request.
  25 +
  26 +As **RTU server**, the slave ID allows the various clients to reach your
  27 +service. You should use a free ID, once set, this ID should be known by the
  28 +clients of the network. According to the protocol, a Modbus device must only
  29 +accept message holding its slave number or the special broadcast number.
  30 +
  31 +In **TCP**, the slave number is only required if the message must reach a device
  32 +on a serial network. Some not compliant devices or software (such as modpoll)
  33 +uses the slave ID as unit identifier, that's incorrect (cf page 23 of Modbus
29 34 Messaging Implementation Guide v1.0b) but without the slave value, the faulty
30 35 remote device or software drops the requests! The special value
31 36 `MODBUS_TCP_SLAVE` (0xFF) can be used in TCP mode to restore the default value.
... ...
docs/modbus_write_and_read_registers.md
... ... @@ -23,7 +23,7 @@ to the address `read_addr` of the remote device. The result of reading is stored
23 23 in `dest` array as word values (16 bits).
24 24  
25 25 You must take care to allocate enough memory to store the results in `dest`
26   -(at least `nb` * sizeof(uint16_t)).
  26 +(at least `nb * sizeof(uint16_t)`).
27 27  
28 28 The function uses the Modbus function code 0x17 (write/read registers).
29 29  
... ...