3、通信超时定义:超时参数(T1、T2、T3)在PLC通信中的含义与配置

在工业PLC通信协议(如Modbus RTU/TCP、PROFINET、EtherNet/IP、S7通信)中,超时参数是决定通信稳定性和故障恢复速度的核心要素。绝大多数协议将超时机制抽象为三个关键时间参数:T1(字符/帧间隔超时)、T2(响应超时)、T3(连接空闲/保活超时)。错误配置这三个参数是导致“偶发断连”、“响应卡死”、“重连风暴”等缺陷的直接原因。

核心原则:T1 保证帧完整性,T2 保证请求-应答可靠性,T3 保证连接活性。三者必须协同配置,不可孤立调整。

3.1 T1:字符/帧间隔超时(Inter-Character / Frame Timeout)

T1 定义的是接收方在等待一个完整报文时,允许相邻两个字节(或帧片段)之间的最大时间间隔。如果超过 T1 仍未收到下一个字节,接收方认为当前帧已结束,开始解析并处理已接收的数据。

  • 作用域: 串口通信(RS-232/485)的 Modbus RTU/ASCII、PROFIBUS DP;TCP 模式下通常由 TCP 协议栈保证字节顺序,T1 退化为帧结束判断。
  • 典型值: Modbus RTU 标准规定 T1 ≥ 3.5 个字符传输时间(波特率相关)。例如 9600 bps 下,T1 ≈ 3.5 × (11 bit / 9600) ≈ 4.0 ms。
  • 配置风险: T1 过小 → 帧被提前截断,产生 CRC 错误;T1 过大 → 帧粘连,多帧合并为一帧,导致解析错位。
实战建议: 在串口通信中,T1 应设置为 3.5 ~ 5 个字符时间。对于 115200 bps 高速串口,T1 可缩小至 0.5 ms 以下,但需确保主站和从站时钟偏差不超过 20%。
T1 超时示意图:字节间隔与帧结束判断 B1 B2 B3 B4 B5 间隔 > T1 B6 ← 帧结束,开始解析 t0 t0 + T1 t 说明:当字节间隔超过 T1,接收方认为当前帧结束,即使后续还有字节到达,也作为新帧起始。

3.2 T2:响应超时(Response Timeout)

T2 是主站(Client)发送请求后,等待从站(Server)返回响应帧的最大时间。如果 T2 超时,主站认为本次通信失败,触发重试或错误处理逻辑。T2 是影响系统实时性和重连频率的最敏感参数。

协议类型 T2 典型范围 配置依据 常见错误
Modbus RTU/TCP 100 ms ~ 10 s 从站扫描周期 + 通信延迟 设 1 s 固定值,忽略从站负载
PROFINET RT 1 ms ~ 100 ms 看门狗时间 × 3 看门狗与 T2 混淆,导致误判
EtherNet/IP 500 ms ~ 5 s RPI (Requested Packet Interval) × 4 RPI 过小,T2 未同步放大
S7 通信 200 ms ~ 30 s CPU 循环时间 + 网络抖动 默认 10 s 太长,故障恢复慢
⚠ 配置陷阱: T2 设置过小会导致“假超时”——从站实际正常,但主站因网络抖动提前放弃,触发不必要的重连。T2 设置过大则故障检测延迟,系统“死等”时间过长。建议 T2 = 从站最大响应时间 × 2 + 网络往返时间 × 3。
T2 响应超时:请求-应答生命周期 主站 (Client) 从站 (Server) 请求帧 响应帧 T2 响应超时窗口 请求发出 响应到达 超时点 说明:T2 从请求帧发送完成开始计时,到收到完整响应帧结束。超时后主站进入重试或错误状态。

3.3 T3:连接空闲/保活超时(Idle / Keep-Alive Timeout)

T3 定义的是在面向连接的协议(TCP、PROFINET IO、EtherNet/IP 封装会话)中,连接上无任何数据交互时,保持连接存活的最大空闲时间。超过 T3 后,通信栈自动发送保活探测帧(Keep-Alive Probe)或直接断开连接。

  • 作用域: TCP 长连接、PROFINET AR(应用关系)、EtherNet/IP 封装会话、S7 连接资源。
  • 典型值: 30 s ~ 300 s(TCP Keep-Alive 默认 2 小时,工业场景需大幅缩短)。
  • 配置风险: T3 过大 → 连接泄漏,PLC 连接资源耗尽;T3 过小 → 频繁保活探测,增加网络和 CPU 负载。
