github.com/simpleiot/simpleiot@v0.18.3/cmd/modbus-server/main.go (about) 1 // example modbus server 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 simulator") 25 26 flagPort := flag.String("port", "", "serial port") 27 flagBaud := flag.String("baud", "9600", "baud rate") 28 29 flag.Parse() 30 31 if *flagPort == "" { 32 usage() 33 } 34 35 baud, err := strconv.Atoi(*flagBaud) 36 37 if err != nil { 38 log.Println("Baud rate error:", err) 39 os.Exit(-1) 40 } 41 42 log.Printf("Starting server on: %v, baud: %v", *flagPort, baud) 43 44 mode := &serial.Mode{ 45 BaudRate: baud, 46 } 47 port, err := serial.Open(*flagPort, mode) 48 if err != nil { 49 log.Fatal(err) 50 } 51 52 portRR := respreader.NewReadWriteCloser(port, time.Second, time.Millisecond*30) 53 54 transport := modbus.NewRTU(portRR) 55 56 regs := &modbus.Regs{} 57 serv := modbus.NewServer(1, transport, regs, 1) 58 regs.AddCoil(128) 59 err = regs.WriteCoil(128, true) 60 if err != nil { 61 log.Println("Error writing coil:", err) 62 os.Exit(-1) 63 } 64 65 regs.AddReg(2, 1) 66 err = regs.WriteReg(2, 5) 67 if err != nil { 68 log.Println("Error writing reg:", err) 69 os.Exit(-1) 70 } 71 72 // start slave so it can respond to requests 73 go serv.Listen(func(err error) { 74 log.Println("modbus server listen error:", err) 75 }, func() { 76 log.Printf("modbus reg changes") 77 }, func() { 78 log.Printf("modbus listener done") 79 }) 80 81 if err != nil { 82 log.Println("Error opening modbus port:", err) 83 } 84 85 value := true 86 regValue := 0 87 up := true 88 89 for { 90 time.Sleep(time.Second * 10) 91 92 value = !value 93 _ = regs.WriteCoil(128, value) 94 95 if up { 96 regValue = regValue + 1 97 if regValue >= 10 { 98 up = false 99 } 100 } else { 101 regValue = regValue - 1 102 if regValue <= 0 { 103 up = true 104 } 105 } 106 _ = regs.WriteReg(2, uint16(regValue)) 107 } 108 }