class ModbusTCPClient – Modbus TCP client

ModbusTCPClient implements the Modbus TCP client. ModbusTCPClient support function codes 1 (Read Coils), 2 (Read Discrete Inputs), 3 (Read Holding Registers), 4 (Read Input Registers), 5 (Write Single Coil), 6 (Write Single Holding Register), 15 (Write Multiple Coils), and 16 (Write Multiple Holding Registers).

Micropython Example:

  1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8import modbus
  9import time
 10
 11
 12label0 = None
 13label1 = None
 14label2 = None
 15label3 = None
 16label4 = None
 17label5 = None
 18label6 = None
 19label7 = None
 20label8 = None
 21label9 = None
 22label14 = None
 23label19 = None
 24label24 = None
 25label10 = None
 26label15 = None
 27label20 = None
 28label25 = None
 29label11 = None
 30label16 = None
 31label21 = None
 32label26 = None
 33label12 = None
 34label17 = None
 35label22 = None
 36label27 = None
 37label13 = None
 38label18 = None
 39label23 = None
 40label28 = None
 41modbustcpclient_0 = None
 42
 43
 44hr = None
 45coil = None
 46res = None
 47
 48
 49def setup():
 50    global \
 51        label0, \
 52        label1, \
 53        label2, \
 54        label3, \
 55        label4, \
 56        label5, \
 57        label6, \
 58        label7, \
 59        label8, \
 60        label9, \
 61        label14, \
 62        label19, \
 63        label24, \
 64        label10, \
 65        label15, \
 66        label20, \
 67        label25, \
 68        label11, \
 69        label16, \
 70        label21, \
 71        label26, \
 72        label12, \
 73        label17, \
 74        label22, \
 75        label27, \
 76        label13, \
 77        label18, \
 78        label23, \
 79        label28, \
 80        modbustcpclient_0, \
 81        hr, \
 82        coil, \
 83        res
 84
 85    M5.begin()
 86    Widgets.fillScreen(0x222222)
 87    label0 = Widgets.Label("co", 65, 8, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 88    label1 = Widgets.Label("di", 135, 8, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 89    label2 = Widgets.Label("hr", 205, 8, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 90    label3 = Widgets.Label("ir", 275, 8, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 91    label4 = Widgets.Label("1000", 4, 45, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 92    label5 = Widgets.Label("1001", 4, 85, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 93    label6 = Widgets.Label("1002", 4, 125, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 94    label7 = Widgets.Label("1003", 4, 165, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 95    label8 = Widgets.Label("1004", 4, 205, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 96    label9 = Widgets.Label("a00", 65, 45, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 97    label14 = Widgets.Label("a01", 135, 45, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 98    label19 = Widgets.Label("a02", 205, 45, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 99    label24 = Widgets.Label("a03", 275, 45, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
100    label10 = Widgets.Label("a10", 65, 85, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
101    label15 = Widgets.Label("a11", 135, 85, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
102    label20 = Widgets.Label("a12", 205, 85, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
103    label25 = Widgets.Label("a13", 275, 85, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
104    label11 = Widgets.Label("a20", 65, 125, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
105    label16 = Widgets.Label("a21", 135, 125, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
106    label21 = Widgets.Label("a22", 205, 125, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
107    label26 = Widgets.Label("a23", 275, 125, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
108    label12 = Widgets.Label("a30", 65, 165, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
109    label17 = Widgets.Label("a31", 135, 165, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
110    label22 = Widgets.Label("a32", 205, 165, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
111    label27 = Widgets.Label("a33", 275, 165, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
112    label13 = Widgets.Label("a40", 65, 205, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
113    label18 = Widgets.Label("a41", 135, 205, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
114    label23 = Widgets.Label("a42", 205, 205, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
115    label28 = Widgets.Label("a43", 275, 205, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
116
117    modbustcpclient_0 = modbus.ModbusTCPClient("192.168.8.48", 502, verbose=True)
118    modbustcpclient_0.connect()
119    hr = 0
120    res = modbustcpclient_0.read_coils(1, 1000, 5, timeout=2000)
121    label9.setText(str(res[0]))
122    label10.setText(str(res[1]))
123    label11.setText(str(res[2]))
124    label12.setText(str(res[3]))
125    label13.setText(str(res[4]))
126    res = modbustcpclient_0.read_discrete_inputs(1, 1000, 5, timeout=2000)
127    label14.setText(str(res[0]))
128    label15.setText(str(res[1]))
129    label16.setText(str(res[2]))
130    label17.setText(str(res[3]))
131    label18.setText(str(res[4]))
132    res = modbustcpclient_0.read_holding_registers(1, 1000, 5, timeout=2000)
133    label19.setText(str(res[0]))
134    label20.setText(str(res[1]))
135    label21.setText(str(res[2]))
136    label22.setText(str(res[3]))
137    label23.setText(str(res[4]))
138    res = modbustcpclient_0.read_input_registers(1, 1000, 5, timeout=2000)
139    label24.setText(str(res[0]))
140    label25.setText(str(res[1]))
141    label26.setText(str(res[2]))
142    label27.setText(str(res[3]))
143    label28.setText(str(res[4]))
144
145
146def loop():
147    global \
148        label0, \
149        label1, \
150        label2, \
151        label3, \
152        label4, \
153        label5, \
154        label6, \
155        label7, \
156        label8, \
157        label9, \
158        label14, \
159        label19, \
160        label24, \
161        label10, \
162        label15, \
163        label20, \
164        label25, \
165        label11, \
166        label16, \
167        label21, \
168        label26, \
169        label12, \
170        label17, \
171        label22, \
172        label27, \
173        label13, \
174        label18, \
175        label23, \
176        label28, \
177        modbustcpclient_0, \
178        hr, \
179        coil, \
180        res
181    M5.update()
182    hr = (hr + 1) % 65535
183    coil = not coil
184    modbustcpclient_0.write_single_coil(1, 1000, coil, timeout=2000)
185    modbustcpclient_0.write_single_register(1, 1000, hr, timeout=2000)
186    modbustcpclient_0.write_multiple_coils(1, 1000, [coil, coil, coil], timeout=2000)
187    label9.setText(str(coil))
188    label10.setText(str(coil))
189    label11.setText(str(coil))
190    modbustcpclient_0.write_multiple_registers(1, 1000, [hr, hr, hr], timeout=2000)
191    label19.setText(str(hr))
192    label20.setText(str(hr))
193    label21.setText(str(hr))
194    time.sleep(1)
195
196
197if __name__ == "__main__":
198    try:
199        setup()
200        while True:
201            loop()
202    except (Exception, KeyboardInterrupt) as e:
203        try:
204            from utility import print_error_msg
205
206            print_error_msg(e)
207        except ImportError:
208            print("please update to latest firmware")

UIFLOW2 Example:

example.png

cores3_tcp_client_example.m5f2

Constructors

class modbus.ModbusTCPClient(host: str, port: int = 502, verbose: bool = False)

Create a ModbusTCPClient object.

参数:
  • host (str) – Hostname or IP address.

  • port (int) – Port number.

  • verbose (bool) – Verbose mode.

UIFLOW2:

init.png

Methods

ModbusTCPClient.connect() None

Connect to the Modbus server.

UIFLOW2:

connect.png

ModbusTCPClient.disconnect() None

Disconnect from the Modbus server.

UIFLOW2:

disconnect.png

ModbusTCPClient.read_coils(address, register, quantity, timeout: int = 2000) list

Read coils.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the coils. The address is 0x0000 to 0xFFFF.

  • quantity (int) – Quantity of registers to read.

  • timeout (int) – Timeout in milliseconds.

返回:

A list of coils. The item of the list is True or False.

UIFLOW2:

read_coils.png

ModbusTCPClient.read_discrete_inputs(address, register, quantity, timeout: int = 2000) list

Read discrete inputs.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the discrete inputs. The address is 0x0000 to 0xFFFF.

  • quantity (int) – Quantity of registers to read.

  • timeout (int) – Timeout in milliseconds.

返回:

A list of discrete inputs. The item of the list is True or False.

UIFLOW2:

read_discrete_inputs.png

ModbusTCPClient.read_holding_registers(address, register, quantity, timeout: int = 2000) list

Read holding registers.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the holding registers. The address is 0x0000 to 0xFFFF.

  • quantity (int) – Quantity of registers to read.

  • timeout (int) – Timeout in milliseconds.

返回:

A list of holding registers. The item of the list is 0x0000 to 0xFFFF.

UIFLOW2:

read_holding_registers.png

ModbusTCPClient.read_input_registers(address, register, quantity, timeout: int = 2000) list

Read input registers.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the input registers. The address is 0x0000 to 0xFFFF.

  • quantity (int) – Quantity of registers to read.

  • timeout (int) – Timeout in milliseconds.

返回:

A list of input registers. The item of the list is 0x0000 to 0xFFFF.

UIFLOW2:

read_input_registers.png

ModbusTCPClient.write_single_coil(address, register, value, timeout: int = 2000) bool

Write a single coil.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the coils. The address is 0x0000 to 0xFFFF.

  • value (int) – Value to write. The value is True or False.

  • timeout (int) – Timeout in milliseconds.

返回:

The value of the coil.

UIFLOW2:

write_single_coil.png

ModbusTCPClient.write_single_register(address, register, value, timeout: int = 2000) int

Write a single register.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the holding registers. The address is 0x0000 to 0xFFFF.

  • value (int) – Value to write. The value is 0x0000 to 0xFFFF.

  • timeout (int) – Timeout in milliseconds.

返回:

the written value

UIFLOW2:

write_single_register.png

ModbusTCPClient.write_multiple_coils(address, register, values, timeout: int = 2000) int

Write multiple coils.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the coils. The address is 0x0000 to 0xFFFF.

  • values (list) – Values to write. The item of the list is True or False.

  • timeout (int) – Timeout in milliseconds.

返回:

the written count.

UIFLOW2:

write_multiple_coils.png

ModbusTCPClient.write_multiple_registers(address: int, register: int, values: list, timeout: int = 2000) int

Write multiple registers.

参数:
  • address (int) – Slave address. The address is 0 to 247.

  • register (int) – Start address of the holding registers. The address is 0x0000 to 0xFFFF.

  • values (list) – Values to write. The item of the list is 0x0000 to 0xFFFF.

  • timeout (int) – Timeout in milliseconds.

返回:

the written count.

UIFLOW2:

write_multiple_registers.png