github.com/simpleiot/simpleiot@v0.18.3/cmd/modbus-client/main.go (about) 1 // example modbus client application 2 package main 3 4 import ( 5 "flag" 6 "fmt" 7 "log" 8 "os" 9 "strconv" 10 "time" 11 12 "github.com/simpleiot/simpleiot/modbus" 13 "github.com/simpleiot/simpleiot/respreader" 14 "go.bug.st/serial" 15 ) 16 17 func usage() { 18 fmt.Println("Usage: ") 19 flag.PrintDefaults() 20 os.Exit(-1) 21 } 22 23 func main() { 24 log.Println("modbus client") 25 26 flagPort := flag.String("port", "", "serial port") 27 flagBaud := flag.String("baud", "9600", "baud rate") 28 flag.Parse() 29 30 if *flagPort == "" { 31 usage() 32 } 33 34 baud, err := strconv.Atoi(*flagBaud) 35 36 if err != nil { 37 log.Println("Baud rate error:", err) 38 os.Exit(-1) 39 } 40 41 mode := &serial.Mode{ 42 BaudRate: baud, 43 } 44 45 port, err := serial.Open(*flagPort, mode) 46 if err != nil { 47 log.Fatal(err) 48 } 49 50 portRR := respreader.NewReadWriteCloser(port, time.Second*1, time.Millisecond*30) 51 transport := modbus.NewRTU(portRR) 52 client := modbus.NewClient(transport, 1) 53 54 // Read discrete inputs. 55 coils, _ := client.ReadCoils(1, 128, 1) 56 if len(coils) != 1 { 57 log.Println("Error: Expected one coil result") 58 os.Exit(-1) 59 } 60 61 log.Println("Coil results:", coils) 62 63 // read holding reg 64 regs, _ := client.ReadHoldingRegs(1, 2, 1) 65 if len(regs) != 1 { 66 log.Println("Error: Expected one reg result") 67 os.Exit(-1) 68 } 69 70 log.Printf("Reg result: 0x%x\n", regs[0]) 71 }