262 lines
9.8 KiB
C#
262 lines
9.8 KiB
C#
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 区地址 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);
|
||
}
|
||
|
||
/// <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();
|