github.com/simpleiot/simpleiot@v0.18.3/modbus/rtu-end-to-end_test.go (about)

     1  package modbus
     2  
     3  import (
     4  	"log"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/simpleiot/simpleiot/respreader"
     9  	"github.com/simpleiot/simpleiot/test"
    10  )
    11  
    12  func TestRtuEndToEnd(t *testing.T) {
    13  
    14  	id := byte(1)
    15  
    16  	// create virtual serial wire to simulate connection between
    17  	// server and client
    18  	a, b := test.NewIoSim()
    19  
    20  	// first set up the server (slave) to process data
    21  	portA := respreader.NewReadWriteCloser(a, time.Second*2,
    22  		5*time.Millisecond)
    23  	transportA := NewRTU(portA)
    24  	regs := &Regs{}
    25  	slave := NewServer(id, transportA, regs, 9)
    26  	regs.AddCoil(128)
    27  	err := regs.WriteCoil(128, true)
    28  	if err != nil {
    29  		t.Fatal(err)
    30  	}
    31  
    32  	regs.AddReg(2, 1)
    33  	err = regs.WriteReg(2, 0x1234)
    34  	if err != nil {
    35  		t.Fatal(err)
    36  	}
    37  
    38  	// start slave so it can respond to requests
    39  	go slave.Listen(func(err error) {
    40  		log.Println("modbus server listen error:", err)
    41  	}, func() {
    42  		log.Printf("modbus reg changes")
    43  	}, func() {
    44  		log.Printf("modbus listener done")
    45  	})
    46  
    47  	// set up client (master)
    48  	portB := respreader.NewReadWriteCloser(b, time.Second*2,
    49  		5*time.Millisecond)
    50  	transportB := NewRTU(portB)
    51  	master := NewClient(transportB, 9)
    52  
    53  	coils, err := master.ReadCoils(id, 128, 1)
    54  	if err != nil {
    55  		t.Fatal("read coils returned err: ", err)
    56  	}
    57  	if len(coils) != 1 {
    58  		t.Fatal("invalid coil length")
    59  		return
    60  	}
    61  
    62  	if coils[0] != true {
    63  		t.Fatal("wrong coil value")
    64  	}
    65  
    66  	_ = regs.WriteCoil(128, false)
    67  	coils, _ = master.ReadCoils(id, 128, 1)
    68  
    69  	if coils[0] != false {
    70  		t.Fatal("wrong coil value")
    71  	}
    72  
    73  	hr, err := master.ReadHoldingRegs(id, 2, 1)
    74  	if err != nil {
    75  		t.Fatal("read holding regs returned err: ", err)
    76  	}
    77  
    78  	if len(hr) != 1 {
    79  		t.Fatal("invalid regs length")
    80  	}
    81  
    82  	if hr[0] != 0x1234 {
    83  		t.Fatalf("read holding reg returned wrong value: 0x%x", hr[0])
    84  	}
    85  }