Commit ad80a6d3cc2c38989cab0e04e9a2a667f54fc99c

Authored by Stéphane Raimbault
1 parent 78587bdf

Enhanced report slave ID and documentation

@@ -11,6 +11,8 @@ libmodbus 2.9.5 (2011-06-XX) @@ -11,6 +11,8 @@ libmodbus 2.9.5 (2011-06-XX)
11 The function name was confusing because the write operation is performed 11 The function name was confusing because the write operation is performed
12 before the read. Take care to swap the arguments in the migration process. 12 before the read. Take care to swap the arguments in the migration process.
13 - Documentation of modbus_write_and_read_registers, modbus_mapping_new/free 13 - Documentation of modbus_write_and_read_registers, modbus_mapping_new/free
  14 + and report_slave_id.
  15 +- Enhanced report slave ID
14 16
15 libmodbus 2.9.4 (2011-06-05) 17 libmodbus 2.9.4 (2011-06-05)
16 ============================ 18 ============================
doc/Makefile.am
@@ -18,6 +18,7 @@ MAN3 = \ @@ -18,6 +18,7 @@ MAN3 = \
18 modbus_read_registers.3 \ 18 modbus_read_registers.3 \
19 modbus_receive.3 \ 19 modbus_receive.3 \
20 modbus_receive_confirmation.3 \ 20 modbus_receive_confirmation.3 \
  21 + modbus_report_slave_id.3 \
21 modbus_rtu_get_serial_mode.3 \ 22 modbus_rtu_get_serial_mode.3 \
22 modbus_rtu_set_serial_mode.3 \ 23 modbus_rtu_set_serial_mode.3 \
23 modbus_send_raw_request.3 \ 24 modbus_send_raw_request.3 \
doc/libmodbus.txt
@@ -139,14 +139,15 @@ Flush a connection:: @@ -139,14 +139,15 @@ Flush a connection::
139 Client 139 Client
140 ~~~~~~ 140 ~~~~~~
141 The Modbus protocol defines different data types and functions to read and write 141 The Modbus protocol defines different data types and functions to read and write
142 -them from/to remote devices. The following functions are used by the clients to send  
143 -Modbus requests: 142 +them from/to remote devices. The following functions are used by the clients to
  143 +send Modbus requests:
144 144
145 Read data:: 145 Read data::
146 linkmb:modbus_read_bits[3] 146 linkmb:modbus_read_bits[3]
147 linkmb:modbus_read_input_bits[3] 147 linkmb:modbus_read_input_bits[3]
148 linkmb:modbus_read_registers[3] 148 linkmb:modbus_read_registers[3]
149 linkmb:modbus_read_input_registers[3] 149 linkmb:modbus_read_input_registers[3]
  150 + libkmb:modbus_report_slave_id[3]
150 151
151 Write data:: 152 Write data::
152 linkmb:modbus_write_bit[3] 153 linkmb:modbus_write_bit[3]
doc/modbus_report_slave_id.txt 0 → 100644
  1 +modbus_report_slave_id(3)
  2 +=========================
  3 +
  4 +
  5 +NAME
  6 +----
  7 +modbus_report_slave_id - returns a description of the controller
  8 +
  9 +
  10 +SYNOPSIS
  11 +--------
  12 +*int modbus_report_slave_id(modbus_t *'ctx', uint8_t *'dest')*
  13 +
  14 +
  15 +DESCRIPTION
  16 +-----------
  17 +The _modbus_report_slave_id()_ function shall send a request to the controller
  18 +to obtain a description of the controller.
  19 +
  20 +The response stored in 'dest' contains:
  21 +
  22 +* the byte count of the response
  23 +* the slave ID, this unique ID is in reality not unique at all so it's not
  24 + possible to depend on it to know how the information are packed in the
  25 + response.
  26 +* the run indicator status (0x00 = OFF, 0xFF = ON)
  27 +* additional data specific to each controller. For example, libmodbus returns
  28 + the version of the library as a string.
  29 +
  30 +
  31 +RETURN VALUE
  32 +------------
  33 +The _modbus_report_slave_id()_ function shall return the number of read data if
  34 +successful. Otherwise it shall return -1 and set errno.
  35 +
  36 +
  37 +EXAMPLE
  38 +-------
  39 +[source,c]
  40 +-------------------
  41 +uint8_t *tab_bytes;
  42 +
  43 +...
  44 +
  45 +rc = modbus_report_slave_id(ctx, tab_bytes);
  46 +if (rc > 1) {
  47 + printf("Run Status Indicator: %s\n", tab_bytes[1] ? "ON" : "OFF");
  48 +}
  49 +-------------------
  50 +
  51 +
  52 +AUTHORS
  53 +-------
  54 +The libmodbus documentation was written by Stéphane Raimbault
  55 +<stephane.raimbault@gmail.com>
