快速开始 - Snet Docs

🚀 快速开始

本教程通过 5 个步骤演示完整的 Modbus TCP 连接:配置、连接、读取、订阅数据事件和断开连接。

前置条件

  • .NET 8.0+ SDK
  • 已安装 Snet.Modbus NuGet 包
  • 在已知 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);

下一步