using Microsoft.VisualStudio.TestTools.UnitTesting; using Modbus.Net.Modbus; using Modbus.Net.Siemens; using AddressUnit = Modbus.Net.AddressUnit; namespace Modbus.Net.Tests { /// /// 基础测试类 /// 提供通用的测试初始化和测试方法 /// [TestClass] public class BaseTest { // 地址单元列表 private List? _addressUnits; // 基础机器实例 private BaseMachine? _baseMachine; // 测试机器 IP 地址 private string _machineIp = "10.10.18.251"; /// /// 测试初始化方法 /// 在每个测试方法执行前运行 /// [TestInitialize] public void Init() { // 初始化地址单元列表,定义要测试的地址 _addressUnits = new List { // 输入寄存器位测试(3X 区) new AddressUnit { Id = 1, Area = "3X", Address = 1, SubAddress = 0, // 第 0 位 DataType = typeof(bool) }, new AddressUnit { Id = 2, Area = "3X", Address = 1, SubAddress = 1, // 第 1 位 DataType = typeof(bool) }, new AddressUnit { Id = 3, Area = "3X", Address = 1, SubAddress = 2, // 第 2 位 DataType = typeof(bool) }, // 输入寄存器字节测试 new AddressUnit { Id = 4, Area = "3X", Address = 2, SubAddress = 0, DataType = typeof(byte) }, new AddressUnit { Id = 5, Area = "3X", Address = 2, SubAddress = 8, // 下一个字节 DataType = typeof(byte) }, // 输入寄存器字测试 new AddressUnit { Id = 6, Area = "3X", Address = 3, SubAddress = 0, DataType = typeof(ushort) }, new AddressUnit { Id = 7, Area = "3X", Address = 4, SubAddress = 0, DataType = typeof(ushort) }, new AddressUnit { Id = 8, Area = "3X", Address = 6, SubAddress = 0, DataType = typeof(ushort) }, new AddressUnit { Id = 9, Area = "3X", Address = 9, SubAddress = 0, DataType = typeof(ushort) }, new AddressUnit { Id = 10, Area = "3X", Address = 10, SubAddress = 0, DataType = typeof(ushort) }, new AddressUnit { Id = 11, Area = "3X", Address = 100, SubAddress = 0, DataType = typeof(ushort) }, // 保持寄存器测试(4X 区) new AddressUnit { Id = 12, Area = "4X", Address = 1, SubAddress = 0, DataType = typeof(uint) }, new AddressUnit { Id = 13, Area = "4X", Address = 4, SubAddress = 0, DataType = typeof(ushort) }, }; // 创建 Siemens S7-1200 机器实例 // 参数:ID, 别名,连接类型,IP 地址,型号,地址列表,保持连接,从站地址,主站地址,src, dst _baseMachine = new SiemensMachine(2, "", SiemensType.Tcp, _machineIp, SiemensMachineModel.S7_1200, _addressUnits, true, 2, 0, 1, 0) { ProjectName = "Project 1", MachineName = "Test 2" }; // 连接设备 _baseMachine.ConnectAsync().Wait(); } /// /// 测试连续地址组合器 /// 验证地址组合器将连续地址合并为一个通信包的功能 /// [TestMethod] public void AddressCombinerContinusTest() { // 创建连续地址组合器,最大长度 100000 字节 var addressCombiner = new AddressCombinerContinus(new AddressTranslatorModbus(), 100000); // 组合地址 var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); // 验证组合结果 // 第 1 组:3X 区地址 1,3 个位 Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 1); // 第 2 组:3X 区地址 2-3,6 个字节 Assert.AreEqual(combinedAddresses[1].Area, "3X"); Assert.AreEqual(combinedAddresses[1].Address, 2); Assert.AreEqual(combinedAddresses[1].GetCount, 6); // 第 3 组:3X 区地址 6-7,2 个寄存器 Assert.AreEqual(combinedAddresses[2].Area, "3X"); Assert.AreEqual(combinedAddresses[2].Address, 6); Assert.AreEqual(combinedAddresses[2].GetCount, 2); // 第 4 组:3X 区地址 9-10,4 个寄存器 Assert.AreEqual(combinedAddresses[3].Area, "3X"); Assert.AreEqual(combinedAddresses[3].Address, 9); Assert.AreEqual(combinedAddresses[3].GetCount, 4); // 第 5 组:3X 区地址 100-101,2 个寄存器 Assert.AreEqual(combinedAddresses[4].Area, "3X"); Assert.AreEqual(combinedAddresses[4].Address, 100); Assert.AreEqual(combinedAddresses[4].GetCount, 2); // 第 6 组:4X 区地址 1-4,4 个寄存器(包含 uint 和 ushort) Assert.AreEqual(combinedAddresses[5].Area, "4X"); Assert.AreEqual(combinedAddresses[5].Address, 1); Assert.AreEqual(combinedAddresses[5].GetCount, 4); // 第 7 组:4X 区地址 4,2 个寄存器 Assert.AreEqual(combinedAddresses[6].Area, "4X"); Assert.AreEqual(combinedAddresses[6].Address, 4); Assert.AreEqual(combinedAddresses[6].GetCount, 2); } /// /// 测试连续地址组合器的长度限制 /// 验证当组合长度超过限制时,地址会被分割 /// [TestMethod] public void AddressCombinerContinusLimitTest() { // 创建连续地址组合器,最大长度 4 字节 var addressCombiner = new AddressCombinerContinus(new AddressTranslatorModbus(), 4); // 组合地址 var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); // 验证组合结果(由于长度限制,地址会被分割) Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 1); Assert.AreEqual(combinedAddresses[1].Area, "3X"); Assert.AreEqual(combinedAddresses[1].Address, 2); Assert.AreEqual(combinedAddresses[1].GetCount, 4); Assert.AreEqual(combinedAddresses[2].Area, "3X"); Assert.AreEqual(combinedAddresses[2].Address, 2); Assert.AreEqual(combinedAddresses[2].GetCount, 2); Assert.AreEqual(combinedAddresses[3].Area, "3X"); Assert.AreEqual(combinedAddresses[3].Address, 6); Assert.AreEqual(combinedAddresses[3].GetCount, 2); Assert.AreEqual(combinedAddresses[4].Area, "3X"); Assert.AreEqual(combinedAddresses[4].Address, 9); Assert.AreEqual(combinedAddresses[4].GetCount, 4); Assert.AreEqual(combinedAddresses[5].Area, "3X"); Assert.AreEqual(combinedAddresses[5].Address, 100); Assert.AreEqual(combinedAddresses[5].GetCount, 2); Assert.AreEqual(combinedAddresses[6].Area, "4X"); Assert.AreEqual(combinedAddresses[6].Address, 1); Assert.AreEqual(combinedAddresses[6].GetCount, 4); Assert.AreEqual(combinedAddresses[7].Area, "4X"); Assert.AreEqual(combinedAddresses[7].Address, 4); Assert.AreEqual(combinedAddresses[7].GetCount, 2); } /// /// 测试单个地址组合器 /// 验证每个地址单独通信的组合器 /// [TestMethod] public void AddressCombinerSingleTest() { // 创建单个地址组合器 var addressCombiner = new AddressCombinerSingle(); // 组合地址 var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();