src/modbus-private.h
@@ -40,11 +40,11 @@ MODBUS_BEGIN_DECLS @@ -40,11 +40,11 @@ MODBUS_BEGIN_DECLS
40 * - HEADER_LENGTH_TCP (7) + function (1) + address (2) + number (2) 40 * - HEADER_LENGTH_TCP (7) + function (1) + address (2) + number (2)
41 * - HEADER_LENGTH_RTU (1) + function (1) + address (2) + number (2) + CRC (2) 41 * - HEADER_LENGTH_RTU (1) + function (1) + address (2) + number (2) + CRC (2)
42 */ 42 */
43 -#define _MIN_REQ_LENGTH 12 43 +#define _MIN_REQ_LENGTH 12
44 44
45 -#define _REPORT_SLAVE_ID_LENGTH 75 45 +#define _REPORT_SLAVE_ID 180
46 46
47 -#define _MODBUS_EXCEPTION_RSP_LENGTH 5 47 +#define _MODBUS_EXCEPTION_RSP_LENGTH 5
48 48
49 /* Timeouts in microsecond (0.5 s) */ 49 /* Timeouts in microsecond (0.5 s) */
50 #define _RESPONSE_TIMEOUT 500000 50 #define _RESPONSE_TIMEOUT 500000
src/modbus.c
@@ -842,13 +842,22 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, @@ -842,13 +842,22 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req,
842 } 842 }
843 } 843 }
844 break; 844 break;
845 - case _FC_REPORT_SLAVE_ID: 845 + case _FC_REPORT_SLAVE_ID: {
  846 + int str_len;
  847 + int byte_count_pos;
  848 +
846 rsp_length = ctx->backend->build_response_basis(&sft, rsp); 849 rsp_length = ctx->backend->build_response_basis(&sft, rsp);
847 - /* 2 bytes */  
848 - rsp[rsp_length++] = 2;  
849 - rsp[rsp_length++] = ctx->slave;  
850 - /* Slave is ON */ 850 + /* Skip byte count for now */
  851 + byte_count_pos = rsp_length++;
  852 + rsp[rsp_length++] = _REPORT_SLAVE_ID;
  853 + /* Run indicator status to ON */
851 rsp[rsp_length++] = 0xFF; 854 rsp[rsp_length++] = 0xFF;
  855 + /* LMB + length of LIBMODBUS_VERSION_STRING */
  856 + str_len = 3 + strlen(LIBMODBUS_VERSION_STRING);
  857 + memcpy(rsp + rsp_length, "LMB" LIBMODBUS_VERSION_STRING, str_len);
  858 + rsp_length += str_len;
  859 + rsp[byte_count_pos] = rsp_length - byte_count_pos - 1;
  860 + }
852 break; 861 break;
853 case _FC_READ_EXCEPTION_STATUS: 862 case _FC_READ_EXCEPTION_STATUS:
854 if (ctx->debug) { 863 if (ctx->debug) {
tests/unit-test-client.c
@@ -562,14 +562,31 @@ int main(int argc, char *argv[]) @@ -562,14 +562,31 @@ int main(int argc, char *argv[])
562 goto close; 562 goto close;
563 } 563 }
564 564
565 - if (((use_backend == RTU) && (tab_rp_bits[0] == SERVER_ID))  
566 - || tab_rp_bits[0] == 0xFF) {  
567 - printf("OK\n"); 565 + /* Slave ID is an arbitraty number for libmodbus */
  566 + if (rc > 0) {
  567 + printf("OK Slave ID is %d\n", tab_rp_bits[0]);
568 } else { 568 } else {
569 printf("FAILED\n"); 569 printf("FAILED\n");
570 goto close; 570 goto close;
571 } 571 }
572 572
  573 + /* Run status indicator */
  574 + if (rc > 1 && tab_rp_bits[1] == 0xFF) {
  575 + printf("OK Run Status Indicator is %s\n", tab_rp_bits[1] ? "ON" : "OFF");
  576 + } else {
  577 + printf("FAILED\n");
  578 + goto close;
  579 + }
  580 +
  581 + /* Print additional data as string */
  582 + if (rc > 2) {
  583 + printf("Additional data: ");
  584 + for (i=2; i < rc; i++) {
  585 + printf("%c", tab_rp_bits[i]);
  586 + }
  587 + printf("\n");
  588 + }
  589 +
573 /* Save original timeout */ 590 /* Save original timeout */
574 modbus_get_response_timeout(ctx, &old_response_timeout); 591 modbus_get_response_timeout(ctx, &old_response_timeout);
575 592