Line 1: |
Line 1: |
| {{Template: Networking_rutxxx_manual_fw_disclosure | | {{Template: Networking_rutxxx_manual_fw_disclosure |
| | fw_version = {{#switch: {{{series}}} | | | fw_version = {{#switch: {{{series}}} |
− | | RUT2 = {{{series}}}_R_00.01.12 | + | | RUT2 = {{{series}}}_R_00.01.13 |
| | RUT9 = {{{series}}}_R_00.06.07}} | | | RUT9 = {{{series}}}_R_00.06.07}} |
| | series = {{{series}}} | | | series = {{{series}}} |
Line 51: |
Line 51: |
| ==Modbus TCP Master== | | ==Modbus TCP Master== |
| | | |
− | A Modbus <b>master</b> device can request data from Modbus slaves. The Modbus TCP Master section is used to configure Modbus TCP slaves. To add a new slave, enter a custom name, slave's ID, IP address and port and click the "Add" button: | + | A Modbus <b>master</b> device can request data from Modbus slaves. The Modbus TCP Master section is used to configure Modbus TCP slaves. |
− | [[File:{{{file_add_new_slave}}}]]
| |
− | | |
− | <table class="nd-othertables_2">
| |
− | <tr>
| |
− | <th width=250>Button</th>
| |
− | <th width=902>Description</th>
| |
− | </tr>
| |
− | <tr>
| |
− | <td><b>Edit</b></td>
| |
− | <td>Redirects you to the slave's configuration page (more information in [[{{{name}}} Modbus#Slave_device_configuration|section 3.1]])</td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td><b>Delete</b></td>
| |
− | <td>Deletes the slave configuration</td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td><b>Alarms</b></td>
| |
− | <td>Redirects you to the slave's alarm configuration page (more information in [[{{{name}}} Modbus#Alarm_configuration|section 3.3]])</td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td><b>Clone</b></td>
| |
− | <td>Creates an identical slave configuration</td>
| |
− | </tr>
| |
− | </table>
| |
− | | |
| You can create a maximum of 10 slave configurations. | | You can create a maximum of 10 slave configurations. |
| | | |
Line 171: |
Line 146: |
| <td>First Register</td> | | <td>First Register</td> |
| <td>integer [1..65536]; default: <b>1</b></td> | | <td>integer [1..65536]; default: <b>1</b></td> |
− | <td>First Modbus register number from which data will be read.<br>'''Note.:''' {{{series}}} Modbus Master uses register numbers, which value is +1 higher than address value.</br></td> | + | <td>First Modbus register number from which data will be read.<br>'''Note''' - {{{series}}} Modbus Master uses register numbers, which value is +1 higher than address value.</br></td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
Line 239: |
Line 214: |
| <tr> | | <tr> |
| <td>Action</td> | | <td>Action</td> |
− | <td>SMS | Trigger output | Modbus Request; default: <b>SMS</b></td> | + | <td><span style="color: #0054a6; font-weight:bold;">SMS</span> | <span style="color: red; font-weight:bold;">Trigger output</span> | <span style="color: purple; font-weight:bold;">Modbus Request</span>; default: <b>SMS</b></td> |
| <td>Action that will be taken if the condition is met. Possible actions: | | <td>Action that will be taken if the condition is met. Possible actions: |
| <ul> | | <ul> |
Line 249: |
Line 224: |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: #0054a6;">SMS: Message</span></td> | + | <td><span style="color: #0054a6;">SMS:</span> Message</td> |
| <td>string; default: <b>none</b></td> | | <td>string; default: <b>none</b></td> |
| <td>SMS message text.</td> | | <td>SMS message text.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: #0054a6;">SMS: Phone number</span></td> | + | <td><span style="color: #0054a6;">SMS:</span> Phone number</td> |
| <td>phone number; default: <b>none</b></td> | | <td>phone number; default: <b>none</b></td> |
| <td>Recipient's phone number.</td> | | <td>Recipient's phone number.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: red;">Trigger output: Output</span></td> | + | <td><span style="color: red;">Trigger output:</span> Output</td> |
| <td>Open collector output | Relay output | Both; default: <b>Open collector output</b></td> | | <td>Open collector output | Relay output | Both; default: <b>Open collector output</b></td> |
| <td>Which output(s) will be triggered.</td> | | <td>Which output(s) will be triggered.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: red;">Trigger output: I/O Action</span></td> | + | <td><span style="color: red;">Trigger output:</span> I/O Action</td> |
| <td>Turn On | Turn Off | Invert; default: <b>Turn On</b></td> | | <td>Turn On | Turn Off | Invert; default: <b>Turn On</b></td> |
| <td>Action that will taken on the specified output.</td> | | <td>Action that will taken on the specified output.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: IP address</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> IP address</td> |
| <td>ip | host; default: <b>none</b></td> | | <td>ip | host; default: <b>none</b></td> |
| <td>Modbus slave's IP address.</td> | | <td>Modbus slave's IP address.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: Port</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> Port</td> |
| <td>integer [0..65535]; default: <b>none</b></td> | | <td>integer [0..65535]; default: <b>none</b></td> |
| <td>Modbus slave's port.</td> | | <td>Modbus slave's port.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: Timeout</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> Timeout</td> |
| <td>integer [1..30]; default: <b>5</b></td> | | <td>integer [1..30]; default: <b>5</b></td> |
| <td>Maximum time to wait for a response.</td> | | <td>Maximum time to wait for a response.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: ID</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> ID</td> |
| <td>integer [1..255]; default: <b>none</b></td> | | <td>integer [1..255]; default: <b>none</b></td> |
| <td>Modbus slave ID.</td> | | <td>Modbus slave ID.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: Modbus function</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> Modbus function</td> |
| <td>Read Coil Status (1) | Read Input Status (2) | Read Holding Registers (3) | Read Input Registers (4) | Force Single Coil (5) | Preset Single Register (6) | Force Multiple Coils (15) | Force Multiple Registers (16); default: <b>Force Single Coil (5)</b></td> | | <td>Read Coil Status (1) | Read Input Status (2) | Read Holding Registers (3) | Read Input Registers (4) | Force Single Coil (5) | Preset Single Register (6) | Force Multiple Coils (15) | Force Multiple Registers (16); default: <b>Force Single Coil (5)</b></td> |
| <td>A function code specifies the type of register being addressed by a Modbus request.</td> | | <td>A function code specifies the type of register being addressed by a Modbus request.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: First register</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> First register</td> |
| <td>integer [0..65535]; default: <b>none</b></td> | | <td>integer [0..65535]; default: <b>none</b></td> |
| <td>Begins reading from the register specified in this field.</td> | | <td>Begins reading from the register specified in this field.</td> |
| </tr> | | </tr> |
| <tr> | | <tr> |
− | <td><span style="color: purple;">Modbus Request: Number of registers</span></td> | + | <td><span style="color: purple;">Modbus Request:</span> Number of registers</td> |
| <td>integer [0..65535]; default: <b>none</b></td> | | <td>integer [0..65535]; default: <b>none</b></td> |
| <td>The number of registers that will be read from the first register.</td> | | <td>The number of registers that will be read from the first register.</td> |
Line 346: |
Line 321: |
| <tr> | | <tr> |
| <td>Protocol</td> | | <td>Protocol</td> |
− | <td>HTTP(S) | MQTT; Default: <b>HTTP(S)</b></td> | + | <td><span style="color:tomato; font-weight:bold;">HTTP(S)</span> | <span style="color:darkcyan; font-weight:bold;">MQTT</span>; Default: <b>HTTP(S)</b></td> |
| <td>Data sending protocol</td> | | <td>Data sending protocol</td> |
| </tr> | | </tr> |
Line 413: |
Line 388: |
| </tr> | | </tr> |
| </table> | | </table> |
| + | |
| + | ==MQTT Gateway== |
| + | |
| + | The <b>MQTT Gateway</b> function is used to transfer Modbus data (send requests, receive responses) over MQTT. When it is enabled, the device (this {{{name}}}) subscribes to a REQUEST topic and publishes on a RESPONSE topic on a specified MQTT broker. It translates received MQTT message payload to a Modbus request and relays it to the specified Modbus TCP slave. |
| + | |
| + | When the MQTT Gateway receives a response from the slave, it translates it to an MQTT message and publishes it on the RESPONSE topic. |
| + | |
| + | [[File:Networking_rutos_manual_modbus_mqtt_gateway_scheme.png]] |
| + | |
| + | Below is an example of the MQTT Gateway page. Refer to the table for information on MQTT Gateway configuration fields. |
| + | |
| + | [[File:Networking_rut9_manual_modbus_mqtt_gateway_v1.png|border|class=tlt-border]] |
| + | |
| + | <table class="nd-mantable"> |
| + | <tr> |
| + | <th>Field</th> |
| + | <th>Value</th> |
| + | <th>Description</th> |
| + | </tr> |
| + | <tr> |
| + | <td>Enable</td> |
| + | <td>off <nowiki>|</nowiki> on; default: <b>off</b></td> |
| + | <td>Turns MQTT gateway on or off.</td> |
| + | </tr> |
| + | <tr> |
| + | <td>Host</td> |
| + | <td>ip <nowiki>|</nowiki> host; default: <b>127.0.0.1</b></td> |
| + | <td>IP address or hostname of an MQTT broker.</td> |
| + | </tr> |
| + | <tr> |
| + | <td>Port</td> |
| + | <td>integer [0..65535]; default: <b>1883</b></td> |
| + | <td>Port number of the MQTT broker.</td> |
| + | </tr> |
| + | <tr> |
| + | <td>Request topic</td> |
| + | <td>string; default: <b>request</b></td> |
| + | <td>MQTT topic for sending requests.</td> |
| + | </tr> |
| + | <tr> |
| + | <td>Response topic</td> |
| + | <td>string; default: <b>response</b></td> |
| + | <td>MQTT topic for subscribing to responses.</td> |
| + | </tr> |
| + | <tr> |
| + | <td>Username</td> |
| + | <td>string; default: <b>none</b></td> |
| + | <td>Username for authentication to the MQTT broker. Leave empty if you do not use client authentication.</td> |
| + | </tr> |
| + | <tr> |
| + | <td>Password</td> |
| + | <td>string; default: <b>none</b></td> |
| + | <td>Password for authentication to the MQTT broker. Leave empty if you do not use client authentication.</td> |
| + | </tr> |
| + | </table> |
| + | |
| + | ===Request messages=== |
| + | ---- |
| + | Modbus request data sent in the MQTT payload should be generated in accordance with the following format: |
| + | |
| + | <b>0 <COOKIE> <IP_TYPE> <IP> <PORT> <TIMEOUT> <SLAVE_ID> <MODBUS_FUNCTION> <REGISTER_NUMBER> <REGISTER_COUNT/VALUE></b> |
| + | |
| + | Explanation: |
| + | |
| + | <ul> |
| + | <li><b>0</b> - must be 0, which signifies a textual format (currently the only one implemented).</li> |
| + | <li><b>Cookie</b> - a 64-bit unsigned integer in range [0..2<sup>64</sup>]). A cookie is used in order to distinguish which response belongs to which request, each request and the corresponding response contain a matching cookie: a 64-bit unsigned integer.</li> |
| + | <li><b>IP type</b> - host IP address type. Possible values: |
| + | <ul> |
| + | <li><b>0</b> - IPv4 address;</li> |
| + | <li><b>1</b> - IPv6 address;</li> |
| + | <li><b>2</b> - hostname that will be resolved to an IP address.</li> |
| + | </ul></li> |
| + | <li><b>IP</b> - IP address of a Modbus TCP slave. IPv6 must be presented in full form (e.g., <i>2001:0db8:0000:0000:0000:8a2e:0370:7334</i>).</li> |
| + | <li><b>Port</b> - port number of the Modbus TCP slave.</li> |
| + | <li><b>Timeout</b> - timeoutfor Modbus TCP connection, in seconds. Range [1..999].</li> |
| + | <li><b>Slave ID</b> - Modbus TCP slave ID. Range [1..255].</li> |
| + | <li><b>Modbus function</b> - Only these are supported at the moment: |
| + | <ul> |
| + | <li><b>3</b> - read holding registers;</li> |
| + | <li><b>6</b> - write to a single holding register;</li> |
| + | <li><b>16</b> - write to multiple holding registers.</li> |
| + | </ul></li> |
| + | <li><b>Register number</b> - number of the first register (in range [1..65536]) from which the registers will be read/written to. |
| + | <li><b>Register count/value</b> - this value depends on the Modbus function: |
| + | <ul> |
| + | <li><b>3</b> - <u>register count</u> (in range [1..125]); must not exceed the boundary (first register number + register count <= 65537);</li> |
| + | <li><b>6</b> - <u>register value</u> (in range [0..65535]);</li> |
| + | <li><b>16</b> - <u>register count</u> (in range [1..123]); must not exceed the boundary (first register number + register count <= 65537); and <u>register values</u> separated with commas, without spaces (e.g., <i>1,2,3,654,21,789</i>); there must be exactly as many values as specified (with register count); each value must be in the range of [0..65535].</li> |
| + | </ul></li> |
| + | </ul> |
| + | |
| + | ===Response messages=== |
| + | ---- |
| + | A special response message can take one of the following forms: |
| + | |
| + | <COOKIE> OK - <i>for functions 6 and 16</i> |
| + | <COOKIE> OK <VALUE> <VALUE> <VALUE>... - <i>for function 3, where <VALUE> <VALUE> <VALUE>... are read register values</i> |
| + | <COOKIE> ERROR: ... - <i>for failures, where ... is the error description</i> |
| + | |
| + | ===Examples=== |
| + | ---- |
| + | Below are a few <b>examples</b> of controlling/monitoring the internal Modbus TCP Slave on {{{name}}}. |
| + | ---- |
| + | <b>Reboot the device</b> |
| + | |
| + | <ul> |
| + | <li>Request:<br><pre>0 65432 0 192.168.1.1 502 5 1 6 206 1</pre></li> |
| + | <li>Response:<br><pre>65432 OK</pre></li> |
| + | </ul> |
| + | ---- |
| + | <b>Retrieve uptime</b> |
| + | |
| + | <ul> |
| + | <li>Request:<br><pre>0 65432 0 192.168.1.1 502 5 1 3 2 2</pre></li> |
| + | <li>Response:<br><pre>65432 OK 0 5590</pre></li> |
| + | </ul> |
| + | ---- |
| + | If you're using Eclipse Mosquitto (MQTT implementation used on {{{name}}}), Publish/Subscribe commands may look something like this: |
| + | |
| + | <b>Retrieve uptime</b> |
| + | |
| + | <ul> |
| + | <li>Request:<br><pre>mosquitto_pub -h 192.168.1.1 -p 1883 -t request -m "0 65432 0 192.168.1.1 502 5 1 3 2 2"</pre></li> |
| + | <li>Response:<br><pre>mosquitto_sub -h 192.168.1.1 -p 1883 -t response |
| + | 65432 OK 0 5590</pre></li> |
| + | </ul> |
| + | |
| | | |
| ==See also== | | ==See also== |