Commit da87669697ae0e4397356665dafd151bb6d4795a
1 parent
ef3c4bc9
Rewrite documentation with Material for mkdocs
- remove doc build from autotools - don't depend anymore on asciidoc - don't provide man pages anymore - new illustrations - provide mkdocs instructions
Showing
138 changed files
with
3680 additions
and
3483 deletions
.gitignore
| ... | ... | @@ -10,11 +10,10 @@ |
| 10 | 10 | .libs |
| 11 | 11 | .DS_Store |
| 12 | 12 | |
| 13 | -# Emacs | |
| 14 | -GPATH | |
| 15 | -GRTAGS | |
| 16 | -GSYMS | |
| 17 | -GTAGS | |
| 13 | +# Editors | |
| 14 | +/*.sublime-* | |
| 15 | +/.vscode | |
| 16 | +/.venv | |
| 18 | 17 | |
| 19 | 18 | # Generated by Autotools |
| 20 | 19 | INSTALL |
| ... | ... | @@ -28,17 +27,17 @@ Makefile.in |
| 28 | 27 | /configure.scan |
| 29 | 28 | /depcomp |
| 30 | 29 | /install-sh |
| 30 | +/libmodbus.pc | |
| 31 | 31 | /libtool |
| 32 | 32 | /ltmain.sh |
| 33 | 33 | /missing |
| 34 | -/libmodbus.pc | |
| 35 | 34 | /stamp-h1 |
| 36 | 35 | src/modbus-version.h |
| 37 | 36 | src/win32/modbus.dll.manifest |
| 38 | 37 | tests/unit-test.h |
| 39 | 38 | |
| 40 | -/*.sublime-* | |
| 41 | -/.vscode | |
| 39 | +# mkdocs | |
| 40 | +/site | |
| 42 | 41 | |
| 43 | 42 | # Binary |
| 44 | 43 | tests/bandwidth-client |
| ... | ... | @@ -50,8 +49,3 @@ tests/unit-test-client |
| 50 | 49 | tests/unit-test-server |
| 51 | 50 | tests/version |
| 52 | 51 | tests/stamp-h2 |
| 53 | - | |
| 54 | -# Documentation | |
| 55 | -doc/*.html | |
| 56 | -doc/*.3 | |
| 57 | -doc/*.7 | ... | ... |
CONTRIBUTING.md
| ... | ... | @@ -4,7 +4,7 @@ How Do I Submit A Good Bug Report? |
| 4 | 4 | Please, don't send direct emails to Stéphane Raimbault unless you want |
| 5 | 5 | commercial support. |
| 6 | 6 | |
| 7 | -Take care to read the documentation at http://libmodbus.org/documentation/. | |
| 7 | +Take care to read the documentation at http://libmodbus.org/. | |
| 8 | 8 | |
| 9 | 9 | - *Be sure it's a bug before creating an issue*, in doubt, post a message on |
| 10 | 10 | https://groups.google.com/forum/#!forum/libmodbus or send an email to |
| ... | ... | @@ -24,6 +24,6 @@ the clients are connected (TCP, RTU, ASCII) and the source code you are using. |
| 24 | 24 | |
| 25 | 25 | - *Enable the debug mode*, libmodbus provides a function to display the content |
| 26 | 26 | of the Modbus messages and it's very convenient to analyze issues |
| 27 | -(http://libmodbus.org/docs/latest/modbus_set_debug.html). | |
| 27 | +(http://libmodbus.org/docs/modbus_set_debug/). | |
| 28 | 28 | |
| 29 | 29 | Good bug reports provide right and quick fixes! | ... | ... |
ISSUE_TEMPLATE.md
| ... | ... | @@ -34,7 +34,7 @@ When you get here and you are still convinced that you want to report a bug: |
| 34 | 34 | |
| 35 | 35 | - *Enable the debug mode*, libmodbus provides a function to display the content |
| 36 | 36 | of the Modbus messages and it's very convenient to analyze issues |
| 37 | - (<http://libmodbus.org/docs/latest/modbus_set_debug.html>). | |
| 37 | + (<http://libmodbus.org/docs/modbus_set_debug/>). | |
| 38 | 38 | |
| 39 | 39 | Good bug reports provide right and quick fixes! |
| 40 | 40 | ... | ... |
Makefile.am
README.md
| 1 | -A groovy modbus library | |
| 2 | -======================= | |
| 1 | +# A groovy modbus library | |
| 3 | 2 | |
| 4 | 3 |  |
| 5 | 4 | |
| 6 | -Overview | |
| 7 | --------- | |
| 5 | +## Overview | |
| 8 | 6 | |
| 9 | 7 | libmodbus is a free software library to send/receive data with a device which |
| 10 | 8 | respects the Modbus protocol. This library can use a serial port or an Ethernet |
| ... | ... | @@ -15,21 +13,15 @@ Protocol Reference Guide which can be obtained from [www.modbus.org](http://www. |
| 15 | 13 | |
| 16 | 14 | The license of libmodbus is *LGPL v2.1 or later*. |
| 17 | 15 | |
| 18 | -The documentation is available as manual pages (`man libmodbus` to read general | |
| 19 | -description and list of available functions) or Web pages | |
| 20 | -[www.libmodbus.org/documentation/](http://libmodbus.org/documentation/). The | |
| 21 | -documentation is licensed under the Creative Commons Attribution-ShareAlike | |
| 22 | -License 3.0 (Unported) (<http://creativecommons.org/licenses/by-sa/3.0/>). | |
| 23 | - | |
| 24 | -The official website is [www.libmodbus.org](http://www.libmodbus.org). | |
| 16 | +The official website is [www.libmodbus.org](http://www.libmodbus.org). The | |
| 17 | +website contains the latest version of the documentation. | |
| 25 | 18 | |
| 26 | 19 | The library is written in C and designed to run on Linux, Mac OS X, FreeBSD, Embox, |
| 27 | 20 | QNX and Windows. |
| 28 | 21 | |
| 29 | 22 | You can use the library on MCUs with Embox RTOS. |
| 30 | 23 | |
| 31 | -Installation | |
| 32 | ------------- | |
| 24 | +## Installation | |
| 33 | 25 | |
| 34 | 26 | You will only need to install automake, autoconf, libtool and a C compiler (gcc |
| 35 | 27 | or clang) to compile the library and asciidoc and xmlto to generate the |
| ... | ... | @@ -59,19 +51,7 @@ automake libtool`. |
| 59 | 51 | |
| 60 | 52 | To build under Embox, you have to use its build system. |
| 61 | 53 | |
| 62 | -Documentation | |
| 63 | -------------- | |
| 64 | - | |
| 65 | -The documentation is available [online](http://libmodbus.org/documentation) or | |
| 66 | -as manual pages after installation. | |
| 67 | - | |
| 68 | -The documentation is based on | |
| 69 | -[AsciiDoc](http://www.methods.co.nz/asciidoc/). Only man pages are built | |
| 70 | -by default with `make` command, you can run `make htmldoc` in *doc* directory | |
| 71 | -to generate HTML files. | |
| 72 | - | |
| 73 | -Testing | |
| 74 | -------- | |
| 54 | +## Testing | |
| 75 | 55 | |
| 76 | 56 | Some tests are provided in *tests* directory, you can freely edit the source |
| 77 | 57 | code to fit your needs (it's Free Software :). |
| ... | ... | @@ -87,7 +67,15 @@ By default, all TCP unit tests will be executed (see --help for options). |
| 87 | 67 | |
| 88 | 68 | It's also possible to run the unit tests with `make check`. |
| 89 | 69 | |
| 90 | -To report a bug or to contribute | |
| 91 | --------------------------------- | |
| 70 | +## To report a bug or to contribute | |
| 92 | 71 | |
| 93 | 72 | See [CONTRIBUTING](CONTRIBUTING.md) document. |
| 73 | + | |
| 74 | +## Documentation | |
| 75 | + | |
| 76 | +You can serve the local documentation with: | |
| 77 | + | |
| 78 | +```shell | |
| 79 | +pip install mkdocs-material | |
| 80 | +mkdocs serve | |
| 81 | +``` | ... | ... |
acinclude.m4 deleted
| 1 | -dnl ############################################################################## | |
| 2 | -dnl # AC_LIBMODBUS_CHECK_BUILD_DOC # | |
| 3 | -dnl # Check whether to build documentation and install man-pages # | |
| 4 | -dnl ############################################################################## | |
| 5 | -AC_DEFUN([AC_LIBMODBUS_CHECK_BUILD_DOC], [{ | |
| 6 | - # Allow user to disable doc build | |
| 7 | - AC_ARG_WITH([documentation], [AS_HELP_STRING([--without-documentation], | |
| 8 | - [disable documentation build even if asciidoc and xmlto are present [default=no]])]) | |
| 9 | - | |
| 10 | - if test "x$with_documentation" = "xno"; then | |
| 11 | - ac_libmodbus_build_doc="no" | |
| 12 | - else | |
| 13 | - # Determine whether or not documentation should be built and installed. | |
| 14 | - ac_libmodbus_build_doc="yes" | |
| 15 | - # Check for asciidoc and xmlto and don't build the docs if these are not installed. | |
| 16 | - AC_CHECK_PROG(ac_libmodbus_have_asciidoc, asciidoc, yes, no) | |
| 17 | - AC_CHECK_PROG(ac_libmodbus_have_xmlto, xmlto, yes, no) | |
| 18 | - if test "x$ac_libmodbus_have_asciidoc" = "xno" -o "x$ac_libmodbus_have_xmlto" = "xno"; then | |
| 19 | - ac_libmodbus_build_doc="no" | |
| 20 | - fi | |
| 21 | - fi | |
| 22 | - | |
| 23 | - AC_MSG_CHECKING([whether to build documentation]) | |
| 24 | - AC_MSG_RESULT([$ac_libmodbus_build_doc]) | |
| 25 | - if test "x$ac_libmodbus_build_doc" = "xno"; then | |
| 26 | - AC_MSG_WARN([The tools to build the documentation aren't installed]) | |
| 27 | - fi | |
| 28 | - AM_CONDITIONAL(BUILD_DOC, test "x$ac_libmodbus_build_doc" = "xyes") | |
| 29 | -}]) |
configure.ac
| ... | ... | @@ -94,9 +94,6 @@ AC_CHECK_HEADERS([ \ |
| 94 | 94 | unistd.h \ |
| 95 | 95 | ]) |
| 96 | 96 | |
| 97 | -# Check whether to build docs / install man pages | |
| 98 | -AC_LIBMODBUS_CHECK_BUILD_DOC | |
| 99 | - | |
| 100 | 97 | # Cygwin defines IPTOS_LOWDELAY but can't handle that flag so it's necessary to |
| 101 | 98 | # workaround that problem and Cygwin doesn't define MSG_DONTWAIT. |
| 102 | 99 | AC_CHECK_DECLS([__CYGWIN__]) |
| ... | ... | @@ -161,7 +158,6 @@ AC_CONFIG_FILES([ |
| 161 | 158 | src/modbus-version.h |
| 162 | 159 | src/win32/modbus.dll.manifest |
| 163 | 160 | tests/Makefile |
| 164 | - doc/Makefile | |
| 165 | 161 | libmodbus.pc |
| 166 | 162 | ]) |
| 167 | 163 | |
| ... | ... | @@ -179,6 +175,5 @@ AC_MSG_RESULT([ |
| 179 | 175 | cflags: ${CFLAGS} |
| 180 | 176 | ldflags: ${LDFLAGS} |
| 181 | 177 | |
| 182 | - documentation: ${ac_libmodbus_build_doc} | |
| 183 | 178 | tests: ${enable_tests} |
| 184 | 179 | ]) | ... | ... |
doc/Makefile.am deleted
| 1 | -TXT3 = \ | |
| 2 | - modbus_close.txt \ | |
| 3 | - modbus_connect.txt \ | |
| 4 | - modbus_flush.txt \ | |
| 5 | - modbus_free.txt \ | |
| 6 | - modbus_get_indication_timeout.txt \ | |
| 7 | - modbus_get_slave.txt \ | |
| 8 | - modbus_get_byte_from_bits.txt \ | |
| 9 | - modbus_get_byte_timeout.txt \ | |
| 10 | - modbus_get_float.txt \ | |
| 11 | - modbus_get_float_abcd.txt \ | |
| 12 | - modbus_get_float_badc.txt \ | |
| 13 | - modbus_get_float_cdab.txt \ | |
| 14 | - modbus_get_float_dcba.txt \ | |
| 15 | - modbus_get_header_length.txt \ | |
| 16 | - modbus_get_response_timeout.txt \ | |
| 17 | - modbus_get_socket.txt \ | |
| 18 | - modbus_mapping_free.txt \ | |
| 19 | - modbus_mapping_new.txt \ | |
| 20 | - modbus_mapping_new_start_address.txt \ | |
| 21 | - modbus_mask_write_register.txt \ | |
| 22 | - modbus_new_rtu.txt \ | |
| 23 | - modbus_new_tcp_pi.txt \ | |
| 24 | - modbus_new_tcp.txt \ | |
| 25 | - modbus_read_bits.txt \ | |
| 26 | - modbus_read_input_bits.txt \ | |
| 27 | - modbus_read_input_registers.txt \ | |
| 28 | - modbus_read_registers.txt \ | |
| 29 | - modbus_receive_confirmation.txt \ | |
| 30 | - modbus_receive.txt \ | |
| 31 | - modbus_reply_exception.txt \ | |
| 32 | - modbus_reply.txt \ | |
| 33 | - modbus_report_slave_id.txt \ | |
| 34 | - modbus_rtu_get_serial_mode.txt \ | |
| 35 | - modbus_rtu_set_serial_mode.txt \ | |
| 36 | - modbus_rtu_get_rts.txt \ | |
| 37 | - modbus_rtu_set_rts.txt \ | |
| 38 | - modbus_rtu_set_custom_rts.txt \ | |
| 39 | - modbus_rtu_get_rts_delay.txt \ | |
| 40 | - modbus_rtu_set_rts_delay.txt \ | |
| 41 | - modbus_send_raw_request.txt \ | |
| 42 | - modbus_set_bits_from_bytes.txt \ | |
| 43 | - modbus_set_bits_from_byte.txt \ | |
| 44 | - modbus_set_byte_timeout.txt \ | |
| 45 | - modbus_set_debug.txt \ | |
| 46 | - modbus_set_error_recovery.txt \ | |
| 47 | - modbus_set_float.txt \ | |
| 48 | - modbus_set_float_abcd.txt \ | |
| 49 | - modbus_set_float_badc.txt \ | |
| 50 | - modbus_set_float_cdab.txt \ | |
| 51 | - modbus_set_float_dcba.txt \ | |
| 52 | - modbus_set_indication_timeout.txt \ | |
| 53 | - modbus_set_response_timeout.txt \ | |
| 54 | - modbus_set_slave.txt \ | |
| 55 | - modbus_set_socket.txt \ | |
| 56 | - modbus_strerror.txt \ | |
| 57 | - modbus_tcp_accept.txt \ | |
| 58 | - modbus_tcp_pi_accept.txt \ | |
| 59 | - modbus_tcp_listen.txt \ | |
| 60 | - modbus_tcp_pi_listen.txt \ | |
| 61 | - modbus_write_and_read_registers.txt \ | |
| 62 | - modbus_write_bits.txt \ | |
| 63 | - modbus_write_bit.txt \ | |
| 64 | - modbus_write_registers.txt \ | |
| 65 | - modbus_write_register.txt | |
| 66 | -TXT7 = libmodbus.txt | |
| 67 | - | |
| 68 | -EXTRA_DIST = asciidoc.conf $(TXT3) $(TXT7) | |
| 69 | - | |
| 70 | -MAN3 = $(TXT3:%.txt=%.3) | |
| 71 | -MAN7 = $(TXT7:%.txt=%.7) | |
| 72 | - | |
| 73 | -if BUILD_DOC | |
| 74 | -man3_MANS = $(MAN3) | |
| 75 | -man7_MANS = $(MAN7) | |
| 76 | -endif | |
| 77 | - | |
| 78 | -HTML = $(TXT3:%.txt=%.html) $(TXT7:%.txt=%.html) | |
| 79 | - | |
| 80 | -htmldoc: $(HTML) | |
| 81 | - | |
| 82 | -.txt.html: | |
| 83 | - asciidoc -d manpage -b xhtml11 -f asciidoc.conf -alibmodbus_version=@LIBMODBUS_VERSION@ $< | |
| 84 | - | |
| 85 | -.txt.3 .txt.7: | |
| 86 | - a2x --doctype manpage --format manpage -alibmodbus_version=@LIBMODBUS_VERSION@ $< | |
| 87 | - | |
| 88 | -CLEANFILES = *.3 *.7 *.html |
doc/asciidoc.conf deleted
| 1 | -[paradef-default] | |
| 2 | -literal-style=template="literalparagraph" | |
| 3 | - | |
| 4 | -[macros] | |
| 5 | -(?su)[\\]?(?P<name>linkmb):(?P<target>\S*?)\[(?P<attrlist>.*?)\]= | |
| 6 | - | |
| 7 | -ifdef::backend-docbook[] | |
| 8 | -[linkmb-inlinemacro] | |
| 9 | -{0%{target}} | |
| 10 | -{0#<citerefentry>} | |
| 11 | -{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>} | |
| 12 | -{0#</citerefentry>} | |
| 13 | -endif::backend-docbook[] | |
| 14 | - | |
| 15 | -ifdef::backend-xhtml11[] | |
| 16 | -[linkmb-inlinemacro] | |
| 17 | -<a href="{target}.html">{target}{0?({0})}</a> | |
| 18 | -endif::backend-xhtml11[] | |
| 19 | - | |
| 20 | -ifdef::doctype-manpage[] | |
| 21 | -ifdef::backend-docbook[] | |
| 22 | -[header] | |
| 23 | -template::[header-declarations] | |
| 24 | -<refentry> | |
| 25 | -<refmeta> | |
| 26 | -<refentrytitle>{mantitle}</refentrytitle> | |
| 27 | -<manvolnum>{manvolnum}</manvolnum> | |
| 28 | -<refmiscinfo class="source">libmodbus</refmiscinfo> | |
| 29 | -<refmiscinfo class="version">v{libmodbus_version}</refmiscinfo> | |
| 30 | -<refmiscinfo class="manual">libmodbus Manual</refmiscinfo> | |
| 31 | -</refmeta> | |
| 32 | -<refnamediv> | |
| 33 | - <refname>{manname}</refname> | |
| 34 | - <refpurpose>{manpurpose}</refpurpose> | |
| 35 | -</refnamediv> | |
| 36 | -endif::backend-docbook[] | |
| 37 | -endif::doctype-manpage[] | |
| 38 | - | |
| 39 | -ifdef::backend-xhtml11[] | |
| 40 | -[footer] | |
| 41 | -</div> | |
| 42 | -{disable-javascript%<div id="footnotes"><hr /></div>} | |
| 43 | -<div id="footer"> | |
| 44 | -<div id="footer-text"> | |
| 45 | -libmodbus {libmodbus_version}<br /> | |
| 46 | -Last updated {docdate} {doctime} | |
| 47 | -</div> | |
| 48 | -</div> | |
| 49 | -</body> | |
| 50 | -</html> | |
| 51 | -endif::backend-xhtml11[] |
doc/libmodbus.txt deleted
| 1 | -libmodbus(7) | |
| 2 | -============ | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -libmodbus - a fast and portable Modbus library | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*#include <modbus.h>* | |
| 13 | - | |
| 14 | -*cc* 'files' \`pkg-config --cflags --libs libmodbus` | |
| 15 | - | |
| 16 | -DESCRIPTION | |
| 17 | ------------ | |
| 18 | -libmodbus is a library to send/receive data with a device which respects the | |
| 19 | -Modbus protocol. This library contains various backends to communicate over | |
| 20 | -different networks (eg. serial in RTU mode or Ethernet in TCP/IPv6). The | |
| 21 | -http://www.modbus.org site provides documentation about the protocol at | |
| 22 | -http://www.modbus.org/specs.php. | |
| 23 | - | |
| 24 | -libmodbus provides an abstraction of the lower communication layers and offers | |
| 25 | -the same API on all supported platforms. | |
| 26 | - | |
| 27 | -This documentation presents an overview of libmodbus concepts, describes how | |
| 28 | -libmodbus abstracts Modbus communication with different hardware and platforms | |
| 29 | -and provides a reference manual for the functions provided by the libmodbus | |
| 30 | -library. | |
| 31 | - | |
| 32 | - | |
| 33 | -Contexts | |
| 34 | -~~~~~~~~ | |
| 35 | -The Modbus protocol contains many variants (eg. serial RTU or Ethernet TCP), to | |
| 36 | -ease the implementation of a variant, the library was designed to use a backend | |
| 37 | -for each variant. The backends are also a convenient way to fulfill other | |
| 38 | -requirements (eg. real-time operations). Each backend offers a specific function | |
| 39 | -to create a new 'modbus_t' context. The 'modbus_t' context is an opaque | |
| 40 | -structure containing all necessary information to establish a connection with | |
| 41 | -other Modbus devices according to the selected variant. | |
| 42 | - | |
| 43 | -You can choose the best context for your needs among: | |
| 44 | - | |
| 45 | -RTU Context | |
| 46 | -^^^^^^^^^^^ | |
| 47 | -The RTU backend (Remote Terminal Unit) is used in serial communication and makes | |
| 48 | -use of a compact, binary representation of the data for protocol | |
| 49 | -communication. The RTU format follows the commands/data with a cyclic redundancy | |
| 50 | -check checksum as an error check mechanism to ensure the reliability of | |
| 51 | -data. Modbus RTU is the most common implementation available for Modbus. A | |
| 52 | -Modbus RTU message must be transmitted continuously without inter-character | |
| 53 | -hesitations (extract from Wikipedia, Modbus, http://en.wikipedia.org/wiki/Modbus | |
| 54 | -(as of Mar. 13, 2011, 20:51 GMT). | |
| 55 | - | |
| 56 | -The Modbus RTU framing calls a slave, a device/service which handle Modbus | |
| 57 | -requests, and a master, a client which send requests. The communication is | |
| 58 | -always initiated by the master. | |
| 59 | - | |
| 60 | -Many Modbus devices can be connected together on the same physical link so | |
| 61 | -before sending a message, you must set the slave (receiver) with | |
| 62 | -linkmb:modbus_set_slave[3]. If you're running a slave, its slave number will be | |
| 63 | -used to filter received messages. | |
| 64 | - | |
| 65 | -The libmodbus implementation of RTU isn't time based as stated in original | |
| 66 | -Modbus specification, instead all bytes are sent as fast as possible and a | |
| 67 | -response or an indication is considered complete when all expected characters | |
| 68 | -have been received. This implementation offers very fast communication but you | |
| 69 | -must take care to set a response timeout of slaves less than response timeout of | |
| 70 | -master (ortherwise other slaves may ignore master requests when one of the slave | |
| 71 | -is not responding). | |
| 72 | - | |
| 73 | -Create a Modbus RTU context:: | |
| 74 | - - linkmb:modbus_new_rtu[3] | |
| 75 | - | |
| 76 | - | |
| 77 | -Set the serial mode:: | |
| 78 | - - linkmb:modbus_rtu_get_serial_mode[3] | |
| 79 | - - linkmb:modbus_rtu_set_serial_mode[3] | |
| 80 | - - linkmb:modbus_rtu_get_rts[3] | |
| 81 | - - linkmb:modbus_rtu_set_rts[3] | |
| 82 | - - linkmb:modbus_rtu_set_custom_rts[3] | |
| 83 | - - linkmb:modbus_rtu_get_rts_delay[3] | |
| 84 | - - linkmb:modbus_rtu_set_rts_delay[3] | |
| 85 | - | |
| 86 | - | |
| 87 | -TCP (IPv4) Context | |
| 88 | -^^^^^^^^^^^^^^^^^^ | |
| 89 | -The TCP backend implements a Modbus variant used for communications over | |
| 90 | -TCP/IPv4 networks. It does not require a checksum calculation as lower layer | |
| 91 | -takes care of the same. | |
| 92 | - | |
| 93 | -Create a Modbus TCP context:: | |
| 94 | - - linkmb:modbus_new_tcp[3] | |
| 95 | - | |
| 96 | - | |
| 97 | -TCP PI (IPv4 and IPv6) Context | |
| 98 | -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| 99 | -The TCP PI (Protocol Independent) backend implements a Modbus variant used for | |
| 100 | -communications over TCP IPv4 and IPv6 networks. It does not require a checksum | |
| 101 | -calculation as lower layer takes care of the same. | |
| 102 | - | |
| 103 | -Contrary to the TCP IPv4 only backend, the TCP PI backend offers hostname | |
| 104 | -resolution but it consumes about 1Kb of additional memory. | |
| 105 | - | |
| 106 | -Create a Modbus TCP context:: | |
| 107 | - - linkmb:modbus_new_tcp_pi[3] | |
| 108 | - | |
| 109 | - | |
| 110 | -Common | |
| 111 | -^^^^^^ | |
| 112 | -Before using any libmodbus functions, the caller must allocate and initialize a | |
| 113 | -'modbus_t' context with functions explained above, then the following functions | |
| 114 | -are provided to modify and free a 'context': | |
| 115 | - | |
| 116 | -Free libmodbus context:: | |
| 117 | - - linkmb:modbus_free[3] | |
| 118 | - | |
| 119 | -Set slave ID:: | |
| 120 | - - linkmb:modbus_set_slave[3] | |
| 121 | - | |
| 122 | -Enable debug mode:: | |
| 123 | - - linkmb:modbus_set_debug[3] | |
| 124 | - | |
| 125 | -Timeout settings:: | |
| 126 | - - linkmb:modbus_get_byte_timeout[3] | |
| 127 | - - linkmb:modbus_set_byte_timeout[3] | |
| 128 | - - linkmb:modbus_get_response_timeout[3] | |
| 129 | - - linkmb:modbus_set_response_timeout[3] | |
| 130 | - | |
| 131 | -Error recovery mode:: | |
| 132 | - - linkmb:modbus_set_error_recovery[3] | |
| 133 | - | |
| 134 | -Setter/getter of internal socket:: | |
| 135 | - - linkmb:modbus_set_socket[3] | |
| 136 | - - linkmb:modbus_get_socket[3] | |
| 137 | - | |
| 138 | -Information about header:: | |
| 139 | - - linkmb:modbus_get_header_length[3] | |
| 140 | - | |
| 141 | -Macros for data manipulation:: | |
| 142 | - | |
| 143 | - - MODBUS_GET_HIGH_BYTE(data), extracts the high byte from a byte | |
| 144 | - - MODBUS_GET_LOW_BYTE(data), extracts the low byte from a byte | |
| 145 | - - MODBUS_GET_INT64_FROM_INT16(tab_int16, index), builds an int64 from the four | |
| 146 | - first int16 starting at tab_int16[index] | |
| 147 | - - MODBUS_GET_INT32_FROM_INT16(tab_int16, index), builds an int32 from the two | |
| 148 | - first int16 starting at tab_int16[index] | |
| 149 | - - MODBUS_GET_INT16_FROM_INT8(tab_int8, index), builds an int16 from the two | |
| 150 | - first int8 starting at tab_int8[index] | |
| 151 | - - MODBUS_SET_INT16_TO_INT8(tab_int8, index, value), set an int16 value into | |
| 152 | - the two first bytes starting at tab_int8[index] | |
| 153 | - - MODBUS_SET_INT32_TO_INT16(tab_int16, index, value), set an int32 value into | |
| 154 | - the two first int16 starting at tab_int16[index] | |
| 155 | - - MODBUS_SET_INT64_TO_INT16(tab_int16, index, value), set an int64 value into | |
| 156 | - the four first int16 starting at tab_int16[index] | |
| 157 | - | |
| 158 | -Handling of bits and bytes:: | |
| 159 | - - linkmb:modbus_set_bits_from_byte[3] | |
| 160 | - - linkmb:modbus_set_bits_from_bytes[3] | |
| 161 | - - linkmb:modbus_get_byte_from_bits[3] | |
| 162 | - | |
| 163 | -Set or get float numbers:: | |
| 164 | - - linkmb:modbus_get_float_abcd[3] | |
| 165 | - - linkmb:modbus_set_float_abcd[3] | |
| 166 | - - linkmb:modbus_get_float_badc[3] | |
| 167 | - - linkmb:modbus_set_float_badc[3] | |
| 168 | - - linkmb:modbus_get_float_cdab[3] | |
| 169 | - - linkmb:modbus_set_float_cdab[3] | |
| 170 | - - linkmb:modbus_get_float_dcba[3] | |
| 171 | - - linkmb:modbus_set_float_dcba[3] | |
| 172 | - - linkmb:modbus_get_float[3] (deprecated) | |
| 173 | - - linkmb:modbus_set_float[3] (deprecated) | |
| 174 | - | |
| 175 | - | |
| 176 | - | |
| 177 | -Connection | |
| 178 | -~~~~~~~~~~ | |
| 179 | -The following functions are provided to establish and close a connection with | |
| 180 | -Modbus devices: | |
| 181 | - | |
| 182 | -Establish a connection:: | |
| 183 | - - linkmb:modbus_connect[3] | |
| 184 | - | |
| 185 | -Close a connection:: | |
| 186 | - - linkmb:modbus_close[3] | |
| 187 | - | |
| 188 | -Flush a connection:: | |
| 189 | - - linkmb:modbus_flush[3] | |
| 190 | - | |
| 191 | - | |
| 192 | -Client | |
| 193 | -~~~~~~ | |
| 194 | -The Modbus protocol defines different data types and functions to read and write | |
| 195 | -them from/to remote devices. The following functions are used by the clients to | |
| 196 | -send Modbus requests: | |
| 197 | - | |
| 198 | -Read data:: | |
| 199 | - - linkmb:modbus_read_bits[3] | |
| 200 | - - linkmb:modbus_read_input_bits[3] | |
| 201 | - - linkmb:modbus_read_registers[3] | |
| 202 | - - linkmb:modbus_read_input_registers[3] | |
| 203 | - - linkmb:modbus_report_slave_id[3] | |
| 204 | - | |
| 205 | -Write data:: | |
| 206 | - - linkmb:modbus_write_bit[3] | |
| 207 | - - linkmb:modbus_write_register[3] | |
| 208 | - - linkmb:modbus_write_bits[3] | |
| 209 | - - linkmb:modbus_write_registers[3] | |
| 210 | - | |
| 211 | -Write and read data:: | |
| 212 | - - linkmb:modbus_write_and_read_registers[3] | |
| 213 | - | |
| 214 | -Raw requests:: | |
| 215 | - - linkmb:modbus_send_raw_request[3] | |
| 216 | - - linkmb:modbus_receive_confirmation[3] | |
| 217 | - | |
| 218 | -Reply an exception:: | |
| 219 | - - linkmb:modbus_reply_exception[3] | |
| 220 | - | |
| 221 | - | |
| 222 | -Server | |
| 223 | -~~~~~~ | |
| 224 | -The server is waiting for request from clients and must answer when it is | |
| 225 | -concerned by the request. The libmodbus offers the following functions to | |
| 226 | -handle requests: | |
| 227 | - | |
| 228 | -Data mapping:: | |
| 229 | - - linkmb:modbus_mapping_new[3] | |
| 230 | - - linkmb:modbus_mapping_free[3] | |
| 231 | - | |
| 232 | -Receive:: | |
| 233 | - - linkmb:modbus_receive[3] | |
| 234 | - | |
| 235 | -Reply:: | |
| 236 | - - linkmb:modbus_reply[3] | |
| 237 | - - linkmb:modbus_reply_exception[3] | |
| 238 | - | |
| 239 | - | |
| 240 | -ERROR HANDLING | |
| 241 | --------------- | |
| 242 | -The libmodbus functions handle errors using the standard conventions found on | |
| 243 | -POSIX systems. Generally, this means that upon failure a libmodbus function | |
| 244 | -shall return either a NULL value (if returning a pointer) or a negative value | |
| 245 | -(if returning an integer), and the actual error code shall be stored in the | |
| 246 | -'errno' variable. | |
| 247 | - | |
| 248 | -The *modbus_strerror()* function is provided to translate libmodbus-specific | |
| 249 | -error codes into error message strings; for details refer to | |
| 250 | -linkmb:modbus_strerror[3]. | |
| 251 | - | |
| 252 | - | |
| 253 | -MISCELLANEOUS | |
| 254 | -------------- | |
| 255 | -The _LIBMODBUS_VERSION_STRING_ constant indicates the libmodbus version the | |
| 256 | -program has been compiled against. The variables 'libmodbus_version_major', | |
| 257 | -'libmodbus_version_minor', 'libmodbus_version_micro' give the version the | |
| 258 | -program is linked against. | |
| 259 | - | |
| 260 | - | |
| 261 | -AUTHORS | |
| 262 | -------- | |
| 263 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 264 | -<stephane.raimbault@gmail.com> | |
| 265 | - | |
| 266 | - | |
| 267 | -RESOURCES | |
| 268 | ---------- | |
| 269 | -Main web site: <http://www.libmodbus.org/> | |
| 270 | - | |
| 271 | -Report bugs on the issue tracker at | |
| 272 | -<http://github.com/stephane/libmodbus/issues>. | |
| 273 | - | |
| 274 | - | |
| 275 | -COPYING | |
| 276 | -------- | |
| 277 | -Free use of this software is granted under the terms of the GNU Lesser General | |
| 278 | -Public License (LGPL v2.1+). For details see the file `COPYING.LESSER` included | |
| 279 | -with the libmodbus distribution. |
doc/modbus_close.txt deleted
| 1 | -modbus_close(3) | |
| 2 | -=============== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_close - close a Modbus connection | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_close(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_close()* function shall close the connection established with the | |
| 18 | -backend set in the context. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -There is no return value. | |
| 24 | - | |
| 25 | - | |
| 26 | -EXAMPLE | |
| 27 | -------- | |
| 28 | -[source,c] | |
| 29 | -------------------- | |
| 30 | -modbus_t *ctx; | |
| 31 | - | |
| 32 | -ctx = modbus_new_tcp("127.0.0.1", 502); | |
| 33 | -if (modbus_connect(ctx) == -1) { | |
| 34 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 35 | - modbus_free(ctx); | |
| 36 | - return -1; | |
| 37 | -} | |
| 38 | - | |
| 39 | -modbus_close(ctx); | |
| 40 | -modbus_free(ctx); | |
| 41 | -------------------- | |
| 42 | - | |
| 43 | -SEE ALSO | |
| 44 | --------- | |
| 45 | -linkmb:modbus_connect[3] | |
| 46 | - | |
| 47 | - | |
| 48 | -AUTHORS | |
| 49 | -------- | |
| 50 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 51 | -<stephane.raimbault@gmail.com> |
doc/modbus_connect.txt deleted
| 1 | -modbus_connect(3) | |
| 2 | -================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_connect - establish a Modbus connection | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_connect(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_connect()* function shall establish a connection to a Modbus server, | |
| 18 | -a network or a bus using the context information of libmodbus context given in | |
| 19 | -argument. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 25 | -errno to one of the values defined by the system calls of the underlying | |
| 26 | -platform. | |
| 27 | - | |
| 28 | - | |
| 29 | -EXAMPLE | |
| 30 | -------- | |
| 31 | -[source,c] | |
| 32 | -------------------- | |
| 33 | -modbus_t *ctx; | |
| 34 | - | |
| 35 | -ctx = modbus_new_tcp("127.0.0.1", 502); | |
| 36 | -if (modbus_connect(ctx) == -1) { | |
| 37 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 38 | - modbus_free(ctx); | |
| 39 | - return -1; | |
| 40 | -} | |
| 41 | -------------------- | |
| 42 | - | |
| 43 | - | |
| 44 | -SEE ALSO | |
| 45 | --------- | |
| 46 | -linkmb:modbus_close[3] | |
| 47 | - | |
| 48 | - | |
| 49 | -AUTHORS | |
| 50 | -------- | |
| 51 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 52 | -<stephane.raimbault@gmail.com> |
doc/modbus_flush.txt deleted
| 1 | -modbus_flush(3) | |
| 2 | -=============== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_flush - flush non-transmitted data | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_flush(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_flush()* function shall discard data received but not read to the | |
| 18 | -socket or file descriptor associated to the context 'ctx'. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -The function shall return 0 or the number of flushed bytes if | |
| 24 | -successful. Otherwise it shall return -1 and set errno. | |
| 25 | - | |
| 26 | - | |
| 27 | -AUTHORS | |
| 28 | -------- | |
| 29 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 30 | -<stephane.raimbault@gmail.com> |
doc/modbus_free.txt deleted
| 1 | -modbus_free(3) | |
| 2 | -============== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_free - free a libmodbus context | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_free(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_free()* function shall free an allocated modbus_t structure. | |
| 18 | - | |
| 19 | - | |
| 20 | -RETURN VALUE | |
| 21 | ------------- | |
| 22 | -There is no return values. | |
| 23 | - | |
| 24 | - | |
| 25 | -SEE ALSO | |
| 26 | --------- | |
| 27 | -linkmb:libmodbus[3] | |
| 28 | - | |
| 29 | - | |
| 30 | -AUTHORS | |
| 31 | -------- | |
| 32 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 33 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_byte_from_bits.txt deleted
| 1 | -modbus_get_byte_from_bits(3) | |
| 2 | -============================ | |
| 3 | - | |
| 4 | -NAME | |
| 5 | ----- | |
| 6 | -modbus_get_byte_from_bits - get the value from many bits | |
| 7 | - | |
| 8 | - | |
| 9 | -SYNOPSIS | |
| 10 | --------- | |
| 11 | -*uint8_t modbus_get_byte_from_bits(const uint8_t *'src', int 'index', unsigned int 'nb_bits');* | |
| 12 | - | |
| 13 | - | |
| 14 | -DESCRIPTION | |
| 15 | ------------ | |
| 16 | -The *modbus_get_byte_from_bits()* function shall extract a value from many | |
| 17 | -bits. All _nb_bits_ bits from _src_ at position _index_ will be read as a | |
| 18 | -single value. To obtain a full byte, set nb_bits to 8. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -The function shall return a byte containing the bits read. | |
| 24 | - | |
| 25 | - | |
| 26 | -SEE ALSO | |
| 27 | --------- | |
| 28 | -linkmb:modbus_set_bits_from_byte[3] | |
| 29 | -linkmb:modbus_set_bits_from_bytes[3] | |
| 30 | - | |
| 31 | - | |
| 32 | -AUTHORS | |
| 33 | -------- | |
| 34 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 35 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_byte_timeout.txt deleted
| 1 | -modbus_get_byte_timeout(3) | |
| 2 | -========================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_byte_timeout - get timeout between bytes | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_get_byte_timeout(modbus_t *'ctx', uint32_t *'to_sec', uint32_t *'to_usec');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_byte_timeout()* function shall store the timeout interval | |
| 18 | -between two consecutive bytes of the same message in the _to_sec_ and _to_usec_ | |
| 19 | -arguments. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 25 | -errno. | |
| 26 | - | |
| 27 | - | |
| 28 | -EXAMPLE | |
| 29 | -------- | |
| 30 | -[source,c] | |
| 31 | -------------------- | |
| 32 | -uint32_t to_sec; | |
| 33 | -uint32_t to_usec; | |
| 34 | - | |
| 35 | -/* Save original timeout */ | |
| 36 | -modbus_get_byte_timeout(ctx, &to_sec, &to_usec); | |
| 37 | -------------------- | |
| 38 | - | |
| 39 | - | |
| 40 | -SEE ALSO | |
| 41 | --------- | |
| 42 | -linkmb:modbus_set_byte_timeout[3] | |
| 43 | -linkmb:modbus_get_response_timeout[3] | |
| 44 | -linkmb:modbus_set_response_timeout[3] | |
| 45 | - | |
| 46 | - | |
| 47 | -AUTHORS | |
| 48 | -------- | |
| 49 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 50 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_float.txt deleted
| 1 | -modbus_get_float(3) | |
| 2 | -=================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_float - get a float value from 2 registers | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*float modbus_get_float(const uint16_t *'src');* | |
| 13 | - | |
| 14 | -Warning, this function is *deprecated* since libmodbus v3.2.0 and has been | |
| 15 | -replaced by *modbus_get_float_dcba()*. | |
| 16 | - | |
| 17 | -DESCRIPTION | |
| 18 | ------------ | |
| 19 | -The *modbus_get_float()* function shall get a float from 4 bytes in Modbus | |
| 20 | -format (DCBA byte order). The _src_ array must be a pointer on two 16 bits | |
| 21 | -values, for example, if the first word is set to 0x4465 and the second to | |
| 22 | -0x229a, the float value will be 916.540649. | |
| 23 | - | |
| 24 | - | |
| 25 | -RETURN VALUE | |
| 26 | ------------- | |
| 27 | -The function shall return a float. | |
| 28 | - | |
| 29 | - | |
| 30 | -SEE ALSO | |
| 31 | --------- | |
| 32 | -linkmb:modbus_set_float[3] | |
| 33 | -linkmb:modbus_set_float_dcba[3] | |
| 34 | -linkmb:modbus_get_float_dcba[3] | |
| 35 | - | |
| 36 | -AUTHORS | |
| 37 | -------- | |
| 38 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 39 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_float_abcd.txt deleted
| 1 | -modbus_get_float_abcd(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_float_abcd - get a float value from 2 registers in ABCD byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*float modbus_get_float_abcd(const uint16_t *'src');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_float_abcd()* function shall get a float from 4 bytes in usual | |
| 18 | -Modbus format. The _src_ array must be a pointer on two 16 bits values, for | |
| 19 | -example, if the first word is set to 0x0020 and the second to 0xF147, the float | |
| 20 | -value will be read as 123456.0. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return a float. | |
| 26 | - | |
| 27 | - | |
| 28 | -SEE ALSO | |
| 29 | --------- | |
| 30 | -linkmb:modbus_set_float_abcd[3] | |
| 31 | -linkmb:modbus_get_float_badc[3] | |
| 32 | -linkmb:modbus_get_float_cdab[3] | |
| 33 | -linkmb:modbus_get_float_dcba[3] | |
| 34 | - | |
| 35 | - | |
| 36 | -AUTHORS | |
| 37 | -------- | |
| 38 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 39 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_float_badc.txt deleted
| 1 | -modbus_get_float_badc(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_float_badc - get a float value from 2 registers in BADC byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*float modbus_get_float_badc(const uint16_t *'src');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_float_badc()* function shall get a float from 4 bytes with | |
| 18 | -swapped bytes (BADC instead of ABCD). The _src_ array must be a pointer on two | |
| 19 | -16 bits values, for example, if the first word is set to 0x2000 and the second | |
| 20 | -to 0x47F1, the float value will be read as 123456.0. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return a float. | |
| 26 | - | |
| 27 | - | |
| 28 | -SEE ALSO | |
| 29 | --------- | |
| 30 | -linkmb:modbus_set_float_badc[3] | |
| 31 | -linkmb:modbus_get_float_abcd[3] | |
| 32 | -linkmb:modbus_get_float_cdab[3] | |
| 33 | -linkmb:modbus_get_float_dcba[3] | |
| 34 | - | |
| 35 | - | |
| 36 | -AUTHORS | |
| 37 | -------- | |
| 38 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 39 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_float_cdab.txt deleted
| 1 | -modbus_get_float_cdab(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_float_cdab - get a float value from 2 registers in CDAB byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*float modbus_get_float_cdab(const uint16_t *'src');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_float_cdab()* function shall get a float from 4 bytes with | |
| 18 | -swapped words (CDAB order instead of ABCD). The _src_ array must be a pointer on | |
| 19 | -two 16 bits values, for example, if the first word is set to F147 and the second | |
| 20 | -to 0x0020, the float value will be read as 123456.0. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return a float. | |
| 26 | - | |
| 27 | - | |
| 28 | -SEE ALSO | |
| 29 | --------- | |
| 30 | -linkmb:modbus_set_float_cdab[3] | |
| 31 | -linkmb:modbus_get_float_abcd[3] | |
| 32 | -linkmb:modbus_get_float_badc[3] | |
| 33 | -linkmb:modbus_get_float_dcba[3] | |
| 34 | - | |
| 35 | - | |
| 36 | -AUTHORS | |
| 37 | -------- | |
| 38 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 39 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_float_dcba.txt deleted
| 1 | -modbus_get_float_dcba(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_float_dcba - get a float value from 2 registers in DCBA byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*float modbus_get_float_dcba(const uint16_t *'src');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_float_dcba()* function shall get a float from 4 bytes in | |
| 18 | -inversed Modbus format (DCBA order instead of ABCD). The _src_ array must be a | |
| 19 | -pointer on two 16 bits values, for example, if the first word is set to 0x47F1 | |
| 20 | -and the second to 0x2000, the float value will be read as 123456.0. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return a float. | |
| 26 | - | |
| 27 | - | |
| 28 | -SEE ALSO | |
| 29 | --------- | |
| 30 | -linkmb:modbus_set_float_dcba[3] | |
| 31 | -linkmb:modbus_get_float_abcd[3] | |
| 32 | -linkmb:modbus_get_float_badc[3] | |
| 33 | -linkmb:modbus_get_float_cdab[3] | |
| 34 | - | |
| 35 | - | |
| 36 | -AUTHORS | |
| 37 | -------- | |
| 38 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 39 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_header_length.txt deleted
| 1 | -modbus_get_header_length(3) | |
| 2 | -=========================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_header_length - retrieve the current header length | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_get_header_length(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_header_length()* function shall retrieve the current header | |
| 18 | -length from the backend. This function is convenient to manipulate a message and | |
| 19 | -so its limited to low-level operations. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -The header length as integer value. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:libmodbus[7] | |
| 30 | - | |
| 31 | - | |
| 32 | -AUTHORS | |
| 33 | -------- | |
| 34 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 35 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_indication_timeout.txt deleted
| 1 | -modbus_get_indication_timeout(3) | |
| 2 | -================================ | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_indication_timeout - get timeout used to wait for an indication (request received by a server). | |
| 8 | - | |
| 9 | -SYNOPSIS | |
| 10 | --------- | |
| 11 | -*int modbus_get_indication_timeout(modbus_t *'ctx', uint32_t *'to_sec', uint32_t *'to_usec');* | |
| 12 | - | |
| 13 | - | |
| 14 | -DESCRIPTION | |
| 15 | ------------ | |
| 16 | - | |
| 17 | -The *modbus_get_indication_timeout()* function shall store the timeout interval | |
| 18 | -used to wait for an indication in the _to_sec_ and _to_usec_ arguments. | |
| 19 | -Indication is the term used by the Modbus protocol to designate a request | |
| 20 | -received by the server. | |
| 21 | - | |
| 22 | -The default value is zero, it means the server will wait forever. | |
| 23 | - | |
| 24 | - | |
| 25 | -RETURN VALUE | |
| 26 | ------------- | |
| 27 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 28 | -errno. | |
| 29 | - | |
| 30 | - | |
| 31 | -EXAMPLE | |
| 32 | -------- | |
| 33 | -[source,c] | |
| 34 | -------------------- | |
| 35 | -uint32_t to_sec; | |
| 36 | -uint32_t to_usec; | |
| 37 | - | |
| 38 | -/* Save original timeout */ | |
| 39 | -modbus_get_indication_timeout(ctx, &to_sec, &to_usec); | |
| 40 | -------------------- | |
| 41 | - | |
| 42 | - | |
| 43 | -SEE ALSO | |
| 44 | --------- | |
| 45 | -linkmb:modbus_set_indication_timeout[3] | |
| 46 | -linkmb:modbus_get_response_timeout[3] | |
| 47 | -linkmb:modbus_set_response_timeout[3] | |
| 48 | - | |
| 49 | - | |
| 50 | -AUTHORS | |
| 51 | -------- | |
| 52 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 53 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_response_timeout.txt deleted
| 1 | -modbus_get_response_timeout(3) | |
| 2 | -============================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_response_timeout - get timeout for response | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_get_response_timeout(modbus_t *'ctx', uint32_t *'to_sec', uint32_t *'to_usec');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_response_timeout()* function shall return the timeout interval | |
| 18 | -used to wait for a response in the _to_sec_ and _to_usec_ arguments. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 24 | -errno. | |
| 25 | - | |
| 26 | - | |
| 27 | -EXAMPLE | |
| 28 | -------- | |
| 29 | -[source,c] | |
| 30 | -------------------- | |
| 31 | -uint32_t old_response_to_sec; | |
| 32 | -uint32_t old_response_to_usec; | |
| 33 | - | |
| 34 | -/* Save original timeout */ | |
| 35 | -modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec); | |
| 36 | - | |
| 37 | -/* Define a new and too short timeout! */ | |
| 38 | -modbus_set_response_timeout(ctx, 0, 0); | |
| 39 | -------------------- | |
| 40 | - | |
| 41 | - | |
| 42 | -SEE ALSO | |
| 43 | --------- | |
| 44 | -linkmb:modbus_set_response_timeout[3] | |
| 45 | -linkmb:modbus_get_byte_timeout[3] | |
| 46 | -linkmb:modbus_set_byte_timeout[3] | |
| 47 | - | |
| 48 | - | |
| 49 | -AUTHORS | |
| 50 | -------- | |
| 51 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 52 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_slave.txt deleted
| 1 | -modbus_get_slave(3) | |
| 2 | -=================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_slave - get slave number in the context | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_get_slave(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_slave()* function shall get the slave number in the libmodbus | |
| 18 | -context. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -The function shall return the slave number if successful. Otherwise it shall return -1 | |
| 24 | -and set errno to one of the values defined below. | |
| 25 | - | |
| 26 | - | |
| 27 | -ERRORS | |
| 28 | ------- | |
| 29 | -*EINVAL*:: | |
| 30 | -The libmodbus context is undefined. | |
| 31 | - | |
| 32 | - | |
| 33 | -SEE ALSO | |
| 34 | --------- | |
| 35 | -linkmb:modbus_set_slave[3] | |
| 36 | - | |
| 37 | - | |
| 38 | -AUTHORS | |
| 39 | -------- | |
| 40 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 41 | -<stephane.raimbault@gmail.com> |
doc/modbus_get_socket.txt deleted
| 1 | -modbus_get_socket(3) | |
| 2 | -==================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_get_socket - get the current socket of the context | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_get_socket(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_get_socket()* function shall return the current socket or file | |
| 18 | -descriptor of the libmodbus context. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -The function returns the current socket or file descriptor of the context if | |
| 24 | -successful. Otherwise it shall return -1 and set errno. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:modbus_set_socket[3] | |
| 30 | - | |
| 31 | - | |
| 32 | -AUTHORS | |
| 33 | -------- | |
| 34 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 35 | -<stephane.raimbault@gmail.com> |
doc/modbus_mapping_free.txt deleted
| 1 | -modbus_mapping_free(3) | |
| 2 | -===================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_mapping_free - free a modbus_mapping_t structure | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_mapping_free(modbus_mapping_t *'mb_mapping');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The function shall free the four arrays of mb_mapping_t structure and finally | |
| 18 | -the mb_mapping_t referenced by _mb_mapping_. | |
| 19 | - | |
| 20 | - | |
| 21 | -RETURN VALUE | |
| 22 | ------------- | |
| 23 | -There is no return values. | |
| 24 | - | |
| 25 | - | |
| 26 | -SEE ALSO | |
| 27 | --------- | |
| 28 | -linkmb:modbus_mapping_new[3] | |
| 29 | - | |
| 30 | - | |
| 31 | -AUTHORS | |
| 32 | -------- | |
| 33 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 34 | -<stephane.raimbault@gmail.com> |
doc/modbus_mapping_new.txt deleted
| 1 | -modbus_mapping_new(3) | |
| 2 | -===================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_mapping_new - allocate four arrays of bits and registers | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*modbus_mapping_t* modbus_mapping_new(int 'nb_bits', int 'nb_input_bits', int 'nb_registers', int 'nb_input_registers');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_mapping_new()* function shall allocate four arrays to store bits, | |
| 18 | -input bits, registers and inputs registers. The pointers are stored in | |
| 19 | -modbus_mapping_t structure. All values of the arrays are initialized to zero. | |
| 20 | - | |
| 21 | -This function is equivalent to a call of the | |
| 22 | -linkmb:modbus_mapping_new_start_address[3] function with all start addresses to | |
| 23 | -`0`. | |
| 24 | - | |
| 25 | -If it isn't necessary to allocate an array for a specific type of data, you can | |
| 26 | -pass the zero value in argument, the associated pointer will be NULL. | |
| 27 | - | |
| 28 | -This function is convenient to handle requests in a Modbus server/slave. | |
| 29 | - | |
| 30 | - | |
| 31 | -RETURN VALUE | |
| 32 | ------------- | |
| 33 | -The function shall return the new allocated structure if successful. Otherwise | |
| 34 | -it shall return NULL and set errno. | |
| 35 | - | |
| 36 | - | |
| 37 | -ERRORS | |
| 38 | ------- | |
| 39 | -*ENOMEM*:: | |
| 40 | -Not enough memory | |
| 41 | - | |
| 42 | - | |
| 43 | -EXAMPLE | |
| 44 | -------- | |
| 45 | -[source,c] | |
| 46 | -------------------- | |
| 47 | -/* The first value of each array is accessible from the 0 address. */ | |
| 48 | -mb_mapping = modbus_mapping_new(BITS_ADDRESS + BITS_NB, | |
| 49 | - INPUT_BITS_ADDRESS + INPUT_BITS_NB, | |
| 50 | - REGISTERS_ADDRESS + REGISTERS_NB, | |
| 51 | - INPUT_REGISTERS_ADDRESS + INPUT_REGISTERS_NB); | |
| 52 | -if (mb_mapping == NULL) { | |
| 53 | - fprintf(stderr, "Failed to allocate the mapping: %s\n", | |
| 54 | - modbus_strerror(errno)); | |
| 55 | - modbus_free(ctx); | |
| 56 | - return -1; | |
| 57 | -} | |
| 58 | -------------------- | |
| 59 | - | |
| 60 | -SEE ALSO | |
| 61 | --------- | |
| 62 | -linkmb:modbus_mapping_free[3] | |
| 63 | -linkmb:modbus_mapping_new_start_address[3] | |
| 64 | - | |
| 65 | - | |
| 66 | -AUTHORS | |
| 67 | -------- | |
| 68 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 69 | -<stephane.raimbault@gmail.com> |
doc/modbus_mapping_new_start_address.txt deleted
| 1 | -modbus_mapping_new_start_address(3) | |
| 2 | -=================================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_mapping_new_start_address - allocate four arrays of bits and registers accessible from their starting addresses | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*modbus_mapping_t* modbus_mapping_new_start_address(int 'start_bits', int 'nb_bits', | |
| 13 | - int 'start_input_bits', int 'nb_input_bits', | |
| 14 | - int 'start_registers', int 'nb_registers', | |
| 15 | - int 'start_input_registers', int 'nb_input_registers');* | |
| 16 | - | |
| 17 | - | |
| 18 | -DESCRIPTION | |
| 19 | ------------ | |
| 20 | -The _modbus_mapping_new_start_address()_ function shall allocate four arrays to | |
| 21 | -store bits, input bits, registers and inputs registers. The pointers are stored | |
| 22 | -in modbus_mapping_t structure. All values of the arrays are initialized to zero. | |
| 23 | - | |
| 24 | -The different starting addresses make it possible to place the mapping at any | |
| 25 | -address in each address space. This way, you can give access to values stored | |
| 26 | -at high addresses without allocating memory from the address zero, for eg. to | |
| 27 | -make available registers from 10000 to 10009, you can use: | |
| 28 | - | |
| 29 | -[source,c] | |
| 30 | -------------------- | |
| 31 | -mb_mapping = modbus_mapping_new_start_address(0, 0, 0, 0, 10000, 10, 0, 0); | |
| 32 | -------------------- | |
| 33 | - | |
| 34 | -With this code, only 10 registers (`uint16_t`) are allocated. | |
| 35 | - | |
| 36 | -If it isn't necessary to allocate an array for a specific type of data, you can | |
| 37 | -pass the zero value in argument, the associated pointer will be NULL. | |
| 38 | - | |
| 39 | -This function is convenient to handle requests in a Modbus server/slave. | |
| 40 | - | |
| 41 | - | |
| 42 | -RETURN VALUE | |
| 43 | ------------- | |
| 44 | -The _modbus_mapping_new_start_address()_ function shall return the new allocated structure if | |
| 45 | -successful. Otherwise it shall return NULL and set errno. | |
| 46 | - | |
| 47 | - | |
| 48 | -ERRORS | |
| 49 | ------- | |
| 50 | -ENOMEM:: | |
| 51 | -Not enough memory | |
| 52 | - | |
| 53 | - | |
| 54 | -EXAMPLE | |
| 55 | -------- | |
| 56 | -[source,c] | |
| 57 | -------------------- | |
| 58 | -/* The first value of each array is accessible at the defined address. | |
| 59 | - The end address is ADDRESS + NB - 1. */ | |
| 60 | -mb_mapping = modbus_mapping_new_start_address(BITS_ADDRESS, BITS_NB, | |
| 61 | - INPUT_BITS_ADDRESS, INPUT_BITS_NB, | |
| 62 | - REGISTERS_ADDRESS, REGISTERS_NB, | |
| 63 | - INPUT_REGISTERS_ADDRESS, INPUT_REGISTERS_NB); | |
| 64 | -if (mb_mapping == NULL) { | |
| 65 | - fprintf(stderr, "Failed to allocate the mapping: %s\n", | |
| 66 | - modbus_strerror(errno)); | |
| 67 | - modbus_free(ctx); | |
| 68 | - return -1; | |
| 69 | -} | |
| 70 | -------------------- | |
| 71 | - | |
| 72 | -SEE ALSO | |
| 73 | --------- | |
| 74 | -linkmb:modbus_mapping_new[3] | |
| 75 | -linkmb:modbus_mapping_free[3] | |
| 76 | - | |
| 77 | - | |
| 78 | -AUTHORS | |
| 79 | -------- | |
| 80 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 81 | -<stephane.raimbault@gmail.com> |
doc/modbus_mask_write_register.txt deleted
| 1 | -modbus_mask_write_register(3) | |
| 2 | -============================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_mask_write_register - mask a single register | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_mask_write_register(modbus_t *'ctx', int 'addr', uint16_t 'and', uint16_t 'or');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_mask_write_register()* function shall modify the value of the | |
| 18 | -holding register at the address 'addr' of the remote device using the algorithm: | |
| 19 | - | |
| 20 | - new value = (current value AND 'and') OR ('or' AND (NOT 'and')) | |
| 21 | - | |
| 22 | -The function uses the Modbus function code 0x16 (mask single register). | |
| 23 | - | |
| 24 | - | |
| 25 | -RETURN VALUE | |
| 26 | ------------- | |
| 27 | -The function shall return 1 if successful. Otherwise it shall return -1 and set | |
| 28 | -errno. | |
| 29 | - | |
| 30 | - | |
| 31 | -SEE ALSO | |
| 32 | --------- | |
| 33 | -linkmb:modbus_read_registers[3] | |
| 34 | -linkmb:modbus_write_registers[3] | |
| 35 | - | |
| 36 | - | |
| 37 | -AUTHORS | |
| 38 | -------- | |
| 39 | -Martijn de Gouw <martijn.de.gouw@prodrive.nl> | |
| 40 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 41 | -<stephane.raimbault@gmail.com> |
doc/modbus_new_rtu.txt deleted
| 1 | -modbus_new_rtu(3) | |
| 2 | -================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_new_rtu - create a libmodbus context for RTU | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*modbus_t *modbus_new_rtu(const char *'device', int 'baud', char 'parity', int 'data_bit', int 'stop_bit');* | |
| 13 | - | |
| 14 | - | |
| 15 | - | |
| 16 | -DESCRIPTION | |
| 17 | ------------ | |
| 18 | -The *modbus_new_rtu()* function shall allocate and initialize a _modbus_t_ | |
| 19 | -structure to communicate in RTU mode on a serial line. | |
| 20 | - | |
| 21 | -The _device_ argument specifies the name of the serial port handled by the OS, | |
| 22 | -eg. "/dev/ttyS0" or "/dev/ttyUSB0". On Windows, it's necessary to prepend COM | |
| 23 | -name with "\\.\" for COM number greater than 9, eg. "\\\\.\\COM10". See | |
| 24 | -http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx for details | |
| 25 | - | |
| 26 | -The _baud_ argument specifies the baud rate of the communication, eg. 9600, | |
| 27 | -19200, 57600, 115200, etc. | |
| 28 | - | |
| 29 | -The _parity_ argument can have one of the following values::: | |
| 30 | -* _N_ for none | |
| 31 | -* _E_ for even | |
| 32 | -* _O_ for odd | |
| 33 | - | |
| 34 | -The _data_bits_ argument specifies the number of bits of data, the allowed | |
| 35 | -values are 5, 6, 7 and 8. | |
| 36 | - | |
| 37 | -The _stop_bits_ argument specifies the bits of stop, the allowed values are 1 | |
| 38 | -and 2. | |
| 39 | - | |
| 40 | -Once the _modbus_t_ structure is initialized, you must set the slave of your | |
| 41 | -device with linkmb:modbus_set_slave[3] and connect to the serial bus with | |
| 42 | -linkmb:modbus_connect[3]. | |
| 43 | - | |
| 44 | -RETURN VALUE | |
| 45 | ------------- | |
| 46 | -The function shall return a pointer to a _modbus_t_ structure if | |
| 47 | -successful. Otherwise it shall return NULL and set errno to one of the values | |
| 48 | -defined below. | |
| 49 | - | |
| 50 | - | |
| 51 | -ERRORS | |
| 52 | ------- | |
| 53 | -*EINVAL*:: | |
| 54 | -An invalid argument was given. | |
| 55 | - | |
| 56 | -*ENOMEM*:: | |
| 57 | -Out of memory. Possibly, the application hits its memory limit and/or whole | |
| 58 | -system is running out of memory. | |
| 59 | - | |
| 60 | - | |
| 61 | -EXAMPLE | |
| 62 | -------- | |
| 63 | -[source,c] | |
| 64 | -------------------- | |
| 65 | -modbus_t *ctx; | |
| 66 | - | |
| 67 | -ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1); | |
| 68 | -if (ctx == NULL) { | |
| 69 | - fprintf(stderr, "Unable to create the libmodbus context\n"); | |
| 70 | - return -1; | |
| 71 | -} | |
| 72 | - | |
| 73 | -modbus_set_slave(ctx, YOUR_DEVICE_ID); | |
| 74 | - | |
| 75 | -if (modbus_connect(ctx) == -1) { | |
| 76 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 77 | - modbus_free(ctx); | |
| 78 | - return -1; | |
| 79 | -} | |
| 80 | -------------------- | |
| 81 | - | |
| 82 | -SEE ALSO | |
| 83 | --------- | |
| 84 | -linkmb:modbus_new_tcp[3] | |
| 85 | -linkmb:modbus_free[3] | |
| 86 | - | |
| 87 | - | |
| 88 | -AUTHORS | |
| 89 | -------- | |
| 90 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 91 | -<stephane.raimbault@gmail.com> |
doc/modbus_new_tcp.txt deleted
| 1 | -modbus_new_tcp(3) | |
| 2 | -================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_new_tcp - create a libmodbus context for TCP/IPv4 | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*modbus_t *modbus_new_tcp(const char *'ip', int 'port');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_new_tcp()* function shall allocate and initialize a modbus_t | |
| 18 | -structure to communicate with a Modbus TCP IPv4 server. | |
| 19 | - | |
| 20 | -The _ip_ argument specifies the IP address of the server to which the client | |
| 21 | -wants to establish a connection. A NULL value can be used to listen any addresses in | |
| 22 | -server mode. | |
| 23 | - | |
| 24 | -The _port_ argument is the TCP port to use. Set the port to | |
| 25 | -`MODBUS_TCP_DEFAULT_PORT` to use the default one (502). It’s convenient to use a | |
| 26 | -port number greater than or equal to 1024 because it’s not necessary to have | |
| 27 | -administrator privileges. | |
| 28 | - | |
| 29 | - | |
| 30 | -RETURN VALUE | |
| 31 | ------------- | |
| 32 | -The function shall return a pointer to a *modbus_t* structure if | |
| 33 | -successful. Otherwise it shall return NULL and set errno to one of the values | |
| 34 | -defined below. | |
| 35 | - | |
| 36 | - | |
| 37 | -ERRORS | |
| 38 | ------- | |
| 39 | -*EINVAL*:: | |
| 40 | -An invalid IP address was given. | |
| 41 | - | |
| 42 | -*ENOMEM*:: | |
| 43 | -Out of memory. Possibly, the application hits its memory limit and/or whole | |
| 44 | -system is running out of memory. | |
| 45 | - | |
| 46 | - | |
| 47 | -EXAMPLE | |
| 48 | -------- | |
| 49 | -[source,c] | |
| 50 | -------------------- | |
| 51 | -modbus_t *ctx; | |
| 52 | - | |
| 53 | -ctx = modbus_new_tcp("127.0.0.1", 1502); | |
| 54 | -if (ctx == NULL) { | |
| 55 | - fprintf(stderr, "Unable to allocate libmodbus context\n"); | |
| 56 | - return -1; | |
| 57 | -} | |
| 58 | - | |
| 59 | -if (modbus_connect(ctx) == -1) { | |
| 60 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 61 | - modbus_free(ctx); | |
| 62 | - return -1; | |
| 63 | -} | |
| 64 | -------------------- | |
| 65 | - | |
| 66 | -SEE ALSO | |
| 67 | --------- | |
| 68 | -linkmb:modbus_tcp_listen[3] | |
| 69 | -linkmb:modbus_free[3] | |
| 70 | - | |
| 71 | - | |
| 72 | -AUTHORS | |
| 73 | -------- | |
| 74 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 75 | -<stephane.raimbault@gmail.com> |
doc/modbus_new_tcp_pi.txt deleted
| 1 | -modbus_new_tcp_pi(3) | |
| 2 | -==================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_new_tcp_pi - create a libmodbus context for TCP Protocol Independent | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*modbus_t *modbus_new_tcp_pi(const char *'node', const char *'service');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_new_tcp_pi()* function shall allocate and initialize a modbus_t | |
| 18 | -structure to communicate with a Modbus TCP IPv4 or IPv6 server. | |
| 19 | - | |
| 20 | -The _node_ argument specifies the host name or IP address of the host to connect | |
| 21 | -to, eg. "192.168.0.5" , "::1" or "server.com". A NULL value can be used to | |
| 22 | -listen any addresses in server mode. | |
| 23 | - | |
| 24 | -The _service_ argument is the service name/port number to connect to. To use the | |
| 25 | -default Modbus port use the string "502". On many Unix systems, it’s | |
| 26 | -convenient to use a port number greater than or equal to 1024 because it’s not | |
| 27 | -necessary to have administrator privileges. | |
| 28 | - | |
| 29 | - | |
| 30 | -RETURN VALUE | |
| 31 | ------------- | |
| 32 | -The function shall return a pointer to a *modbus_t* structure if | |
| 33 | -successful. Otherwise it shall return NULL and set errno to one of the values | |
| 34 | -defined below. | |
| 35 | - | |
| 36 | - | |
| 37 | -ERRORS | |
| 38 | ------- | |
| 39 | -*EINVAL*:: | |
| 40 | -The node string is empty or has been truncated. The service string is empty or | |
| 41 | -has been truncated. | |
| 42 | - | |
| 43 | -*ENOMEM*:: | |
| 44 | -Out of memory. Possibly, the application hits its memory limit and/or whole | |
| 45 | -system is running out of memory. | |
| 46 | - | |
| 47 | - | |
| 48 | -EXAMPLE | |
| 49 | -------- | |
| 50 | -[source,c] | |
| 51 | -------------------- | |
| 52 | -modbus_t *ctx; | |
| 53 | - | |
| 54 | -ctx = modbus_new_tcp_pi("::1", "1502"); | |
| 55 | -if (ctx == NULL) { | |
| 56 | - fprintf(stderr, "Unable to allocate libmodbus context\n"); | |
| 57 | - return -1; | |
| 58 | -} | |
| 59 | - | |
| 60 | -if (modbus_connect(ctx) == -1) { | |
| 61 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 62 | - modbus_free(ctx); | |
| 63 | - return -1; | |
| 64 | -} | |
| 65 | -------------------- | |
| 66 | - | |
| 67 | -SEE ALSO | |
| 68 | --------- | |
| 69 | -linkmb:modbus_new_tcp[3] | |
| 70 | -linkmb:modbus_tcp_pi_listen[3] | |
| 71 | -linkmb:modbus_free[3] | |
| 72 | - | |
| 73 | - | |
| 74 | -AUTHORS | |
| 75 | -------- | |
| 76 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 77 | -<stephane.raimbault@gmail.com> |
doc/modbus_read_bits.txt deleted
| 1 | -modbus_read_bits(3) | |
| 2 | -=================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_read_bits - read many bits | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_read_bits(modbus_t *'ctx', int 'addr', int 'nb', uint8_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_read_bits()* function shall read the status of the _nb_ bits (coils) | |
| 18 | -to the address _addr_ of the remote device. The result of reading is stored in | |
| 19 | -_dest_ array as unsigned bytes (8 bits) set to `TRUE` or `FALSE`. | |
| 20 | - | |
| 21 | -You must take care to allocate enough memory to store the results in _dest_ | |
| 22 | -(at least _nb_ * sizeof(uint8_t)). | |
| 23 | - | |
| 24 | -The function uses the Modbus function code 0x01 (read coil status). | |
| 25 | - | |
| 26 | - | |
| 27 | -RETURN VALUE | |
| 28 | ------------- | |
| 29 | -The function shall return the number of read bits if successful. Otherwise it | |
| 30 | -shall return -1 and set errno. | |
| 31 | - | |
| 32 | - | |
| 33 | -ERRORS | |
| 34 | ------- | |
| 35 | -*EMBMDATA*:: | |
| 36 | -Too many bits requested | |
| 37 | - | |
| 38 | - | |
| 39 | -SEE ALSO | |
| 40 | --------- | |
| 41 | -linkmb:modbus_write_bit[3] | |
| 42 | -linkmb:modbus_write_bits[3] | |
| 43 | - | |
| 44 | - | |
| 45 | -AUTHORS | |
| 46 | -------- | |
| 47 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 48 | -<stephane.raimbault@gmail.com> |
doc/modbus_read_input_bits.txt deleted
| 1 | -modbus_read_input_bits(3) | |
| 2 | -========================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_read_input_bits - read many input bits | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_read_input_bits(modbus_t *'ctx', int 'addr', int 'nb', uint8_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_read_input_bits()* function shall read the content of the _nb_ input | |
| 18 | -bits to the address _addr_ of the remote device. The result of reading is stored | |
| 19 | -in _dest_ array as unsigned bytes (8 bits) set to _TRUE_ or _FALSE_. | |
| 20 | - | |
| 21 | -You must take care to allocate enough memory to store the results in _dest_ | |
| 22 | -(at least _nb_ * sizeof(uint8_t)). | |
| 23 | - | |
| 24 | -The function uses the Modbus function code 0x02 (read input status). | |
| 25 | - | |
| 26 | - | |
| 27 | -RETURN VALUE | |
| 28 | ------------- | |
| 29 | -The function shall return the number of read input status if | |
| 30 | -successful. Otherwise it shall return -1 and set errno. | |
| 31 | - | |
| 32 | - | |
| 33 | -ERRORS | |
| 34 | ------- | |
| 35 | -*EMBMDATA*:: | |
| 36 | -Too many discrete inputs requested | |
| 37 | - | |
| 38 | - | |
| 39 | -SEE ALSO | |
| 40 | --------- | |
| 41 | -linkmb:modbus_read_input_registers[3] | |
| 42 | - | |
| 43 | - | |
| 44 | -AUTHORS | |
| 45 | -------- | |
| 46 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 47 | -<stephane.raimbault@gmail.com> |
doc/modbus_read_input_registers.txt deleted
| 1 | -modbus_read_input_registers(3) | |
| 2 | -============================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_read_input_registers - read many input registers | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_read_input_registers(modbus_t *'ctx', int 'addr', int 'nb', uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_read_input_registers()* function shall read the content of the _nb_ | |
| 18 | -input registers to address _addr_ of the remote device. The result of the | |
| 19 | -reading is stored in _dest_ array as word values (16 bits). | |
| 20 | - | |
| 21 | -You must take care to allocate enough memory to store the results in _dest_ (at | |
| 22 | -least _nb_ * sizeof(uint16_t)). | |
| 23 | - | |
| 24 | -The function uses the Modbus function code 0x04 (read input registers). The | |
| 25 | -holding registers and input registers have different historical meaning, but | |
| 26 | -nowadays it's more common to use holding registers only. | |
| 27 | - | |
| 28 | - | |
| 29 | -RETURN VALUE | |
| 30 | ------------- | |
| 31 | -The function shall return the number of read input registers if | |
| 32 | -successful. Otherwise it shall return -1 and set errno. | |
| 33 | - | |
| 34 | - | |
| 35 | -ERRORS | |
| 36 | ------- | |
| 37 | -*EMBMDATA*:: | |
| 38 | -Too many bits requested | |
| 39 | - | |
| 40 | - | |
| 41 | -SEE ALSO | |
| 42 | --------- | |
| 43 | -linkmb:modbus_read_input_bits[3] | |
| 44 | -linkmb:modbus_write_register[3] | |
| 45 | -linkmb:modbus_write_registers[3] | |
| 46 | - | |
| 47 | - | |
| 48 | -AUTHORS | |
| 49 | -------- | |
| 50 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 51 | -<stephane.raimbault@gmail.com> |
doc/modbus_read_registers.txt deleted
| 1 | -modbus_read_registers(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_read_registers - read many registers | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_read_registers(modbus_t *'ctx', int 'addr', int 'nb', uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_read_registers()* function shall read the content of the _nb_ | |
| 18 | -holding registers to the address _addr_ of the remote device. The result of | |
| 19 | -reading is stored in _dest_ array as word values (16 bits). | |
| 20 | - | |
| 21 | -You must take care to allocate enough memory to store the results in _dest_ | |
| 22 | -(at least _nb_ * sizeof(uint16_t)). | |
| 23 | - | |
| 24 | -The function uses the Modbus function code 0x03 (read holding registers). | |
| 25 | - | |
| 26 | - | |
| 27 | -RETURN VALUE | |
| 28 | ------------- | |
| 29 | -The function shall return the number of read registers | |
| 30 | -if successful. Otherwise it shall return -1 and set errno. | |
| 31 | - | |
| 32 | - | |
| 33 | -ERRORS | |
| 34 | ------- | |
| 35 | -*EMBMDATA*:: | |
| 36 | -Too many registers requested | |
| 37 | - | |
| 38 | - | |
| 39 | -EXAMPLE | |
| 40 | -------- | |
| 41 | -[source,c] | |
| 42 | -------------------- | |
| 43 | -modbus_t *ctx; | |
| 44 | -uint16_t tab_reg[64]; | |
| 45 | -int rc; | |
| 46 | -int i; | |
| 47 | - | |
| 48 | -ctx = modbus_new_tcp("127.0.0.1", 1502); | |
| 49 | -if (modbus_connect(ctx) == -1) { | |
| 50 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 51 | - modbus_free(ctx); | |
| 52 | - return -1; | |
| 53 | -} | |
| 54 | - | |
| 55 | -rc = modbus_read_registers(ctx, 0, 10, tab_reg); | |
| 56 | -if (rc == -1) { | |
| 57 | - fprintf(stderr, "%s\n", modbus_strerror(errno)); | |
| 58 | - return -1; | |
| 59 | -} | |
| 60 | - | |
| 61 | -for (i=0; i < rc; i++) { | |
| 62 | - printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]); | |
| 63 | -} | |
| 64 | - | |
| 65 | -modbus_close(ctx); | |
| 66 | -modbus_free(ctx); | |
| 67 | -------------------- | |
| 68 | - | |
| 69 | - | |
| 70 | -SEE ALSO | |
| 71 | --------- | |
| 72 | -linkmb:modbus_write_register[3] | |
| 73 | -linkmb:modbus_write_registers[3] | |
| 74 | - | |
| 75 | - | |
| 76 | -AUTHORS | |
| 77 | -------- | |
| 78 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 79 | -<stephane.raimbault@gmail.com> |
doc/modbus_receive.txt deleted
| 1 | -modbus_receive(3) | |
| 2 | -================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_receive - receive an indication request | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_receive(modbus_t *'ctx', uint8_t *'req');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_receive()* function shall receive an indication request from the | |
| 18 | -socket of the context _ctx_. This function is used by Modbus slave/server to | |
| 19 | -receive and analyze indication request sent by the masters/clients. | |
| 20 | - | |
| 21 | -If you need to use another socket or file descriptor than the one defined in the | |
| 22 | -context _ctx_, see the function linkmb:modbus_set_socket[3]. | |
| 23 | - | |
| 24 | - | |
| 25 | -RETURN VALUE | |
| 26 | ------------- | |
| 27 | -The function shall store the indication request in _req_ and return the request | |
| 28 | -length if successful. The returned request length can be zero if the indication | |
| 29 | -request is ignored (eg. a query for another slave in RTU mode). Otherwise it | |
| 30 | -shall return -1 and set errno. | |
| 31 | - | |
| 32 | - | |
| 33 | -SEE ALSO | |
| 34 | --------- | |
| 35 | -linkmb:modbus_set_socket[3] | |
| 36 | -linkmb:modbus_reply[3] | |
| 37 | - | |
| 38 | - | |
| 39 | -AUTHORS | |
| 40 | -------- | |
| 41 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 42 | -<stephane.raimbault@gmail.com> |
doc/modbus_receive_confirmation.txt deleted
| 1 | -modbus_receive_confirmation(3) | |
| 2 | -============================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_receive_confirmation - receive a confirmation request | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_receive_confirmation(modbus_t *'ctx', uint8_t *'rsp');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_receive_confirmation()* function shall receive a request via the | |
| 18 | -socket of the context _ctx_. This function must be used for debugging purposes | |
| 19 | -because the received response isn't checked against the initial request. This | |
| 20 | -function can be used to receive request not handled by the library. | |
| 21 | - | |
| 22 | -The maximum size of the response depends on the used backend, in RTU the _rsp_ | |
| 23 | -array must be _MODBUS_RTU_MAX_ADU_LENGTH_ bytes and in TCP it must be | |
| 24 | -_MODBUS_TCP_MAX_ADU_LENGTH_ bytes. If you want to write code compatible with | |
| 25 | -both, you can use the constant _MODBUS_MAX_ADU_LENGTH_ (maximum value of all | |
| 26 | -libmodbus backends). Take care to allocate enough memory to store responses to | |
| 27 | -avoid crashes of your server. | |
| 28 | - | |
| 29 | - | |
| 30 | -RETURN VALUE | |
| 31 | ------------- | |
| 32 | -The function shall store the confirmation request in _rsp_ and return the | |
| 33 | -response length if successful. The returned request length can be zero if the | |
| 34 | -indication request is ignored (eg. a query for another slave in RTU | |
| 35 | -mode). Otherwise it shall return -1 and set errno. | |
| 36 | - | |
| 37 | -EXAMPLE | |
| 38 | -------- | |
| 39 | -[source,c] | |
| 40 | -------------------- | |
| 41 | -uint8_t rsp[MODBUS_MAX_ADU_LENGTH]; | |
| 42 | -rc = modbus_receive_confirmation(ctx, rsp); | |
| 43 | -------------------- | |
| 44 | - | |
| 45 | -SEE ALSO | |
| 46 | --------- | |
| 47 | -linkmb:modbus_send_raw_request[3] | |
| 48 | - | |
| 49 | - | |
| 50 | -AUTHORS | |
| 51 | -------- | |
| 52 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 53 | -<stephane.raimbault@gmail.com> |
doc/modbus_reply.txt deleted
| 1 | -modbus_reply(3) | |
| 2 | -=============== | |
| 3 | - | |
| 4 | -NAME | |
| 5 | ----- | |
| 6 | -modbus_reply - send a response to the received request | |
| 7 | - | |
| 8 | - | |
| 9 | -SYNOPSIS | |
| 10 | --------- | |
| 11 | -*int modbus_reply(modbus_t *'ctx', const uint8_t *'req', int 'req_length', modbus_mapping_t *'mb_mapping'); | |
| 12 | - | |
| 13 | - | |
| 14 | -DESCRIPTION | |
| 15 | ------------ | |
| 16 | -The *modbus_reply()* function shall send a response to received request. The | |
| 17 | -request _req_ given in argument is analyzed, a response is then built and sent | |
| 18 | -by using the information of the modbus context _ctx_. | |
| 19 | - | |
| 20 | -If the request indicates to read or write a value the operation will done in the | |
| 21 | -modbus mapping _mb_mapping_ according to the type of the manipulated data. | |
| 22 | - | |
| 23 | -If an error occurs, an exception response will be sent. | |
| 24 | - | |
| 25 | -This function is designed for Modbus server. | |
| 26 | - | |
| 27 | - | |
| 28 | -RETURN VALUE | |
| 29 | ------------- | |
| 30 | -The function shall return the length of the response sent if | |
| 31 | -successful. Otherwise it shall return -1 and set errno. | |
| 32 | - | |
| 33 | - | |
| 34 | -ERRORS | |
| 35 | ------- | |
| 36 | -*EMBMDATA*:: | |
| 37 | -Sending has failed | |
| 38 | - | |
| 39 | -See also the errors returned by the syscall used to send the response (eg. send | |
| 40 | -or write). | |
| 41 | - | |
| 42 | - | |
| 43 | -SEE ALSO | |
| 44 | --------- | |
| 45 | -linkmb:modbus_reply_exception[3] | |
| 46 | -linkmb:libmodbus[7] | |
| 47 | - | |
| 48 | - | |
| 49 | -AUTHORS | |
| 50 | -------- | |
| 51 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 52 | -<stephane.raimbault@gmail.com> |
doc/modbus_reply_exception.txt deleted
| 1 | -modbus_reply_exception(3) | |
| 2 | -========================= | |
| 3 | - | |
| 4 | -NAME | |
| 5 | ----- | |
| 6 | -modbus_reply_exception - send an exception response | |
| 7 | - | |
| 8 | - | |
| 9 | -SYNOPSIS | |
| 10 | --------- | |
| 11 | -*int modbus_reply_exception(modbus_t *'ctx', const uint8_t *'req', unsigned int 'exception_code'); | |
| 12 | - | |
| 13 | - | |
| 14 | -DESCRIPTION | |
| 15 | ------------ | |
| 16 | -The *modbus_reply_exception()* function shall send an exception response based | |
| 17 | -on the 'exception_code' in argument. | |
| 18 | - | |
| 19 | -The libmodbus provides the following exception codes: | |
| 20 | - | |
| 21 | -* MODBUS_EXCEPTION_ILLEGAL_FUNCTION (1) | |
| 22 | -* MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS (2) | |
| 23 | -* MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE (3) | |
| 24 | -* MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE (4) | |
| 25 | -* MODBUS_EXCEPTION_ACKNOWLEDGE (5) | |
| 26 | -* MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY (6) | |
| 27 | -* MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE (7) | |
| 28 | -* MODBUS_EXCEPTION_MEMORY_PARITY (8) | |
| 29 | -* MODBUS_EXCEPTION_NOT_DEFINED (9) | |
| 30 | -* MODBUS_EXCEPTION_GATEWAY_PATH (10) | |
| 31 | -* MODBUS_EXCEPTION_GATEWAY_TARGET (11) | |
| 32 | - | |
| 33 | -The initial request _req_ is required to build a valid response. | |
| 34 | - | |
| 35 | - | |
| 36 | -RETURN VALUE | |
| 37 | ------------- | |
| 38 | -The function shall return the length of the response sent if | |
| 39 | -successful. Otherwise it shall return -1 and set errno. | |
| 40 | - | |
| 41 | - | |
| 42 | -ERRORS | |
| 43 | ------- | |
| 44 | -*EINVAL*:: | |
| 45 | -The exception code is invalid | |
| 46 | - | |
| 47 | - | |
| 48 | -SEE ALSO | |
| 49 | --------- | |
| 50 | -linkmb:modbus_reply[3] | |
| 51 | -linkmb:libmodbus[7] | |
| 52 | - | |
| 53 | - | |
| 54 | -AUTHORS | |
| 55 | -------- | |
| 56 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 57 | -<stephane.raimbault@gmail.com> |
doc/modbus_report_slave_id.txt deleted
| 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', int 'max_dest', 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 slave ID, this unique ID is in reality not unique at all so it's not | |
| 23 | - possible to depend on it to know how the information are packed in the | |
| 24 | - response. | |
| 25 | -* the run indicator status (0x00 = OFF, 0xFF = ON) | |
| 26 | -* additional data specific to each controller. For example, libmodbus returns | |
| 27 | - the version of the library as a string. | |
| 28 | - | |
| 29 | -The function writes at most _max_dest_ bytes from the response to _dest_ so | |
| 30 | -you must ensure that _dest_ is large enough. | |
| 31 | - | |
| 32 | -RETURN VALUE | |
| 33 | ------------- | |
| 34 | -The function shall return the number of read data if successful. | |
| 35 | - | |
| 36 | -If the output was truncated due to the _max_dest_ limit then the return value is | |
| 37 | -the number of bytes which would have been written to _dest_ if enough space had | |
| 38 | -been available. Thus, a return value greater than _max_dest_ means that the | |
| 39 | -response data was truncated. | |
| 40 | - | |
| 41 | -Otherwise it shall return -1 and set errno. | |
| 42 | - | |
| 43 | -EXAMPLE | |
| 44 | -------- | |
| 45 | -[source,c] | |
| 46 | -------------------- | |
| 47 | -uint8_t tab_bytes[MODBUS_MAX_PDU_LENGTH]; | |
| 48 | - | |
| 49 | -... | |
| 50 | - | |
| 51 | -rc = modbus_report_slave_id(ctx, MODBUS_MAX_PDU_LENGTH, tab_bytes); | |
| 52 | -if (rc > 1) { | |
| 53 | - printf("Run Status Indicator: %s\n", tab_bytes[1] ? "ON" : "OFF"); | |
| 54 | -} | |
| 55 | -------------------- | |
| 56 | - | |
| 57 | - | |
| 58 | -AUTHORS | |
| 59 | -------- | |
| 60 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 61 | -<stephane.raimbault@gmail.com> |
doc/modbus_rtu_get_rts.txt deleted
| 1 | -modbus_rtu_get_rts(3) | |
| 2 | -===================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_rtu_get_rts - get the current RTS mode in RTU | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_get_rts(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_rtu_get_rts()* function shall get the current Request To Send mode | |
| 18 | -of the libmodbus context _ctx_. The possible returned values are: | |
| 19 | - | |
| 20 | -* MODBUS_RTU_RTS_NONE | |
| 21 | -* MODBUS_RTU_RTS_UP | |
| 22 | -* MODBUS_RTU_RTS_DOWN | |
| 23 | - | |
| 24 | -This function can only be used with a context using a RTU backend. | |
| 25 | - | |
| 26 | - | |
| 27 | -RETURN VALUE | |
| 28 | ------------- | |
| 29 | -The function shall return the current RTS mode if successful. Otherwise it shall | |
| 30 | -return -1 and set errno. | |
| 31 | - | |
| 32 | - | |
| 33 | -ERRORS | |
| 34 | ------- | |
| 35 | -*EINVAL*:: | |
| 36 | -The libmodbus backend is not RTU. | |
| 37 | - | |
| 38 | - | |
| 39 | -SEE ALSO | |
| 40 | --------- | |
| 41 | -linkmb:modbus_rtu_set_rts[3] | |
| 42 | - | |
| 43 | - | |
| 44 | -AUTHORS | |
| 45 | -------- | |
| 46 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 47 | -<stephane.raimbault@gmail.com> |
doc/modbus_rtu_get_rts_delay.txt deleted
| 1 | -modbus_rtu_get_rts_delay(3) | |
| 2 | -=========================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_rtu_get_rts_delay - get the current RTS delay in RTU | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_get_rts_delay(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | - | |
| 18 | -The _modbus_rtu_get_rts_delay()_ function shall get the current Request To Send | |
| 19 | -delay period of the libmodbus context 'ctx'. | |
| 20 | - | |
| 21 | -This function can only be used with a context using a RTU backend. | |
| 22 | - | |
| 23 | - | |
| 24 | -RETURN VALUE | |
| 25 | ------------- | |
| 26 | -The _modbus_rtu_get_rts_delay()_ function shall return the current RTS delay in | |
| 27 | -microseconds if successful. Otherwise it shall return -1 and set errno. | |
| 28 | - | |
| 29 | - | |
| 30 | -ERRORS | |
| 31 | ------- | |
| 32 | -*EINVAL*:: | |
| 33 | -The libmodbus backend is not RTU. | |
| 34 | - | |
| 35 | - | |
| 36 | -SEE ALSO | |
| 37 | --------- | |
| 38 | -linkmb:modbus_rtu_set_rts_delay[3] | |
| 39 | - | |
| 40 | - | |
| 41 | -AUTHORS | |
| 42 | -------- | |
| 43 | -Jimmy Bergström <jimmy@ekontroll.com> | |
| 44 | - | |
| 45 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 46 | -<stephane.raimbault@gmail.com> |
doc/modbus_rtu_get_serial_mode.txt deleted
| 1 | -modbus_rtu_get_serial_mode(3) | |
| 2 | -============================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_rtu_get_serial_mode - get the current serial mode | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_get_serial_mode(modbus_t *'ctx');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_rtu_get_serial_mode()* function shall return the serial mode | |
| 18 | -currently used by the libmodbus context: | |
| 19 | - | |
| 20 | -*MODBUS_RTU_RS232*:: the serial line is set for RS232 communication. RS-232 | |
| 21 | - (Recommended Standard 232) is the traditional name for a series of standards | |
| 22 | - for serial binary single-ended data and control signals connecting between a | |
| 23 | - DTE (Data Terminal Equipment) and a DCE (Data Circuit-terminating | |
| 24 | - Equipment). It is commonly used in computer serial ports | |
| 25 | - | |
| 26 | -*MODBUS_RTU_RS485*:: the serial line is set for RS485 communication. EIA-485, | |
| 27 | - also known as TIA/EIA-485 or RS-485, is a standard defining the electrical | |
| 28 | - characteristics of drivers and receivers for use in balanced digital multipoint | |
| 29 | - systems. This standard is widely used for communications in industrial | |
| 30 | - automation because it can be used effectively over long distances and in | |
| 31 | - electrically noisy environments. | |
| 32 | - | |
| 33 | -This function is only available on Linux kernels 2.6.28 onwards and can only be | |
| 34 | -used with a context using a RTU backend. | |
| 35 | - | |
| 36 | - | |
| 37 | -RETURN VALUE | |
| 38 | ------------- | |
| 39 | -The function shall return `MODBUS_RTU_RS232` or `MODBUS_RTU_RS485` if | |
| 40 | -successful. Otherwise it shall return -1 and set errno to one of the values | |
| 41 | -defined below. | |
| 42 | - | |
| 43 | - | |
| 44 | -ERRORS | |
| 45 | ------- | |
| 46 | -*EINVAL*:: | |
| 47 | -The current libmodbus backend is not RTU. | |
| 48 | - | |
| 49 | - | |
| 50 | -AUTHORS | |
| 51 | -------- | |
| 52 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 53 | -<stephane.raimbault@gmail.com> |
doc/modbus_rtu_set_custom_rts.txt deleted
| 1 | -modbus_rtu_set_custom_rts(3) | |
| 2 | -============================ | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_rtu_set_custom_rts - set a function to be used for custom RTS implementation | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_set_custom_rts(modbus_t *'ctx', void (*'set_rts') (modbus_t *ctx, int on))* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The _modbus_rtu_set_custom_rts()_ function shall set a custom function to be | |
| 18 | -called when the RTS pin is to be set before and after a transmission. By default | |
| 19 | -this is set to an internal function that toggles the RTS pin using an ioctl | |
| 20 | -call. | |
| 21 | - | |
| 22 | -Note that this function adheres to the RTS mode, the values MODBUS_RTU_RTS_UP or | |
| 23 | -MODBUS_RTU_RTS_DOWN must be used for the function to be called. | |
| 24 | - | |
| 25 | -This function can only be used with a context using a RTU backend. | |
| 26 | - | |
| 27 | - | |
| 28 | -RETURN VALUE | |
| 29 | ------------- | |
| 30 | -The _modbus_rtu_set_custom_rts()_ function shall return 0 if successful. | |
| 31 | -Otherwise it shall return -1 and set errno to one of the values defined below. | |
| 32 | - | |
| 33 | - | |
| 34 | -ERRORS | |
| 35 | ------- | |
| 36 | -*EINVAL*:: | |
| 37 | -The libmodbus backend is not RTU. | |
| 38 | - | |
| 39 | - | |
| 40 | -AUTHORS | |
| 41 | -------- | |
| 42 | -Jimmy Bergström <jimmy@ekontroll.com> | |
| 43 | - | |
| 44 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 45 | -<stephane.raimbault@gmail.com> |
doc/modbus_rtu_set_rts_delay.txt deleted
| 1 | -modbus_rtu_set_rts_delay(3) | |
| 2 | -=========================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_rtu_set_rts_delay - set the RTS delay in RTU | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_set_rts_delay(modbus_t *'ctx', int 'us');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | - | |
| 18 | -The _modbus_rtu_set_rts_delay()_ function shall set the Request To Send delay | |
| 19 | -period of the libmodbus context 'ctx'. | |
| 20 | - | |
| 21 | -This function can only be used with a context using a RTU backend. | |
| 22 | - | |
| 23 | - | |
| 24 | -RETURN VALUE | |
| 25 | ------------- | |
| 26 | -The _modbus_rtu_set_rts_delay()_ function shall return 0 if successful. | |
| 27 | -Otherwise it shall return -1 and set errno. | |
| 28 | - | |
| 29 | - | |
| 30 | -ERRORS | |
| 31 | ------- | |
| 32 | -*EINVAL*:: | |
| 33 | -The libmodbus backend is not RTU or a negative delay was specified. | |
| 34 | - | |
| 35 | - | |
| 36 | -SEE ALSO | |
| 37 | --------- | |
| 38 | -linkmb:modbus_rtu_get_rts_delay[3] | |
| 39 | - | |
| 40 | - | |
| 41 | -AUTHORS | |
| 42 | -------- | |
| 43 | -Jimmy Bergström <jimmy@ekontroll.com> | |
| 44 | - | |
| 45 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 46 | -<stephane.raimbault@gmail.com> |
doc/modbus_rtu_set_serial_mode.txt deleted
| 1 | -modbus_rtu_set_serial_mode(3) | |
| 2 | -============================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_rtu_set_serial_mode - set the serial mode | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_set_serial_mode(modbus_t *'ctx', int 'mode');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_rtu_set_serial_mode()* function shall set the selected serial | |
| 18 | -mode: | |
| 19 | - | |
| 20 | -*MODBUS_RTU_RS232*:: the serial line is set for RS232 communication. RS-232 | |
| 21 | - (Recommended Standard 232) is the traditional name for a series of standards | |
| 22 | - for serial binary single-ended data and control signals connecting between a | |
| 23 | - DTE (Data Terminal Equipment) and a DCE (Data Circuit-terminating | |
| 24 | - Equipment). It is commonly used in computer serial ports | |
| 25 | - | |
| 26 | -*MODBUS_RTU_RS485*:: the serial line is set for RS485 communication. EIA-485, | |
| 27 | - also known as TIA/EIA-485 or RS-485, is a standard defining the electrical | |
| 28 | - characteristics of drivers and receivers for use in balanced digital multipoint | |
| 29 | - systems. This standard is widely used for communications in industrial | |
| 30 | - automation because it can be used effectively over long distances and in | |
| 31 | - electrically noisy environments. | |
| 32 | - | |
| 33 | -This function is only supported on Linux kernels 2.6.28 onwards. | |
| 34 | - | |
| 35 | - | |
| 36 | -RETURN VALUE | |
| 37 | ------------- | |
| 38 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 39 | -errno to one of the values defined below. | |
| 40 | - | |
| 41 | - | |
| 42 | -ERRORS | |
| 43 | ------- | |
| 44 | -*EINVAL*:: | |
| 45 | -The current libmodbus backend is not RTU. | |
| 46 | - | |
| 47 | -*ENOTSUP*:: | |
| 48 | -The function is not supported on your platform. | |
| 49 | - | |
| 50 | -If the call to ioctl() fails, the error code of ioctl will be returned. | |
| 51 | - | |
| 52 | - | |
| 53 | -AUTHORS | |
| 54 | -------- | |
| 55 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 56 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_bits_from_byte.txt deleted
| 1 | -modbus_set_bits_from_byte(3) | |
| 2 | -============================ | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_bits_from_byte - set many bits from a single byte value | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_bits_from_byte(uint8_t *'dest', int 'index', const uint8_t 'value');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_bits_from_byte()* function shall set many bits from a single byte. | |
| 18 | -All 8 bits from the byte _value_ will be written to _dest_ array starting at | |
| 19 | -_index_ position. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -There is no return values. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:modbus_set_bits_from_byte[3] | |
| 30 | -linkmb:modbus_set_bits_from_bytes[3] | |
| 31 | - | |
| 32 | - | |
| 33 | -AUTHORS | |
| 34 | -------- | |
| 35 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 36 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_bits_from_bytes.txt deleted
| 1 | -modbus_set_bits_from_bytes(3) | |
| 2 | -============================ | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_bits_from_bytes - set many bits from an array of bytes | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_bits_from_bytes(uint8_t *'dest', int 'index', unsigned int 'nb_bits', const uint8_t *'tab_byte');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_bits_from_bytes* function shall set bits by reading an array of | |
| 18 | -bytes. All the bits of the bytes read from the first position of the array | |
| 19 | -_tab_byte_ are written as bits in the _dest_ array starting at position _index_. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -There is no return values. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:modbus_set_bits_from_byte[3] | |
| 30 | -linkmb:modbus_get_byte_from_bits[3] | |
| 31 | - | |
| 32 | - | |
| 33 | -AUTHORS | |
| 34 | -------- | |
| 35 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 36 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_byte_timeout.txt deleted
| 1 | -modbus_set_byte_timeout(3) | |
| 2 | -========================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_byte_timeout - set timeout between bytes | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_byte_timeout(modbus_t *'ctx', uint32_t 'to_sec', uint32_t 'to_usec');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_byte_timeout()* function shall set the timeout interval between | |
| 18 | -two consecutive bytes of the same message. The timeout is an upper bound on the | |
| 19 | -amount of time elapsed before *select()* returns, if the time elapsed is longer | |
| 20 | -than the defined timeout, an `ETIMEDOUT` error will be raised by the | |
| 21 | -function waiting for a response. | |
| 22 | - | |
| 23 | -The value of _to_usec_ argument must be in the range 0 to 999999. | |
| 24 | - | |
| 25 | -If both _to_sec_ and _to_usec_ are zero, this timeout will not be used at all. | |
| 26 | -In this case, *modbus_set_response_timeout()* governs the entire handling of the | |
| 27 | -response, the full confirmation response must be received before expiration of | |
| 28 | -the response timeout. When a byte timeout is set, the response timeout is only | |
| 29 | -used to wait for until the first byte of the response. | |
| 30 | - | |
| 31 | - | |
| 32 | -RETURN VALUE | |
| 33 | ------------- | |
| 34 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 35 | -errno. | |
| 36 | - | |
| 37 | - | |
| 38 | -ERRORS | |
| 39 | ------- | |
| 40 | -*EINVAL*:: | |
| 41 | -The argument _ctx_ is NULL or _to_usec_ is larger than 999999. | |
| 42 | - | |
| 43 | - | |
| 44 | -SEE ALSO | |
| 45 | --------- | |
| 46 | -linkmb:modbus_get_byte_timeout[3] | |
| 47 | -linkmb:modbus_get_response_timeout[3] | |
| 48 | -linkmb:modbus_set_response_timeout[3] | |
| 49 | - | |
| 50 | - | |
| 51 | -AUTHORS | |
| 52 | -------- | |
| 53 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 54 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_debug.txt deleted
| 1 | -modbus_set_debug(3) | |
| 2 | -=================== | |
| 3 | - | |
| 4 | -NAME | |
| 5 | ----- | |
| 6 | -modbus_set_debug - set debug flag of the context | |
| 7 | - | |
| 8 | - | |
| 9 | -SYNOPSIS | |
| 10 | --------- | |
| 11 | -*int modbus_set_debug(modbus_t *'ctx', int 'flag');* | |
| 12 | - | |
| 13 | - | |
| 14 | -DESCRIPTION | |
| 15 | ------------ | |
| 16 | -The *modbus_set_debug()* function shall set the debug flag of the *modbus_t* | |
| 17 | -context by using the argument _flag_. By default, the boolean flag is set to | |
| 18 | -`FALSE`. When the _flag_ value is set to `TRUE`, many verbose messages are | |
| 19 | -displayed on stdout and stderr. For example, this flag is useful to display the | |
| 20 | -bytes of the Modbus messages. | |
| 21 | - | |
| 22 | -[verse] | |
| 23 | -___________________ | |
| 24 | -[00][14][00][00][00][06][12][03][00][6B][00][03] | |
| 25 | -Waiting for a confirmation... | |
| 26 | -<00><14><00><00><00><09><12><03><06><02><2B><00><00><00><00> | |
| 27 | -___________________ | |
| 28 | - | |
| 29 | - | |
| 30 | -RETURN VALUE | |
| 31 | ------------- | |
| 32 | -The function shall return 0 if successful. Otherwise it shall return -1 and set errno. | |
| 33 | - | |
| 34 | - | |
| 35 | -AUTHORS | |
| 36 | -------- | |
| 37 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 38 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_float.txt deleted
| 1 | -modbus_set_float(3) | |
| 2 | -=================== | |
| 3 | - | |
| 4 | -NAME | |
| 5 | ----- | |
| 6 | -modbus_set_float - set a float value from 2 registers | |
| 7 | - | |
| 8 | - | |
| 9 | -SYNOPSIS | |
| 10 | --------- | |
| 11 | -*void modbus_set_float(float 'f', uint16_t *'dest');* | |
| 12 | - | |
| 13 | -Warning, this function is *deprecated* since libmodbus v3.2.0 and has been | |
| 14 | -replaced by *modbus_set_float_dcba()*. | |
| 15 | - | |
| 16 | -DESCRIPTION | |
| 17 | ------------ | |
| 18 | -The *modbus_set_float()* function shall set a float to 4 bytes in Modbus format | |
| 19 | -(ABCD). The _dest_ array must be pointer on two 16 bits values to be able to | |
| 20 | -store the full result of the conversion. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -There is no return values. | |
| 26 | - | |
| 27 | - | |
| 28 | -SEE ALSO | |
| 29 | --------- | |
| 30 | -linkmb:modbus_get_float[3] | |
| 31 | -linkmb:modbus_set_float_dcba[3] | |
| 32 | - | |
| 33 | -AUTHORS | |
| 34 | -------- | |
| 35 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 36 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_float_abcd.txt deleted
| 1 | -modbus_set_float_abcd(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_float_abcd - set a float value in 2 registers using ABCD byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_float_abcd(float 'f', uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_float_abcd()* function shall set a float to 4 bytes in usual | |
| 18 | -Modbus format. The _dest_ array must be pointer on two 16 bits values to be able | |
| 19 | -to store the full result of the conversion. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -There is no return values. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:modbus_get_float_abcd[3] | |
| 30 | -linkmb:modbus_set_float_badc[3] | |
| 31 | -linkmb:modbus_set_float_cdab[3] | |
| 32 | -linkmb:modbus_set_float_dcba[3] | |
| 33 | - | |
| 34 | - | |
| 35 | -AUTHORS | |
| 36 | -------- | |
| 37 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 38 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_float_badc.txt deleted
| 1 | -modbus_set_float_badc(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_float_badc - set a float value in 2 registers using BADC byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_float_badc(float 'f', uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_float_badc()* function shall set a float to 4 bytes in swapped | |
| 18 | -bytes Modbus format (BADC instead of ABCD). The _dest_ array must be pointer on | |
| 19 | -two 16 bits values to be able to store the full result of the conversion. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -There is no return values. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:modbus_get_float_badc[3] | |
| 30 | -linkmb:modbus_set_float_abcd[3] | |
| 31 | -linkmb:modbus_set_float_cdab[3] | |
| 32 | -linkmb:modbus_set_float_dcba[3] | |
| 33 | - | |
| 34 | - | |
| 35 | -AUTHORS | |
| 36 | -------- | |
| 37 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 38 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_float_cdab.txt deleted
| 1 | -modbus_set_float_cdab(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_float_cdab - set a float value in 2 registers using CDAB byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_float_cdab(float 'f', uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_float_cdab()* function shall set a float to 4 bytes in swapped | |
| 18 | -words Modbus format (CDAB order instead of ABCD). The _dest_ array must be | |
| 19 | -pointer on two 16 bits values to be able to store the full result of the | |
| 20 | -conversion. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -There is no return values. | |
| 26 | - | |
| 27 | - | |
| 28 | -SEE ALSO | |
| 29 | --------- | |
| 30 | -linkmb:modbus_get_float_cdab[3] | |
| 31 | -linkmb:modbus_set_float_abcd[3] | |
| 32 | -linkmb:modbus_set_float_badc[3] | |
| 33 | -linkmb:modbus_set_float_dcba[3] | |
| 34 | - | |
| 35 | - | |
| 36 | -AUTHORS | |
| 37 | -------- | |
| 38 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 39 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_float_dcba.txt deleted
| 1 | -modbus_set_float_dcba(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_float_dcba - set a float value in 2 registers using DCBA byte order | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_float_dcba(float 'f', uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_float_dcba()* function shall set a float to 4 bytes in inverted | |
| 18 | -Modbus format (DCBA order). The _dest_ array must be pointer on two 16 bits | |
| 19 | -values to be able to store the full result of the conversion. | |
| 20 | - | |
| 21 | - | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | -There is no return values. | |
| 25 | - | |
| 26 | - | |
| 27 | -SEE ALSO | |
| 28 | --------- | |
| 29 | -linkmb:modbus_get_float_dcba[3] | |
| 30 | -linkmb:modbus_set_float[3] | |
| 31 | -linkmb:modbus_get_float[3] | |
| 32 | - | |
| 33 | - | |
| 34 | -AUTHORS | |
| 35 | -------- | |
| 36 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 37 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_indication_timeout.txt deleted
| 1 | -modbus_set_indication_timeout(3) | |
| 2 | -================================ | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_indication_timeout - set timeout between indications | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*void modbus_set_indication_timeout(modbus_t *'ctx', uint32_t 'to_sec', uint32_t 'to_usec');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_indication_timeout()* function shall set the timeout interval used by | |
| 18 | -a server to wait for a request from a client. | |
| 19 | - | |
| 20 | -The value of _to_usec_ argument must be in the range 0 to 999999. | |
| 21 | - | |
| 22 | -If both _to_sec_ and _to_usec_ are zero, this timeout will not be used at all. | |
| 23 | -In this case, the server will wait forever. | |
| 24 | - | |
| 25 | - | |
| 26 | -RETURN VALUE | |
| 27 | ------------- | |
| 28 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 29 | -errno. | |
| 30 | - | |
| 31 | - | |
| 32 | -ERRORS | |
| 33 | ------- | |
| 34 | -*EINVAL*:: | |
| 35 | -The argument _ctx_ is NULL or _to_usec_ is larger than 1000000. | |
| 36 | - | |
| 37 | - | |
| 38 | -SEE ALSO | |
| 39 | --------- | |
| 40 | -linkmb:modbus_get_indication_timeout[3] | |
| 41 | -linkmb:modbus_get_response_timeout[3] | |
| 42 | -linkmb:modbus_set_response_timeout[3] | |
| 43 | - | |
| 44 | - | |
| 45 | -AUTHORS | |
| 46 | -------- | |
| 47 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 48 | -<stephane.raimbault@gmail.com> |
doc/modbus_set_response_timeout.txt deleted
| 1 | -modbus_set_response_timeout(3) | |
| 2 | -============================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_set_response_timeout - set timeout for response | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_set_response_timeout(modbus_t *'ctx', uint32_t 'to_sec', uint32_t 'to_usec');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_set_response_timeout()* function shall set the timeout interval used | |
| 18 | -to wait for a response. When a byte timeout is set, if elapsed time for the | |
| 19 | -first byte of response is longer than the given timeout, an `ETIMEDOUT` error | |
| 20 | -will be raised by the function waiting for a response. When byte timeout is | |
| 21 | -disabled, the full confirmation response must be received before expiration of | |
| 22 | -the response timeout. | |
| 23 | - | |
| 24 | -The value of _to_usec_ argument must be in the range 0 to 999999. | |
| 25 | - | |
| 26 | - | |
| 27 | -RETURN VALUE | |
| 28 | ------------- | |
| 29 | -The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 30 | -errno. | |
| 31 | - | |
| 32 | - | |
| 33 | -ERRORS | |
| 34 | ------- | |
| 35 | -*EINVAL*:: | |
| 36 | -The argument _ctx_ is NULL, or both _to_sec_ and _to_usec_ are zero, or _to_usec_ | |
| 37 | -is larger than 999999. | |
| 38 | - | |
| 39 | - | |
| 40 | -EXAMPLE | |
| 41 | -------- | |
| 42 | -[source,c] | |
| 43 | -------------------- | |
| 44 | -uint32_t old_response_to_sec; | |
| 45 | -uint32_t old_response_to_usec; | |
| 46 | - | |
| 47 | -/* Save original timeout */ | |
| 48 | -modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec); | |
| 49 | - | |
| 50 | -/* Define a new timeout of 200ms */ | |
| 51 | -modbus_set_response_timeout(ctx, 0, 200000); | |
| 52 | -------------------- | |
| 53 | - | |
| 54 | - | |
| 55 | -SEE ALSO | |
| 56 | --------- | |
| 57 | -linkmb:modbus_get_response_timeout[3] | |
| 58 | -linkmb:modbus_get_byte_timeout[3] | |
| 59 | -linkmb:modbus_set_byte_timeout[3] | |
| 60 | - | |
| 61 | - | |
| 62 | -AUTHORS | |
| 63 | -------- | |
| 64 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 65 | -<stephane.raimbault@gmail.com> |
doc/modbus_strerror.txt deleted
| 1 | -modbus_strerror(3) | |
| 2 | -================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_strerror - return the error message | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*const char *modbus_strerror(int 'errnum');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_strerror()* function shall return a pointer to an error message | |
| 18 | -string corresponding to the error number specified by the _errnum_ argument. As | |
| 19 | -libmodbus defines additional error numbers over and above those defined by the | |
| 20 | -operating system, applications should use *modbus_strerror()* in preference to | |
| 21 | -the standard *strerror()* function. | |
| 22 | - | |
| 23 | - | |
| 24 | -RETURN VALUE | |
| 25 | ------------- | |
| 26 | -The *modbus_strerror()* function shall return a pointer to an error message | |
| 27 | -string. | |
| 28 | - | |
| 29 | - | |
| 30 | -ERRORS | |
| 31 | ------- | |
| 32 | -No errors are defined. | |
| 33 | - | |
| 34 | - | |
| 35 | -EXAMPLE | |
| 36 | -------- | |
| 37 | -.Display an error message when a Modbus connection cannot be established | |
| 38 | -[source,c] | |
| 39 | -------------------- | |
| 40 | -if (modbus_connect(ctx) == -1) { | |
| 41 | - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 42 | - abort(); | |
| 43 | -} | |
| 44 | -------------------- | |
| 45 | - | |
| 46 | -SEE ALSO | |
| 47 | --------- | |
| 48 | -linkmb:libmodbus | |
| 49 | - | |
| 50 | - | |
| 51 | -AUTHORS | |
| 52 | -------- | |
| 53 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 54 | -<stephane.raimbault@gmail.com> |
doc/modbus_tcp_accept.txt deleted
| 1 | -modbus_tcp_accept(3) | |
| 2 | -==================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_tcp_accept - accept a new connection on a TCP Modbus socket (IPv4) | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_tcp_accept(modbus_t *'ctx', int *'s);* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_tcp_accept()* function shall extract the first connection on the | |
| 18 | -queue of pending connections, create a new socket and store it in libmodbus | |
| 19 | -context given in argument. If available, _accept4()_ with `SOCK_CLOEXEC` will be | |
| 20 | -called instead of *accept()*. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return a new socket if successful. | |
| 26 | -Otherwise it shall return -1 and set errno. | |
| 27 | - | |
| 28 | - | |
| 29 | -EXAMPLE | |
| 30 | -------- | |
| 31 | -For detailed example, see unit-test-server.c source file in tests directory. | |
| 32 | - | |
| 33 | -[source,c] | |
| 34 | -------------------- | |
| 35 | -... | |
| 36 | - | |
| 37 | -ctx = modbus_new_tcp("127.0.0.1", 502); | |
| 38 | -s = modbus_tcp_listen(ctx, 1); | |
| 39 | -modbus_tcp_accept(ctx, &s); | |
| 40 | - | |
| 41 | -... | |
| 42 | - | |
| 43 | -close(s) | |
| 44 | -modbus_free(ctx); | |
| 45 | -------------------- | |
| 46 | - | |
| 47 | -SEE ALSO | |
| 48 | --------- | |
| 49 | -linkmb:modbus_tcp_pi_accept[3] | |
| 50 | -linkmb:modbus_tcp_listen[3] | |
| 51 | -linkmb:modbus_tcp_pi_listen[3] | |
| 52 | - | |
| 53 | -AUTHORS | |
| 54 | -------- | |
| 55 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 56 | -<stephane.raimbault@gmail.com> |
doc/modbus_tcp_pi_accept.txt deleted
| 1 | -modbus_tcp_pi_accept(3) | |
| 2 | -======================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_tcp_pi_accept - accept a new connection on a TCP PI Modbus socket (IPv6) | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_tcp_pi_accept(modbus_t *'ctx', int *'s);* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_tcp_pi_accept()* function shall extract the first connection on the | |
| 18 | -queue of pending connections, create a new socket and store it in libmodbus | |
| 19 | -context given in argument. If available, _accept4()_ with `SOCK_CLOEXEC` will be | |
| 20 | -called instead of *accept()*. | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return a new socket if successful. | |
| 26 | -Otherwise it shall return -1 and set errno. | |
| 27 | - | |
| 28 | - | |
| 29 | -EXAMPLE | |
| 30 | -------- | |
| 31 | -For detailed example, see unit-test-server.c source file in tests directory. | |
| 32 | - | |
| 33 | -[source,c] | |
| 34 | -------------------- | |
| 35 | -... | |
| 36 | - | |
| 37 | -ctx = modbus_new_tcp_pi("::0", 502); | |
| 38 | -s = modbus_tcp_pi_listen(ctx, 1); | |
| 39 | -modbus_tcp_pi_accept(ctx, &s); | |
| 40 | - | |
| 41 | -... | |
| 42 | - | |
| 43 | -close(s) | |
| 44 | -modbus_free(ctx); | |
| 45 | -------------------- | |
| 46 | - | |
| 47 | -SEE ALSO | |
| 48 | --------- | |
| 49 | -linkmb:modbus_tcp_pi_accept[3] | |
| 50 | -linkmb:modbus_tcp_listen[3] | |
| 51 | -linkmb:modbus_tcp_pi_listen[3] | |
| 52 | - | |
| 53 | -AUTHORS | |
| 54 | -------- | |
| 55 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 56 | -<stephane.raimbault@gmail.com> |
doc/modbus_tcp_pi_listen.txt deleted
| 1 | -modbus_tcp_pi_listen(3) | |
| 2 | -======================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_tcp_pi_listen - create and listen a TCP PI Modbus socket (IPv6) | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_tcp_pi_listen(modbus_t *'ctx', int 'nb_connection');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_tcp_pi_listen()* function shall create a socket and listen to | |
| 18 | -maximum _nb_connection_ incoming connections on the specified nodes. The | |
| 19 | -context *ctx* must be allocated and initialized with linkmb:modbus_new_tcp_pi[3] | |
| 20 | -before to set the node to listen, if node is set to NULL or '0.0.0.0', any addresses will be | |
| 21 | -listen. | |
| 22 | - | |
| 23 | - | |
| 24 | -RETURN VALUE | |
| 25 | ------------- | |
| 26 | -The function shall return a new socket if successful. Otherwise it shall return | |
| 27 | --1 and set errno. | |
| 28 | - | |
| 29 | - | |
| 30 | -EXAMPLE | |
| 31 | -------- | |
| 32 | - | |
| 33 | -For detailed examples, see source files in tests directory: | |
| 34 | - | |
| 35 | -- unit-test-server.c, simple but handle only one connection | |
| 36 | - | |
| 37 | -[source,c] | |
| 38 | -------------------- | |
| 39 | -... | |
| 40 | - | |
| 41 | -ctx = modbus_new_tcp_pi("::0", "502"); | |
| 42 | -s = modbus_tcp_pi_listen(ctx, 1); | |
| 43 | -modbus_tcp_pi_accept(ctx, &s); | |
| 44 | - | |
| 45 | -for (;;) { | |
| 46 | - rc = modbus_receive(ctx, query); | |
| 47 | - modbus_replay(ctx, query, rc, mb_mapping); | |
| 48 | -} | |
| 49 | -... | |
| 50 | - | |
| 51 | -mclose(s); | |
| 52 | -modbus_free(ctx); | |
| 53 | -------------------- | |
| 54 | - | |
| 55 | -- bandwidth-server-many-up.c, handles several connections at once | |
| 56 | - | |
| 57 | - | |
| 58 | -SEE ALSO | |
| 59 | --------- | |
| 60 | -linkmb:modbus_new_tcp_pi[3] | |
| 61 | -linkmb:modbus_tcp_pi_accept[3] | |
| 62 | -linkmb:modbus_tcp_listen[3] | |
| 63 | - | |
| 64 | -AUTHORS | |
| 65 | -------- | |
| 66 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 67 | -<stephane.raimbault@gmail.com> |
doc/modbus_write_and_read_registers.txt deleted
| 1 | -modbus_write_and_read_registers(3) | |
| 2 | -================================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_write_and_read_registers - write and read many registers in a single transaction | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_write_and_read_registers(modbus_t *'ctx', int 'write_addr', int 'write_nb', const uint16_t *'src', int 'read_addr', int 'read_nb', const uint16_t *'dest');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_write_and_read_registers()* function shall write the content of the | |
| 18 | -_write_nb_ holding registers from the array 'src' to the address _write_addr_ of | |
| 19 | -the remote device then shall read the content of the _read_nb_ holding registers | |
| 20 | -to the address _read_addr_ of the remote device. The result of reading is stored | |
| 21 | -in _dest_ array as word values (16 bits). | |
| 22 | - | |
| 23 | -You must take care to allocate enough memory to store the results in _dest_ | |
| 24 | -(at least _nb_ * sizeof(uint16_t)). | |
| 25 | - | |
| 26 | -The function uses the Modbus function code 0x17 (write/read registers). | |
| 27 | - | |
| 28 | - | |
| 29 | -RETURN VALUE | |
| 30 | ------------- | |
| 31 | -The function shall return the number of read registers if successful. Otherwise | |
| 32 | -it shall return -1 and set errno. | |
| 33 | - | |
| 34 | - | |
| 35 | -ERRORS | |
| 36 | ------- | |
| 37 | -*EMBMDATA*:: | |
| 38 | -Too many registers requested, Too many registers to write | |
| 39 | - | |
| 40 | - | |
| 41 | -SEE ALSO | |
| 42 | --------- | |
| 43 | -linkmb:modbus_read_registers[3] | |
| 44 | -linkmb:modbus_write_register[3] | |
| 45 | -linkmb:modbus_write_registers[3] | |
| 46 | - | |
| 47 | - | |
| 48 | -AUTHORS | |
| 49 | -------- | |
| 50 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 51 | -<stephane.raimbault@gmail.com> |
doc/modbus_write_bit.txt deleted
| 1 | -modbus_write_bit(3) | |
| 2 | -=================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_write_bit - write a single bit | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_write_bit(modbus_t *'ctx', int 'addr', int 'status');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_write_bit()* function shall write the status of _status_ at the | |
| 18 | -address _addr_ of the remote device. The value must be set to `TRUE` or `FALSE`. | |
| 19 | - | |
| 20 | -The function uses the Modbus function code 0x05 (force single coil). | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return 1 if successful. Otherwise it shall return -1 and set | |
| 26 | -errno. | |
| 27 | - | |
| 28 | - | |
| 29 | -SEE ALSO | |
| 30 | --------- | |
| 31 | -linkmb:modbus_read_bits[3] | |
| 32 | -linkmb:modbus_write_bits[3] | |
| 33 | - | |
| 34 | - | |
| 35 | -AUTHORS | |
| 36 | -------- | |
| 37 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 38 | -<stephane.raimbault@gmail.com> |
doc/modbus_write_bits.txt deleted
| 1 | -modbus_write_bits(3) | |
| 2 | -==================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_write_bits - write many bits | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_write_bits(modbus_t *'ctx', int 'addr', int 'nb', const uint8_t *'src');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_write_bits()* function shall write the status of the _nb_ bits | |
| 18 | -(coils) from _src_ at the address _addr_ of the remote device. The | |
| 19 | -_src_ array must contains bytes set to `TRUE` or `FALSE`. | |
| 20 | - | |
| 21 | -The function uses the Modbus function code 0x0F (force multiple coils). | |
| 22 | - | |
| 23 | - | |
| 24 | -RETURN VALUE | |
| 25 | ------------- | |
| 26 | -The function shall return the number of written bits if successful. Otherwise it | |
| 27 | -shall return -1 and set errno. | |
| 28 | - | |
| 29 | - | |
| 30 | -ERRORS | |
| 31 | ------- | |
| 32 | -*EMBMDATA*:: | |
| 33 | -Writing too many bits | |
| 34 | - | |
| 35 | - | |
| 36 | -SEE ALSO | |
| 37 | --------- | |
| 38 | -linkmb:modbus_read_bits[3] | |
| 39 | -linkmb:modbus_write_bit[3] | |
| 40 | - | |
| 41 | - | |
| 42 | -AUTHORS | |
| 43 | -------- | |
| 44 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 45 | -<stephane.raimbault@gmail.com> |
doc/modbus_write_register.txt deleted
| 1 | -modbus_write_register(3) | |
| 2 | -======================== | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_write_register - write a single register | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_write_register(modbus_t *'ctx', int 'addr', const uint16_t 'value');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_write_register()* function shall write the value of _value_ | |
| 18 | -holding registers at the address _addr_ of the remote device. | |
| 19 | - | |
| 20 | -The function uses the Modbus function code 0x06 (preset single register). | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return 1 if successful. Otherwise it shall return -1 and set | |
| 26 | -errno. | |
| 27 | - | |
| 28 | - | |
| 29 | -SEE ALSO | |
| 30 | --------- | |
| 31 | -linkmb:modbus_read_registers[3] | |
| 32 | -linkmb:modbus_write_registers[3] | |
| 33 | - | |
| 34 | - | |
| 35 | -AUTHORS | |
| 36 | -------- | |
| 37 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 38 | -<stephane.raimbault@gmail.com> |
doc/modbus_write_registers.txt deleted
| 1 | -modbus_write_registers(3) | |
| 2 | -========================= | |
| 3 | - | |
| 4 | - | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | -modbus_write_registers - write many registers | |
| 8 | - | |
| 9 | - | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_write_registers(modbus_t *'ctx', int 'addr', int 'nb', const uint16_t *'src');* | |
| 13 | - | |
| 14 | - | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | -The *modbus_write_registers()* function shall write the content of the _nb_ | |
| 18 | -holding registers from the array _src_ at address _addr_ of the remote device. | |
| 19 | - | |
| 20 | -The function uses the Modbus function code 0x10 (preset multiple registers). | |
| 21 | - | |
| 22 | - | |
| 23 | -RETURN VALUE | |
| 24 | ------------- | |
| 25 | -The function shall return the number of written registers if | |
| 26 | -successful. Otherwise it shall return -1 and set errno. | |
| 27 | - | |
| 28 | - | |
| 29 | -SEE ALSO | |
| 30 | --------- | |
| 31 | -linkmb:modbus_write_register[3] | |
| 32 | -linkmb:modbus_read_registers[3] | |
| 33 | - | |
| 34 | - | |
| 35 | -AUTHORS | |
| 36 | -------- | |
| 37 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 38 | -<stephane.raimbault@gmail.com> |
docs/assets/client-sensors.excalidraw
0 → 100644
| 1 | +{ | |
| 2 | + "type": "excalidraw", | |
| 3 | + "version": 2, | |
| 4 | + "source": "https://excalidraw.com", | |
| 5 | + "elements": [ | |
| 6 | + { | |
| 7 | + "type": "rectangle", | |
| 8 | + "version": 473, | |
| 9 | + "versionNonce": 1256506895, | |
| 10 | + "isDeleted": false, | |
| 11 | + "id": "ox1Blt2bzl0onmQfB7ZAN", | |
| 12 | + "fillStyle": "hachure", | |
| 13 | + "strokeWidth": 1, | |
| 14 | + "strokeStyle": "solid", | |
| 15 | + "roughness": 1, | |
| 16 | + "opacity": 100, | |
| 17 | + "angle": 0, | |
| 18 | + "x": 827.69921875, | |
| 19 | + "y": 210.68359375, | |
| 20 | + "strokeColor": "#000000", | |
| 21 | + "backgroundColor": "transparent", | |
| 22 | + "width": 251.7109375, | |
| 23 | + "height": 259.47265625, | |
| 24 | + "seed": 1508024704, | |
| 25 | + "groupIds": [], | |
| 26 | + "strokeSharpness": "sharp", | |
| 27 | + "boundElements": [ | |
| 28 | + { | |
| 29 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 30 | + "type": "arrow" | |
| 31 | + }, | |
| 32 | + { | |
| 33 | + "id": "HZoAI_wR8CyRR9fVaFwSl", | |
| 34 | + "type": "arrow" | |
| 35 | + } | |
| 36 | + ], | |
| 37 | + "updated": 1660298248381, | |
| 38 | + "link": null, | |
| 39 | + "locked": false | |
| 40 | + }, | |
| 41 | + { | |
| 42 | + "type": "text", | |
| 43 | + "version": 585, | |
| 44 | + "versionNonce": 720617423, | |
| 45 | + "isDeleted": false, | |
| 46 | + "id": "rjHz2X8U0ZDEyckj_tTSw", | |
| 47 | + "fillStyle": "hachure", | |
| 48 | + "strokeWidth": 1, | |
| 49 | + "strokeStyle": "solid", | |
| 50 | + "roughness": 1, | |
| 51 | + "opacity": 100, | |
| 52 | + "angle": 0, | |
| 53 | + "x": 854.0546875, | |
| 54 | + "y": 287.16015625, | |
| 55 | + "strokeColor": "#000000", | |
| 56 | + "backgroundColor": "transparent", | |
| 57 | + "width": 199, | |
| 58 | + "height": 160, | |
| 59 | + "seed": 2100367744, | |
| 60 | + "groupIds": [], | |
| 61 | + "strokeSharpness": "sharp", | |
| 62 | + "boundElements": [ | |
| 63 | + { | |
| 64 | + "id": "vJNRjoY0dZcqOBw5RzuHn", | |
| 65 | + "type": "arrow" | |
| 66 | + } | |
| 67 | + ], | |
| 68 | + "updated": 1660298281789, | |
| 69 | + "link": null, | |
| 70 | + "locked": false, | |
| 71 | + "fontSize": 16, | |
| 72 | + "fontFamily": 1, | |
| 73 | + "text": "Reads temperatures\nfrom various\nModbus sensors (servers)\n\nS1: read index 0 -> 28\nS2: read index 0 -> 26\n...\n", | |
| 74 | + "baseline": 154, | |
| 75 | + "textAlign": "left", | |
| 76 | + "verticalAlign": "top", | |
| 77 | + "containerId": null, | |
| 78 | + "originalText": "Reads temperatures\nfrom various\nModbus sensors (servers)\n\nS1: read index 0 -> 28\nS2: read index 0 -> 26\n...\n" | |
| 79 | + }, | |
| 80 | + { | |
| 81 | + "type": "rectangle", | |
| 82 | + "version": 534, | |
| 83 | + "versionNonce": 2127380463, | |
| 84 | + "isDeleted": false, | |
| 85 | + "id": "mDgu1gSg34HbU-NAHPB30", | |
| 86 | + "fillStyle": "hachure", | |
| 87 | + "strokeWidth": 1, | |
| 88 | + "strokeStyle": "solid", | |
| 89 | + "roughness": 1, | |
| 90 | + "opacity": 100, | |
| 91 | + "angle": 0, | |
| 92 | + "x": 420.2109375, | |
| 93 | + "y": 212.580078125, | |
| 94 | + "strokeColor": "#000000", | |
| 95 | + "backgroundColor": "transparent", | |
| 96 | + "width": 216.16406250000006, | |
| 97 | + "height": 172.06640624999997, | |
| 98 | + "seed": 1336837760, | |
| 99 | + "groupIds": [], | |
| 100 | + "strokeSharpness": "sharp", | |
| 101 | + "boundElements": [ | |
| 102 | + { | |
| 103 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 104 | + "type": "arrow" | |
| 105 | + } | |
| 106 | + ], | |
| 107 | + "updated": 1660298020282, | |
| 108 | + "link": null, | |
| 109 | + "locked": false | |
| 110 | + }, | |
| 111 | + { | |
| 112 | + "type": "text", | |
| 113 | + "version": 653, | |
| 114 | + "versionNonce": 2127484513, | |
| 115 | + "isDeleted": false, | |
| 116 | + "id": "UxvTnld8qh188IzV4uJ2q", | |
| 117 | + "fillStyle": "hachure", | |
| 118 | + "strokeWidth": 1, | |
| 119 | + "strokeStyle": "solid", | |
| 120 | + "roughness": 1, | |
| 121 | + "opacity": 100, | |
| 122 | + "angle": 0, | |
| 123 | + "x": 443.79296875, | |
| 124 | + "y": 286.3515625, | |
| 125 | + "strokeColor": "#000000", | |
| 126 | + "backgroundColor": "transparent", | |
| 127 | + "width": 178, | |
| 128 | + "height": 80, | |
| 129 | + "seed": 759374208, | |
| 130 | + "groupIds": [], | |
| 131 | + "strokeSharpness": "sharp", | |
| 132 | + "boundElements": [], | |
| 133 | + "updated": 1660298185311, | |
| 134 | + "link": null, | |
| 135 | + "locked": false, | |
| 136 | + "fontSize": 16, | |
| 137 | + "fontFamily": 1, | |
| 138 | + "text": "Measures temperature\nand hygrometry:\n0: 28°C\n1: 32% ", | |
| 139 | + "baseline": 74, | |
| 140 | + "textAlign": "left", | |
| 141 | + "verticalAlign": "top", | |
| 142 | + "containerId": null, | |
| 143 | + "originalText": "Measures temperature\nand hygrometry:\n0: 28°C\n1: 32% " | |
| 144 | + }, | |
| 145 | + { | |
| 146 | + "type": "text", | |
| 147 | + "version": 349, | |
| 148 | + "versionNonce": 1469666511, | |
| 149 | + "isDeleted": false, | |
| 150 | + "id": "F6UUk6_B6uALmjxcHLYw4", | |
| 151 | + "fillStyle": "hachure", | |
| 152 | + "strokeWidth": 1, | |
| 153 | + "strokeStyle": "solid", | |
| 154 | + "roughness": 1, | |
| 155 | + "opacity": 100, | |
| 156 | + "angle": 0, | |
| 157 | + "x": 488.19921875, | |
| 158 | + "y": 237.921875, | |
| 159 | + "strokeColor": "#000000", | |
| 160 | + "backgroundColor": "transparent", | |
| 161 | + "width": 79, | |
| 162 | + "height": 25, | |
| 163 | + "seed": 354006656, | |
| 164 | + "groupIds": [], | |
| 165 | + "strokeSharpness": "sharp", | |
| 166 | + "boundElements": [], | |
| 167 | + "updated": 1660298032950, | |
| 168 | + "link": null, | |
| 169 | + "locked": false, | |
| 170 | + "fontSize": 20, | |
| 171 | + "fontFamily": 1, | |
| 172 | + "text": "Sensor 1", | |
| 173 | + "baseline": 18, | |
| 174 | + "textAlign": "left", | |
| 175 | + "verticalAlign": "top", | |
| 176 | + "containerId": null, | |
| 177 | + "originalText": "Sensor 1" | |
| 178 | + }, | |
| 179 | + { | |
| 180 | + "type": "text", | |
| 181 | + "version": 224, | |
| 182 | + "versionNonce": 864770191, | |
| 183 | + "isDeleted": false, | |
| 184 | + "id": "v7q2uvVFHZBvjr-y_ZJKl", | |
| 185 | + "fillStyle": "hachure", | |
| 186 | + "strokeWidth": 1, | |
| 187 | + "strokeStyle": "solid", | |
| 188 | + "roughness": 1, | |
| 189 | + "opacity": 100, | |
| 190 | + "angle": 0, | |
| 191 | + "x": 884.5546875, | |
| 192 | + "y": 238.328125, | |
| 193 | + "strokeColor": "#000000", | |
| 194 | + "backgroundColor": "transparent", | |
| 195 | + "width": 150, | |
| 196 | + "height": 25, | |
| 197 | + "seed": 2108436864, | |
| 198 | + "groupIds": [], | |
| 199 | + "strokeSharpness": "sharp", | |
| 200 | + "boundElements": [], | |
| 201 | + "updated": 1660299132232, | |
| 202 | + "link": null, | |
| 203 | + "locked": false, | |
| 204 | + "fontSize": 20, | |
| 205 | + "fontFamily": 1, | |
| 206 | + "text": "libmodbus client", | |
| 207 | + "baseline": 18, | |
| 208 | + "textAlign": "left", | |
| 209 | + "verticalAlign": "top", | |
| 210 | + "containerId": null, | |
| 211 | + "originalText": "libmodbus client" | |
| 212 | + }, | |
| 213 | + { | |
| 214 | + "type": "arrow", | |
| 215 | + "version": 925, | |
| 216 | + "versionNonce": 27208751, | |
| 217 | + "isDeleted": false, | |
| 218 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 219 | + "fillStyle": "hachure", | |
| 220 | + "strokeWidth": 1, | |
| 221 | + "strokeStyle": "solid", | |
| 222 | + "roughness": 1, | |
| 223 | + "opacity": 100, | |
| 224 | + "angle": 0, | |
| 225 | + "x": 656.03125, | |
| 226 | + "y": 313.29799967005374, | |
| 227 | + "strokeColor": "#000000", | |
| 228 | + "backgroundColor": "transparent", | |
| 229 | + "width": 154.05078125, | |
| 230 | + "height": 8.294130761394001, | |
| 231 | + "seed": 455209344, | |
| 232 | + "groupIds": [], | |
| 233 | + "strokeSharpness": "round", | |
| 234 | + "boundElements": [], | |
| 235 | + "updated": 1660298248381, | |
| 236 | + "link": null, | |
| 237 | + "locked": false, | |
| 238 | + "startBinding": { | |
| 239 | + "elementId": "mDgu1gSg34HbU-NAHPB30", | |
| 240 | + "focus": 0.08648410639065775, | |
| 241 | + "gap": 19.65625 | |
| 242 | + }, | |
| 243 | + "endBinding": { | |
| 244 | + "elementId": "ox1Blt2bzl0onmQfB7ZAN", | |
| 245 | + "focus": 0.08133464876815498, | |
| 246 | + "gap": 17.6171875 | |
| 247 | + }, | |
| 248 | + "lastCommittedPoint": null, | |
| 249 | + "startArrowhead": null, | |
| 250 | + "endArrowhead": "arrow", | |
| 251 | + "points": [ | |
| 252 | + [ | |
| 253 | + 0, | |
| 254 | + 0 | |
| 255 | + ], | |
| 256 | + [ | |
| 257 | + 154.05078125, | |
| 258 | + 8.294130761394001 | |
| 259 | + ] | |
| 260 | + ] | |
| 261 | + }, | |
| 262 | + { | |
| 263 | + "type": "text", | |
| 264 | + "version": 709, | |
| 265 | + "versionNonce": 650449167, | |
| 266 | + "isDeleted": false, | |
| 267 | + "id": "Q6P32mRyop5JlKGPB3tei", | |
| 268 | + "fillStyle": "hachure", | |
| 269 | + "strokeWidth": 1, | |
| 270 | + "strokeStyle": "solid", | |
| 271 | + "roughness": 1, | |
| 272 | + "opacity": 100, | |
| 273 | + "angle": 5.552321937284518, | |
| 274 | + "x": 679.345703125, | |
| 275 | + "y": 433.1444738051471, | |
| 276 | + "strokeColor": "#000000", | |
| 277 | + "backgroundColor": "transparent", | |
| 278 | + "width": 79, | |
| 279 | + "height": 15, | |
| 280 | + "seed": 1091054019, | |
| 281 | + "groupIds": [], | |
| 282 | + "strokeSharpness": "sharp", | |
| 283 | + "boundElements": [], | |
| 284 | + "updated": 1660298261423, | |
| 285 | + "link": null, | |
| 286 | + "locked": false, | |
| 287 | + "fontSize": 11.542968749999993, | |
| 288 | + "fontFamily": 1, | |
| 289 | + "text": "TCP or serial", | |
| 290 | + "baseline": 10, | |
| 291 | + "textAlign": "left", | |
| 292 | + "verticalAlign": "top", | |
| 293 | + "containerId": null, | |
| 294 | + "originalText": "TCP or serial" | |
| 295 | + }, | |
| 296 | + { | |
| 297 | + "type": "text", | |
| 298 | + "version": 707, | |
| 299 | + "versionNonce": 1999616833, | |
| 300 | + "isDeleted": false, | |
| 301 | + "id": "vETmEnYJoC4MKv7ysqjAv", | |
| 302 | + "fillStyle": "hachure", | |
| 303 | + "strokeWidth": 1, | |
| 304 | + "strokeStyle": "solid", | |
| 305 | + "roughness": 1, | |
| 306 | + "opacity": 100, | |
| 307 | + "angle": 0.06779103263247777, | |
| 308 | + "x": 683.3417968749999, | |
| 309 | + "y": 281.21582031250006, | |
| 310 | + "strokeColor": "#000000", | |
| 311 | + "backgroundColor": "transparent", | |
| 312 | + "width": 79, | |
| 313 | + "height": 15, | |
| 314 | + "seed": 1043479501, | |
| 315 | + "groupIds": [], | |
| 316 | + "strokeSharpness": "sharp", | |
| 317 | + "boundElements": [], | |
| 318 | + "updated": 1660298255264, | |
| 319 | + "link": null, | |
| 320 | + "locked": false, | |
| 321 | + "fontSize": 11.542968749999993, | |
| 322 | + "fontFamily": 1, | |
| 323 | + "text": "TCP or serial", | |
| 324 | + "baseline": 10, | |
| 325 | + "textAlign": "left", | |
| 326 | + "verticalAlign": "top", | |
| 327 | + "containerId": null, | |
| 328 | + "originalText": "TCP or serial" | |
| 329 | + }, | |
| 330 | + { | |
| 331 | + "type": "rectangle", | |
| 332 | + "version": 587, | |
| 333 | + "versionNonce": 85990017, | |
| 334 | + "isDeleted": false, | |
| 335 | + "id": "pHhCP3DIU5fE4v3yi3obG", | |
| 336 | + "fillStyle": "hachure", | |
| 337 | + "strokeWidth": 1, | |
| 338 | + "strokeStyle": "solid", | |
| 339 | + "roughness": 1, | |
| 340 | + "opacity": 100, | |
| 341 | + "angle": 0, | |
| 342 | + "x": 426.513671875, | |
| 343 | + "y": 424.2646484375, | |
| 344 | + "strokeColor": "#000000", | |
| 345 | + "backgroundColor": "transparent", | |
| 346 | + "width": 216.16406250000006, | |
| 347 | + "height": 172.06640624999997, | |
| 348 | + "seed": 1733016847, | |
| 349 | + "groupIds": [], | |
| 350 | + "strokeSharpness": "sharp", | |
| 351 | + "boundElements": [ | |
| 352 | + { | |
| 353 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 354 | + "type": "arrow" | |
| 355 | + }, | |
| 356 | + { | |
| 357 | + "id": "HZoAI_wR8CyRR9fVaFwSl", | |
| 358 | + "type": "arrow" | |
| 359 | + } | |
| 360 | + ], | |
| 361 | + "updated": 1660298157321, | |
| 362 | + "link": null, | |
| 363 | + "locked": false | |
| 364 | + }, | |
| 365 | + { | |
| 366 | + "type": "text", | |
| 367 | + "version": 708, | |
| 368 | + "versionNonce": 1824105825, | |
| 369 | + "isDeleted": false, | |
| 370 | + "id": "3oXICnKHoOzNPyb-PxNbt", | |
| 371 | + "fillStyle": "hachure", | |
| 372 | + "strokeWidth": 1, | |
| 373 | + "strokeStyle": "solid", | |
| 374 | + "roughness": 1, | |
| 375 | + "opacity": 100, | |
| 376 | + "angle": 0, | |
| 377 | + "x": 450.095703125, | |
| 378 | + "y": 498.0361328125, | |
| 379 | + "strokeColor": "#000000", | |
| 380 | + "backgroundColor": "transparent", | |
| 381 | + "width": 178, | |
| 382 | + "height": 80, | |
| 383 | + "seed": 1378197345, | |
| 384 | + "groupIds": [], | |
| 385 | + "strokeSharpness": "sharp", | |
| 386 | + "boundElements": [], | |
| 387 | + "updated": 1660298208836, | |
| 388 | + "link": null, | |
| 389 | + "locked": false, | |
| 390 | + "fontSize": 16, | |
| 391 | + "fontFamily": 1, | |
| 392 | + "text": "Measures temperature\nand hygrometry:\n0: 26°C\n1: 40% ", | |
| 393 | + "baseline": 74, | |
| 394 | + "textAlign": "left", | |
| 395 | + "verticalAlign": "top", | |
| 396 | + "containerId": null, | |
| 397 | + "originalText": "Measures temperature\nand hygrometry:\n0: 26°C\n1: 40% " | |
| 398 | + }, | |
| 399 | + { | |
| 400 | + "type": "text", | |
| 401 | + "version": 400, | |
| 402 | + "versionNonce": 747588289, | |
| 403 | + "isDeleted": false, | |
| 404 | + "id": "rD_cbOE0Mwz-sfB0YqcaJ", | |
| 405 | + "fillStyle": "hachure", | |
| 406 | + "strokeWidth": 1, | |
| 407 | + "strokeStyle": "solid", | |
| 408 | + "roughness": 1, | |
| 409 | + "opacity": 100, | |
| 410 | + "angle": 0, | |
| 411 | + "x": 494.501953125, | |
| 412 | + "y": 449.6064453125, | |
| 413 | + "strokeColor": "#000000", | |
| 414 | + "backgroundColor": "transparent", | |
| 415 | + "width": 88, | |
| 416 | + "height": 25, | |
| 417 | + "seed": 68109103, | |
| 418 | + "groupIds": [], | |
| 419 | + "strokeSharpness": "sharp", | |
| 420 | + "boundElements": [], | |
| 421 | + "updated": 1660298172011, | |
| 422 | + "link": null, | |
| 423 | + "locked": false, | |
| 424 | + "fontSize": 20, | |
| 425 | + "fontFamily": 1, | |
| 426 | + "text": "Sensor 2", | |
| 427 | + "baseline": 18, | |
| 428 | + "textAlign": "left", | |
| 429 | + "verticalAlign": "top", | |
| 430 | + "containerId": null, | |
| 431 | + "originalText": "Sensor 2" | |
| 432 | + }, | |
| 433 | + { | |
| 434 | + "type": "arrow", | |
| 435 | + "version": 1150, | |
| 436 | + "versionNonce": 1550306895, | |
| 437 | + "isDeleted": false, | |
| 438 | + "id": "HZoAI_wR8CyRR9fVaFwSl", | |
| 439 | + "fillStyle": "hachure", | |
| 440 | + "strokeWidth": 1, | |
| 441 | + "strokeStyle": "solid", | |
| 442 | + "roughness": 1, | |
| 443 | + "opacity": 100, | |
| 444 | + "angle": 0, | |
| 445 | + "x": 666.49609375, | |
| 446 | + "y": 532.2655116636315, | |
| 447 | + "strokeColor": "#000000", | |
| 448 | + "backgroundColor": "transparent", | |
| 449 | + "width": 145.8515625, | |
| 450 | + "height": 133.46442554799017, | |
| 451 | + "seed": 1409289601, | |
| 452 | + "groupIds": [], | |
| 453 | + "strokeSharpness": "round", | |
| 454 | + "boundElements": [], | |
| 455 | + "updated": 1660298248381, | |
| 456 | + "link": null, | |
| 457 | + "locked": false, | |
| 458 | + "startBinding": { | |
| 459 | + "elementId": "pHhCP3DIU5fE4v3yi3obG", | |
| 460 | + "focus": 0.7718436212944663, | |
| 461 | + "gap": 23.818359375 | |
| 462 | + }, | |
| 463 | + "endBinding": { | |
| 464 | + "elementId": "ox1Blt2bzl0onmQfB7ZAN", | |
| 465 | + "focus": 0.28922965891088237, | |
| 466 | + "gap": 15.3515625 | |
| 467 | + }, | |
| 468 | + "lastCommittedPoint": null, | |
| 469 | + "startArrowhead": null, | |
| 470 | + "endArrowhead": "arrow", | |
| 471 | + "points": [ | |
| 472 | + [ | |
| 473 | + 0, | |
| 474 | + 0 | |
| 475 | + ], | |
| 476 | + [ | |
| 477 | + 145.8515625, | |
| 478 | + -133.46442554799017 | |
| 479 | + ] | |
| 480 | + ] | |
| 481 | + }, | |
| 482 | + { | |
| 483 | + "id": "feq5Rn2_gEHIfIzRPvNu6", | |
| 484 | + "type": "rectangle", | |
| 485 | + "x": 832.283203125, | |
| 486 | + "y": 515.0556640625, | |
| 487 | + "width": 255, | |
| 488 | + "height": 76.1171875, | |
| 489 | + "angle": 0, | |
| 490 | + "strokeColor": "#000000", | |
| 491 | + "backgroundColor": "transparent", | |
| 492 | + "fillStyle": "hachure", | |
| 493 | + "strokeWidth": 1, | |
| 494 | + "strokeStyle": "solid", | |
| 495 | + "roughness": 1, | |
| 496 | + "opacity": 100, | |
| 497 | + "groupIds": [], | |
| 498 | + "strokeSharpness": "sharp", | |
| 499 | + "seed": 826152751, | |
| 500 | + "version": 65, | |
| 501 | + "versionNonce": 19459567, | |
| 502 | + "isDeleted": false, | |
| 503 | + "boundElements": [ | |
| 504 | + { | |
| 505 | + "type": "text", | |
| 506 | + "id": "n4_rv3VhjyMXLSFrP52Vw" | |
| 507 | + }, | |
| 508 | + { | |
| 509 | + "id": "vJNRjoY0dZcqOBw5RzuHn", | |
| 510 | + "type": "arrow" | |
| 511 | + } | |
| 512 | + ], | |
| 513 | + "updated": 1660298281790, | |
| 514 | + "link": null, | |
| 515 | + "locked": false | |
| 516 | + }, | |
| 517 | + { | |
| 518 | + "id": "n4_rv3VhjyMXLSFrP52Vw", | |
| 519 | + "type": "text", | |
| 520 | + "x": 837.283203125, | |
| 521 | + "y": 540.6142578125, | |
| 522 | + "width": 245, | |
| 523 | + "height": 25, | |
| 524 | + "angle": 0, | |
| 525 | + "strokeColor": "#000000", | |
| 526 | + "backgroundColor": "transparent", | |
| 527 | + "fillStyle": "hachure", | |
| 528 | + "strokeWidth": 1, | |
| 529 | + "strokeStyle": "solid", | |
| 530 | + "roughness": 1, | |
| 531 | + "opacity": 100, | |
| 532 | + "groupIds": [], | |
| 533 | + "strokeSharpness": "sharp", | |
| 534 | + "seed": 555916079, | |
| 535 | + "version": 20, | |
| 536 | + "versionNonce": 1538604143, | |
| 537 | + "isDeleted": false, | |
| 538 | + "boundElements": null, | |
| 539 | + "updated": 1660298276528, | |
| 540 | + "link": null, | |
| 541 | + "locked": false, | |
| 542 | + "text": "Database or logs", | |
| 543 | + "fontSize": 20, | |
| 544 | + "fontFamily": 1, | |
| 545 | + "textAlign": "center", | |
| 546 | + "verticalAlign": "middle", | |
| 547 | + "baseline": 18, | |
| 548 | + "containerId": "feq5Rn2_gEHIfIzRPvNu6", | |
| 549 | + "originalText": "Database or logs" | |
| 550 | + }, | |
| 551 | + { | |
| 552 | + "id": "vJNRjoY0dZcqOBw5RzuHn", | |
| 553 | + "type": "arrow", | |
| 554 | + "x": 958.509765625, | |
| 555 | + "y": 472.4150390625, | |
| 556 | + "width": 0, | |
| 557 | + "height": 39.33984375, | |
| 558 | + "angle": 0, | |
| 559 | + "strokeColor": "#000000", | |
| 560 | + "backgroundColor": "transparent", | |
| 561 | + "fillStyle": "hachure", | |
| 562 | + "strokeWidth": 1, | |
| 563 | + "strokeStyle": "solid", | |
| 564 | + "roughness": 1, | |
| 565 | + "opacity": 100, | |
| 566 | + "groupIds": [], | |
| 567 | + "strokeSharpness": "round", | |
| 568 | + "seed": 1036508641, | |
| 569 | + "version": 20, | |
| 570 | + "versionNonce": 2130978977, | |
| 571 | + "isDeleted": false, | |
| 572 | + "boundElements": null, | |
| 573 | + "updated": 1660298281790, | |
| 574 | + "link": null, | |
| 575 | + "locked": false, | |
| 576 | + "points": [ | |
| 577 | + [ | |
| 578 | + 0, | |
| 579 | + 0 | |
| 580 | + ], | |
| 581 | + [ | |
| 582 | + 0, | |
| 583 | + 39.33984375 | |
| 584 | + ] | |
| 585 | + ], | |
| 586 | + "lastCommittedPoint": null, | |
| 587 | + "startBinding": { | |
| 588 | + "elementId": "rjHz2X8U0ZDEyckj_tTSw", | |
| 589 | + "focus": -0.04979978015075378, | |
| 590 | + "gap": 25.2548828125 | |
| 591 | + }, | |
| 592 | + "endBinding": { | |
| 593 | + "elementId": "feq5Rn2_gEHIfIzRPvNu6", | |
| 594 | + "focus": -0.009987745098039217, | |
| 595 | + "gap": 3.30078125 | |
| 596 | + }, | |
| 597 | + "startArrowhead": null, | |
| 598 | + "endArrowhead": "arrow" | |
| 599 | + } | |
| 600 | + ], | |
| 601 | + "appState": { | |
| 602 | + "gridSize": null, | |
| 603 | + "viewBackgroundColor": "#ffffff" | |
| 604 | + }, | |
| 605 | + "files": {} | |
| 606 | +} | |
| 0 | 607 | \ No newline at end of file | ... | ... |
docs/assets/client-sensors.webp
0 → 100644
No preview for this file type
docs/assets/server-grafana.excalidraw
0 → 100644
| 1 | +{ | |
| 2 | + "type": "excalidraw", | |
| 3 | + "version": 2, | |
| 4 | + "source": "https://excalidraw.com", | |
| 5 | + "elements": [ | |
| 6 | + { | |
| 7 | + "type": "rectangle", | |
| 8 | + "version": 938, | |
| 9 | + "versionNonce": 1589965569, | |
| 10 | + "isDeleted": false, | |
| 11 | + "id": "ox1Blt2bzl0onmQfB7ZAN", | |
| 12 | + "fillStyle": "hachure", | |
| 13 | + "strokeWidth": 1, | |
| 14 | + "strokeStyle": "solid", | |
| 15 | + "roughness": 1, | |
| 16 | + "opacity": 100, | |
| 17 | + "angle": 0, | |
| 18 | + "x": 471.66796875, | |
| 19 | + "y": 61.640625, | |
| 20 | + "strokeColor": "#000000", | |
| 21 | + "backgroundColor": "transparent", | |
| 22 | + "width": 251.7109375, | |
| 23 | + "height": 346.86328125, | |
| 24 | + "seed": 1508024704, | |
| 25 | + "groupIds": [], | |
| 26 | + "strokeSharpness": "sharp", | |
| 27 | + "boundElements": [ | |
| 28 | + { | |
| 29 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 30 | + "type": "arrow" | |
| 31 | + }, | |
| 32 | + { | |
| 33 | + "id": "RdDFVItfRo8k8NarDHSp-", | |
| 34 | + "type": "arrow" | |
| 35 | + } | |
| 36 | + ], | |
| 37 | + "updated": 1660300922199, | |
| 38 | + "link": null, | |
| 39 | + "locked": false | |
| 40 | + }, | |
| 41 | + { | |
| 42 | + "type": "text", | |
| 43 | + "version": 1153, | |
| 44 | + "versionNonce": 977576399, | |
| 45 | + "isDeleted": false, | |
| 46 | + "id": "rjHz2X8U0ZDEyckj_tTSw", | |
| 47 | + "fillStyle": "hachure", | |
| 48 | + "strokeWidth": 1, | |
| 49 | + "strokeStyle": "solid", | |
| 50 | + "roughness": 1, | |
| 51 | + "opacity": 100, | |
| 52 | + "angle": 0, | |
| 53 | + "x": 498.0234375, | |
| 54 | + "y": 138.1171875, | |
| 55 | + "strokeColor": "#000000", | |
| 56 | + "backgroundColor": "transparent", | |
| 57 | + "width": 187, | |
| 58 | + "height": 240, | |
| 59 | + "seed": 2100367744, | |
| 60 | + "groupIds": [], | |
| 61 | + "strokeSharpness": "sharp", | |
| 62 | + "boundElements": [], | |
| 63 | + "updated": 1660300922199, | |
| 64 | + "link": null, | |
| 65 | + "locked": false, | |
| 66 | + "fontSize": 16, | |
| 67 | + "fontFamily": 1, | |
| 68 | + "text": "Collect data from CPU,\nIO and memory with\ntimestamp\n\n0: 0.1 %\n1: 1456 b/s\n2: 4567 b\n3: 1660190233 (time)\n...\n\n100: false (alert)\n", | |
| 69 | + "baseline": 234, | |
| 70 | + "textAlign": "left", | |
| 71 | + "verticalAlign": "top", | |
| 72 | + "containerId": null, | |
| 73 | + "originalText": "Collect data from CPU,\nIO and memory with\ntimestamp\n\n0: 0.1 %\n1: 1456 b/s\n2: 4567 b\n3: 1660190233 (time)\n...\n\n100: false (alert)\n" | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "type": "rectangle", | |
| 77 | + "version": 772, | |
| 78 | + "versionNonce": 1558709263, | |
| 79 | + "isDeleted": false, | |
| 80 | + "id": "mDgu1gSg34HbU-NAHPB30", | |
| 81 | + "fillStyle": "hachure", | |
| 82 | + "strokeWidth": 1, | |
| 83 | + "strokeStyle": "solid", | |
| 84 | + "roughness": 1, | |
| 85 | + "opacity": 100, | |
| 86 | + "angle": 0, | |
| 87 | + "x": 896.8984375, | |
| 88 | + "y": 44.853515625, | |
| 89 | + "strokeColor": "#000000", | |
| 90 | + "backgroundColor": "transparent", | |
| 91 | + "width": 216.16406250000006, | |
| 92 | + "height": 172.06640624999997, | |
| 93 | + "seed": 1336837760, | |
| 94 | + "groupIds": [], | |
| 95 | + "strokeSharpness": "sharp", | |
| 96 | + "boundElements": [ | |
| 97 | + { | |
| 98 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 99 | + "type": "arrow" | |
| 100 | + } | |
| 101 | + ], | |
| 102 | + "updated": 1660300917063, | |
| 103 | + "link": null, | |
| 104 | + "locked": false | |
| 105 | + }, | |
| 106 | + { | |
| 107 | + "type": "text", | |
| 108 | + "version": 607, | |
| 109 | + "versionNonce": 747285039, | |
| 110 | + "isDeleted": false, | |
| 111 | + "id": "F6UUk6_B6uALmjxcHLYw4", | |
| 112 | + "fillStyle": "hachure", | |
| 113 | + "strokeWidth": 1, | |
| 114 | + "strokeStyle": "solid", | |
| 115 | + "roughness": 1, | |
| 116 | + "opacity": 100, | |
| 117 | + "angle": 0, | |
| 118 | + "x": 964.88671875, | |
| 119 | + "y": 70.1953125, | |
| 120 | + "strokeColor": "#000000", | |
| 121 | + "backgroundColor": "transparent", | |
| 122 | + "width": 84, | |
| 123 | + "height": 25, | |
| 124 | + "seed": 354006656, | |
| 125 | + "groupIds": [], | |
| 126 | + "strokeSharpness": "sharp", | |
| 127 | + "boundElements": [], | |
| 128 | + "updated": 1660300917063, | |
| 129 | + "link": null, | |
| 130 | + "locked": false, | |
| 131 | + "fontSize": 20, | |
| 132 | + "fontFamily": 1, | |
| 133 | + "text": "Grafana", | |
| 134 | + "baseline": 18, | |
| 135 | + "textAlign": "left", | |
| 136 | + "verticalAlign": "top", | |
| 137 | + "containerId": null, | |
| 138 | + "originalText": "Grafana" | |
| 139 | + }, | |
| 140 | + { | |
| 141 | + "type": "text", | |
| 142 | + "version": 556, | |
| 143 | + "versionNonce": 1932158625, | |
| 144 | + "isDeleted": false, | |
| 145 | + "id": "v7q2uvVFHZBvjr-y_ZJKl", | |
| 146 | + "fillStyle": "hachure", | |
| 147 | + "strokeWidth": 1, | |
| 148 | + "strokeStyle": "solid", | |
| 149 | + "roughness": 1, | |
| 150 | + "opacity": 100, | |
| 151 | + "angle": 0, | |
| 152 | + "x": 528.5234375, | |
| 153 | + "y": 89.28515625, | |
| 154 | + "strokeColor": "#000000", | |
| 155 | + "backgroundColor": "transparent", | |
| 156 | + "width": 159, | |
| 157 | + "height": 25, | |
| 158 | + "seed": 2108436864, | |
| 159 | + "groupIds": [], | |
| 160 | + "strokeSharpness": "sharp", | |
| 161 | + "boundElements": [], | |
| 162 | + "updated": 1660300922199, | |
| 163 | + "link": null, | |
| 164 | + "locked": false, | |
| 165 | + "fontSize": 20, | |
| 166 | + "fontFamily": 1, | |
| 167 | + "text": "libmodbus server", | |
| 168 | + "baseline": 18, | |
| 169 | + "textAlign": "left", | |
| 170 | + "verticalAlign": "top", | |
| 171 | + "containerId": null, | |
| 172 | + "originalText": "libmodbus server" | |
| 173 | + }, | |
| 174 | + { | |
| 175 | + "type": "arrow", | |
| 176 | + "version": 2401, | |
| 177 | + "versionNonce": 1251011297, | |
| 178 | + "isDeleted": false, | |
| 179 | + "id": "sE5xq9Fz5VDTWcJGhJizg", | |
| 180 | + "fillStyle": "hachure", | |
| 181 | + "strokeWidth": 1, | |
| 182 | + "strokeStyle": "solid", | |
| 183 | + "roughness": 1, | |
| 184 | + "opacity": 100, | |
| 185 | + "angle": 0, | |
| 186 | + "x": 748.0898437500001, | |
| 187 | + "y": 161.19331310212854, | |
| 188 | + "strokeColor": "#000000", | |
| 189 | + "backgroundColor": "transparent", | |
| 190 | + "width": 134.5039062499999, | |
| 191 | + "height": 30.970574872077407, | |
| 192 | + "seed": 455209344, | |
| 193 | + "groupIds": [], | |
| 194 | + "strokeSharpness": "round", | |
| 195 | + "boundElements": [], | |
| 196 | + "updated": 1660300922199, | |
| 197 | + "link": null, | |
| 198 | + "locked": false, | |
| 199 | + "startBinding": { | |
| 200 | + "elementId": "ox1Blt2bzl0onmQfB7ZAN", | |
| 201 | + "gap": 24.710937500000114, | |
| 202 | + "focus": -0.19349510698149744 | |
| 203 | + }, | |
| 204 | + "endBinding": { | |
| 205 | + "elementId": "mDgu1gSg34HbU-NAHPB30", | |
| 206 | + "gap": 14.3046875, | |
| 207 | + "focus": 0.2600477394392373 | |
| 208 | + }, | |
| 209 | + "lastCommittedPoint": null, | |
| 210 | + "startArrowhead": null, | |
| 211 | + "endArrowhead": "arrow", | |
| 212 | + "points": [ | |
| 213 | + [ | |
| 214 | + 0, | |
| 215 | + 0 | |
| 216 | + ], | |
| 217 | + [ | |
| 218 | + 134.5039062499999, | |
| 219 | + -30.970574872077407 | |
| 220 | + ] | |
| 221 | + ] | |
| 222 | + }, | |
| 223 | + { | |
| 224 | + "type": "text", | |
| 225 | + "version": 1184, | |
| 226 | + "versionNonce": 1589324399, | |
| 227 | + "isDeleted": false, | |
| 228 | + "id": "Q6P32mRyop5JlKGPB3tei", | |
| 229 | + "fillStyle": "hachure", | |
| 230 | + "strokeWidth": 1, | |
| 231 | + "strokeStyle": "solid", | |
| 232 | + "roughness": 1, | |
| 233 | + "opacity": 100, | |
| 234 | + "angle": 6.077759617018872, | |
| 235 | + "x": 746.0369822154072, | |
| 236 | + "y": 102.90361683493032, | |
| 237 | + "strokeColor": "#000000", | |
| 238 | + "backgroundColor": "transparent", | |
| 239 | + "width": 111, | |
| 240 | + "height": 29, | |
| 241 | + "seed": 1091054019, | |
| 242 | + "groupIds": [], | |
| 243 | + "strokeSharpness": "sharp", | |
| 244 | + "boundElements": [], | |
| 245 | + "updated": 1660300917063, | |
| 246 | + "link": null, | |
| 247 | + "locked": false, | |
| 248 | + "fontSize": 11.542968749999993, | |
| 249 | + "fontFamily": 1, | |
| 250 | + "text": "TCP read requests\n(polling)", | |
| 251 | + "baseline": 25, | |
| 252 | + "textAlign": "left", | |
| 253 | + "verticalAlign": "top", | |
| 254 | + "containerId": null, | |
| 255 | + "originalText": "TCP read requests\n(polling)" | |
| 256 | + }, | |
| 257 | + { | |
| 258 | + "id": "ViVqW_nxoEJO1DpluuMzF", | |
| 259 | + "type": "image", | |
| 260 | + "x": 923.3162172379032, | |
| 261 | + "y": 116.828369140625, | |
| 262 | + "width": 163.32850302419354, | |
| 263 | + "height": 63.289794921875, | |
| 264 | + "angle": 0, | |
| 265 | + "strokeColor": "transparent", | |
| 266 | + "backgroundColor": "transparent", | |
| 267 | + "fillStyle": "hachure", | |
| 268 | + "strokeWidth": 1, | |
| 269 | + "strokeStyle": "solid", | |
| 270 | + "roughness": 1, | |
| 271 | + "opacity": 100, | |
| 272 | + "groupIds": [], | |
| 273 | + "strokeSharpness": "round", | |
| 274 | + "seed": 953641007, | |
| 275 | + "version": 332, | |
| 276 | + "versionNonce": 1122873217, | |
| 277 | + "isDeleted": false, | |
| 278 | + "boundElements": null, | |
| 279 | + "updated": 1660300917064, | |
| 280 | + "link": null, | |
| 281 | + "locked": false, | |
| 282 | + "status": "saved", | |
| 283 | + "fileId": "fe56123c11422301d020f581b74d4397ab49e99c", | |
| 284 | + "scale": [ | |
| 285 | + 1, | |
| 286 | + 1 | |
| 287 | + ] | |
| 288 | + }, | |
| 289 | + { | |
| 290 | + "id": "RdDFVItfRo8k8NarDHSp-", | |
| 291 | + "type": "arrow", | |
| 292 | + "x": 898.5878906250001, | |
| 293 | + "y": 340.31123325850484, | |
| 294 | + "width": 158.6875000000001, | |
| 295 | + "height": 28.44727928318008, | |
| 296 | + "angle": 0, | |
| 297 | + "strokeColor": "#000000", | |
| 298 | + "backgroundColor": "transparent", | |
| 299 | + "fillStyle": "hachure", | |
| 300 | + "strokeWidth": 1, | |
| 301 | + "strokeStyle": "solid", | |
| 302 | + "roughness": 1, | |
| 303 | + "opacity": 100, | |
| 304 | + "groupIds": [], | |
| 305 | + "strokeSharpness": "round", | |
| 306 | + "seed": 595270337, | |
| 307 | + "version": 1096, | |
| 308 | + "versionNonce": 1842538177, | |
| 309 | + "isDeleted": false, | |
| 310 | + "boundElements": null, | |
| 311 | + "updated": 1660300922199, | |
| 312 | + "link": null, | |
| 313 | + "locked": false, | |
| 314 | + "points": [ | |
| 315 | + [ | |
| 316 | + 0, | |
| 317 | + 0 | |
| 318 | + ], | |
| 319 | + [ | |
| 320 | + -158.6875000000001, | |
| 321 | + -28.44727928318008 | |
| 322 | + ] | |
| 323 | + ], | |
| 324 | + "lastCommittedPoint": null, | |
| 325 | + "startBinding": { | |
| 326 | + "elementId": "ro1CNQcmtpkib2r-uhEJo", | |
| 327 | + "gap": 10.179687499999886, | |
| 328 | + "focus": -0.37043558235421187 | |
| 329 | + }, | |
| 330 | + "endBinding": { | |
| 331 | + "elementId": "ox1Blt2bzl0onmQfB7ZAN", | |
| 332 | + "gap": 16.521484375, | |
| 333 | + "focus": 0.2615821499314503 | |
| 334 | + }, | |
| 335 | + "startArrowhead": null, | |
| 336 | + "endArrowhead": "arrow" | |
| 337 | + }, | |
| 338 | + { | |
| 339 | + "id": "ro1CNQcmtpkib2r-uhEJo", | |
| 340 | + "type": "rectangle", | |
| 341 | + "x": 908.767578125, | |
| 342 | + "y": 248.8369140625, | |
| 343 | + "width": 216.01953125, | |
| 344 | + "height": 154, | |
| 345 | + "angle": 0, | |
| 346 | + "strokeColor": "#000000", | |
| 347 | + "backgroundColor": "transparent", | |
| 348 | + "fillStyle": "hachure", | |
| 349 | + "strokeWidth": 1, | |
| 350 | + "strokeStyle": "solid", | |
| 351 | + "roughness": 1, | |
| 352 | + "opacity": 100, | |
| 353 | + "groupIds": [], | |
| 354 | + "strokeSharpness": "sharp", | |
| 355 | + "seed": 1261656367, | |
| 356 | + "version": 298, | |
| 357 | + "versionNonce": 866798383, | |
| 358 | + "isDeleted": false, | |
| 359 | + "boundElements": [ | |
| 360 | + { | |
| 361 | + "id": "RdDFVItfRo8k8NarDHSp-", | |
| 362 | + "type": "arrow" | |
| 363 | + }, | |
| 364 | + { | |
| 365 | + "type": "text", | |
| 366 | + "id": "zWdPKja_yF9g4yVY1kvXH" | |
| 367 | + } | |
| 368 | + ], | |
| 369 | + "updated": 1660300917064, | |
| 370 | + "link": null, | |
| 371 | + "locked": false | |
| 372 | + }, | |
| 373 | + { | |
| 374 | + "id": "zWdPKja_yF9g4yVY1kvXH", | |
| 375 | + "type": "text", | |
| 376 | + "x": 913.767578125, | |
| 377 | + "y": 253.8369140625, | |
| 378 | + "width": 206, | |
| 379 | + "height": 75, | |
| 380 | + "angle": 0, | |
| 381 | + "strokeColor": "#000000", | |
| 382 | + "backgroundColor": "transparent", | |
| 383 | + "fillStyle": "hachure", | |
| 384 | + "strokeWidth": 1, | |
| 385 | + "strokeStyle": "solid", | |
| 386 | + "roughness": 1, | |
| 387 | + "opacity": 100, | |
| 388 | + "groupIds": [], | |
| 389 | + "strokeSharpness": "sharp", | |
| 390 | + "seed": 76196961, | |
| 391 | + "version": 380, | |
| 392 | + "versionNonce": 1800831809, | |
| 393 | + "isDeleted": false, | |
| 394 | + "boundElements": null, | |
| 395 | + "updated": 1660300917064, | |
| 396 | + "link": null, | |
| 397 | + "locked": false, | |
| 398 | + "text": "\nTriggers alert when\nservice is down", | |
| 399 | + "fontSize": 20, | |
| 400 | + "fontFamily": 1, | |
| 401 | + "textAlign": "center", | |
| 402 | + "verticalAlign": "top", | |
| 403 | + "baseline": 68, | |
| 404 | + "containerId": "ro1CNQcmtpkib2r-uhEJo", | |
| 405 | + "originalText": "\nTriggers alert when\nservice is down" | |
| 406 | + }, | |
| 407 | + { | |
| 408 | + "type": "text", | |
| 409 | + "version": 1386, | |
| 410 | + "versionNonce": 2109148495, | |
| 411 | + "isDeleted": false, | |
| 412 | + "id": "DZ2rUAdMymO7ajB4Xr_Kf", | |
| 413 | + "fillStyle": "hachure", | |
| 414 | + "strokeWidth": 1, | |
| 415 | + "strokeStyle": "solid", | |
| 416 | + "roughness": 1, | |
| 417 | + "opacity": 100, | |
| 418 | + "angle": 0.17070993938211565, | |
| 419 | + "x": 774.3998831194928, | |
| 420 | + "y": 298.59613347989244, | |
| 421 | + "strokeColor": "#000000", | |
| 422 | + "backgroundColor": "transparent", | |
| 423 | + "width": 107, | |
| 424 | + "height": 15, | |
| 425 | + "seed": 109244929, | |
| 426 | + "groupIds": [], | |
| 427 | + "strokeSharpness": "sharp", | |
| 428 | + "boundElements": [], | |
| 429 | + "updated": 1660300917064, | |
| 430 | + "link": null, | |
| 431 | + "locked": false, | |
| 432 | + "fontSize": 11.542968749999993, | |
| 433 | + "fontFamily": 1, | |
| 434 | + "text": "TCP write request", | |
| 435 | + "baseline": 10, | |
| 436 | + "textAlign": "left", | |
| 437 | + "verticalAlign": "top", | |
| 438 | + "containerId": null, | |
| 439 | + "originalText": "TCP write request" | |
| 440 | + }, | |
| 441 | + { | |
| 442 | + "id": "Os6j9M5Ipt4Ay74nFj29L", | |
| 443 | + "type": "text", | |
| 444 | + "x": 937.599609375, | |
| 445 | + "y": 348.8330078125, | |
| 446 | + "width": 163, | |
| 447 | + "height": 30, | |
| 448 | + "angle": 0, | |
| 449 | + "strokeColor": "#000000", | |
| 450 | + "backgroundColor": "transparent", | |
| 451 | + "fillStyle": "hachure", | |
| 452 | + "strokeWidth": 1, | |
| 453 | + "strokeStyle": "solid", | |
| 454 | + "roughness": 1, | |
| 455 | + "opacity": 100, | |
| 456 | + "groupIds": [], | |
| 457 | + "strokeSharpness": "sharp", | |
| 458 | + "seed": 577132609, | |
| 459 | + "version": 307, | |
| 460 | + "versionNonce": 654734113, | |
| 461 | + "isDeleted": false, | |
| 462 | + "boundElements": null, | |
| 463 | + "updated": 1660300917064, | |
| 464 | + "link": null, | |
| 465 | + "locked": false, | |
| 466 | + "text": "Write True to address 100\non issue", | |
| 467 | + "fontSize": 12.1, | |
| 468 | + "fontFamily": 1, | |
| 469 | + "textAlign": "left", | |
| 470 | + "verticalAlign": "top", | |
| 471 | + "baseline": 26, | |
| 472 | + "containerId": null, | |
| 473 | + "originalText": "Write True to address 100\non issue" | |
| 474 | + } | |
| 475 | + ], | |
| 476 | + "appState": { | |
| 477 | + "gridSize": null, | |
| 478 | + "viewBackgroundColor": "#ffffff" | |
| 479 | + }, | |
| 480 | + "files": { | |
| 481 | + "fe56123c11422301d020f581b74d4397ab49e99c": { | |
| 482 | + "mimeType": "image/jpeg", | |
| 483 | + "id": "fe56123c11422301d020f581b74d4397ab49e99c", | |
| 484 | + "dataURL": "data:image/jpeg;base64,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", | |
| 485 | + "created": 1660300358240 | |
| 486 | + } | |
| 487 | + } | |
| 488 | +} | |
| 0 | 489 | \ No newline at end of file | ... | ... |
docs/assets/server-grafana.webp
0 → 100644
No preview for this file type
docs/index.md
0 → 100644
| 1 | +# libmodbus | |
| 2 | + | |
| 3 | +A featureful and portable Open Source Modbus library. | |
| 4 | + | |
| 5 | +## Description | |
| 6 | + | |
| 7 | +libmodbus is a library to send/receive data with a device which respects the | |
| 8 | +Modbus protocol. This library contains various backends to communicate over | |
| 9 | +different networks (eg. serial in RTU mode or Ethernet in TCP IPv4/IPv6). The | |
| 10 | +<http://www.modbus.org> site provides documentation about the [Modbus | |
| 11 | +Specifications and Implementation Guides](http://www.modbus.org/specs.php). | |
| 12 | + | |
| 13 | +libmodbus provides an abstraction of the lower communication layers and offers | |
| 14 | +the same API on all supported platforms. | |
| 15 | + | |
| 16 | +This documentation presents an overview of libmodbus concepts, describes how | |
| 17 | +libmodbus abstracts Modbus communication with different hardware and platforms | |
| 18 | +and provides a reference manual for the functions provided by the libmodbus | |
| 19 | +library. | |
| 20 | + | |
| 21 | +## Use cases | |
| 22 | + | |
| 23 | +The library can be used to write a: | |
| 24 | + | |
| 25 | +- **client**, the application reads/writes data from various devices. | |
| 26 | +- **server**, the application provides data to several clients. | |
| 27 | + | |
| 28 | +<figure markdown> | |
| 29 | + <img src="assets/client-sensors.webp" width="512"> | |
| 30 | + <figcaption>A libmodbus client that reads only the temperatures from sensors.</figcaption> | |
| 31 | +</figure> | |
| 32 | + | |
| 33 | +<figure markdown> | |
| 34 | + <img src="assets/server-grafana.webp" width="512"> | |
| 35 | + <figcaption>A libmodbus server that exposes data to a Grafana service.</figcaption> | |
| 36 | +</figure> | |
| 37 | + | |
| 38 | +## Contexts | |
| 39 | + | |
| 40 | +The Modbus protocol supports several transport protocols (eg. serial RTU, | |
| 41 | +Ethernet TCP) called backends in *libmodbus*. | |
| 42 | + | |
| 43 | +The first step is to allocate and set a `modbus_t` context according to the | |
| 44 | +required backend (RTU or TCP) with a dedicated function, such as | |
| 45 | +[modbus_new_rtu](modbus_new_rtu). | |
| 46 | +The function will return an opaque structure called `modbus_t` containing all | |
| 47 | +necessary information to establish a connection with other Modbus devices | |
| 48 | +according to the selected backend. | |
| 49 | + | |
| 50 | +Once this context has been created, you can use use the common API provided by | |
| 51 | +*libmodbus* to read/write or set the various timeouts. With this common API, | |
| 52 | +it's easy to switch the backend of your application from RTU to TCP IPv6 for | |
| 53 | +example. | |
| 54 | + | |
| 55 | +### RTU Context | |
| 56 | + | |
| 57 | +The RTU backend (Remote Terminal Unit) is used in serial communication and makes | |
| 58 | +use of a compact, binary representation of the data for protocol communication. | |
| 59 | +The RTU format follows the commands/data with a cyclic redundancy check checksum | |
| 60 | +as an error check mechanism to ensure the reliability of data. Modbus RTU is the | |
| 61 | +most common implementation available for Modbus. A Modbus RTU message must be | |
| 62 | +transmitted continuously without inter-character hesitations (extract from | |
| 63 | +Wikipedia, [Modbus](http://en.wikipedia.org/wiki/Modbus) as of Mar. 13, 2011, | |
| 64 | +20:51 GMT). | |
| 65 | + | |
| 66 | +The Modbus RTU framing calls a slave, a device/service which handle Modbus | |
| 67 | +requests, and a master, a client which send requests. The communication is | |
| 68 | +always initiated by the master. | |
| 69 | + | |
| 70 | +Many Modbus devices can be connected together on the same physical link so | |
| 71 | +before sending a message, you must set the slave (receiver) with | |
| 72 | +[modbus_set_slave](mobus_set_slave). If you're running a slave, its slave number | |
| 73 | +will be used to filter received messages. | |
| 74 | + | |
| 75 | +The libmodbus implementation of RTU isn't time based as stated in original | |
| 76 | +Modbus specification, instead all bytes are sent as fast as possible and a | |
| 77 | +response or an indication is considered complete when all expected characters | |
| 78 | +have been received. This implementation offers very fast communication but you | |
| 79 | +must take care to set a response timeout of slaves less than response timeout of | |
| 80 | +master (ortherwise other slaves may ignore master requests when one of the slave | |
| 81 | +is not responding). | |
| 82 | + | |
| 83 | +To create a Modbus RTU context, you should use [modbus_new_rtu](modbus_new_rtu). | |
| 84 | + | |
| 85 | +You can tweak the serial mode with the following functions: | |
| 86 | + | |
| 87 | +- [modbus_rtu_get_serial_mode](modbus_rtu_get_serial_mode) | |
| 88 | +- [modbus_rtu_set_serial_mode](modbus_rtu_set_serial_mode) | |
| 89 | +- [modbus_rtu_get_rts](modbus_rtu_get_rts) | |
| 90 | +- [modbus_rtu_set_rts](modbus_rtu_set_rts) | |
| 91 | +- [modbus_rtu_set_custom_rts](modbus_rtu_set_custom_rts) | |
| 92 | +- [modbus_rtu_get_rts_delay](modbus_rtu_get_rts_delay) | |
| 93 | +- [modbus_rtu_set_rts_delay](modbus_rtu_set_rts_delay) | |
| 94 | + | |
| 95 | +### TCP (IPv4) Context | |
| 96 | + | |
| 97 | +The TCP backend implements a Modbus variant used for communications over | |
| 98 | +TCP/IPv4 networks. It does not require a checksum calculation as lower layer | |
| 99 | +takes care of the same. | |
| 100 | + | |
| 101 | +To create a Modbus TCP context, you should use [modbus_new_tcp](modbus_new_tcp). | |
| 102 | + | |
| 103 | +### TCP PI (IPv4 and IPv6) Context | |
| 104 | + | |
| 105 | +The TCP PI (Protocol Independent) backend implements a Modbus variant used for | |
| 106 | +communications over TCP IPv4 and IPv6 networks. It does not require a checksum | |
| 107 | +calculation as lower layer takes care of the same. | |
| 108 | + | |
| 109 | +Contrary to the TCP IPv4 only backend, the TCP PI backend offers hostname | |
| 110 | +resolution but it consumes about 1Kb of additional memory. | |
| 111 | + | |
| 112 | +Create a Modbus TCP PI context, you should use [modbus_new_tcp_pi](modbus_new_tcp_pi). | |
| 113 | + | |
| 114 | +## Connection | |
| 115 | + | |
| 116 | +The following functions are provided to establish and close a connection with | |
| 117 | +Modbus devices: | |
| 118 | + | |
| 119 | +- [modbus_connect](modbus_connect) establishes a connection. | |
| 120 | +- [modbus_close](modbus_close) closes a connection. | |
| 121 | +- [modbus_flush](modbus_flush) flushed a connection. | |
| 122 | + | |
| 123 | +In RTU, you should define the slave ID of your client with | |
| 124 | +[modbus_set_slave](modbus_set_slave). | |
| 125 | + | |
| 126 | +To analyse the exchanged data, you can enable the debug mode with | |
| 127 | +[modbus_set_debug](modbus_set_debug). | |
| 128 | + | |
| 129 | +Once you have completed the communication or at the end of your program, you | |
| 130 | +should free the resources with the common function, [modbus_free](modbus_free) | |
| 131 | + | |
| 132 | +## Reads and writes from the client | |
| 133 | + | |
| 134 | +The Modbus protocol defines different data types and functions to read and write | |
| 135 | +them from/to remote devices. The following functions are used by the clients to | |
| 136 | +send Modbus requests: | |
| 137 | + | |
| 138 | +To read data: | |
| 139 | + | |
| 140 | +- [modbus_read_bits](modbus_read_bits) | |
| 141 | +- [modbus_read_input_bits](modbus_read_input_bits) | |
| 142 | +- [modbus_read_registers](modbus_read_registers) | |
| 143 | +- [modbus_read_input_registers](modbus_read_input_registers) | |
| 144 | +- [modbus_report_slave_id](modbus_report_slave_id) | |
| 145 | + | |
| 146 | +To write data: | |
| 147 | + | |
| 148 | +- [modbus_write_bit](modbus_write_bit) | |
| 149 | +- [modbus_write_register](modbus_write_register) | |
| 150 | +- [modbus_write_bits](modbus_write_bits) | |
| 151 | +- [modbus_write_registers](modbus_write_registers) | |
| 152 | + | |
| 153 | +To write and read data in a single operation: | |
| 154 | + | |
| 155 | +- [modbus_write_and_read_registers](modbus_write_and_read_registers) | |
| 156 | + | |
| 157 | +To send and receive low-level requests: | |
| 158 | + | |
| 159 | +- [modbus_send_raw_request](modbus_send_raw_request) | |
| 160 | +- [modbus_receive_confirmation](modbus_receive_confirmation) | |
| 161 | + | |
| 162 | +To reply to an exception: | |
| 163 | + | |
| 164 | +- [modbus_reply_exception](modbus_reply_exception) | |
| 165 | + | |
| 166 | +## Handling requests from server | |
| 167 | + | |
| 168 | +The server is waiting for request from clients and must answer when it is | |
| 169 | +concerned by the request. The libmodbus offers the following functions to | |
| 170 | +handle requests: | |
| 171 | + | |
| 172 | +Data mapping: | |
| 173 | + | |
| 174 | +- [modbus_mapping_new](modbus_mapping_new) | |
| 175 | +- [modbus_mapping_free](modbus_mapping_free) | |
| 176 | + | |
| 177 | +Receive: | |
| 178 | + | |
| 179 | +- [modbus_receive](modbus_receive) | |
| 180 | + | |
| 181 | +Reply: | |
| 182 | + | |
| 183 | +- [modbus_reply](modbus_reply) | |
| 184 | +- [modbus_reply_exception](modbus_reply_exception) | |
| 185 | + | |
| 186 | +## Advanced functions | |
| 187 | + | |
| 188 | +Timeout settings: | |
| 189 | + | |
| 190 | +- [modbus_get_byte_timeout](modbus_get_byte_timeout) | |
| 191 | +- [modbus_set_byte_timeout](modbus_set_byte_timeout) | |
| 192 | +- [modbus_get_response_timeout](modbus_get_response_timeout) | |
| 193 | +- [modbus_set_response_timeout](modbus_set_response_timeout) | |
| 194 | + | |
| 195 | +Error recovery mode: | |
| 196 | + | |
| 197 | +- [modbus_set_error_recovery](modbus_set_error_recovery) | |
| 198 | + | |
| 199 | +Setter/getter of internal socket: | |
| 200 | + | |
| 201 | +- [modbus_set_socket](modbus_set_socket) | |
| 202 | +- [modbus_get_socket](modbus_get_socket) | |
| 203 | + | |
| 204 | +Information about header: | |
| 205 | + | |
| 206 | +- [modbus_get_header_length](modbus_get_header_length) | |
| 207 | + | |
| 208 | +## Data handling | |
| 209 | + | |
| 210 | +Macros for data manipulation: | |
| 211 | + | |
| 212 | +- `MODBUS_GET_HIGH_BYTE(data)`, extracts the high byte from a byte | |
| 213 | +- `MODBUS_GET_LOW_BYTE(data)`, extracts the low byte from a byte | |
| 214 | +- `MODBUS_GET_INT64_FROM_INT16(tab_int16, index)`, builds an int64 from the four first int16 starting at tab_int16[index] | |
| 215 | +- `MODBUS_GET_INT32_FROM_INT16(tab_int16, index)`, builds an int32 from the two first int16 starting at tab_int16[index] | |
| 216 | +- `MODBUS_GET_INT16_FROM_INT8(tab_int8, index)`, builds an int16 from the two first int8 starting at tab_int8[index] | |
| 217 | +- `MODBUS_SET_INT16_TO_INT8(tab_int8, index, value)`, set an int16 value into the two first bytes starting at tab_int8[index] | |
| 218 | +- `MODBUS_SET_INT32_TO_INT16(tab_int16, index, value)`, set an int32 value into the two first int16 starting at tab_int16[index] | |
| 219 | +- `MODBUS_SET_INT64_TO_INT16(tab_int16, index, value)`, set an int64 value into the four first int16 starting at tab_int16[index] | |
| 220 | + | |
| 221 | +Handling of bits and bytes: | |
| 222 | + | |
| 223 | +- [modbus_set_bits_from_byte](modbus_set_bits_from_byte) | |
| 224 | +- [modbus_set_bits_from_bytes](modbus_set_bits_from_bytes) | |
| 225 | +- [modbus_get_byte_from_bits](modbus_get_byte_from_bits) | |
| 226 | + | |
| 227 | +Set or get float numbers: | |
| 228 | + | |
| 229 | +- [modbus_get_float_abcd](modbus_get_float_abcd) | |
| 230 | +- [modbus_set_float_abcd](modbus_set_float_abcd) | |
| 231 | +- [modbus_get_float_badc](modbus_get_float_badc) | |
| 232 | +- [modbus_set_float_badc](modbus_set_float_badc) | |
| 233 | +- [modbus_get_float_cdab](modbus_get_float_cdab) | |
| 234 | +- [modbus_set_float_cdab](modbus_set_float_cdab) | |
| 235 | +- [modbus_get_float_dcba](modbus_get_float_dcba) | |
| 236 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | |
| 237 | +- [modbus_get_float](modbus_get_float) **deprecated** | |
| 238 | +- [modbus_set_float](modbus_set_float) **deprecated** | |
| 239 | + | |
| 240 | +## Error handling | |
| 241 | + | |
| 242 | +The libmodbus functions handle errors using the standard conventions found on | |
| 243 | +POSIX systems. Generally, this means that upon failure a libmodbus function | |
| 244 | +shall return either a NULL value (if returning a pointer) or a negative value | |
| 245 | +(if returning an integer), and the actual error code shall be stored in the | |
| 246 | +`errno` variable. | |
| 247 | + | |
| 248 | +The *modbus_strerror()* function is provided to translate libmodbus-specific | |
| 249 | +error codes into error message strings; for details refer to | |
| 250 | +[modbus_strerror](modbus_strerror). | |
| 251 | + | |
| 252 | +## Miscellaneous | |
| 253 | + | |
| 254 | +The `_LIBMODBUS_VERSION_STRING_` constant indicates the libmodbus version the | |
| 255 | +program has been compiled against. The variables 'libmodbus_version_major', | |
| 256 | +'libmodbus_version_minor', 'libmodbus_version_micro' give the version the | |
| 257 | +program is linked against. | |
| 258 | + | |
| 259 | +## Copying | |
| 260 | + | |
| 261 | +Free use of this software is granted under the terms of the GNU Lesser General | |
| 262 | +Public License (LGPL v2.1+). For details see the file `COPYING.LESSER` included | |
| 263 | +with the libmodbus distribution. | ... | ... |
docs/modbus_close.md
0 → 100644
| 1 | +# modbus_close | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_close - close a Modbus connection | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_close(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_close()* function shall close the connection established with the | |
| 16 | +backend set in the context. | |
| 17 | + | |
| 18 | +## Return value | |
| 19 | + | |
| 20 | +There is no return value. | |
| 21 | + | |
| 22 | +## Example | |
| 23 | + | |
| 24 | +```c | |
| 25 | +modbus_t *ctx; | |
| 26 | + | |
| 27 | +ctx = modbus_new_tcp("127.0.0.1", 502); | |
| 28 | +if (modbus_connect(ctx) == -1) { | |
| 29 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 30 | + modbus_free(ctx); | |
| 31 | + return -1; | |
| 32 | +} | |
| 33 | + | |
| 34 | +modbus_close(ctx); | |
| 35 | +modbus_free(ctx); | |
| 36 | +``` | |
| 37 | + | |
| 38 | +## See also | |
| 39 | + | |
| 40 | +- [modbus_connect](modbus_connect) | ... | ... |
docs/modbus_connect.md
0 → 100644
| 1 | +# modbus_connect | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_connect - establish a Modbus connection | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_connect(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_connect()* function shall establish a connection to a Modbus server, | |
| 16 | +a network or a bus using the context information of libmodbus context given in | |
| 17 | +argument. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 22 | +errno to one of the values defined by the system calls of the underlying | |
| 23 | +platform. | |
| 24 | + | |
| 25 | +## Example | |
| 26 | + | |
| 27 | +```c | |
| 28 | +modbus_t *ctx; | |
| 29 | + | |
| 30 | +ctx = modbus_new_tcp("127.0.0.1", 502); | |
| 31 | +if (modbus_connect(ctx) == -1) { | |
| 32 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 33 | + modbus_free(ctx); | |
| 34 | + return -1; | |
| 35 | +} | |
| 36 | +``` | |
| 37 | + | |
| 38 | +## See also | |
| 39 | + | |
| 40 | +- [modbus_close](modbus_close) | ... | ... |
docs/modbus_flush.md
0 → 100644
| 1 | +# modbus_flush | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_flush - flush non-transmitted data | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_flush(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_flush()* function shall discard data received but not read to the | |
| 16 | +socket or file descriptor associated to the context 'ctx'. | |
| 17 | + | |
| 18 | +## Return value | |
| 19 | + | |
| 20 | +The function shall return 0 or the number of flushed bytes if | |
| 21 | +successful. Otherwise it shall return -1 and set errno. | ... | ... |
docs/modbus_free.md
0 → 100644
| 1 | +# modbus_free | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_free - free a libmodbus context | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_free(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_free()* function shall free an allocated modbus_t structure. | |
| 16 | + | |
| 17 | +## Return value | |
| 18 | + | |
| 19 | +There is no return values. | ... | ... |
docs/modbus_get_byte_from_bits.md
0 → 100644
| 1 | +# modbus_get_byte_from_bits | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_byte_from_bits - get the value from many bits | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +uint8_t modbus_get_byte_from_bits(const uint8_t *src, int index, unsigned int nb_bits); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_byte_from_bits()* function shall extract a value from many | |
| 16 | +bits. All `nb_bits` bits from `src` at position `index` will be read as a | |
| 17 | +single value. To obtain a full byte, set nb_bits to 8. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +The function shall return a byte containing the bits read. | |
| 22 | + | |
| 23 | +## See also | |
| 24 | + | |
| 25 | +- [modbus_set_bits_from_byte](modbus_set_bits_from_byte) | |
| 26 | +- [modbus_set_bits_from_bytes](modbus_set_bits_from_bytes) | ... | ... |
docs/modbus_get_byte_timeout.md
0 → 100644
| 1 | +# modbus_get_byte_timeout | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_byte_timeout - get timeout between bytes | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_get_byte_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_byte_timeout()* function shall store the timeout interval | |
| 16 | +between two consecutive bytes of the same message in the `to_sec` and `to_usec` | |
| 17 | +arguments. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 22 | +errno. | |
| 23 | + | |
| 24 | +## Example | |
| 25 | + | |
| 26 | +```c | |
| 27 | +uint32_t to_sec; | |
| 28 | +uint32_t to_usec; | |
| 29 | + | |
| 30 | +/* Save original timeout */ | |
| 31 | +modbus_get_byte_timeout(ctx, &to_sec, &to_usec); | |
| 32 | +``` | |
| 33 | + | |
| 34 | +## See also | |
| 35 | + | |
| 36 | +- [modbus_set_byte_timeout](modbus_set_byte_timeout) | |
| 37 | +- [modbus_get_response_timeout](modbus_get_response_timeout) | |
| 38 | +- [modbus_set_response_timeout](modbus_set_response_timeout) | ... | ... |
docs/modbus_get_float.md
0 → 100644
| 1 | +# modbus_get_float | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_float - get a float value from 2 registers | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +float modbus_get_float(const uint16_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +Warning, this function is *deprecated* since libmodbus v3.2.0 and has been | |
| 14 | +replaced by *modbus_get_float_dcba()*. | |
| 15 | + | |
| 16 | +## Description | |
| 17 | + | |
| 18 | +The *modbus_get_float()* function shall get a float from 4 bytes in Modbus | |
| 19 | +format (DCBA byte order). The `src` array must be a pointer on two 16 bits | |
| 20 | +values, for example, if the first word is set to 0x4465 and the second to | |
| 21 | +0x229a, the float value will be 916.540649. | |
| 22 | + | |
| 23 | +## Return value | |
| 24 | + | |
| 25 | +The function shall return a float. | |
| 26 | + | |
| 27 | +## See also | |
| 28 | + | |
| 29 | +- [modbus_set_float](modbus_set_float) | |
| 30 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | |
| 31 | +- [modbus_get_float_dcba](modbus_get_float_dcba) | ... | ... |
docs/modbus_get_float_abcd.md
0 → 100644
| 1 | +# modbus_get_float_abcd | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_float_abcd - get a float value from 2 registers in ABCD byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +float modbus_get_float_abcd(const uint16_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_float_abcd()* function shall get a float from 4 bytes in usual | |
| 16 | +Modbus format. The `src` array must be a pointer on two 16 bits values, for | |
| 17 | +example, if the first word is set to 0x0020 and the second to 0xF147, the float | |
| 18 | +value will be read as 123456.0. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return a float. | |
| 23 | + | |
| 24 | +## See also | |
| 25 | + | |
| 26 | +- [modbus_set_float_abcd](modbus_set_float_abcd) | |
| 27 | +- [modbus_get_float_badc](modbus_get_float_badc) | |
| 28 | +- [modbus_get_float_cdab](modbus_get_float_cdab) | |
| 29 | +- [modbus_get_float_dcba](modbus_get_float_dcba) | ... | ... |
docs/modbus_get_float_badc.md
0 → 100644
| 1 | +# modbus_get_float_badc | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_float_badc - get a float value from 2 registers in BADC byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +float modbus_get_float_badc(const uint16_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_float_badc()* function shall get a float from 4 bytes with | |
| 16 | +swapped bytes (BADC instead of ABCD). The `src` array must be a pointer on two | |
| 17 | +16 bits values, for example, if the first word is set to 0x2000 and the second | |
| 18 | +to 0x47F1, the float value will be read as 123456.0. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return a float. | |
| 23 | + | |
| 24 | +## See also | |
| 25 | + | |
| 26 | +- [modbus_set_float_badc](modbus_set_float_badc) | |
| 27 | +- [modbus_get_float_abcd](modbus_get_float_abcd) | |
| 28 | +- [modbus_get_float_cdab](modbus_get_float_cdab) | |
| 29 | +- [modbus_get_float_dcba](modbus_get_float_dcba) | ... | ... |
docs/modbus_get_float_cdab.md
0 → 100644
| 1 | +# modbus_get_float_cdab | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_float_cdab - get a float value from 2 registers in CDAB byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +float modbus_get_float_cdab(const uint16_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_float_cdab()* function shall get a float from 4 bytes with | |
| 16 | +swapped words (CDAB order instead of ABCD). The `src` array must be a pointer on | |
| 17 | +two 16 bits values, for example, if the first word is set to F147 and the second | |
| 18 | +to 0x0020, the float value will be read as 123456.0. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return a float. | |
| 23 | + | |
| 24 | +## See also | |
| 25 | + | |
| 26 | +- [modbus_set_float_cdab](modbus_set_float_cdab) | |
| 27 | +- [modbus_get_float_abcd](modbus_get_float_abcd) | |
| 28 | +- [modbus_get_float_badc](modbus_get_float_badc) | |
| 29 | +- [modbus_get_float_dcba](modbus_get_float_dcba) | ... | ... |
docs/modbus_get_float_dcba.md
0 → 100644
| 1 | +# modbus_get_float_dcba | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_float_dcba - get a float value from 2 registers in DCBA byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +float modbus_get_float_dcba(const uint16_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_float_dcba()* function shall get a float from 4 bytes in | |
| 16 | +inverted Modbus format (DCBA order instead of ABCD). The `src` array must be a | |
| 17 | +pointer on two 16 bits values, for example, if the first word is set to 0x47F1 | |
| 18 | +and the second to 0x2000, the float value will be read as 123456.0. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return a float. | |
| 23 | + | |
| 24 | +## See also | |
| 25 | + | |
| 26 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | |
| 27 | +- [modbus_get_float_abcd](modbus_get_float_abcd) | |
| 28 | +- [modbus_get_float_badc](modbus_get_float_badc) | |
| 29 | +- [modbus_get_float_cdab](modbus_get_float_cdab) | ... | ... |
docs/modbus_get_header_length.md
0 → 100644
| 1 | +# modbus_get_header_length | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_header_length - retrieve the current header length | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_get_header_length(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_header_length()* function shall retrieve the current header | |
| 16 | +length from the backend. This function is convenient to manipulate a message and | |
| 17 | +so its limited to low-level operations. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +The header length as integer value. | ... | ... |
docs/modbus_get_indication_timeout.md
0 → 100644
| 1 | +# modbus_get_indication_timeout | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_indication_timeout - get timeout used to wait for an indication (request received by a server). | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_get_indication_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_indication_timeout()* function shall store the timeout interval | |
| 16 | +used to wait for an indication in the `to_sec` and `to_usec` arguments. | |
| 17 | +Indication is the term used by the Modbus protocol to designate a request | |
| 18 | +received by the server. | |
| 19 | + | |
| 20 | +The default value is zero, it means the server will wait forever. | |
| 21 | + | |
| 22 | +## Return value | |
| 23 | + | |
| 24 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 25 | +errno. | |
| 26 | + | |
| 27 | +```c | |
| 28 | +uint32_t to_sec; | |
| 29 | +uint32_t to_usec; | |
| 30 | + | |
| 31 | +/* Save original timeout */ | |
| 32 | +modbus_get_indication_timeout(ctx, &to_sec, &to_usec); | |
| 33 | +``` | |
| 34 | + | |
| 35 | +## See also | |
| 36 | + | |
| 37 | +- [modbus_set_indication_timeout](modbus_set_indication_timeout) | |
| 38 | +- [modbus_get_response_timeout](modbus_get_response_timeout) | |
| 39 | +- [modbus_set_response_timeout](modbus_set_response_timeout) | ... | ... |
docs/modbus_get_response_timeout.md
0 → 100644
| 1 | +# modbus_get_response_timeout | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_response_timeout - get timeout for response | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_get_response_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_response_timeout()* function shall return the timeout interval | |
| 16 | +used to wait for a response in the `to_sec` and `to_usec` arguments. | |
| 17 | + | |
| 18 | +## Return value | |
| 19 | + | |
| 20 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 21 | +errno. | |
| 22 | + | |
| 23 | +Example: | |
| 24 | + | |
| 25 | +```c | |
| 26 | +uint32_t old_response_to_sec; | |
| 27 | +uint32_t old_response_to_usec; | |
| 28 | + | |
| 29 | +/* Save original timeout */ | |
| 30 | +modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec); | |
| 31 | + | |
| 32 | +/* Define a new and too short timeout! */ | |
| 33 | +modbus_set_response_timeout(ctx, 0, 0); | |
| 34 | +``` | |
| 35 | + | |
| 36 | +## See also | |
| 37 | + | |
| 38 | +- [modbus_set_response_timeout](modbus_set_response_timeout) | |
| 39 | +- [modbus_get_byte_timeout](modbus_get_byte_timeout) | |
| 40 | +- [modbus_set_byte_timeout](modbus_set_byte_timeout) | ... | ... |
docs/modbus_get_slave.md
0 → 100644
| 1 | +# modbus_get_slave | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_slave - get slave number in the context | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_get_slave(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_slave()* function shall get the slave number in the libmodbus | |
| 16 | +context. | |
| 17 | + | |
| 18 | +## Return value | |
| 19 | + | |
| 20 | +The function shall return the slave number if successful. Otherwise it shall | |
| 21 | +return -1 and set errno to one of the values defined below. | |
| 22 | + | |
| 23 | +## Errors | |
| 24 | + | |
| 25 | +- *EINVAL*, the libmodbus context is undefined. | |
| 26 | + | |
| 27 | +## See also | |
| 28 | + | |
| 29 | +- [modbus_set_slave](modbus_set_slave) | ... | ... |
docs/modbus_get_socket.md
0 → 100644
| 1 | +# modbus_get_socket | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_get_socket - get the current socket of the context | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_get_socket(modbus_t *'ctx'); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_get_socket()* function shall return the current socket or file | |
| 16 | +descriptor of the libmodbus context. | |
| 17 | + | |
| 18 | +## Return value | |
| 19 | + | |
| 20 | +The function returns the current socket or file descriptor of the context if | |
| 21 | +successful. Otherwise it shall return -1 and set errno. | |
| 22 | + | |
| 23 | +## See also | |
| 24 | + | |
| 25 | +- [modbus_set_socket](modbus_set_socket) | ... | ... |
docs/modbus_mapping_free.md
0 → 100644
| 1 | +# modbus_mapping_free | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_mapping_free - free a modbus_mapping_t structure | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_mapping_free(modbus_mapping_t *mb_mapping); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The function shall free the four arrays of mb_mapping_t structure and finally | |
| 16 | +the mb_mapping_t referenced by `mb_mapping`. | |
| 17 | + | |
| 18 | +## Return value | |
| 19 | + | |
| 20 | +There is no return values. | |
| 21 | + | |
| 22 | +## See also | |
| 23 | + | |
| 24 | +- [modbus_mapping_new](modbus_mapping_new) | ... | ... |
docs/modbus_mapping_new.md
0 → 100644
| 1 | +# modbus_mapping_new | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_mapping_new - allocate four arrays of bits and registers | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +modbus_mapping_t* modbus_mapping_new(int nb_bits, int nb_input_bits, int nb_registers, int nb_input_registers); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_mapping_new()* function shall allocate four arrays to store bits, | |
| 16 | +input bits, registers and inputs registers. The pointers are stored in | |
| 17 | +modbus_mapping_t structure. All values of the arrays are initialized to zero. | |
| 18 | + | |
| 19 | +This function is equivalent to a call of the | |
| 20 | +[modbus_mapping_new_start_address](modbus_mapping_new_start_address) function | |
| 21 | +with all start addresses to `0`. | |
| 22 | + | |
| 23 | +If it isn't necessary to allocate an array for a specific type of data, you can | |
| 24 | +pass the zero value in argument, the associated pointer will be NULL. | |
| 25 | + | |
| 26 | +This function is convenient to handle requests in a Modbus server/slave. | |
| 27 | + | |
| 28 | +## Return value | |
| 29 | + | |
| 30 | +The function shall return the new allocated structure if successful. Otherwise | |
| 31 | +it shall return NULL and set errno. | |
| 32 | + | |
| 33 | +## Errors | |
| 34 | + | |
| 35 | +- *ENOMEM*, not enough memory. | |
| 36 | + | |
| 37 | +## Example | |
| 38 | + | |
| 39 | +```c | |
| 40 | +/* The first value of each array is accessible from the 0 address. */ | |
| 41 | +mb_mapping = modbus_mapping_new( | |
| 42 | + BITS_ADDRESS + BITS_NB, | |
| 43 | + INPUT_BITS_ADDRESS + INPUT_BITS_NB, | |
| 44 | + REGISTERS_ADDRESS + REGISTERS_NB, | |
| 45 | + INPUT_REGISTERS_ADDRESS + INPUT_REGISTERS_NB | |
| 46 | +); | |
| 47 | +if (mb_mapping == NULL) { | |
| 48 | + fprintf( | |
| 49 | + stderr, "Failed to allocate the mapping: %s\n", | |
| 50 | + modbus_strerror(errno) | |
| 51 | + ); | |
| 52 | + modbus_free(ctx); | |
| 53 | + return -1; | |
| 54 | +} | |
| 55 | +``` | |
| 56 | + | |
| 57 | +## See also | |
| 58 | + | |
| 59 | +- [modbus_mapping_free](modbus_mapping_free) | |
| 60 | +- [modbus_mapping_new_start_address](modbus_mapping_new_start_address) | ... | ... |
docs/modbus_mapping_new_start_address.md
0 → 100644
| 1 | +# modbus_mapping_new_start_address | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_mapping_new_start_address - allocate four arrays of bits and registers accessible from their starting addresses | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +modbus_mapping_t* modbus_mapping_new_start_address( | |
| 11 | + int start_bits, int nb_bits, | |
| 12 | + int start_input_bits, int nb_input_bits, | |
| 13 | + int start_registers, int nb_registers, | |
| 14 | + int start_input_registers, int nb_input_registers); | |
| 15 | +``` | |
| 16 | + | |
| 17 | +## Description | |
| 18 | + | |
| 19 | +The `modbus_mapping_new_start_address()` function shall allocate four arrays to | |
| 20 | +store bits, input bits, registers and inputs registers. The pointers are stored | |
| 21 | +in modbus_mapping_t structure. All values of the arrays are initialized to zero. | |
| 22 | + | |
| 23 | +The different starting addresses make it possible to place the mapping at any | |
| 24 | +address in each address space. This way, you can give access to the clients at | |
| 25 | +values stored at high addresses without allocating memory from the address zero, | |
| 26 | +for eg. to make available registers from 340 to 349, you can use: | |
| 27 | + | |
| 28 | +```c | |
| 29 | +mb_mapping = modbus_mapping_new_start_address(0, 0, 0, 0, 340, 10, 0, 0); | |
| 30 | +``` | |
| 31 | + | |
| 32 | +The newly created `mb_mapping` will have the following arrays: | |
| 33 | + | |
| 34 | +- `tab_bits` set to NULL | |
| 35 | +- `tab_input_bits` set to NULL | |
| 36 | +- `tab_input_registers` allocated to store 10 registers (`uint16_t`) | |
| 37 | +- `tab_registers` set to NULL. | |
| 38 | + | |
| 39 | +The clients can read the first register by using the address 340 in its request. | |
| 40 | +On the server side, you should use the first index of the array to set the value | |
| 41 | +at this client address: | |
| 42 | + | |
| 43 | +```c | |
| 44 | +mb_mapping->tab_registers[0] = 42; | |
| 45 | +``` | |
| 46 | + | |
| 47 | +If it isn't necessary to allocate an array for a specific type of data, you can | |
| 48 | +pass the zero value in argument, the associated pointer will be NULL. | |
| 49 | + | |
| 50 | +This function is convenient to handle requests in a Modbus server/slave. | |
| 51 | + | |
| 52 | +## Return value | |
| 53 | + | |
| 54 | +The `modbus_mapping_new_start_address()` function shall return the new allocated structure if | |
| 55 | +successful. Otherwise it shall return NULL and set errno. | |
| 56 | + | |
| 57 | +## Errors | |
| 58 | + | |
| 59 | +- *ENOMEM*, not enough memory. | |
| 60 | + | |
| 61 | +## Example | |
| 62 | + | |
| 63 | +```c | |
| 64 | +/* The first value of each array is accessible at the defined address. | |
| 65 | +The end address is ADDRESS + NB - 1. */ | |
| 66 | +mb_mapping = modbus_mapping_new_start_address( | |
| 67 | + BITS_ADDRESS, BITS_NB, | |
| 68 | + INPUT_BITS_ADDRESS, INPUT_BITS_NB, | |
| 69 | + REGISTERS_ADDRESS, REGISTERS_NB, | |
| 70 | + INPUT_REGISTERS_ADDRESS, INPUT_REGISTERS_NB | |
| 71 | +); | |
| 72 | +if (mb_mapping == NULL) { | |
| 73 | + fprintf( | |
| 74 | + stderr, "Failed to allocate the mapping: %s\n", | |
| 75 | + modbus_strerror(errno) | |
| 76 | + ); | |
| 77 | + modbus_free(ctx); | |
| 78 | + return -1; | |
| 79 | +} | |
| 80 | +``` | |
| 81 | + | |
| 82 | +## See also | |
| 83 | + | |
| 84 | +- [modbus_mapping_new](modbus_mapping_new) | |
| 85 | +- [modbus_mapping_free](modbus_mapping_free) | ... | ... |
docs/modbus_mask_write_register.md
0 → 100644
| 1 | +# modbus_mask_write_register | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_mask_write_register - mask a single register | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_mask_write_register(modbus_t *ctx, int addr, uint16_t and, uint16_t or); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_mask_write_register()* function shall modify the value of the | |
| 16 | +holding register at the address 'addr' of the remote device using the algorithm: | |
| 17 | + | |
| 18 | + new value = (current value AND 'and') OR ('or' AND (NOT 'and')) | |
| 19 | + | |
| 20 | +The function uses the Modbus function code 0x16 (mask single register). | |
| 21 | + | |
| 22 | +## Return value | |
| 23 | + | |
| 24 | +The function shall return 1 if successful. Otherwise it shall return -1 and set | |
| 25 | +errno. | |
| 26 | + | |
| 27 | +## See also | |
| 28 | + | |
| 29 | +- [modbus_read_registers](modbus_read_registers) | |
| 30 | +- [modbus_write_registers](modbus_write_registers) | ... | ... |
docs/modbus_new_rtu.md
0 → 100644
| 1 | +# modbus_new_rtu | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_new_rtu - create a libmodbus context for RTU | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +modbus_t *modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_new_rtu()* function shall allocate and initialize a `modbus_t` | |
| 16 | +structure to communicate in RTU mode on a serial line. | |
| 17 | + | |
| 18 | +The `device` argument specifies the name of the serial port handled by the OS, | |
| 19 | +eg. "/dev/ttyS0" or "/dev/ttyUSB0". On Windows, it's necessary to prepend COM | |
| 20 | +name with "\\.\" for COM number greater than 9, eg. "\\\\.\\COM10". See | |
| 21 | +http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx for details | |
| 22 | + | |
| 23 | +The `baud` argument specifies the baud rate of the communication, eg. 9600, | |
| 24 | +19200, 57600, 115200, etc. | |
| 25 | + | |
| 26 | +The `parity` argument can have one of the following values: | |
| 27 | + | |
| 28 | +- `N` for none | |
| 29 | +- `E` for even | |
| 30 | +- `O` for odd | |
| 31 | + | |
| 32 | +The `data_bits` argument specifies the number of bits of data, the allowed | |
| 33 | +values are 5, 6, 7 and 8. | |
| 34 | + | |
| 35 | +The `stop_bits` argument specifies the bits of stop, the allowed values are 1 | |
| 36 | +and 2. | |
| 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) and connect to the serial bus with | |
| 40 | +[modbus_connect](modbus_connect). | |
| 41 | + | |
| 42 | +## Return value | |
| 43 | + | |
| 44 | +The function shall return a pointer to a `modbus_t` structure if | |
| 45 | +successful. Otherwise it shall return NULL and set errno to one of the values | |
| 46 | +defined below. | |
| 47 | + | |
| 48 | +## Errors | |
| 49 | + | |
| 50 | +- *EINVAL*, an invalid argument was given. | |
| 51 | +- *ENOMEM*, out of memory. Possibly, the application hits its memory limit | |
| 52 | + and/or whole system is running out of memory. | |
| 53 | + | |
| 54 | +## Example | |
| 55 | + | |
| 56 | +```c | |
| 57 | +modbus_t *ctx; | |
| 58 | + | |
| 59 | +ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1); | |
| 60 | +if (ctx == NULL) { | |
| 61 | + fprintf(stderr, "Unable to create the libmodbus context\n"); | |
| 62 | + return -1; | |
| 63 | +} | |
| 64 | + | |
| 65 | +modbus_set_slave(ctx, YOUR_DEVICE_ID); | |
| 66 | + | |
| 67 | +if (modbus_connect(ctx) == -1) { | |
| 68 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 69 | + modbus_free(ctx); | |
| 70 | + return -1; | |
| 71 | +} | |
| 72 | +``` | |
| 73 | + | |
| 74 | +## See also | |
| 75 | + | |
| 76 | +- [modbus_new_tcp](modbus_new_tcp) | |
| 77 | +- [modbus_free](modbus_free) | ... | ... |
docs/modbus_new_tcp.md
0 → 100644
| 1 | +# modbus_new_tcp | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_new_tcp - create a libmodbus context for TCP/IPv4 | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +modbus_t *modbus_new_tcp(const char *ip, int port); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_new_tcp()* function shall allocate and initialize a modbus_t | |
| 16 | +structure to communicate with a Modbus TCP IPv4 server. | |
| 17 | + | |
| 18 | +The `ip` argument specifies the IP address of the server to which the client | |
| 19 | +wants to establish a connection. A NULL value can be used to listen any addresses in | |
| 20 | +server mode. | |
| 21 | + | |
| 22 | +The `port` argument is the TCP port to use. Set the port to | |
| 23 | +`MODBUS_TCP_DEFAULT_PORT` to use the default one (502). It’s convenient to use a | |
| 24 | +port number greater than or equal to 1024 because it’s not necessary to have | |
| 25 | +administrator privileges. | |
| 26 | + | |
| 27 | +## Return value | |
| 28 | + | |
| 29 | +The function shall return a pointer to a *modbus_t* structure if | |
| 30 | +successful. Otherwise it shall return NULL and set errno to one of the values | |
| 31 | +defined below. | |
| 32 | + | |
| 33 | +## Errors | |
| 34 | + | |
| 35 | +- *EINVAL*, an invalid IP address was given. | |
| 36 | +- *ENOMEM*, out of memory. Possibly, the application hits its memory limit | |
| 37 | + and/or whole system is running out of memory. | |
| 38 | + | |
| 39 | +## Example | |
| 40 | + | |
| 41 | +```c | |
| 42 | +modbus_t *ctx; | |
| 43 | + | |
| 44 | +ctx = modbus_new_tcp("127.0.0.1", 1502); | |
| 45 | +if (ctx == NULL) { | |
| 46 | + fprintf(stderr, "Unable to allocate libmodbus context\n"); | |
| 47 | + return -1; | |
| 48 | +} | |
| 49 | + | |
| 50 | +if (modbus_connect(ctx) == -1) { | |
| 51 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 52 | + modbus_free(ctx); | |
| 53 | + return -1; | |
| 54 | +} | |
| 55 | +``` | |
| 56 | + | |
| 57 | +## See also | |
| 58 | + | |
| 59 | +- [modbus_tcp_listen](modbus_tcp_listen) | |
| 60 | +- [modbus_free](modbus_free) | ... | ... |
docs/modbus_new_tcp_pi.md
0 → 100644
| 1 | +# modbus_new_tcp_pi | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_new_tcp_pi - create a libmodbus context for TCP Protocol Independent | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +*modbus_t *modbus_new_tcp_pi(const char *node, const char *service); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_new_tcp_pi()* function shall allocate and initialize a modbus_t | |
| 16 | +structure to communicate with a Modbus TCP IPv4 or IPv6 server. | |
| 17 | + | |
| 18 | +The `node` argument specifies the host name or IP address of the host to connect | |
| 19 | +to, eg. "192.168.0.5" , "::1" or "server.com". A NULL value can be used to | |
| 20 | +listen any addresses in server mode. | |
| 21 | + | |
| 22 | +The `service` argument is the service name/port number to connect to. To use the | |
| 23 | +default Modbus port, you can provide an NULL value or the string "502". On many | |
| 24 | +Unix systems, it’s convenient to use a port number greater than or equal to 1024 | |
| 25 | +because it’s not necessary to have administrator privileges. | |
| 26 | + | |
| 27 | +:octicons-tag-24: v3.1.8 handles NULL value for `service` (no *EINVAL* error). | |
| 28 | + | |
| 29 | +## Return value | |
| 30 | + | |
| 31 | +The function shall return a pointer to a *modbus_t* structure if | |
| 32 | +successful. Otherwise it shall return NULL and set errno to one of the values | |
| 33 | +defined below. | |
| 34 | + | |
| 35 | +## Errors | |
| 36 | + | |
| 37 | +- *ENOMEM*, out of memory. Possibly, the application hits its memory limit | |
| 38 | + and/or whole system is running out of memory. | |
| 39 | + | |
| 40 | +## Example | |
| 41 | + | |
| 42 | +```c | |
| 43 | +modbus_t *ctx; | |
| 44 | + | |
| 45 | +ctx = modbus_new_tcp_pi("::1", "1502"); | |
| 46 | +if (ctx == NULL) { | |
| 47 | + fprintf(stderr, "Unable to allocate libmodbus context\n"); | |
| 48 | + return -1; | |
| 49 | +} | |
| 50 | + | |
| 51 | +if (modbus_connect(ctx) == -1) { | |
| 52 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 53 | + modbus_free(ctx); | |
| 54 | + return -1; | |
| 55 | +} | |
| 56 | +``` | |
| 57 | + | |
| 58 | +## See also | |
| 59 | + | |
| 60 | +- [modbus_new_tcp](modbus_new_tcp) | |
| 61 | +- [modbus_tcp_pi_listen](modbus_tcp_pi_listen) | |
| 62 | +- [modbus_free](modbus_free) | ... | ... |
docs/modbus_read_bits.md
0 → 100644
| 1 | +# modbus_read_bits | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_read_bits - read many bits | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_read_bits()* function shall read the status of the `nb` bits (coils) | |
| 16 | +to the address `addr` of the remote device. The result of reading is stored in | |
| 17 | +`dest` array as unsigned bytes (8 bits) set to `TRUE` or `FALSE`. | |
| 18 | + | |
| 19 | +You must take care to allocate enough memory to store the results in `dest` | |
| 20 | +(at least `nb` * sizeof(uint8_t)). | |
| 21 | + | |
| 22 | +The function uses the Modbus function code 0x01 (read coil status). | |
| 23 | + | |
| 24 | +## Return value | |
| 25 | + | |
| 26 | +The function shall return the number of read bits if successful. Otherwise it | |
| 27 | +shall return -1 and set errno. | |
| 28 | + | |
| 29 | +## Errors | |
| 30 | + | |
| 31 | +- *EMBMDATA*, too many bits requested | |
| 32 | + | |
| 33 | +## See also | |
| 34 | + | |
| 35 | +- [modbus_write_bit](modbus_write_bit) | |
| 36 | +- [modbus_write_bits](modbus_write_bits) | ... | ... |
docs/modbus_read_input_bits.md
0 → 100644
| 1 | +# modbus_read_input_bits | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_read_input_bits - read many input bits | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_read_input_bits()* function shall read the content of the `nb` input | |
| 16 | +bits to the address `addr` of the remote device. The result of reading is stored | |
| 17 | +in `dest` array as unsigned bytes (8 bits) set to `TRUE` or `FALSE`. | |
| 18 | + | |
| 19 | +You must take care to allocate enough memory to store the results in `dest` | |
| 20 | +(at least `nb` * sizeof(uint8_t)). | |
| 21 | + | |
| 22 | +The function uses the Modbus function code 0x02 (read input status). | |
| 23 | + | |
| 24 | +## Return value | |
| 25 | + | |
| 26 | +The function shall return the number of read input status if | |
| 27 | +successful. Otherwise it shall return -1 and set errno. | |
| 28 | + | |
| 29 | +## Errors | |
| 30 | + | |
| 31 | +- *EMBMDATA*, too many discrete inputs requested | |
| 32 | + | |
| 33 | +## See also | |
| 34 | + | |
| 35 | +- [modbus_read_input_registers](modbus_read_input_registers) | ... | ... |
docs/modbus_read_input_registers.md
0 → 100644
| 1 | +# modbus_read_input_registers | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_read_input_registers - read many input registers | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_read_input_registers()* function shall read the content of the `nb` | |
| 16 | +input registers to address `addr` of the remote device. The result of the | |
| 17 | +reading is stored in `dest` array as word values (16 bits). | |
| 18 | + | |
| 19 | +You must take care to allocate enough memory to store the results in `dest` (at | |
| 20 | +least `nb` * sizeof(uint16_t)). | |
| 21 | + | |
| 22 | +The function uses the Modbus function code 0x04 (read input registers). The | |
| 23 | +holding registers and input registers have different historical meaning, but | |
| 24 | +nowadays it's more common to use holding registers only. | |
| 25 | + | |
| 26 | +## Return value | |
| 27 | + | |
| 28 | +The function shall return the number of read input registers if | |
| 29 | +successful. Otherwise it shall return -1 and set errno. | |
| 30 | + | |
| 31 | +## Errors | |
| 32 | + | |
| 33 | +- *EMBMDATA*, too many bits requested. | |
| 34 | + | |
| 35 | +## See also | |
| 36 | + | |
| 37 | +- [modbus_read_input_bits](modbus_read_input_bits) | |
| 38 | +- [modbus_write_register](modbus_write_register) | |
| 39 | +- [modbus_write_registers](modbus_write_registers) | ... | ... |
docs/modbus_read_registers.md
0 → 100644
| 1 | +# modbus_read_registers | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_read_registers - read many registers | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_read_registers()* function shall read the content of the `nb` | |
| 16 | +holding registers to the address `addr` of the remote device. The result of | |
| 17 | +reading is stored in `dest` array as word values (16 bits). | |
| 18 | + | |
| 19 | +You must take care to allocate enough memory to store the results in `dest` | |
| 20 | +(at least `nb` * sizeof(uint16_t)). | |
| 21 | + | |
| 22 | +The function uses the Modbus function code 0x03 (read holding registers). | |
| 23 | + | |
| 24 | +## Return value | |
| 25 | + | |
| 26 | +The function shall return the number of read registers | |
| 27 | +if successful. Otherwise it shall return -1 and set errno. | |
| 28 | + | |
| 29 | +## Errors | |
| 30 | + | |
| 31 | +- *EMBMDATA*, too many registers requested. | |
| 32 | + | |
| 33 | +## Example | |
| 34 | + | |
| 35 | +```c | |
| 36 | +modbus_t *ctx; | |
| 37 | +uint16_t tab_reg[64]; | |
| 38 | +int rc; | |
| 39 | +int i; | |
| 40 | + | |
| 41 | +ctx = modbus_new_tcp("127.0.0.1", 1502); | |
| 42 | +if (modbus_connect(ctx) == -1) { | |
| 43 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 44 | + modbus_free(ctx); | |
| 45 | + return -1; | |
| 46 | +} | |
| 47 | + | |
| 48 | +rc = modbus_read_registers(ctx, 0, 10, tab_reg); | |
| 49 | +if (rc == -1) { | |
| 50 | + fprintf(stderr, "%s\n", modbus_strerror(errno)); | |
| 51 | + return -1; | |
| 52 | +} | |
| 53 | + | |
| 54 | +for (i=0; i < rc; i++) { | |
| 55 | + printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]); | |
| 56 | +} | |
| 57 | + | |
| 58 | +modbus_close(ctx); | |
| 59 | +modbus_free(ctx); | |
| 60 | +``` | |
| 61 | + | |
| 62 | +## See also | |
| 63 | + | |
| 64 | +- [modbus_write_register](modbus_write_register) | |
| 65 | +- [modbus_write_registers](modbus_write_registers) | ... | ... |
docs/modbus_receive.md
0 → 100644
| 1 | +# modbus_receive | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_receive - receive an indication request | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_receive(modbus_t *'ctx', uint8_t *'req'); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_receive()* function shall receive an indication request from the | |
| 16 | +socket of the context `ctx`. This function is used by Modbus slave/server to | |
| 17 | +receive and analyze indication request sent by the masters/clients. | |
| 18 | + | |
| 19 | +If you need to use another socket or file descriptor than the one defined in the | |
| 20 | +context `ctx`, see the function [modbus_set_socket](modbus_set_socket). | |
| 21 | + | |
| 22 | +## Return value | |
| 23 | + | |
| 24 | +The function shall store the indication request in `req` and return the request | |
| 25 | +length if successful. The returned request length can be zero if the indication | |
| 26 | +request is ignored (eg. a query for another slave in RTU mode). Otherwise it | |
| 27 | +shall return -1 and set errno. | |
| 28 | + | |
| 29 | +## See also | |
| 30 | + | |
| 31 | +- [modbus_set_socket](modbus_set_socket) | |
| 32 | +- [modbus_reply](modbus_reply) | ... | ... |
docs/modbus_receive_confirmation.md
0 → 100644
| 1 | +# modbus_receive_confirmation | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_receive_confirmation - receive a confirmation request | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_receive_confirmation(modbus_t *ctx, uint8_t *rsp); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_receive_confirmation()* function shall receive a request via the | |
| 16 | +socket of the context `ctx`. This function must be used for debugging purposes | |
| 17 | +because the received response isn't checked against the initial request. This | |
| 18 | +function can be used to receive request not handled by the library. | |
| 19 | + | |
| 20 | +The maximum size of the response depends on the used backend, in RTU the `rsp` | |
| 21 | +array must be `MODBUS_RTU_MAX_ADU_LENGTH` bytes and in TCP it must be | |
| 22 | +`MODBUS_TCP_MAX_ADU_LENGTH` bytes. If you want to write code compatible with | |
| 23 | +both, you can use the constant `MODBUS_MAX_ADU_LENGTH` (maximum value of all | |
| 24 | +libmodbus backends). Take care to allocate enough memory to store responses to | |
| 25 | +avoid crashes of your server. | |
| 26 | + | |
| 27 | +## Return value | |
| 28 | + | |
| 29 | +The function shall store the confirmation request in `rsp` and return the | |
| 30 | +response length if successful. The returned request length can be zero if the | |
| 31 | +indication request is ignored (eg. a query for another slave in RTU | |
| 32 | +mode). Otherwise it shall return -1 and set errno. | |
| 33 | + | |
| 34 | +## Example | |
| 35 | + | |
| 36 | +```c | |
| 37 | +uint8_t rsp[MODBUS_MAX_ADU_LENGTH]; | |
| 38 | +rc = modbus_receive_confirmation(ctx, rsp); | |
| 39 | +``` | |
| 40 | + | |
| 41 | +## See also | |
| 42 | + | |
| 43 | +- [modbus_send_raw_request](modbus_send_raw_request) | ... | ... |
docs/modbus_reply.md
0 → 100644
| 1 | +# modbus_reply | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_reply - send a response to the received request | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_reply(modbus_t *ctx, const uint8_t *req, int req_length, modbus_mapping_t *mb_mapping); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_reply()* function shall send a response to received request. The | |
| 16 | +request `req` given in argument is analyzed, a response is then built and sent | |
| 17 | +by using the information of the modbus context `ctx`. | |
| 18 | + | |
| 19 | +If the request indicates to read or write a value the operation will done in the | |
| 20 | +modbus mapping `mb_mapping` according to the type of the manipulated data. | |
| 21 | + | |
| 22 | +If an error occurs, an exception response will be sent. | |
| 23 | + | |
| 24 | +This function is designed for Modbus server. | |
| 25 | + | |
| 26 | +## Return value | |
| 27 | + | |
| 28 | +The function shall return the length of the response sent if | |
| 29 | +successful. Otherwise it shall return -1 and set errno. | |
| 30 | + | |
| 31 | +## Errors | |
| 32 | + | |
| 33 | +- *EMBMDATA*, sending has failed | |
| 34 | + | |
| 35 | +See also the errors returned by the syscall used to send the response (eg. send or write). | |
| 36 | + | |
| 37 | +## See also | |
| 38 | + | |
| 39 | +- [modbus_reply_exception](modbus_reply_exception) | ... | ... |
docs/modbus_reply_exception.md
0 → 100644
| 1 | +# modbus_reply_exception | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_reply_exception - send an exception response | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_reply_exception(modbus_t *ctx, const uint8_t *req, unsigned int exception_code); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_reply_exception()* function shall send an exception response based | |
| 16 | +on the 'exception_code' in argument. | |
| 17 | + | |
| 18 | +The libmodbus provides the following exception codes: | |
| 19 | + | |
| 20 | +- MODBUS_EXCEPTION_ILLEGAL_FUNCTION (1) | |
| 21 | +- MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS (2) | |
| 22 | +- MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE (3) | |
| 23 | +- MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE (4) | |
| 24 | +- MODBUS_EXCEPTION_ACKNOWLEDGE (5) | |
| 25 | +- MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY (6) | |
| 26 | +- MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE (7) | |
| 27 | +- MODBUS_EXCEPTION_MEMORY_PARITY (8) | |
| 28 | +- MODBUS_EXCEPTION_NOT_DEFINED (9) | |
| 29 | +- MODBUS_EXCEPTION_GATEWAY_PATH (10) | |
| 30 | +- MODBUS_EXCEPTION_GATEWAY_TARGET (11) | |
| 31 | + | |
| 32 | +The initial request `req` is required to build a valid response. | |
| 33 | + | |
| 34 | +## Return value | |
| 35 | + | |
| 36 | +The function shall return the length of the response sent if | |
| 37 | +successful. Otherwise it shall return -1 and set errno. | |
| 38 | + | |
| 39 | +## Errors | |
| 40 | + | |
| 41 | +- *EINVAL*, the exception code is invalid | |
| 42 | + | |
| 43 | +## See also | |
| 44 | + | |
| 45 | +- [modbus_reply](modbus_reply) | ... | ... |
docs/modbus_report_slave_id.md
0 → 100644
| 1 | +# modbus_report_slave_id | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_report_slave_id - returns a description of the controller | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_report_slave_id(modbus_t *ctx, int max_dest, uint8_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_report_slave_id()* function shall send a request to the controller | |
| 16 | +to obtain a description of the controller. | |
| 17 | + | |
| 18 | +The response stored in `dest` contains: | |
| 19 | + | |
| 20 | +- the slave ID, this unique ID is in reality not unique at all so it's not | |
| 21 | + possible to depend on it to know how the information are packed in the | |
| 22 | + response. | |
| 23 | +- the run indicator status (0x00 = OFF, 0xFF = ON) | |
| 24 | +- additional data specific to each controller. For example, libmodbus returns | |
| 25 | + the version of the library as a string. | |
| 26 | + | |
| 27 | +The function writes at most `max_dest` bytes from the response to `dest` so | |
| 28 | +you must ensure that `dest` is large enough. | |
| 29 | + | |
| 30 | +## Return value | |
| 31 | + | |
| 32 | +The function shall return the number of read data if successful. | |
| 33 | + | |
| 34 | +If the output was truncated due to the `max_dest` limit then the return value is | |
| 35 | +the number of bytes which would have been written to `dest` if enough space had | |
| 36 | +been available. Thus, a return value greater than `max_dest` means that the | |
| 37 | +response data was truncated. | |
| 38 | + | |
| 39 | +Otherwise it shall return -1 and set errno. | |
| 40 | + | |
| 41 | +## Example | |
| 42 | + | |
| 43 | +```c | |
| 44 | +uint8_t tab_bytes[MODBUS_MAX_PDU_LENGTH]; | |
| 45 | + | |
| 46 | +... | |
| 47 | + | |
| 48 | +rc = modbus_report_slave_id(ctx, MODBUS_MAX_PDU_LENGTH, tab_bytes); | |
| 49 | +if (rc > 1) { | |
| 50 | + printf("Run Status Indicator: %s\n", tab_bytes[1] ? "ON" : "OFF"); | |
| 51 | +} | |
| 52 | +``` | ... | ... |
docs/modbus_rtu_get_rts.md
0 → 100644
| 1 | +# modbus_rtu_get_rts | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_rtu_get_rts - get the current RTS mode in RTU | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_rtu_get_rts(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_rtu_get_rts()* function shall get the current Request To Send mode | |
| 16 | +of the libmodbus context `ctx`. The possible returned values are: | |
| 17 | + | |
| 18 | +- `MODBUS_RTU_RTS_NONE` | |
| 19 | +- `MODBUS_RTU_RTS_UP` | |
| 20 | +- `MODBUS_RTU_RTS_DOWN` | |
| 21 | + | |
| 22 | +This function can only be used with a context using a RTU backend. | |
| 23 | + | |
| 24 | +## Return value | |
| 25 | + | |
| 26 | +The function shall return the current RTS mode if successful. Otherwise it shall | |
| 27 | +return -1 and set errno. | |
| 28 | + | |
| 29 | +## Errors | |
| 30 | + | |
| 31 | +- *EINVAL*, the libmodbus backend is not RTU. | |
| 32 | + | |
| 33 | +## See also | |
| 34 | + | |
| 35 | +- [modbus_rtu_set_rts](modbus_rtu_set_rts) | ... | ... |
docs/modbus_rtu_get_rts_delay.md
0 → 100644
| 1 | +# modbus_rtu_get_rts_delay | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_rtu_get_rts_delay - get the current RTS delay in RTU | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_rtu_get_rts_delay(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The `modbus_rtu_get_rts_delay()` function shall get the current Request To Send | |
| 16 | +delay period of the libmodbus context 'ctx'. | |
| 17 | + | |
| 18 | +This function can only be used with a context using a RTU backend. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The `modbus_rtu_get_rts_delay()` function shall return the current RTS delay in | |
| 23 | +microseconds if successful. Otherwise it shall return -1 and set errno. | |
| 24 | + | |
| 25 | +## Errors | |
| 26 | + | |
| 27 | +- *EINVAL*, the libmodbus backend is not RTU. | |
| 28 | + | |
| 29 | +## See also | |
| 30 | + | |
| 31 | +- [modbus_rtu_set_rts_delay](modbus_rtu_set_rts_delay) | ... | ... |
docs/modbus_rtu_get_serial_mode.md
0 → 100644
| 1 | +# modbus_rtu_get_serial_mode | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_rtu_get_serial_mode - get the current serial mode | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_rtu_get_serial_mode(modbus_t *ctx); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_rtu_get_serial_mode()* function shall return the serial mode | |
| 16 | +currently used by the libmodbus context: | |
| 17 | + | |
| 18 | +- **MODBUS_RTU_RS232**, the serial line is set for RS232 communication. RS-232 | |
| 19 | + (Recommended Standard 232) is the traditional name for a series of standards | |
| 20 | + for serial binary single-ended data and control signals connecting between a | |
| 21 | + DTE (Data Terminal Equipment) and a DCE (Data Circuit-terminating Equipment). | |
| 22 | + It is commonly used in computer serial ports | |
| 23 | + | |
| 24 | +- **MODBUS_RTU_RS485**, the serial line is set for RS485 communication. EIA-485, | |
| 25 | + also known as TIA/EIA-485 or RS-485, is a standard defining the electrical | |
| 26 | + characteristics of drivers and receivers for use in balanced digital | |
| 27 | + multipoint systems. This standard is widely used for communications in | |
| 28 | + industrial automation because it can be used effectively over long distances | |
| 29 | + and in electrically noisy environments. This function is only available on | |
| 30 | + Linux kernels 2.6.28 onwards and can only be used with a context using a RTU | |
| 31 | + backend. | |
| 32 | + | |
| 33 | +## Return value | |
| 34 | + | |
| 35 | +The function shall return `MODBUS_RTU_RS232` or `MODBUS_RTU_RS485` if | |
| 36 | +successful. Otherwise it shall return -1 and set errno to one of the values | |
| 37 | +defined below. | |
| 38 | + | |
| 39 | +## Errors | |
| 40 | + | |
| 41 | +- *EINVAL*, the current libmodbus backend is not RTU. | ... | ... |
docs/modbus_rtu_set_custom_rts.md
0 → 100644
| 1 | +# modbus_rtu_set_custom_rts | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_rtu_set_custom_rts - set a function to be used for custom RTS implementation | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_rtu_set_custom_rts(modbus_t *ctx, void (*set_rts) (modbus_t *ctx, int on)) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The `modbus_rtu_set_custom_rts()` function shall set a custom function to be | |
| 16 | +called when the RTS pin is to be set before and after a transmission. By default | |
| 17 | +this is set to an internal function that toggles the RTS pin using an ioctl | |
| 18 | +call. | |
| 19 | + | |
| 20 | +Note that this function adheres to the RTS mode, the values `MODBUS_RTU_RTS_UP` or | |
| 21 | +`MODBUS_RTU_RTS_DOWN` must be used for the function to be called. | |
| 22 | + | |
| 23 | +This function can only be used with a context using a RTU backend. | |
| 24 | + | |
| 25 | +## Return value | |
| 26 | + | |
| 27 | +The `modbus_rtu_set_custom_rts()` function shall return 0 if successful. | |
| 28 | +Otherwise it shall return -1 and set errno to one of the values defined below. | |
| 29 | + | |
| 30 | +## Errors | |
| 31 | + | |
| 32 | +- *EINVAL*, the libmodbus backend is not RTU. | ... | ... |
doc/modbus_rtu_set_rts.txt renamed to docs/modbus_rtu_set_rts.md
| 1 | -modbus_rtu_set_rts(3) | |
| 2 | -===================== | |
| 1 | +# modbus_rtu_set_rts | |
| 3 | 2 | |
| 3 | +## Name | |
| 4 | 4 | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | 5 | modbus_rtu_set_rts - set the RTS mode in RTU |
| 8 | 6 | |
| 7 | +## Synopsis | |
| 9 | 8 | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_rtu_set_rts(modbus_t *'ctx', int 'mode')* | |
| 9 | +```c | |
| 10 | +int modbus_rtu_set_rts(modbus_t *ctx, int mode) | |
| 11 | +``` | |
| 13 | 12 | |
| 13 | +## Description | |
| 14 | 14 | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | 15 | The *modbus_rtu_set_rts()* function shall set the Request To Send mode to |
| 18 | 16 | communicate on a RS485 serial bus. By default, the mode is set to |
| 19 | 17 | `MODBUS_RTU_RTS_NONE` and no signal is issued before writing data on the wire. |
| ... | ... | @@ -28,24 +26,20 @@ RTS flag. |
| 28 | 26 | |
| 29 | 27 | This function can only be used with a context using a RTU backend. |
| 30 | 28 | |
| 29 | +## Return value | |
| 31 | 30 | |
| 32 | -RETURN VALUE | |
| 33 | ------------- | |
| 34 | 31 | The function shall return 0 if successful. Otherwise it shall return -1 and set |
| 35 | 32 | errno to one of the values defined below. |
| 36 | 33 | |
| 34 | +## Errors | |
| 37 | 35 | |
| 38 | -ERRORS | |
| 39 | ------- | |
| 40 | -*EINVAL*:: | |
| 41 | -The libmodbus backend isn't RTU or the mode given in argument is invalid. | |
| 36 | +- *EINVAL*, the libmodbus backend isn't RTU or the mode given in argument is invalid. | |
| 42 | 37 | |
| 38 | +## Example | |
| 43 | 39 | |
| 44 | -EXAMPLE | |
| 45 | -------- | |
| 46 | -.Enable the RTS mode with positive polarity | |
| 47 | -[source,c] | |
| 48 | -------------------- | |
| 40 | +Enable the RTS mode with positive polarity: | |
| 41 | + | |
| 42 | +```c | |
| 49 | 43 | modbus_t *ctx; |
| 50 | 44 | uint16_t tab_reg[10]; |
| 51 | 45 | |
| ... | ... | @@ -68,14 +62,8 @@ if (rc == -1) { |
| 68 | 62 | |
| 69 | 63 | modbus_close(ctx); |
| 70 | 64 | modbus_free(ctx); |
| 71 | -------------------- | |
| 72 | - | |
| 73 | -SEE ALSO | |
| 74 | --------- | |
| 75 | -linkmb:modbus_rtu_get_rts[3] | |
| 65 | +``` | |
| 76 | 66 | |
| 67 | +## See also | |
| 77 | 68 | |
| 78 | -AUTHORS | |
| 79 | -------- | |
| 80 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 81 | -<stephane.raimbault@gmail.com> | |
| 69 | +- [modbus_rtu_get_rts](modbus_rtu_get_rts) | ... | ... |
docs/modbus_rtu_set_rts_delay.md
0 → 100644
| 1 | +# modbus_rtu_set_rts_delay | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_rtu_set_rts_delay - set the RTS delay in RTU | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_rtu_set_rts_delay(modbus_t *ctx, int us); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The `modbus_rtu_set_rts_delay()` function shall set the Request To Send delay | |
| 16 | +period of the libmodbus context 'ctx'. | |
| 17 | + | |
| 18 | +This function can only be used with a context using a RTU backend. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The `modbus_rtu_set_rts_delay()` function shall return 0 if successful. | |
| 23 | +Otherwise it shall return -1 and set errno. | |
| 24 | + | |
| 25 | +## Errors | |
| 26 | + | |
| 27 | +- *EINVAL*, the libmodbus backend is not RTU or a negative delay was specified. | |
| 28 | + | |
| 29 | +## See also | |
| 30 | + | |
| 31 | +- [modbus_rtu_get_rts_delay](modbus_rtu_get_rts_delay) | ... | ... |
docs/modbus_rtu_set_serial_mode.md
0 → 100644
| 1 | +# modbus_rtu_set_serial_mode | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_rtu_set_serial_mode - set the serial mode | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_rtu_set_serial_mode()* function shall set the selected serial | |
| 16 | +mode: | |
| 17 | + | |
| 18 | +- **MODBUS_RTU_RS232**, the serial line is set for RS232 communication. RS-232 | |
| 19 | + (Recommended Standard 232) is the traditional name for a series of standards | |
| 20 | + for serial binary single-ended data and control signals connecting between a | |
| 21 | + DTE (Data Terminal Equipment) and a DCE (Data Circuit-terminating Equipment). | |
| 22 | + It is commonly used in computer serial ports. | |
| 23 | + | |
| 24 | +- **MODBUS_RTU_RS485**, the serial line is set for RS485 communication. | |
| 25 | +EIA-485, also known as TIA/EIA-485 or RS-485, is a standard defining the | |
| 26 | +electrical characteristics of drivers and receivers for use in balanced | |
| 27 | +digital multipoint systems. This standard is widely used for communications | |
| 28 | +in industrial automation because it can be used effectively over long | |
| 29 | +distances and in electrically noisy environments. | |
| 30 | + | |
| 31 | +This function is only supported on Linux kernels 2.6.28 onwards. | |
| 32 | + | |
| 33 | +## Return value | |
| 34 | + | |
| 35 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 36 | +errno to one of the values defined below. | |
| 37 | + | |
| 38 | +## Errors | |
| 39 | + | |
| 40 | +- *EINVAL*, the current libmodbus backend is not RTU. | |
| 41 | +- *ENOTSUP*, the function is not supported on your platform. | |
| 42 | + | |
| 43 | +If the call to `ioctl()` fails, the error code of ioctl will be returned. | ... | ... |
doc/modbus_send_raw_request.txt renamed to docs/modbus_send_raw_request.md
| 1 | -modbus_send_raw_request(3) | |
| 2 | -========================== | |
| 1 | +# modbus_send_raw_request | |
| 3 | 2 | |
| 3 | +## Name | |
| 4 | 4 | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | 5 | modbus_send_raw_request - send a raw request |
| 8 | 6 | |
| 7 | +## Synopsis | |
| 9 | 8 | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_send_raw_request(modbus_t *'ctx', const uint8_t *'raw_req', int 'raw_req_length');* | |
| 9 | +```c | |
| 10 | +int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length); | |
| 11 | +``` | |
| 13 | 12 | |
| 13 | +## Description | |
| 14 | 14 | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | 15 | The *modbus_send_raw_request()* function shall send a request via the socket of |
| 18 | -the context _ctx_. This function must be used for debugging purposes because you | |
| 16 | +the context `ctx`. This function must be used for debugging purposes because you | |
| 19 | 17 | have to take care to make a valid request by hand. The function only adds to the |
| 20 | -message, the header or CRC of the selected backend, so _raw_req_ must start and | |
| 18 | +message, the header or CRC of the selected backend, so `raw_req` must start and | |
| 21 | 19 | contain at least a slave/unit identifier and a function code. This function can |
| 22 | 20 | be used to send request not handled by the library. |
| 23 | 21 | |
| ... | ... | @@ -25,18 +23,15 @@ The public header of libmodbus provides a list of supported Modbus functions |
| 25 | 23 | codes, prefixed by `MODBUS_FC_` (eg. `MODBUS_FC_READ_HOLDING_REGISTERS`), to help |
| 26 | 24 | build of raw requests. |
| 27 | 25 | |
| 26 | +## Return value | |
| 28 | 27 | |
| 29 | -RETURN VALUE | |
| 30 | ------------- | |
| 31 | 28 | The function shall return the full message length, counting the extra data |
| 32 | 29 | relating to the backend, if successful. Otherwise it shall return -1 and set |
| 33 | 30 | errno. |
| 34 | 31 | |
| 32 | +## Example | |
| 35 | 33 | |
| 36 | -EXAMPLE | |
| 37 | -------- | |
| 38 | -[source,c] | |
| 39 | -------------------- | |
| 34 | +```c | |
| 40 | 35 | modbus_t *ctx; |
| 41 | 36 | /* Read 5 holding registers from address 1 */ |
| 42 | 37 | uint8_t raw_req[] = { 0xFF, MODBUS_FC_READ_HOLDING_REGISTERS, 0x00, 0x01, 0x0, 0x05 }; |
| ... | ... | @@ -55,14 +50,8 @@ modbus_receive_confirmation(ctx, rsp); |
| 55 | 50 | |
| 56 | 51 | modbus_close(ctx); |
| 57 | 52 | modbus_free(ctx); |
| 58 | -------------------- | |
| 53 | +``` | |
| 59 | 54 | |
| 60 | -SEE ALSO | |
| 61 | --------- | |
| 62 | -linkmb:modbus_receive_confirmation[3] | |
| 55 | +## See also | |
| 63 | 56 | |
| 64 | - | |
| 65 | -AUTHORS | |
| 66 | -------- | |
| 67 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 68 | -<stephane.raimbault@gmail.com> | |
| 57 | +- [modbus_receive_confirmation](modbus_receive_confirmation) | ... | ... |
docs/modbus_set_bits_from_byte.md
0 → 100644
| 1 | +# modbus_set_bits_from_byte | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_bits_from_byte - set many bits from a single byte value | |
| 6 | + | |
| 7 | + | |
| 8 | +## Synopsis | |
| 9 | + | |
| 10 | +```c | |
| 11 | +void modbus_set_bits_from_byte(uint8_t *dest, int index, const uint8_t value); | |
| 12 | +``` | |
| 13 | + | |
| 14 | +## Description | |
| 15 | + | |
| 16 | +The *modbus_set_bits_from_byte()* function shall set many bits from a single | |
| 17 | +byte. All 8 bits from the byte `value` will be written to `dest` array starting | |
| 18 | +at `index` position. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +There is no return values. | |
| 23 | + | |
| 24 | +## See also | |
| 25 | + | |
| 26 | +- [modbus_set_bits_from_byte](modbus_set_bits_from_byte) | |
| 27 | +- [modbus_set_bits_from_bytes](modbus_set_bits_from_bytes) | ... | ... |
docs/modbus_set_bits_from_bytes.md
0 → 100644
| 1 | +# modbus_set_bits_from_bytes | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_bits_from_bytes - set many bits from an array of bytes | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_bits_from_bytes(uint8_t *dest, int index, unsigned int nb_bits, const uint8_t *tab_byte); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_bits_from_bytes* function shall set bits by reading an array of | |
| 16 | +bytes. All the bits of the bytes read from the first position of the array | |
| 17 | +`tab_byte` are written as bits in the `dest` array starting at position `index`. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +There is no return values. | |
| 22 | + | |
| 23 | +## See also | |
| 24 | + | |
| 25 | +- [modbus_set_bits_from_byte](modbus_set_bits_from_byte) | |
| 26 | +- [modbus_get_byte_from_bits](modbus_get_byte_from_bits) | ... | ... |
docs/modbus_set_byte_timeout.md
0 → 100644
| 1 | +# modbus_set_byte_timeout | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_byte_timeout - set timeout between bytes | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_byte_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_byte_timeout()* function shall set the timeout interval between | |
| 16 | +two consecutive bytes of the same message. The timeout is an upper bound on the | |
| 17 | +amount of time elapsed before *select()* returns, if the time elapsed is longer | |
| 18 | +than the defined timeout, an `ETIMEDOUT` error will be raised by the | |
| 19 | +function waiting for a response. | |
| 20 | + | |
| 21 | +The value of `to_usec` argument must be in the range 0 to 999999. | |
| 22 | + | |
| 23 | +If both `to_sec` and `to_usec` are zero, this timeout will not be used at all. | |
| 24 | +In this case, *modbus_set_response_timeout()* governs the entire handling of the | |
| 25 | +response, the full confirmation response must be received before expiration of | |
| 26 | +the response timeout. When a byte timeout is set, the response timeout is only | |
| 27 | +used to wait for until the first byte of the response. | |
| 28 | + | |
| 29 | +## Return value | |
| 30 | + | |
| 31 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 32 | +errno. | |
| 33 | + | |
| 34 | +## Errors | |
| 35 | + | |
| 36 | +- *EINVAL*, The argument `ctx` is NULL or `to_usec` is larger than 999999. | |
| 37 | + | |
| 38 | +## See also | |
| 39 | + | |
| 40 | +- [modbus_get_byte_timeout](modbus_get_byte_timeout) | |
| 41 | +- [modbus_get_response_timeout](modbus_get_response_timeout) | |
| 42 | +- [modbus_set_response_timeout](modbus_set_response_timeout) | |
| 43 | +w | ... | ... |
docs/modbus_set_debug.md
0 → 100644
| 1 | +# modbus_set_debug | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_debug - set debug flag of the context | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_set_debug(modbus_t *ctx, int flag); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_debug()* function shall set the debug flag of the *modbus_t* | |
| 16 | +context by using the argument `flag`. By default, the boolean flag is set to | |
| 17 | +`FALSE`. When the `flag` value is set to `TRUE`, many verbose messages are | |
| 18 | +displayed on stdout and stderr. For example, this flag is useful to display the | |
| 19 | +bytes of the Modbus messages. | |
| 20 | + | |
| 21 | +```text | |
| 22 | +[00][14][00][00][00][06][12][03][00][6B][00][03] | |
| 23 | +Waiting for a confirmation... | |
| 24 | +<00><14><00><00><00><09><12><03><06><02><2B><00><00><00><00> | |
| 25 | +``` | |
| 26 | + | |
| 27 | +## Return value | |
| 28 | + | |
| 29 | +The function shall return 0 if successful. Otherwise it shall return -1 and set errno. | ... | ... |
doc/modbus_set_error_recovery.txt renamed to docs/modbus_set_error_recovery.md
| 1 | -modbus_set_error_recovery(3) | |
| 2 | -============================ | |
| 1 | +# modbus_set_error_recovery | |
| 3 | 2 | |
| 3 | +## Name | |
| 4 | 4 | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | 5 | modbus_set_error_recovery - set the error recovery mode |
| 8 | 6 | |
| 7 | +## Synopsis | |
| 9 | 8 | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_set_error_recovery(modbus_t *'ctx', modbus_error_recovery_mode 'error_recovery');* | |
| 9 | +```c | |
| 10 | +int modbus_set_error_recovery(modbus_t *ctx, modbus_error_recovery_mode error_recovery); | |
| 11 | +``` | |
| 13 | 12 | |
| 13 | +## Description | |
| 14 | 14 | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | 15 | The *modbus_set_error_recovery()* function shall set the error recovery mode to |
| 18 | 16 | apply when the connection fails or the byte received is not expected. The |
| 19 | -argument _error_recovery_ may be bitwise-or'ed with zero or more of the | |
| 17 | +argument `error_recovery` may be bitwise-or'ed with zero or more of the | |
| 20 | 18 | following constants. |
| 21 | 19 | |
| 22 | 20 | By default there is no error recovery (`MODBUS_ERROR_RECOVERY_NONE`) so the |
| ... | ... | @@ -42,29 +40,20 @@ The modes are mask values and so they are complementary. |
| 42 | 40 | |
| 43 | 41 | It's not recommended to enable error recovery for slave/server. |
| 44 | 42 | |
| 43 | +## Return value | |
| 45 | 44 | |
| 46 | -RETURN VALUE | |
| 47 | ------------- | |
| 48 | 45 | The function shall return 0 if successful. Otherwise it shall return -1 and set |
| 49 | 46 | errno to one of the values defined below. |
| 50 | 47 | |
| 48 | +## Errors | |
| 51 | 49 | |
| 52 | -ERRORS | |
| 53 | ------- | |
| 54 | -*EINVAL*:: | |
| 55 | -The value of the argument _error_recovery_ is not positive. | |
| 50 | +- *EINVAL*, the value of the argument `error_recovery` is not positive. | |
| 56 | 51 | |
| 52 | +## Example | |
| 57 | 53 | |
| 58 | -EXAMPLE | |
| 59 | -------- | |
| 60 | -[source,c] | |
| 61 | -------------------- | |
| 62 | -modbus_set_error_recovery(ctx, | |
| 63 | - MODBUS_ERROR_RECOVERY_LINK | | |
| 64 | - MODBUS_ERROR_RECOVERY_PROTOCOL); | |
| 65 | -------------------- | |
| 66 | - | |
| 67 | -AUTHORS | |
| 68 | -------- | |
| 69 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 70 | -<stephane.raimbault@gmail.com> | |
| 54 | +```c | |
| 55 | +modbus_set_error_recovery( | |
| 56 | + ctx, | |
| 57 | + MODBUS_ERROR_RECOVERY_LINK | MODBUS_ERROR_RECOVERY_PROTOCOL | |
| 58 | +); | |
| 59 | +``` | ... | ... |
docs/modbus_set_float.md
0 → 100644
| 1 | +# modbus_set_float | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_float - set a float value from 2 registers | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_float(float f, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +Warning, this function is *deprecated* since libmodbus v3.2.0 and has been | |
| 14 | +replaced by *modbus_set_float_dcba()*. | |
| 15 | + | |
| 16 | +## Description | |
| 17 | + | |
| 18 | +The *modbus_set_float()* function shall set a float to 4 bytes in Modbus format | |
| 19 | +(ABCD). The `dest` array must be pointer on two 16 bits values to be able to | |
| 20 | +store the full result of the conversion. | |
| 21 | + | |
| 22 | +## Return value | |
| 23 | + | |
| 24 | +There is no return values. | |
| 25 | + | |
| 26 | +## See also | |
| 27 | + | |
| 28 | +- [modbus_get_float](modbus_get_float) | |
| 29 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | ... | ... |
docs/modbus_set_float_abcd.md
0 → 100644
| 1 | +# modbus_set_float_abcd | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_float_abcd - set a float value in 2 registers using ABCD byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_float_abcd(float f, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_float_abcd()* function shall set a float to 4 bytes in usual | |
| 16 | +Modbus format. The `dest` array must be pointer on two 16 bits values to be able | |
| 17 | +to store the full result of the conversion. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +There is no return values. | |
| 22 | + | |
| 23 | +## See also | |
| 24 | + | |
| 25 | +- [modbus_get_float_abcd](modbus_get_float_abcd) | |
| 26 | +- [modbus_set_float_badc](modbus_set_float_badc) | |
| 27 | +- [modbus_set_float_cdab](modbus_set_float_cdab) | |
| 28 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | ... | ... |
docs/modbus_set_float_badc.md
0 → 100644
| 1 | +# modbus_set_float_badc | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_float_badc - set a float value in 2 registers using BADC byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_float_badc(float f, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_float_badc()* function shall set a float to 4 bytes in swapped | |
| 16 | +bytes Modbus format (BADC instead of ABCD). The `dest` array must be pointer on | |
| 17 | +two 16 bits values to be able to store the full result of the conversion. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +There is no return values. | |
| 22 | + | |
| 23 | +## See also | |
| 24 | + | |
| 25 | +- [modbus_get_float_badc](modbus_get_float_badc) | |
| 26 | +- [modbus_set_float_abcd](modbus_set_float_abcd) | |
| 27 | +- [modbus_set_float_cdab](modbus_set_float_cdab) | |
| 28 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | ... | ... |
docs/modbus_set_float_cdab.md
0 → 100644
| 1 | +# modbus_set_float_cdab | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_float_cdab - set a float value in 2 registers using CDAB byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_float_cdab(float f, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_float_cdab()* function shall set a float to 4 bytes in swapped | |
| 16 | +words Modbus format (CDAB order instead of ABCD). The `dest` array must be | |
| 17 | +pointer on two 16 bits values to be able to store the full result of the | |
| 18 | +conversion. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +There is no return values. | |
| 23 | + | |
| 24 | +## See also | |
| 25 | + | |
| 26 | +- [modbus_get_float_cdab](modbus_get_float_cdab) | |
| 27 | +- [modbus_set_float_abcd](modbus_set_float_abcd) | |
| 28 | +- [modbus_set_float_badc](modbus_set_float_badc) | |
| 29 | +- [modbus_set_float_dcba](modbus_set_float_dcba) | ... | ... |
docs/modbus_set_float_dcba.md
0 → 100644
| 1 | +# modbus_set_float_dcba | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_float_dcba - set a float value in 2 registers using DCBA byte order | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_float_dcba(float f, uint16_t *dest); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_float_dcba()* function shall set a float to 4 bytes in inverted | |
| 16 | +Modbus format (DCBA order). The `dest` array must be pointer on two 16 bits | |
| 17 | +values to be able to store the full result of the conversion. | |
| 18 | + | |
| 19 | +## Return value | |
| 20 | + | |
| 21 | +There is no return values. | |
| 22 | + | |
| 23 | +## See also | |
| 24 | + | |
| 25 | +- [modbus_get_float_dcba](modbus_get_float_dcba) | |
| 26 | +- [modbus_set_float](modbus_set_float) | |
| 27 | +- [modbus_get_float](modbus_get_float) | ... | ... |
docs/modbus_set_indication_timeout.md
0 → 100644
| 1 | +# modbus_set_indication_timeout | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_indication_timeout - set timeout between indications | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +void modbus_set_indication_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_indication_timeout()* function shall set the timeout interval used by | |
| 16 | +a server to wait for a request from a client. | |
| 17 | + | |
| 18 | +The value of `to_usec` argument must be in the range 0 to 999999. | |
| 19 | + | |
| 20 | +If both `to_sec` and `to_usec` are zero, this timeout will not be used at all. | |
| 21 | +In this case, the server will wait forever. | |
| 22 | + | |
| 23 | +## Return value | |
| 24 | + | |
| 25 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 26 | +errno. | |
| 27 | + | |
| 28 | +## Errors | |
| 29 | + | |
| 30 | +- *EINVAL*, the argument `ctx` is NULL or `to_usec` is larger than 1000000. | |
| 31 | + | |
| 32 | +## See also | |
| 33 | + | |
| 34 | +- [modbus_get_indication_timeout](modbus_get_indication_timeout) | |
| 35 | +- [modbus_get_response_timeout](modbus_get_response_timeout) | |
| 36 | +- [modbus_set_response_timeout](modbus_set_response_timeout) | ... | ... |
docs/modbus_set_response_timeout.md
0 → 100644
| 1 | +# modbus_set_response_timeout | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_set_response_timeout - set timeout for response | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_set_response_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_set_response_timeout()* function shall set the timeout interval used | |
| 16 | +to wait for a response. When a byte timeout is set, if elapsed time for the | |
| 17 | +first byte of response is longer than the given timeout, an `ETIMEDOUT` error | |
| 18 | +will be raised by the function waiting for a response. When byte timeout is | |
| 19 | +disabled, the full confirmation response must be received before expiration of | |
| 20 | +the response timeout. | |
| 21 | + | |
| 22 | +The value of `to_usec` argument must be in the range 0 to 999999. | |
| 23 | + | |
| 24 | +## Return value | |
| 25 | + | |
| 26 | +The function shall return 0 if successful. Otherwise it shall return -1 and set | |
| 27 | +errno. | |
| 28 | + | |
| 29 | +## Errors | |
| 30 | + | |
| 31 | +- *EINVAL*, the argument `ctx` is NULL, or both `to_sec` and `to_usec` are zero, | |
| 32 | + or `to_usec` is larger than 999999. | |
| 33 | + | |
| 34 | +## Example | |
| 35 | + | |
| 36 | +```c | |
| 37 | +uint32_t old_response_to_sec; | |
| 38 | +uint32_t old_response_to_usec; | |
| 39 | + | |
| 40 | +/* Save original timeout */ | |
| 41 | +modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec); | |
| 42 | + | |
| 43 | +/* Define a new timeout of 200ms */ | |
| 44 | +modbus_set_response_timeout(ctx, 0, 200000); | |
| 45 | +``` | |
| 46 | + | |
| 47 | +## See also | |
| 48 | + | |
| 49 | +- [modbus_get_response_timeout](modbus_get_response_timeout) | |
| 50 | +- [modbus_get_byte_timeout](modbus_get_byte_timeout) | |
| 51 | +- [modbus_set_byte_timeout](modbus_set_byte_timeout) | ... | ... |
doc/modbus_set_slave.txt renamed to docs/modbus_set_slave.md
| 1 | -modbus_set_slave(3) | |
| 2 | -=================== | |
| 1 | +# modbus_set_slave | |
| 3 | 2 | |
| 3 | +## Name | |
| 4 | 4 | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | 5 | modbus_set_slave - set slave number in the context |
| 8 | 6 | |
| 7 | +## Synopsis | |
| 9 | 8 | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_set_slave(modbus_t *'ctx', int 'slave');* | |
| 9 | +```c | |
| 10 | +int modbus_set_slave(modbus_t *ctx, int slave); | |
| 11 | +``` | |
| 13 | 12 | |
| 13 | +## Description | |
| 14 | 14 | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | 15 | The *modbus_set_slave()* function shall set the slave number in the libmodbus |
| 18 | 16 | context. |
| 19 | 17 | |
| ... | ... | @@ -35,23 +33,18 @@ remote device or software drops the requests! The special value |
| 35 | 33 | The broadcast address is `MODBUS_BROADCAST_ADDRESS`. This special value must be |
| 36 | 34 | use when you want all Modbus devices of the network receive the request. |
| 37 | 35 | |
| 36 | +## Return value | |
| 38 | 37 | |
| 39 | -RETURN VALUE | |
| 40 | ------------- | |
| 41 | 38 | The function shall return 0 if successful. Otherwise it shall return -1 and set |
| 42 | 39 | errno to one of the values defined below. |
| 43 | 40 | |
| 41 | +## Errors | |
| 44 | 42 | |
| 45 | -ERRORS | |
| 46 | ------- | |
| 47 | -*EINVAL*:: | |
| 48 | -The slave number is invalid. | |
| 43 | +- *EINVAL*, the slave number is invalid. | |
| 49 | 44 | |
| 45 | +## Example | |
| 50 | 46 | |
| 51 | -EXAMPLE | |
| 52 | -------- | |
| 53 | -[source,c] | |
| 54 | -------------------- | |
| 47 | +```c | |
| 55 | 48 | modbus_t *ctx; |
| 56 | 49 | |
| 57 | 50 | ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1); |
| ... | ... | @@ -72,13 +65,8 @@ if (modbus_connect(ctx) == -1) { |
| 72 | 65 | modbus_free(ctx); |
| 73 | 66 | return -1; |
| 74 | 67 | } |
| 75 | -------------------- | |
| 68 | +``` | |
| 76 | 69 | |
| 77 | -SEE ALSO | |
| 78 | --------- | |
| 79 | -linkmb:modbus_get_slave[3] | |
| 70 | +## See also | |
| 80 | 71 | |
| 81 | -AUTHORS | |
| 82 | -------- | |
| 83 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 84 | -<stephane.raimbault@gmail.com> | |
| 72 | +- [modbus_get_slave](modbus_get_slave) | ... | ... |
doc/modbus_set_socket.txt renamed to docs/modbus_set_socket.md
| 1 | -modbus_set_socket(3) | |
| 2 | -==================== | |
| 1 | +# modbus_set_socket | |
| 3 | 2 | |
| 3 | +## Name | |
| 4 | 4 | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | 5 | modbus_set_socket - set socket of the context |
| 8 | 6 | |
| 7 | +## Synopsis | |
| 9 | 8 | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_set_socket(modbus_t *'ctx', int 's');* | |
| 9 | +```c | |
| 10 | +int modbus_set_socket(modbus_t *ctx, int s); | |
| 11 | +``` | |
| 13 | 12 | |
| 13 | +## Description | |
| 14 | 14 | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | 15 | The *modbus_set_socket()* function shall set the socket or file descriptor in |
| 18 | 16 | the libmodbus context. This function is useful for managing multiple client |
| 19 | 17 | connections to the same server. |
| 20 | 18 | |
| 19 | +## Return value | |
| 21 | 20 | |
| 22 | -RETURN VALUE | |
| 23 | ------------- | |
| 24 | 21 | The function shall return 0 if successful. Otherwise it shall return -1 and set errno. |
| 25 | 22 | |
| 23 | +## Example | |
| 26 | 24 | |
| 27 | -EXAMPLE | |
| 28 | -------- | |
| 29 | -[source,c] | |
| 30 | -------------------- | |
| 25 | +```c | |
| 31 | 26 | ctx = modbus_new_tcp("127.0.0.1", 1502); |
| 32 | 27 | server_socket = modbus_tcp_listen(ctx, NB_CONNECTION); |
| 33 | 28 | |
| ... | ... | @@ -43,14 +38,8 @@ if (FD_ISSET(master_socket, &rdset)) { |
| 43 | 38 | modbus_reply(ctx, query, rc, mb_mapping); |
| 44 | 39 | } |
| 45 | 40 | } |
| 46 | -------------------- | |
| 41 | +``` | |
| 47 | 42 | |
| 48 | -SEE ALSO | |
| 49 | --------- | |
| 50 | -linkmb:modbus_get_socket[3] | |
| 43 | +## See also | |
| 51 | 44 | |
| 52 | - | |
| 53 | -AUTHORS | |
| 54 | -------- | |
| 55 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 56 | -<stephane.raimbault@gmail.com> | |
| 45 | +- [modbus_get_socket](modbus_get_socket) | ... | ... |
docs/modbus_strerror.md
0 → 100644
| 1 | +# modbus_strerror | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_strerror - return the error message | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +const char *modbus_strerror(int errnum); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_strerror()* function shall return a pointer to an error message | |
| 16 | +string corresponding to the error number specified by the `errnum` argument. As | |
| 17 | +libmodbus defines additional error numbers over and above those defined by the | |
| 18 | +operating system, applications should use *modbus_strerror()* in preference to | |
| 19 | +the standard *strerror()* function. | |
| 20 | + | |
| 21 | +## Return value | |
| 22 | + | |
| 23 | +The *modbus_strerror()* function shall return a pointer to an error message | |
| 24 | +string. | |
| 25 | + | |
| 26 | +## Errors | |
| 27 | + | |
| 28 | +No errors are defined. | |
| 29 | + | |
| 30 | +## Example | |
| 31 | + | |
| 32 | +Display an error message when a Modbus connection cannot be established | |
| 33 | + | |
| 34 | +```c | |
| 35 | +if (modbus_connect(ctx) == -1) { | |
| 36 | + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); | |
| 37 | + abort(); | |
| 38 | +} | |
| 39 | +``` | ... | ... |
docs/modbus_tcp_accept.md
0 → 100644
| 1 | +# modbus_tcp_accept | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_tcp_accept - accept a new connection on a TCP Modbus socket (IPv4) | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_tcp_accept(modbus_t *ctx, int *s); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_tcp_accept()* function shall extract the first connection on the | |
| 16 | +queue of pending connections, create a new socket and store it in libmodbus | |
| 17 | +context given in argument. If available, `accept4()` with `SOCK_CLOEXEC` will be | |
| 18 | +called instead of `accept()`. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return a new socket if successful. | |
| 23 | +Otherwise it shall return -1 and set errno. | |
| 24 | + | |
| 25 | +## Example | |
| 26 | + | |
| 27 | +For detailed example, see unit-test-server.c source file in tests directory. | |
| 28 | + | |
| 29 | +```c | |
| 30 | +... | |
| 31 | + | |
| 32 | +ctx = modbus_new_tcp("127.0.0.1", 502); | |
| 33 | +s = modbus_tcp_listen(ctx, 1); | |
| 34 | +modbus_tcp_accept(ctx, &s); | |
| 35 | + | |
| 36 | +... | |
| 37 | + | |
| 38 | +close(s) | |
| 39 | +modbus_free(ctx); | |
| 40 | +``` | |
| 41 | + | |
| 42 | +## See also | |
| 43 | + | |
| 44 | +- [modbus_tcp_pi_accept](modbus_tcp_pi_accept) | |
| 45 | +- [modbus_tcp_listen](modbus_tcp_listen) | |
| 46 | +- [modbus_tcp_pi_listen](modbus_tcp_pi_listen) | ... | ... |
doc/modbus_tcp_listen.txt renamed to docs/modbus_tcp_listen.md
| 1 | -modbus_tcp_listen(3) | |
| 2 | -==================== | |
| 1 | +# modbus_tcp_listen | |
| 3 | 2 | |
| 3 | +## Name | |
| 4 | 4 | |
| 5 | -NAME | |
| 6 | ----- | |
| 7 | 5 | modbus_tcp_listen - create and listen a TCP Modbus socket (IPv4) |
| 8 | 6 | |
| 9 | 7 | |
| 10 | -SYNOPSIS | |
| 11 | --------- | |
| 12 | -*int modbus_tcp_listen(modbus_t *'ctx', int 'nb_connection');* | |
| 8 | +## Synopsis | |
| 13 | 9 | |
| 10 | +```c | |
| 11 | +int modbus_tcp_listen(modbus_t *ctx, int nb_connection); | |
| 12 | +``` | |
| 13 | + | |
| 14 | +## Description | |
| 14 | 15 | |
| 15 | -DESCRIPTION | |
| 16 | ------------ | |
| 17 | 16 | The *modbus_tcp_listen()* function shall create a socket and listen to maximum |
| 18 | -_nb_connection_ incoming connections on the specified IP address. The context | |
| 19 | -_ctx _must be allocated and initialized with linkmb:modbus_new_tcp[3] before to | |
| 17 | +`nb_connection` incoming connections on the specified IP address. The context | |
| 18 | +`ctx` must be allocated and initialized with [modbus_new_tcp](modbus_new_tcp) before to | |
| 20 | 19 | set the IP address to listen, if IP address is set to NULL or '0.0.0.0', any addresses will be |
| 21 | 20 | listen. |
| 22 | 21 | |
| 22 | +## Return value | |
| 23 | 23 | |
| 24 | -RETURN VALUE | |
| 25 | ------------- | |
| 26 | 24 | The function shall return a new socket if successful. Otherwise it shall return |
| 27 | 25 | -1 and set errno. |
| 28 | 26 | |
| 27 | +## Example | |
| 29 | 28 | |
| 30 | -EXAMPLE | |
| 31 | -------- | |
| 32 | 29 | For detailed examples, see source files in tests directory: |
| 33 | 30 | |
| 34 | 31 | - unit-test-server.c, simple but handle only one connection |
| 35 | 32 | - bandwidth-server-many-up.c, handles several connections at once |
| 36 | 33 | |
| 37 | - | |
| 38 | -[source,c] | |
| 39 | -------------------- | |
| 34 | +```c | |
| 40 | 35 | ... |
| 41 | 36 | |
| 42 | 37 | /* To listen any addresses on port 502 */ |
| ... | ... | @@ -58,15 +53,10 @@ if (select(server_socket + 1, &refset, NULL, NULL, NULL) == -1) { |
| 58 | 53 | |
| 59 | 54 | close(server_socket); |
| 60 | 55 | modbus_free(ctx); |
| 61 | -------------------- | |
| 62 | - | |
| 63 | -SEE ALSO | |
| 64 | --------- | |
| 65 | -linkmb:modbus_new_tcp[3] | |
| 66 | -linkmb:modbus_tcp_accept[3] | |
| 67 | -linkmb:modbus_tcp_pi_listen[3] | |
| 68 | - | |
| 69 | -AUTHORS | |
| 70 | -------- | |
| 71 | -The libmodbus documentation was written by Stéphane Raimbault | |
| 72 | -<stephane.raimbault@gmail.com> | |
| 56 | +``` | |
| 57 | + | |
| 58 | +## See also | |
| 59 | + | |
| 60 | +- [modbus_new_tcp](modbus_new_tcp) | |
| 61 | +- [modbus_tcp_accept](modbus_tcp_accept) | |
| 62 | +- [modbus_tcp_pi_listen](modbus_tcp_pi_listen) | ... | ... |
docs/modbus_tcp_pi_accept.md
0 → 100644
| 1 | +# modbus_tcp_pi_accept | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_tcp_pi_accept - accept a new connection on a TCP PI Modbus socket (IPv6) | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_tcp_pi_accept(modbus_t *ctx, int *s); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_tcp_pi_accept()* function shall extract the first connection on the | |
| 16 | +queue of pending connections, create a new socket and store it in libmodbus | |
| 17 | +context given in argument. If available, `accept4()` with `SOCK_CLOEXEC` will be | |
| 18 | +called instead of `accept()`. | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return a new socket if successful. | |
| 23 | +Otherwise it shall return -1 and set errno. | |
| 24 | + | |
| 25 | +## Example | |
| 26 | + | |
| 27 | +For detailed example, see unit-test-server.c source file in tests directory. | |
| 28 | + | |
| 29 | +```c | |
| 30 | +... | |
| 31 | + | |
| 32 | +ctx = modbus_new_tcp_pi("::0", 502); | |
| 33 | +s = modbus_tcp_pi_listen(ctx, 1); | |
| 34 | +modbus_tcp_pi_accept(ctx, &s); | |
| 35 | + | |
| 36 | +... | |
| 37 | + | |
| 38 | +close(s) | |
| 39 | +modbus_free(ctx); | |
| 40 | +``` | |
| 41 | + | |
| 42 | +## See also | |
| 43 | + | |
| 44 | +- [modbus_tcp_pi_accept](modbus_tcp_pi_accept) | |
| 45 | +- [modbus_tcp_listen](modbus_tcp_listen) | |
| 46 | +- [modbus_tcp_pi_listen](modbus_tcp_pi_listen) | ... | ... |
docs/modbus_tcp_pi_listen.md
0 → 100644
| 1 | +# modbus_tcp_pi_listen | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_tcp_pi_listen - create and listen a TCP PI Modbus socket (IPv6) | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_tcp_pi_listen(modbus_t *ctx, int nb_connection); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_tcp_pi_listen()* function shall create a socket and listen to | |
| 16 | +maximum `nb_connection` incoming connections on the specified nodes. The | |
| 17 | +context *ctx* must be allocated and initialized with [modbus_new_tcp_pi](modbus_new_tcp_pi) | |
| 18 | +before to set the node to listen, if node is set to NULL or '0.0.0.0', any addresses will be | |
| 19 | +listen. | |
| 20 | + | |
| 21 | +## Return value | |
| 22 | + | |
| 23 | +The function shall return a new socket if successful. Otherwise it shall return | |
| 24 | +-1 and set errno. | |
| 25 | + | |
| 26 | +## Example | |
| 27 | + | |
| 28 | +For detailed examples, see source files in tests directory: | |
| 29 | + | |
| 30 | +- unit-test-server.c, simple but handle only one connection | |
| 31 | + | |
| 32 | +```c | |
| 33 | +... | |
| 34 | + | |
| 35 | +ctx = modbus_new_tcp_pi("::0", "502"); | |
| 36 | +s = modbus_tcp_pi_listen(ctx, 1); | |
| 37 | +modbus_tcp_pi_accept(ctx, &s); | |
| 38 | + | |
| 39 | +for (;;) { | |
| 40 | + rc = modbus_receive(ctx, query); | |
| 41 | + modbus_replay(ctx, query, rc, mb_mapping); | |
| 42 | +} | |
| 43 | +... | |
| 44 | + | |
| 45 | +modbus_close(s); | |
| 46 | +modbus_free(ctx); | |
| 47 | +``` | |
| 48 | + | |
| 49 | +- bandwidth-server-many-up.c, handles several connections at once | |
| 50 | + | |
| 51 | +## See also | |
| 52 | + | |
| 53 | +- [modbus_new_tcp_pi](modbus_new_tcp_pi) | |
| 54 | +- [modbus_tcp_pi_accept](modbus_tcp_pi_accept) | |
| 55 | +- [modbus_tcp_listen](modbus_tcp_listen) | ... | ... |
docs/modbus_write_and_read_registers.md
0 → 100644
| 1 | +# modbus_write_and_read_registers | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_write_and_read_registers - write and read many registers in a single transaction | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_write_and_read_registers( | |
| 11 | + modbus_t *ctx, | |
| 12 | + int write_addr, int write_nb, const uint16_t *src, | |
| 13 | + int read_addr, int read_nb, const uint16_t *dest | |
| 14 | +); | |
| 15 | +``` | |
| 16 | + | |
| 17 | +## Description | |
| 18 | + | |
| 19 | +The *modbus_write_and_read_registers()* function shall write the content of the | |
| 20 | +`write_nb` holding registers from the array 'src' to the address `write_addr` of | |
| 21 | +the remote device then shall read the content of the `read_nb` holding registers | |
| 22 | +to the address `read_addr` of the remote device. The result of reading is stored | |
| 23 | +in `dest` array as word values (16 bits). | |
| 24 | + | |
| 25 | +You must take care to allocate enough memory to store the results in `dest` | |
| 26 | +(at least `nb` * sizeof(uint16_t)). | |
| 27 | + | |
| 28 | +The function uses the Modbus function code 0x17 (write/read registers). | |
| 29 | + | |
| 30 | +## Return value | |
| 31 | + | |
| 32 | +The function shall return the number of read registers if successful. Otherwise | |
| 33 | +it shall return -1 and set errno. | |
| 34 | + | |
| 35 | +## Errors | |
| 36 | + | |
| 37 | +- *EMBMDATA*, too many registers requested, Too many registers to write | |
| 38 | + | |
| 39 | +## See also | |
| 40 | + | |
| 41 | +- [modbus_read_registers](modbus_read_registers) | |
| 42 | +- [modbus_write_register](modbus_write_register) | |
| 43 | +- [modbus_write_registers](modbus_write_registers) | ... | ... |
docs/modbus_write_bit.md
0 → 100644
| 1 | +# modbus_write_bit | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_write_bit - write a single bit | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_write_bit(modbus_t *ctx, int addr, int status); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_write_bit()* function shall write the status of `status` at the | |
| 16 | +address `addr` of the remote device. The value must be set to `TRUE` or `FALSE`. | |
| 17 | + | |
| 18 | +The function uses the Modbus function code 0x05 (force single coil). | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return 1 if successful. Otherwise it shall return -1 and set | |
| 23 | +errno. | |
| 24 | + | |
| 25 | +## See also | |
| 26 | + | |
| 27 | +- [modbus_read_bits](modbus_read_bits) | |
| 28 | +- [modbus_write_bits](modbus_write_bits) | ... | ... |
docs/modbus_write_bits.md
0 → 100644
| 1 | +# modbus_write_bits | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_write_bits - write many bits | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_write_bits()* function shall write the status of the `nb` bits | |
| 16 | +(coils) from `src` at the address `addr` of the remote device. The | |
| 17 | +`src` array must contains bytes set to `TRUE` or `FALSE`. | |
| 18 | + | |
| 19 | +The function uses the Modbus function code 0x0F (force multiple coils). | |
| 20 | + | |
| 21 | +## Return value | |
| 22 | + | |
| 23 | +The function shall return the number of written bits if successful. Otherwise it | |
| 24 | +shall return -1 and set errno. | |
| 25 | + | |
| 26 | +## Errors | |
| 27 | + | |
| 28 | +- *EMBMDATA*, writing too many bits. | |
| 29 | + | |
| 30 | +## See also | |
| 31 | + | |
| 32 | +- [modbus_read_bits](modbus_read_bits) | |
| 33 | +- [modbus_write_bit](modbus_write_bit) | ... | ... |
docs/modbus_write_register.md
0 → 100644
| 1 | +# modbus_write_register | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_write_register - write a single register | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_write_register(modbus_t *ctx, int addr, const uint16_t value); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_write_register()* function shall write the value of `value` | |
| 16 | +holding registers at the address `addr` of the remote device. | |
| 17 | + | |
| 18 | +The function uses the Modbus function code 0x06 (preset single register). | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return 1 if successful. Otherwise it shall return -1 and set | |
| 23 | +errno. | |
| 24 | + | |
| 25 | +## See also | |
| 26 | + | |
| 27 | +- [modbus_read_registers](modbus_read_registers) | |
| 28 | +- [modbus_write_registers](modbus_write_registers) | ... | ... |
docs/modbus_write_registers.md
0 → 100644
| 1 | +# modbus_write_registers | |
| 2 | + | |
| 3 | +## Name | |
| 4 | + | |
| 5 | +modbus_write_registers - write many registers | |
| 6 | + | |
| 7 | +## Synopsis | |
| 8 | + | |
| 9 | +```c | |
| 10 | +int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src); | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Description | |
| 14 | + | |
| 15 | +The *modbus_write_registers()* function shall write the content of the `nb` | |
| 16 | +holding registers from the array `src` at address `addr` of the remote device. | |
| 17 | + | |
| 18 | +The function uses the Modbus function code 0x10 (preset multiple registers). | |
| 19 | + | |
| 20 | +## Return value | |
| 21 | + | |
| 22 | +The function shall return the number of written registers if | |
| 23 | +successful. Otherwise it shall return -1 and set errno. | |
| 24 | + | |
| 25 | +## See also | |
| 26 | + | |
| 27 | +- [modbus_write_register](modbus_write_register) | |
| 28 | +- [modbus_read_registers](modbus_read_registers) | ... | ... |
mkdocs.yml
0 → 100644
| 1 | +site_name: libmodbus | |
| 2 | + | |
| 3 | +theme: | |
| 4 | + name: material | |
| 5 | + font: false | |
| 6 | + | |
| 7 | +markdown_extensions: | |
| 8 | + - md_in_html | |
| 9 | + - attr_list | |
| 10 | + - pymdownx.highlight: | |
| 11 | + anchor_linenums: true | |
| 12 | + - pymdownx.inlinehilite | |
| 13 | + - pymdownx.snippets | |
| 14 | + - pymdownx.superfences | |
| 15 | + - pymdownx.emoji: | |
| 16 | + emoji_index: !!python/name:materialx.emoji.twemoji | |
| 17 | + emoji_generator: !!python/name:materialx.emoji.to_svg | ... | ... |