NOTE: mb package move to mb
- modbus Serial(RTU,ASCII) Client
- modbus TCP Client
- modbus TCP Server
- object pool design,reduce memory allocation
- fast encode and decode
- interface design
- simple API and support raw data api
Use go get.
go get github.com/thinkgos/gomodbus/v2
Then import the modbus package into your own code.
import modbus "github.com/thinkgos/gomodbus/v2"
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
p := modbus.NewTCPClientProvider("192.168.199.188:502",
modbus.WithEnableLogger())
client := modbus.NewClient(p)
err := client.Connect()
if err != nil {
fmt.Println("connect failed, ", err)
return
}
defer client.Close()
fmt.Println("starting")
for {
results, err := client.ReadCoils(1, 0, 10)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Printf("ReadCoils % x", results)
}
time.Sleep(time.Second * 5)
}
// modbus RTU/ASCII Client
p := modbus.NewRTUClientProvider(modbus.WithEnableLogger(),
modbus.WithSerialConfig(serial.Config{
Address: "COM5",
BaudRate: 115200,
DataBits: 8,
StopBits: 1,
Parity: "N",
Timeout: modbus.SerialDefaultTimeout,
}))
client := modbus.NewClient(p)
err := client.Connect()
if err != nil {
fmt.Println("connect failed, ", err)
return
}
defer client.Close()
fmt.Println("starting")
for {
results, err := client.ReadCoils(1, 0, 10)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Printf("ReadDiscreteInputs %#v\r\n", results)
}
time.Sleep(time.Second * 5)
}
// modbus TCP Server
srv := modbus.NewTCPServer(":502")
srv.Logger = log.New(os.Stdout, "modbus", log.Ltime)
srv.LogMode(true)
srv.AddNode(modbus.NewNodeRegister(
1,
0, 10, 0, 10,
0, 10, 0, 10,
))
err := srv.ListenAndServe(":502")
if err != nil {
panic(err)
}