118 lines
2.8 KiB
ReStructuredText
118 lines
2.8 KiB
ReStructuredText
.. zephyr:code-sample:: modbus-tcp-server
|
|
:name: Modbus TCP server
|
|
:relevant-api: modbus bsd_sockets
|
|
|
|
Implement a Modbus TCP server exposing Modbus commands to control LEDs.
|
|
|
|
Overview
|
|
********
|
|
|
|
This is a simple application demonstrating a Modbus TCP server implementation
|
|
in Zephyr RTOS.
|
|
|
|
Requirements
|
|
************
|
|
|
|
This sample has been tested with FRDM-K64F board,
|
|
but it should work with any board or shield that has a network interface.
|
|
Additionally the board should have three LEDs.
|
|
|
|
TCP server example is running on an evaluation board. Client is running
|
|
on a PC or laptop.
|
|
|
|
The description of this sample uses `PyModbus`_ (Pymodbus REPL).
|
|
The user can of course try out other client implementations with this sample.
|
|
|
|
Building and Running
|
|
********************
|
|
|
|
This sample can be found under
|
|
:zephyr_file:`samples/subsys/modbus/tcp_server` in the Zephyr tree.
|
|
|
|
The following commands build and flash TCP server sample.
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/subsys/modbus/tcp_server
|
|
:board: frdm_k64f
|
|
:goals: build flash
|
|
:compact:
|
|
|
|
On the client side, PC or laptop, the following command connects PyModbus
|
|
to the TCP server.
|
|
|
|
.. code-block:: console
|
|
|
|
# pymodbus.console tcp --host 192.0.2.1 --port 502
|
|
|
|
The LEDs on the board are controlled by Modbus commands FC01, FC05, FC15.
|
|
For example, to set LED0 on use FC01 command (write_coil).
|
|
|
|
.. code-block:: console
|
|
|
|
> client.connect
|
|
> client.write_coil address=0 value=1 slave=1
|
|
|
|
Client should confirm successful communication and LED0 should light.
|
|
|
|
.. code-block:: console
|
|
|
|
{
|
|
"address": 0,
|
|
"value": true
|
|
}
|
|
|
|
To set LED0 off but LED1 and LED2 on use FC15 command (write_coils).
|
|
|
|
.. code-block:: console
|
|
|
|
> client.write_coils address=0 values=0,1,1 slave=1
|
|
|
|
To read LED0, LED1, LED2 state FC05 command (read_coils) can be used.
|
|
|
|
.. code-block:: console
|
|
|
|
> client.read_coils address=0 count=3 slave=1
|
|
{
|
|
"bits": [
|
|
false,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false
|
|
]
|
|
}
|
|
|
|
It is also possible to write and read the holding registers.
|
|
This however does not involve any special interaction
|
|
with the peripherals on the board yet.
|
|
|
|
To write single holding registers use FC06 command (write_register),
|
|
|
|
.. code-block:: console
|
|
|
|
> client.write_register address=0 value=42 slave=1
|
|
|
|
or FC16 command (write_registers).
|
|
|
|
.. code-block:: console
|
|
|
|
> client.write_registers address=0 values=42,42,42 slave=1
|
|
|
|
To read holding registers use FC03 command (read_holding_registers).
|
|
|
|
.. code-block:: console
|
|
|
|
> client.read_holding_registers address=0 count=3 slave=1
|
|
{
|
|
"registers": [
|
|
42,
|
|
42,
|
|
42
|
|
]
|
|
}
|
|
|
|
.. _`PyModbus`: https://github.com/pymodbus-dev/pymodbus
|