Files
Modbus.Net/Tests/Modbus.Net.Tests/BaseTest.cs
2026-04-04 17:25:15 +08:00

262 lines
9.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Modbus.Net.Modbus;
using Modbus.Net.Siemens;
using AddressUnit = Modbus.Net.AddressUnit<int, int, int>;
namespace Modbus.Net.Tests
{
/// <summary>
/// 基础测试类
/// 提供通用的测试初始化和测试方法
/// </summary>
[TestClass]
public class BaseTest
{
// 地址单元列表
private List<AddressUnit>? _addressUnits;
// 基础机器实例
private BaseMachine<int, int>? _baseMachine;
// 测试机器 IP 地址
private string _machineIp = "10.10.18.251";
/// <summary>
/// 测试初始化方法
/// 在每个测试方法执行前运行
/// </summary>
[TestInitialize]
public void Init()
{
// 初始化地址单元列表,定义要测试的地址
_addressUnits = new List<AddressUnit>
{
// 输入寄存器位测试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<int, int>(2, "", SiemensType.Tcp, _machineIp, SiemensMachineModel.S7_1200, _addressUnits, true, 2, 0, 1, 0)
{
ProjectName = "Project 1",
MachineName = "Test 2"
};
// 连接设备
_baseMachine.ConnectAsync().Wait();
}
/// <summary>
/// 测试连续地址组合器
/// 验证地址组合器将连续地址合并为一个通信包的功能
/// </summary>
[TestMethod]
public void AddressCombinerContinusTest()
{
// 创建连续地址组合器,最大长度 100000 字节
var addressCombiner = new AddressCombinerContinus<int>(new AddressTranslatorModbus(), 100000);
// 组合地址
var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();
// 验证组合结果
// 第 1 组3X 区地址 13 个位
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 1);
// 第 2 组3X 区地址 2-36 个字节
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 2);
Assert.AreEqual(combinedAddresses[1].GetCount, 6);
// 第 3 组3X 区地址 6-72 个寄存器
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 6);
Assert.AreEqual(combinedAddresses[2].GetCount, 2);
// 第 4 组3X 区地址 9-104 个寄存器
Assert.AreEqual(combinedAddresses[3].Area, "3X");
Assert.AreEqual(combinedAddresses[3].Address, 9);
Assert.AreEqual(combinedAddresses[3].GetCount, 4);
// 第 5 组3X 区地址 100-1012 个寄存器
Assert.AreEqual(combinedAddresses[4].Area, "3X");
Assert.AreEqual(combinedAddresses[4].Address, 100);
Assert.AreEqual(combinedAddresses[4].GetCount, 2);
// 第 6 组4X 区地址 1-44 个寄存器(包含 uint 和 ushort
Assert.AreEqual(combinedAddresses[5].Area, "4X");
Assert.AreEqual(combinedAddresses[5].Address, 1);
Assert.AreEqual(combinedAddresses[5].GetCount, 4);
// 第 7 组4X 区地址 42 个寄存器
Assert.AreEqual(combinedAddresses[6].Area, "4X");
Assert.AreEqual(combinedAddresses[6].Address, 4);
Assert.AreEqual(combinedAddresses[6].GetCount, 2);
}
/// <summary>
/// 测试连续地址组合器的长度限制
/// 验证当组合长度超过限制时,地址会被分割
/// </summary>
[TestMethod]
public void AddressCombinerContinusLimitTest()
{
// 创建连续地址组合器,最大长度 4 字节
var addressCombiner = new AddressCombinerContinus<int>(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);
}
/// <summary>
/// 测试单个地址组合器
/// 验证每个地址单独通信的组合器
/// </summary>
[TestMethod]
public void AddressCombinerSingleTest()
{
// 创建单个地址组合器
var addressCombiner = new AddressCombinerSingle<int, int, int>();
// 组合地址
var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();