3.NModbus4 长距离多设备超时 C# + WPF 完整示例

cs 复制代码
/// <summary>
/// 当前是否已建立 Modbus-TCP 连接(只读,由 Connect/Disconnect 维护)
/// </summary>
public bool IsConnected;

/// <summary>
/// 建立 Modbus-TCP 连接
/// 调用前请先设置 <see cref="IpAddress"/> 与 <see cref="ServerPort"/>
/// </summary>
/// <returns>true 成功;false 失败(异常已内部记录)</returns>
public bool Connect()
{
    // 100 ms 取消令牌 → 避免半开连接长时间阻塞 UI
    using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(0.1));

    try
    {
        // 1. 创建 TcpClient 并禁用 Nagle,降低小包延迟
        _tcpClient = new TcpClient
        {
            SendTimeout    = 100,   // 发送超时 100 ms
            ReceiveTimeout = 100,   // 接收超时 100 ms
            NoDelay        = true   // 立即发送,不等待合并
        };

        // 2. 异步连接,最多等待 5 秒(与令牌叠加)
        var connectTask = _tcpClient.ConnectAsync(IpAddress, ServerPort);
        connectTask.Wait(cts.Token);        // 先受 100 ms 令牌限制
        connectTask.GetAwaiter().GetResult(); // 再抛异常

        // 3. 连接成功 → 创建 NModbus 主站实例
        IsConnected   = _tcpClient.Connected;
        _modbusMaster = ModbusIpMaster.CreateIp(_tcpClient);

        return true;
    }
    catch (Exception ex)
    {
        // 记录失败状态与日志
        IsConnected = false;
        Debug.WriteLine($"Connection error: {ex.Message}");
        return false;
    }
}

如果你刚接触 Modbus-TCP,建议先回看《12.NModbus4在C#上的部署与使用 C#例子 WPF例子》等往期文章------那里已经演示了如何引用 NModbus4、创建 TcpClient、构建 ModbusIpMaster 并读取第一个寄存器。本文默认你已能完成"建连接 → 读寄存器"这一最小闭环,下面直接切入"连接阶段最容易被忽视、却又最影响实时性"的环节:超时。

示例代码把"建连"做成 Connect() 方法,内部用 ConnectAsync(IpAddress, ServerPort) 异步发起 TCP 三次握手,同时给 CancellationTokenSource 设定 100 ms 取消令牌;这意味着:

  • 网络瞬间可达时,连接在几十毫秒内完成,令牌不会触发,流程无感通过;

  • 一旦出现半开连接、IP 不可达或端口未监听,最多只阻塞 100 ms 就会被强制取消,避免 UI 卡死。

    此外,代码把 TcpClient.NoDelay = true 放在连接前,确保小包立即发出,减少第一个 Modbus 请求的延迟

当你要轮询 80 台设备时,如果每台都"等 1-2 秒才报连接失败",总启动时间 = 80 × 2 s = 160 s ,界面直接假死。把连接超时压到 100 ms 后,80 台总探测时间 < 8 s (并行甚至 < 0.2 s),失败设备可立即标记离线并继续 ,既保证启动速度,也让后续轮询线程快速进入"只与在线设备通信"的状态,实时性与用户体验同时提升

相关推荐
程序员敲代码吗2 小时前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
缺点内向4 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
喵叔哟4 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_930707785 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
初级代码游戏5 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
大空大地20266 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
kylezhao20198 小时前
C#序列化与反序列化详细讲解与应用
c#
JQLvopkk8 小时前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio
故事不长丨8 小时前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
kingwebo'sZone8 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word