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  }