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 }