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

270 lines
9.7 KiB
C#
Raw Permalink 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.Siemens;
using AddressUnit = Modbus.Net.AddressUnit<string, int, int>;
namespace Modbus.Net.Tests
{
/// <summary>
/// 西门子 PLC 测试类
/// 测试 Siemens S7-1200 (TCP) 和 S7-200 (PPI) 的读写功能
/// </summary>
[TestClass]
public class SiemensTest
{
// Siemens TCP 机器实例S7-1200
private BaseMachine<string, string>? _siemensTcpMachine;
// Siemens PPI 机器实例S7-200
private BaseMachine<string, string>? _siemensPpiMachine;
// 测试机器 IP 地址
private string _machineIp = "10.10.18.251";
// 测试串口
private string _machineCom = "COM11";
/// <summary>
/// 测试初始化方法
/// 创建 S7-1200 (TCP) 和 S7-200 (PPI) 两种机器实例
/// </summary>
[TestInitialize]
public void Init()
{
// 创建 S7-1200 TCP 机器实例
// 参数ID, 别名连接类型IP 地址,型号,地址列表,保持连接,从站地址,主站地址
_siemensTcpMachine = new SiemensMachine<string, string>("1", "", SiemensType.Tcp, _machineIp, SiemensMachineModel.S7_1200, null, true, 2, 0);
// 创建 S7-200 PPI 机器实例
// 参数ID, 别名连接类型串口型号地址列表保持连接从站地址主站地址src, dst
_siemensPpiMachine = new SiemensMachine<string, string>("2", "", SiemensType.Ppi, _machineCom, SiemensMachineModel.S7_200, null, true, 2, 0, 1, 0);
}
/// <summary>
/// 测试单个线圈读写
/// 验证 Siemens TCP 和 PPI 协议的输出继电器Q 区)读写功能
/// </summary>
[TestMethod]
public async Task SiemensCoilSingle()
{
Random r = new Random();
// 定义地址单元
var addresses = new List<AddressUnit>
{
new AddressUnit
{
Id = "0",
Area = "Q",
Address = 0,
SubAddress = 0,
CommunicationTag = "A1",
DataType = typeof(bool)
}
};
// 生成随机值0 或 1
var dic1 = new Dictionary<string, double>()
{
{
"Q 0.0", r.Next(0, 2)
}
};
// 设置 TCP 机器的地址列表并写入
_siemensTcpMachine!.GetAddresses = addresses;
await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1);
// 设置 PPI 机器的地址列表并写入
_siemensPpiMachine!.GetAddresses = addresses;
await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1);
// 分别通过 TCP 和 PPI 读取数据
var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address);
// 验证两种协议读取的值与写入的值一致
Assert.AreEqual(ans.Datas["Q 0.0"].DeviceValue, dic1["Q 0.0"]);
Assert.AreEqual(ans2.Datas["Q 0.0"].DeviceValue, dic1["Q 0.0"]);
}
/// <summary>
/// 测试单个离散输入读取
/// 验证 Siemens TCP 和 PPI 协议的输入继电器I 区)读取功能
/// 输入继电器为只读
/// </summary>
[TestMethod]
public async Task SiemensDInputSingle()
{
// 定义地址单元
var addresses = new List<AddressUnit>
{
new AddressUnit
{
Id = "0",
Area = "I",
Address = 0,
SubAddress = 0,
CommunicationTag = "A1",
DataType = typeof(bool)
}
};
// 设置两种协议的地址列表
_siemensTcpMachine!.GetAddresses = addresses;
_siemensPpiMachine!.GetAddresses = addresses;
// 分别通过 TCP 和 PPI 读取数据
var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address);
// 验证两种协议读取的值都为 0默认值
Assert.AreEqual(ans.Datas["I 0.0"].DeviceValue, 0);
Assert.AreEqual(ans2.Datas["I 0.0"].DeviceValue, 0);
}
/// <summary>
/// 测试单个位存储器读写
/// 验证 Siemens TCP 和 PPI 协议的位存储器M 区)读写功能
/// </summary>
[TestMethod]
public async Task SiemensMSingle()
{
Random r = new Random();
// 定义地址单元
var addresses = new List<AddressUnit>
{
new AddressUnit
{
Id = "0",
Area = "M",
Address = 0,
SubAddress = 0,
CommunicationTag = "A1",
DataType = typeof(ushort)
}
};
// 设置两种协议的地址列表
_siemensTcpMachine!.GetAddresses = addresses;
_siemensPpiMachine!.GetAddresses = addresses;
// 生成随机值
var dic1 = new Dictionary<string, double>()
{
{
"M 0", r.Next(0, UInt16.MaxValue)
}
};
// 分别通过 TCP 和 PPI 写入数据
await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1);
await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1);
// 分别通过 TCP 和 PPI 读取数据
var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address);
// 验证两种协议读取的值与写入的值一致
Assert.AreEqual(ans.Datas["M 0.0"].DeviceValue, dic1["M 0"]);
Assert.AreEqual(ans2.Datas["M 0.0"].DeviceValue, dic1["M 0"]);
}
/// <summary>
/// 测试单个位存储器位读写
/// 验证 Siemens TCP 和 PPI 协议的位存储器M 区)位读写功能
/// </summary>
[TestMethod]
public async Task SiemensMSingleBool()
{
Random r = new Random();
// 定义地址单元
var addresses = new List<AddressUnit>
{
new AddressUnit
{
Id = "0",
Area = "M",
Address = 0,
SubAddress = 0,
CommunicationTag = "A1",
DataType = typeof(bool)
}
};
// 设置两种协议的地址列表
_siemensTcpMachine!.GetAddresses = addresses;
_siemensPpiMachine!.GetAddresses = addresses;
// 生成随机值0 或 1
var dic1 = new Dictionary<string, double>()
{
{
"M 0.0", r.Next(0, 2)
}
};
// 分别通过 TCP 和 PPI 写入数据
await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1);
await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1);
// 分别通过 TCP 和 PPI 读取数据
var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address);
// 验证两种协议读取的值与写入的值一致
Assert.AreEqual(ans.Datas["M 0.0"].DeviceValue, dic1["M 0.0"]);
Assert.AreEqual(ans2.Datas["M 0.0"].DeviceValue, dic1["M 0.0"]);
}
/// <summary>
/// 测试单个数据块读写
/// 验证 Siemens TCP 和 PPI 协议的数据块DB 区)读写功能
/// </summary>
[TestMethod]
public async Task SiemensDbSingle()
{
Random r = new Random();
// 定义地址单元
var addresses = new List<AddressUnit>
{
new AddressUnit
{
Id = "0",
Area = "DB1",
Address = 0,
SubAddress = 0,
CommunicationTag = "A1",
DataType = typeof(ushort)
}
};
// 生成随机值
var dic1 = new Dictionary<string, double>()
{
{
"DB1 0.0", r.Next(0, UInt16.MaxValue)
}
};
// 设置两种协议的地址列表
_siemensTcpMachine!.GetAddresses = addresses;
_siemensPpiMachine!.GetAddresses = addresses;
// 分别通过 TCP 和 PPI 写入数据
await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1);
await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1);
// 分别通过 TCP 和 PPI 读取数据
var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address);
var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address);
// 验证两种协议读取的值与写入的值一致
Assert.AreEqual(ans.Datas["DB1 0.0"].DeviceValue, dic1["DB1 0.0"]);
Assert.AreEqual(ans2.Datas["DB1 0.0"].DeviceValue, dic1["DB1 0.0"]);
}
}
}