HJ212 and Documents

This commit is contained in:
OpenClaw
2026-04-04 17:25:15 +08:00
parent e7cad88bcf
commit 3b223bc440
125 changed files with 18829 additions and 9380 deletions

View File

@@ -1,30 +1,43 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
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,
SubAddress = 0, // 第 0 位
DataType = typeof(bool)
},
new AddressUnit
@@ -32,7 +45,7 @@ namespace Modbus.Net.Tests
Id = 2,
Area = "3X",
Address = 1,
SubAddress = 1,
SubAddress = 1, // 第 1 位
DataType = typeof(bool)
},
new AddressUnit
@@ -40,9 +53,10 @@ namespace Modbus.Net.Tests
Id = 3,
Area = "3X",
Address = 1,
SubAddress = 2,
SubAddress = 2, // 第 2 位
DataType = typeof(bool)
},
// 输入寄存器字节测试
new AddressUnit
{
Id = 4,
@@ -56,9 +70,10 @@ namespace Modbus.Net.Tests
Id = 5,
Area = "3X",
Address = 2,
SubAddress = 8,
SubAddress = 8, // 下一个字节
DataType = typeof(byte)
},
// 输入寄存器字测试
new AddressUnit
{
Id = 6,
@@ -107,6 +122,7 @@ namespace Modbus.Net.Tests
SubAddress = 0,
DataType = typeof(ushort)
},
// 保持寄存器测试4X 区)
new AddressUnit
{
Id = 12,
@@ -125,178 +141,121 @@ namespace Modbus.Net.Tests
},
};
// 创建 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();
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, 1);
Assert.AreEqual(combinedAddresses[1].SubAddress, 1);
Assert.AreEqual(combinedAddresses[1].GetCount, 1);
Assert.AreEqual(combinedAddresses[3].Area, "3X");
Assert.AreEqual(combinedAddresses[3].Address, 2);
Assert.AreEqual(combinedAddresses[3].GetCount, 1);
Assert.AreEqual(combinedAddresses[4].Area, "3X");
Assert.AreEqual(combinedAddresses[4].Address, 2);
Assert.AreEqual(combinedAddresses[4].SubAddress, 8);
Assert.AreEqual(combinedAddresses[4].GetCount, 1);
Assert.AreEqual(combinedAddresses[11].Area, "4X");
Assert.AreEqual(combinedAddresses[11].Address, 1);
Assert.AreEqual(combinedAddresses[11].GetCount, 1);
}
[TestMethod]
public void AddressCombinerNumericJumpTest()
{
var addressCombiner = new AddressCombinerNumericJump<int>(10, 100000, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 20);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 100);
Assert.AreEqual(combinedAddresses[1].GetCount, 2);
Assert.AreEqual(combinedAddresses[2].Area, "4X");
Assert.AreEqual(combinedAddresses[2].Address, 1);
Assert.AreEqual(combinedAddresses[2].GetCount, 8);
}
[TestMethod]
public void AddressCombinerNumericJumpLimitTest()
{
var addressCombiner = new AddressCombinerNumericJump<int>(10, 10, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 8);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 6);
Assert.AreEqual(combinedAddresses[1].GetCount, 10);
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 100);
Assert.AreEqual(combinedAddresses[2].GetCount, 2);
Assert.AreEqual(combinedAddresses[3].Area, "4X");
Assert.AreEqual(combinedAddresses[3].Address, 1);
Assert.AreEqual(combinedAddresses[3].GetCount, 8);
}
[TestMethod]
public void AddressCombinerPercentageJumpTest()
{
var addressCombiner = new AddressCombinerPercentageJump<int>(30.0, 100000, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 12);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 9);
Assert.AreEqual(combinedAddresses[1].GetCount, 4);
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 100);
Assert.AreEqual(combinedAddresses[2].GetCount, 2);
Assert.AreEqual(combinedAddresses[3].Area, "4X");
Assert.AreEqual(combinedAddresses[3].Address, 1);
Assert.AreEqual(combinedAddresses[3].GetCount, 8);
}
[TestMethod]
public void AddressCombinerPercentageJumpLimitTest()
{
var addressCombiner = new AddressCombinerPercentageJump<int>(30.0, 10, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 8);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 6);
Assert.AreEqual(combinedAddresses[1].GetCount, 2);
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 9);
Assert.AreEqual(combinedAddresses[2].GetCount, 4);
Assert.AreEqual(combinedAddresses[3].Area, "3X");
Assert.AreEqual(combinedAddresses[3].Address, 100);
Assert.AreEqual(combinedAddresses[3].GetCount, 2);
Assert.AreEqual(combinedAddresses[4].Area, "4X");
Assert.AreEqual(combinedAddresses[4].Address, 1);
Assert.AreEqual(combinedAddresses[4].GetCount, 8);
}
[TestCleanup]
public void MachineClean()
{
_baseMachine?.Disconnect();
}
}
}