Skip to content

grid-x/modbus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0b5f88d · Apr 3, 2025
Mar 23, 2018
Feb 19, 2025
May 3, 2024
Jan 21, 2024
May 4, 2023
May 4, 2023
Apr 22, 2015
Oct 12, 2014
Feb 2, 2024
Feb 18, 2024
Mar 23, 2018
Apr 2, 2025
May 3, 2024
Nov 6, 2022
May 3, 2024
Oct 9, 2016
Nov 6, 2022
Jan 21, 2024
Jan 21, 2024
Feb 3, 2015
Nov 6, 2022
Jan 10, 2022
Apr 2, 2025
Aug 10, 2024
Sep 27, 2024
Jan 21, 2024
Nov 6, 2022
May 3, 2024
Feb 12, 2024
Apr 3, 2025
Jan 21, 2024
Apr 3, 2025

Repository files navigation

go modbus

Fault-tolerant, fail-fast implementation of Modbus protocol in Go.

Supported functions

Bit access:

  • Read Discrete Inputs
  • Read Coils
  • Write Single Coil
  • Write Multiple Coils

16-bit access:

  • Read Input Registers
  • Read Holding Registers
  • Write Single Register
  • Write Multiple Registers
  • Read/Write Multiple Registers
  • Mask Write Register
  • Read FIFO Queue

Supported formats

  • TCP
  • Serial (RTU, ASCII)
  • UDP

Usage

Basic usage:

// Modbus TCP
client := modbus.TCPClient("localhost:502")
// Read input register 9
results, err := client.ReadInputRegisters(8, 1)

// Modbus RTU/ASCII
// Default configuration is 19200, 8, 1, even
client = modbus.RTUClient("/dev/ttyS0")
results, err = client.ReadCoils(2, 1)

Advanced usage:

// Modbus TCP
handler := modbus.NewTCPClientHandler("localhost:502")
handler.Timeout = 10 * time.Second
handler.SlaveID = 0xFF
handler.Logger = log.New(os.Stdout, "test: ", log.LstdFlags)
// Connect manually so that multiple requests are handled in one connection session
err := handler.Connect()
defer handler.Close()

client := modbus.NewClient(handler)
results, err := client.ReadDiscreteInputs(15, 2)
results, err = client.WriteMultipleRegisters(1, 2, []byte{0, 3, 0, 4})
results, err = client.WriteMultipleCoils(5, 10, []byte{4, 3})
// Modbus RTU/ASCII
handler := modbus.NewRTUClientHandler("/dev/ttyUSB0")
handler.BaudRate = 115200
handler.DataBits = 8
handler.Parity = "N"
handler.StopBits = 1
handler.SlaveID = 1
handler.Timeout = 5 * time.Second

err := handler.Connect()
defer handler.Close()

client := modbus.NewClient(handler)
results, err := client.ReadDiscreteInputs(15, 2)

Modbus-CLI

We offer a CLI tool to read/write registers.

Usage

For simplicity, the following examples are all using Modbus TCP. For Modbus RTU, replace the address field and use the rtu- arguments in order to use different baudrates, databits, etc.

./modbus-cli -address=rtu:///dev/ttyUSB0 -rtu-baudrate=57600 -rtu-stopbits=2 -rtu-parity=N -rtu-databits=8 ...

For Modbus UDP, replace the address field with a UDP address.

./modbus-cli --address=udp://127.0.0.1:502 ...

Reading Registers

Read 1 register and get raw result

./modbus-cli -address=tcp://127.0.0.1:502 -quantity=1 -type-parse=raw -register=42

Read 1 register and decode result as uint16

./modbus-cli -address=tcp://127.0.0.1:502 -quantity=1 -type-parse=uint16 -register=42

Read 1 register and get all possible decoded results

./modbus-cli -address=tcp://127.0.0.1:502 -quantity=1 -type-parse=all -register=42

Read 2 registers and decode result as uint32

./modbus-cli -address=tcp://127.0.0.1:502 -quantity=2 -type-parse=uint32 -register=42

Read 2 registers and get all possible decoded results

./modbus-cli -address=tcp://127.0.0.1:502 -quantity=2 -type-parse=all -register=42

Reading multiple registers is only possible in the raw format

./modbus-cli -address=tcp://127.0.0.1:502 -quantity=16 -type-parse=raw -register=42

Writing Registers

Write 1 register

./modbus-cli -address=tcp://127.0.0.1:502 -fn-code=0x06 -type-exec=uint16 -register=42 -write-value=7

Write 2 registers

./modbus-cli -address=tcp://127.0.0.1:502 -fn-code=0x10 -type-exec=uint32 -register=42 -write-value=7

Release

To release the Modbus-CLI tool, run either make release if you have installed goreleaser or make ci_release. The generated files can be found in the directory in the dist directory.

Take the .tar.gz and .zip files and create a new GitHub release.

References