using Microsoft.VisualStudio.TestTools.UnitTesting; using Modbus.Net.Modbus; using System.Reflection; using AddressUnit = Modbus.Net.AddressUnit; namespace Modbus.Net.Tests { /// /// 机器方法测试类 /// 测试 Machine 层的反射调用和 Utility 层的直接调用 /// [TestClass] public class MachineMethodTest { // 测试机器 IP 地址 private string _machineIp = "10.10.18.251"; /// /// 测试获取 Utility 方法 /// 验证可以通过反射获取 Utility 的读写方法 /// [TestMethod] public void GetUtility() { // 创建 Modbus TCP 机器实例 BaseMachine baseMachine = new ModbusMachine(1, "", ModbusType.Tcp, _machineIp, null, true, 2, 0, Endian.BigEndianLsb); // 获取 Utility 方法接口 var utility = baseMachine.GetUtilityMethods(); // 通过反射获取方法列表 var methods = utility.GetType().GetRuntimeMethods(); // 验证 GetDatasAsync 方法存在 Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "GetDatasAsync") != null, true); // 验证 SetDatasAsync 方法存在 Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "SetDatasAsync") != null, true); // 断开连接 baseMachine.Disconnect(); } /// /// 测试调用 Utility 方法 /// 验证可以直接调用 Utility 的底层读写方法 /// [TestMethod] public async Task InvokeUtility() { // 创建 Modbus TCP 机器实例 BaseMachine baseMachine = new ModbusMachine(1, "", ModbusType.Tcp, _machineIp, null, true, 2, 0, Endian.BigEndianLsb); // 连接 Utility await baseMachine.BaseUtility.ConnectAsync(); // 使用 Utility 方法写入数据(字节级 API) // 地址格式:"4X 1" = 保持寄存器区地址 1 // 写入值:byte 类型的 11 var success = await baseMachine.BaseUtility.GetUtilityMethods().SetDatasAsync("4X 1", new object[] { (byte)11 }, 1); Assert.AreEqual(success.IsSuccess, true); // 使用 Utility 方法读取数据 // 读取 1 个字节 var datas = await baseMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1, 1); Assert.AreEqual(datas.Datas[0], 11); // 断开连接 baseMachine.Disconnect(); } /// /// 测试调用 Machine 方法 /// 验证可以调用 Machine 层的高级读写方法 /// [TestMethod] public async Task InvokeMachine() { // 创建 Modbus TCP 机器实例,带地址配置 BaseMachine baseMachine = new ModbusMachine(1, "", ModbusType.Tcp, _machineIp, new List { new AddressUnit { Id = 0, Area = "0X", Address = 1, SubAddress = 0, CommunicationTag = "A1", DataType = typeof(bool) } }, true, 2, 0, Endian.BigEndianLsb); // 使用 Machine 方法写入数据(高级 API) // 按地址写入线圈状态 var success = await baseMachine.GetMachineMethods().SetDatasAsync( MachineDataType.Address, new Dictionary { { "0X 1.0", 1 // 线圈 0X 1.0 设置为 ON } }); Assert.AreEqual(success.IsSuccess, true); // 使用 Machine 方法读取数据 var datas = await baseMachine.GetMachineMethods().GetDatasAsync(MachineDataType.Address); Assert.AreEqual(datas.Datas["0X 1.0"].DeviceValue, 1); // 写入 OFF success = await baseMachine.GetMachineMethods().SetDatasAsync( MachineDataType.Address, new Dictionary { { "0X 1.0", 0 // 线圈 0X 1.0 设置为 OFF } }); Assert.AreEqual(success.IsSuccess, true); // 断开连接 baseMachine.Disconnect(); } } }