You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 line
5.7 KiB

  1. using DryIoc;
  2. using Microsoft.EntityFrameworkCore;
  3. using ModbusDemo.Device;
  4. using ModbusDemo.Model;
  5. using Moq;
  6. using Prism.Ioc;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO.Ports;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace ModbusTest
  14. {
  15. public class ModbusRTUTest
  16. {
  17. //设计缺陷,应该使用适配器模式重写SerialPort
  18. private SerialPort _serialport;
  19. private Mock<ModbusDbContext> _mockDbContext;
  20. private ModbusRTU _modbusRtu;
  21. [SetUp]
  22. public void Setup()
  23. {
  24. _serialport = new SerialPort();
  25. _serialport.PortName = "COM3";
  26. _serialport.DataBits = 8;
  27. _serialport.BaudRate = 9600;
  28. _serialport.Parity = Parity.Even;
  29. _serialport.StopBits = StopBits.One;
  30. _serialport.ReadTimeout = 500;
  31. _serialport.WriteTimeout = 500;
  32. _serialport.Open();
  33. _mockDbContext = new Mock<ModbusDbContext>();
  34. _modbusRtu = new ModbusRTU(_serialport, _mockDbContext.Object);
  35. }
  36. [TearDown]
  37. public void TearDown()
  38. {
  39. // 确保在测试结束后释放资源
  40. _serialport.Dispose();
  41. }
  42. /// <summary>
  43. /// 测试线圈读取
  44. /// </summary>
  45. [Test]
  46. public void ReadCoil1()
  47. {
  48. var result = _modbusRtu.ReadCoil(1, 300, 5);
  49. var expected = new bool[5];
  50. Array.Fill(expected, false);
  51. CollectionAssert.AreEqual(expected, result);
  52. }
  53. [Test]
  54. public void ReadCoil2()
  55. {
  56. var result = _modbusRtu.ReadCoil(1, 305, 5);
  57. var expected = new bool[5];
  58. Array.Fill(expected, true);
  59. CollectionAssert.AreEqual(expected, result);
  60. }
  61. /// <summary>
  62. /// 测试写入线圈
  63. /// </summary>
  64. [Test]
  65. public void WriteCoil1()
  66. {
  67. var data = new bool[5];
  68. Array.Fill(data, true);
  69. _modbusRtu.WriteCoil(1, 310, data);
  70. var expected = _modbusRtu.ReadCoil(1, 310, 5);
  71. CollectionAssert.AreEqual(data, expected);
  72. }
  73. [Test]
  74. public void WriteCoil2()
  75. {
  76. var data = new bool[5];
  77. Array.Fill(data, false);
  78. _modbusRtu.WriteCoil(1, 315, data);
  79. var expected = _modbusRtu.ReadCoil(1, 315, 5);
  80. CollectionAssert.AreEqual(data, expected);
  81. }
  82. /// <summary>
  83. /// 测试读取寄存器
  84. /// </summary>
  85. [Test]
  86. public void ReadRegister1()
  87. {
  88. ushort[] data = new ushort[5];
  89. Array.Fill(data, (ushort)0);
  90. var expected = _modbusRtu.ReadRegisters(1, 300, 5);
  91. CollectionAssert.AreEqual(data, expected);
  92. }
  93. [Test]
  94. public void ReadRegister2()
  95. {
  96. ushort[] data = new ushort[5];
  97. Array.Fill(data, (ushort)1);
  98. var expected = _modbusRtu.ReadRegisters(1, 305, 5);
  99. CollectionAssert.AreEqual(data, expected);
  100. }
  101. /// <summary>
  102. /// 测试写入寄存器
  103. /// </summary>
  104. [Test]
  105. public void WriteRegister1()
  106. {
  107. ushort[] data = new ushort[5];
  108. Array.Fill(data, (ushort)1);
  109. _modbusRtu.WriteRegisters(1, 310, data);
  110. var expected = _modbusRtu.ReadRegisters(1, 310, 5);
  111. CollectionAssert.AreEqual(data, expected);
  112. }
  113. [Test]
  114. public void WriteRegister2()
  115. {
  116. ushort[] data = new ushort[5];
  117. Array.Fill(data, (ushort)2);
  118. _modbusRtu.WriteRegisters(1, 315, data);
  119. var expected = _modbusRtu.ReadRegisters(1, 315, 5);
  120. CollectionAssert.AreEqual(data, expected);
  121. }
  122. ///// <summary>
  123. ///// 解析线圈的返回值
  124. ///// </summary>
  125. //[Test]
  126. //public void ParseCoilresponse1()
  127. //{
  128. // var data = new bool[5];
  129. // Array.Fill(data, true);
  130. // byte[] response = new byte[] { 0x01, 0x01, 0x01, 0x7f, 0x10, 0x68 };
  131. // bool[] bools = _modbusRtu.ParseCoilresponse(new byte[] { }, response, 5);
  132. // CollectionAssert.AreEqual(data, bools);
  133. //}
  134. //[Test]
  135. //public void ParseCoilresponse2()
  136. //{
  137. // var data = new bool[5];
  138. // Array.Fill(data, false);
  139. // byte[] response = new byte[] { 0x01, 0x01, 0x01, 0x00, 0x51, 0x88 };
  140. // bool[] result = _modbusRtu.ParseCoilresponse(new byte[] { }, response, 5);
  141. // CollectionAssert.AreEqual(data, result);
  142. //}
  143. ///// <summary>
  144. ///// 解析寄存器的返回值
  145. ///// </summary>
  146. //[Test]
  147. //public void ParseRegistersresponse1()
  148. //{
  149. // ushort[] data = new ushort[5];
  150. // Array.Fill(data, (ushort)1);
  151. // byte[] response = new byte[] {0x01, 0x03, 0x0a, 0x00, 0x01, 0x00, 0x01, 0x00,
  152. // 0x01, 0x00, 0x01, 0x00, 0x01, 0x94, 0x26 };
  153. // ushort[] result = _modbusRtu.ParseRegistersresponse(new byte[] {},response, 5);
  154. // CollectionAssert.AreEqual(data, result);
  155. //}
  156. //[Test]
  157. //public void ParseRegistersresponse2()
  158. //{
  159. // ushort[] data = new ushort[2];
  160. // Array.Fill(data, (ushort)10);
  161. // byte[] response = new byte[] {0x01, 0x03, 0x04, 0x00,0x0a, 0x00, 0x0a, 0x5a, 0x36 };
  162. // ushort[] result = _modbusRtu.ParseRegistersresponse(new byte[] { }, response, 2);
  163. // CollectionAssert.AreEqual(data, result);
  164. //}
  165. }
  166. }