最佳实践: 在 PLC 与上位机/SCADA 通信中,T3 建议设为 30 ~ 60 秒。配合 T2(响应超时)和重试次数,形成“快速检测 → 快速重连”的闭环。例如:T2=2s,重试 3 次,T3=30s,则最大无响应检测时间为 2×3 + 30 = 36s。

3.4 三参数协同配置矩阵

下表总结了 T1、T2、T3 在不同通信场景下的推荐配置范围及调整方向:

场景 T1(帧间隔) T2(响应超时) T3(空闲保活) 调整优先级
串口 Modbus RTU(9600 bps) 4 ms 500 ms ~ 2 s 不适用(无连接) T1 > T2
串口 Modbus RTU(115200 bps) 0.5 ms 200 ms ~ 1 s 不适用 T1 > T2
Modbus TCP(局域网) TCP 协议栈处理 100 ms ~ 1 s 30 s ~ 60 s T2 > T3
PROFINET RT(实时) 看门狗机制 3 × 看门狗时间 看门狗时间 × 10 T2 = T3 联动
EtherNet/IP(封装) TCP 协议栈处理 4 × RPI 60 s ~ 120 s T2 > T3
S7 通信(TCP 长连接) TCP 协议栈处理 2 s ~ 5 s 30 s ~ 60 s T2 = T3 联动
T1 / T2 / T3 协同工作流程 T1 帧完整性检查 T2 响应等待 T3 连接保活 T1 超时 → 帧错误 T2 超时 → 重试/重连 T3 超时 → 断开连接 说明:三个超时参数形成递进保护——T1 保证单帧正确,T2 保证请求-应答可靠,T3 保证连接资源不泄漏。 任何一层超时都应触发对应的错误处理逻辑,而非直接跳转到重连。

3.5 配置示例:Modbus TCP 超时参数设置

以下是一个基于 C# 的 Modbus TCP 主站超时配置示例,展示 T2 和 T3 的实际代码实现:

// Modbus TCP 主站超时配置示例
public class ModbusTcpTimeoutConfig
{
    // T2:响应超时(单位:毫秒)
    public int ResponseTimeoutMs { get; set; } = 1000;

    // T3:连接空闲保活超时(单位:秒)
    public int KeepAliveIntervalSec { get; set; } = 30;

    // 重试次数(与 T2 配合)
    public int RetryCount { get; set; } = 3;

    // 配置 TCP Keep-Alive 参数
    public void ApplyKeepAlive(Socket socket)
    {
        // 启用 Keep-Alive
        socket.SetSocketOption(SocketOptionLevel.Socket,
            SocketOptionName.KeepAlive, true);

        // T3:空闲时间(毫秒)
        uint keepAliveTime = (uint)KeepAliveIntervalSec * 1000;
        // 保活探测间隔(毫秒)
        uint keepAliveInterval = 1000;

        byte[] inOptionValues = new byte[12];
        BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);       // 启用
        BitConverter.GetBytes(keepAliveTime).CopyTo(inOptionValues, 4); // T3
        BitConverter.GetBytes(keepAliveInterval).CopyTo(inOptionValues, 8);

        socket.IOControl(IOControlCode.KeepAliveValues,
            inOptionValues, null);
    }

    // 计算最大无响应检测时间
    public int GetMaxSilentDetectionTimeMs()
    {
        return ResponseTimeoutMs * RetryCount +
               KeepAliveIntervalSec * 1000;
    }
}
关键点: 上述代码中 GetMaxSilentDetectionTimeMs() 返回的是从最后一次成功通信到触发重连的最坏情况时间。在 T2=1000ms、重试 3 次、T3=30s 时,最大检测时间为 1000×3 + 30000 = 33000 ms(33 秒)。如果系统要求 10 秒内检测到断连,则需要同步缩小 T2 和 T3。

3.6 常见超时配置缺陷与根因

缺陷现象 根因分析 涉及参数 解决方案
偶发 CRC 错误,重连后恢复 T1 过小,帧被提前截断 T1 增大 T1 至 5 个字符时间
主站频繁报“从站无响应” T2 过小,网络抖动触发假超时 T2 增大 T2 至 2~3 倍平均响应时间
PLC 连接资源耗尽,无法建立新连接 T3 过大或未启用 Keep-Alive T3 设置 T3 ≤ 60s,启用保活探测
故障恢复时间长达数分钟 T2 和 T3 均过大,重试次数过多 T2, T3, Retry 协同缩小 T2/T3,限制重试 ≤ 3 次
串口通信帧粘连,数据错位 T1 过大,多帧合并 T1 缩小 T1 至 3.5 字符时间