🚀 快速开始
本教程通过 5 个步骤演示完整的 Modbus TCP 连接:配置、连接、读取、订阅数据事件和断开连接。
前置条件
- .NET 8.0+ SDK
- 已安装
Snet.ModbusNuGet 包 - 在已知 IP 地址上运行 Modbus TCP 服务器(或模拟器)
步骤 1:配置连接参数
创建一个包含设备设置的 ModbusData.Basics 对象:
using Snet.Modbus;
var basics = new ModbusData.Basics
{
IpAddress = "192.168.1.100", // PLC IP 地址
Port = 502, // Modbus TCP 默认端口
Station = 1, // 从站 ID
DataFormat = Snet.Driver.Core.DataFormat.CDAB, // 小端字节序
ConnectTimeOut = 1000, // 连接超时(毫秒)
ReceiveTimeOut = 1000, // 接收超时(毫秒)
IsPersistentConnection = true, // 保持连接存活
ProtocolType = ModbusData.ProtocolType.ModbusTcpNet
};
步骤 2:创建操作实例
使用单例工厂方法获取或创建 ModbusOperate:
var modbus = await ModbusOperate.InstanceAsync(basics);
InstanceAsync() 对等效的 Basics 参数返回相同的对象,强制执行单例模式(最多 255 个实例)。
步骤 3:打开连接
var result = await modbus.OnAsync();
if (!result.Status)
{
Console.WriteLine($"连接失败:{result.Message}");
return;
}
Console.WriteLine($"已连接,耗时 {result.RunTime}ms");
步骤 4:读取数据并订阅事件
读取单个地址
var address = new Snet.Model.data.Address(new Snet.Model.data.AddressDetails
{
AddressName = "40001",
DataType = Snet.Model.@enum.DataType.Float
});
var readResult = await modbus.ReadAsync(address);
if (readResult.Status)
{
Console.WriteLine($"值:{readResult.ResultData},运行时间:{readResult.RunTime}ms");
}
订阅连续数据事件
modbus.OnDataEventAsync += async (sender, e) =>
{
// e.ResultData 包含带填充 AddressArray 的 Address
var addr = e.GetSource<Snet.Model.data.Address>();
if (addr != null)
{
foreach (var detail in addr.AddressArray)
{
Console.WriteLine($"[{detail.AddressName}] = {detail.AddressValue?.Value}");
}
}
await Task.CompletedTask;
};
读取多个地址
var addresses = new Snet.Model.data.Address(new List<Snet.Model.data.AddressDetails>
{
new() { AddressName = "40001", DataType = Snet.Model.@enum.DataType.Float },
new() { AddressName = "40003", DataType = Snet.Model.@enum.DataType.Float },
new() { AddressName = "40005", DataType = Snet.Model.@enum.DataType.Int16 }
});
var multiResult = await modbus.ReadAsync(addresses);
步骤 5:断开连接
var offResult = await modbus.OffAsync(true); // true = 强制关闭
Console.WriteLine($"已断开连接:{offResult.Message}");
// 可选:释放实例
await modbus.DisposeAsync();
完整程序
using Snet.Model.data;
using Snet.Model.@enum;
using Snet.Modbus;
// 1. 配置
var basics = new ModbusData.Basics
{
IpAddress = "192.168.1.100",
Port = 502,
Station = 1,
DataFormat = Snet.Driver.Core.DataFormat.CDAB,
ProtocolType = ModbusData.ProtocolType.ModbusTcpNet
};
// 2. 创建实例
var modbus = await ModbusOperate.InstanceAsync(basics);
// 3. 连接
var onResult = await modbus.OnAsync();
if (!onResult.Status)
{
Console.WriteLine($"错误:{onResult.Message}");
return;
}
// 4a. 订阅事件
modbus.OnDataEventAsync += async (sender, e) =>
{
var addr = e.GetSource<Address>();
Console.WriteLine($"数据接收于 {DateTime.Now:T}");
};
// 4b. 读取一次
var readResult = await modbus.ReadAsync(new Address(new AddressDetails
{
AddressName = "40001",
DataType = DataType.Float
}));
Console.WriteLine($"读取:{readResult.Message}");
// 5. 断开连接
await modbus.OffAsync(true);
下一步
- 配置 -- 每个
Basics属性详解 - 基本概念 -- 了解
IDaq、OperateResult和Address模型 - DaqAbstract -- 深入了解 DAQ 管道
