client.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright 2014 Quoc-Viet Nguyen. All rights reserved.
  2. // This software may be modified and distributed under the terms
  3. // of the BSD license. See the LICENSE file for details.
  4. package test
  5. import (
  6. "testing"
  7. "github.com/goburrow/modbus"
  8. )
  9. func ClientTestReadCoils(t *testing.T, client modbus.Client) {
  10. // Read discrete outputs 20-38:
  11. address := uint16(0x0013)
  12. quantity := uint16(0x0013)
  13. results, err := client.ReadCoils(address, quantity)
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. AssertEquals(t, 3, len(results))
  18. }
  19. func ClientTestReadDiscreteInputs(t *testing.T, client modbus.Client) {
  20. // Read discrete inputs 197-218
  21. address := uint16(0x00C4)
  22. quantity := uint16(0x0016)
  23. results, err := client.ReadDiscreteInputs(address, quantity)
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. AssertEquals(t, 3, len(results))
  28. }
  29. func ClientTestReadHoldingRegisters(t *testing.T, client modbus.Client) {
  30. // Read registers 108-110
  31. address := uint16(0x006B)
  32. quantity := uint16(0x0003)
  33. results, err := client.ReadHoldingRegisters(address, quantity)
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. AssertEquals(t, 6, len(results))
  38. }
  39. func ClientTestReadInputRegisters(t *testing.T, client modbus.Client) {
  40. // Read input register 9
  41. address := uint16(0x0008)
  42. quantity := uint16(0x0001)
  43. results, err := client.ReadInputRegisters(address, quantity)
  44. if err != nil {
  45. t.Fatal(err)
  46. }
  47. AssertEquals(t, 2, len(results))
  48. }
  49. func ClientTestWriteSingleCoil(t *testing.T, client modbus.Client) {
  50. // Write coil 173 ON
  51. address := uint16(0x00AC)
  52. value := uint16(0xFF00)
  53. results, err := client.WriteSingleCoil(address, value)
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. AssertEquals(t, 2, len(results))
  58. }
  59. func ClientTestWriteSingleRegister(t *testing.T, client modbus.Client) {
  60. // Write register 2 to 00 03 hex
  61. address := uint16(0x0001)
  62. value := uint16(0x0003)
  63. results, err := client.WriteSingleRegister(address, value)
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. AssertEquals(t, 2, len(results))
  68. }
  69. func ClientTestWriteMultipleCoils(t *testing.T, client modbus.Client) {
  70. // Write a series of 10 coils starting at coil 20
  71. address := uint16(0x0013)
  72. quantity := uint16(0x000A)
  73. values := []byte{0xCD, 0x01}
  74. results, err := client.WriteMultipleCoils(address, quantity, values)
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. AssertEquals(t, 2, len(results))
  79. }
  80. func ClientTestWriteMultipleRegisters(t *testing.T, client modbus.Client) {
  81. // Write two registers starting at 2 to 00 0A and 01 02 hex
  82. address := uint16(0x0001)
  83. quantity := uint16(0x0002)
  84. values := []byte{0x00, 0x0A, 0x01, 0x02}
  85. results, err := client.WriteMultipleRegisters(address, quantity, values)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. AssertEquals(t, 2, len(results))
  90. }
  91. func ClientTestMaskWriteRegisters(t *testing.T, client modbus.Client) {
  92. // Mask write to register 5
  93. address := uint16(0x0004)
  94. andMask := uint16(0x00F2)
  95. orMask := uint16(0x0025)
  96. results, err := client.MaskWriteRegister(address, andMask, orMask)
  97. if err != nil {
  98. t.Fatal(err)
  99. }
  100. AssertEquals(t, 4, len(results))
  101. }
  102. func ClientTestReadWriteMultipleRegisters(t *testing.T, client modbus.Client) {
  103. // read six registers starting at register 4, and to write three registers starting at register 15
  104. address := uint16(0x0003)
  105. quantity := uint16(0x0006)
  106. writeAddress := uint16(0x000E)
  107. writeQuantity := uint16(0x0003)
  108. values := []byte{0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF}
  109. results, err := client.ReadWriteMultipleRegisters(address, quantity, writeAddress, writeQuantity, values)
  110. if err != nil {
  111. t.Fatal(err)
  112. }
  113. AssertEquals(t, 12, len(results))
  114. }
  115. func ClientTestReadFIFOQueue(t *testing.T, client modbus.Client) {
  116. // Read queue starting at the pointer register 1246
  117. address := uint16(0x04DE)
  118. results, err := client.ReadFIFOQueue(address)
  119. // Server not implemented
  120. if err != nil {
  121. AssertEquals(t, "modbus: exception '1' (illegal function), function '152'", err.Error())
  122. } else {
  123. AssertEquals(t, 0, len(results))
  124. }
  125. }
  126. func ClientTestAll(t *testing.T, client modbus.Client) {
  127. ClientTestReadCoils(t, client)
  128. ClientTestReadDiscreteInputs(t, client)
  129. ClientTestReadHoldingRegisters(t, client)
  130. ClientTestReadInputRegisters(t, client)
  131. ClientTestWriteSingleCoil(t, client)
  132. ClientTestWriteSingleRegister(t, client)
  133. ClientTestWriteMultipleCoils(t, client)
  134. ClientTestWriteMultipleRegisters(t, client)
  135. ClientTestMaskWriteRegisters(t, client)
  136. ClientTestReadWriteMultipleRegisters(t, client)
  137. ClientTestReadFIFOQueue(t, client)
  138. }