网络诊断
概述
DarraRT 在网络层面涉及四种协议:
- EtherCAT (实时, Layer 2 Raw Ethernet, 强时序要求)
- TCP (SDK / IDE ↔ Service 管理通道)
- UDP / KCP (自研轻量远程控制)
- Modbus TCP (第三方互通)
每种协议的故障特征不同, 排查工具和判定准则也不同。本文档按协议逐一展开, 重点在 EtherCAT — 因为 PLC + 机器人产品完全依赖 EtherCAT 实时总线, 一条链路异常就会导致整条产线停机。
适用场景
- 主站从 Init 无法迁移到 OP
- OP 状态下 WKC (Working Counter) 错误
- DC (Distributed Clock) 同步抖动
- PDO 丢帧 / 帧率偏离
- TCP 超时 / Modbus 连接被拒
- NDIS 网卡绑定异常
前置条件与工具
| 工具 | 用途 |
|---|---|
Darra_EtherCAT_Master/debug_info.txt | 主站调试日志 |
| Wireshark + Npcap/WinPcap | 抓包 (ECAT 解析器) |
netstat -e / Get-NetAdapterStatistics | NIC 统计 |
netsh interface show interface | 绑定状态 |
Test-NetConnection (PowerShell) | TCP 连通性 |
ping / pathping / tracert | 基础连通 |
| EtherCAT 拓扑视图 (IDE 内置) | 物理拓扑 |
EtherCAT 诊断
协议栈特性
EtherCAT 使用 EtherType 0x88A4 直接在 Layer 2 运行, 不使用 IP。 这意味着:
ping无效 (没有 IP)- 路由器/交换机透传不保证时序 (应使用 EtherCAT 专用交换或直连)
- 抓包需要 Wireshark 安装 ECAT 解析插件
总线状态机
| 状态 | 名称 | 典型停留时间 | 说明 |
|---|---|---|---|
| Init | 初始化 | 启动后 <1s | 主站发现从站, 加载身份 |
| PreOP | 预运行 | <2s | 邮箱通信 (SDO) 可用, PDO 不通 |
| SafeOP | 安全运行 | <2s | PDO 输入可读, 输出冻结为安全值 |
| OP | 运行 | 稳定态 | 完整 PDO 交换, 正常生产 |
步骤 1: 查看 debug_info.txt
Get-Content "Darra_EtherCAT_Master\debug_info.txt" -Tail 500 |
Select-String -Pattern "\[ECAT\]"
预期输出 (正常):
[ECAT] EnumSlaves = 32
[ECAT] SII check OK, 32/32
[ECAT] FMMU/SM config OK
[ECAT] State Init -> PreOP : 980 ms, WKC=32
[ECAT] State PreOP -> SafeOP : 1240 ms, WKC=32
[ECAT] State SafeOP -> OP : 350 ms, WKC=32
[ECAT] OP stable, cycle=1ms, jitter p99=12μs
异常输出:
[ECAT] EnumSlaves = 31 <-- 实际少了一个从站
[ECAT] SII check FAIL at slave index 17, VendorID mismatch
[ECAT] State Init -> PreOP : TIMEOUT after 3000 ms, WKC=30
判定规则: EnumSlaves 实际值与 ENI 配置不一致 → 有从站掉线 or 被上一台站吃掉数据帧
→ 进入步骤 2 物理排查。
步骤 2: 物理拓扑检查
IDE 中打开 拓扑视图:
IDE → EtherCAT → 拓扑视图
每个从站的端口用颜色标示:
- 绿色 = Open (有帧经过)
- 黄色 = Closed (端口未使能)
- 红色 = LinkLost (线缆异常)
判定规则:
- 末站出现红色端口是正常 (不接东西就是红)
- 中间站出现红色端口 → 物理断链, 该站之后的从站全部掉线
- 末站 前一段红色 → 该站是"末尾", 前面线缆 OK
步骤 3: Wireshark 抓包
1. 打开 Wireshark, 选 EtherCAT 专用网卡
2. 过滤表达式: ecat
3. 复现故障, 抓 10~30 秒
4. 统计 → Protocol Hierarchy → 看 EtherCAT 占比
关键观察:
| 字段 | 正常 | 异常 | 判定 |
|---|---|---|---|
| 帧率 | 1000 帧/s (1ms 周期) | < 999 或 > 1001 | 调度异常 |
| WKC | 配置值 | 偏小 | 有从站未应答 |
| LRW / LRD / LWR | 按 ENI 配置 | 类型错 | 主站 bug |
| 帧长 | PDO Size ± 14 头 | 过短 | 被截断 |
步骤 4: WKC 深度分析
WKC (Working Counter) = 从站读或写 PDO 的累计计数, 主站每周期验证。
| 现象 | 根因 |
|---|---|
| WKC 恒小于配置值 1 | 某从站永不应答 (掉线) |
| WKC 偶发小于配置值 | 线缆 CRC 错误, 帧被丢 |
| WKC 大于配置值 | 主站 ENI 错误, 少算了一个从站 |
| WKC = 0 | 主站帧从未离开网卡 |
步骤 5: DC 同步检查
Distributed Clock (分布式时钟) 保证所有从站 SYNC0 中断同时触发, 精度要求 < 1μs。
IDE → EtherCAT → DC 同步监视
· 参考时钟从站: Slave[0] (ET1100)
· 补偿偏移: ±XX ns
· 漂移率: ±X ppm
判定规则:
- 偏移在 ±100ns 内 → DC 锁定良好
- 偏移持续 > 500ns → 参考从站时钟不稳, 或温度剧烈变化
- 漂移率 > 50 ppm → 换参考从站 (优先选温度稳定的)
TCP 诊断
常见场景
IDE ↔ Service 通讯、SDK 客户端 ↔ Service、Modbus TCP 客户端 ↔ Service。
步骤 1: 连通性
# 测试 Service 管理端口
Test-NetConnection -ComputerName 127.0.0.1 -Port 8848
# 输出示例
# TcpTestSucceeded : True
# PingSucceeded : True
# Latency (ms) : 1
步骤 2: 端口占用
# 谁在占 8848
Get-NetTCPConnection -LocalPort 8848 | Select-Object State, OwningProcess
Get-Process -Id <pid>
判定规则: 若非 Darra.PLC.Service.exe 占用 → 有冲突, 杀占用者或改端口。
步骤 3: 延迟/丢包
pathping -q 10 -n 192.168.1.10
判定规则: 工控内网任意两点延迟应 < 1ms, 丢包率 = 0%。若异常, 走 L1/L2 排查 (交换机链路灯 / 线缆)。
UDP / KCP 诊断
步骤 1: 端口与 MTU
# 查看网卡 MTU
Get-NetAdapterAdvancedProperty -Name "以太网" -DisplayName "*Jumbo*"
KCP 默认使用 1400 字节包, 大于 MTU 会被分片, 建议配置交换机 MTU = 9000 (Jumbo Frame)。
步骤 2: 丢包率
KCP 层面内置丢包重传统计:
IDE → 诊断 → 网络 → KCP 连接 → 详细
· 发送: 1 234 567 包
· 重传: 123 包 (0.01%)
· RTT: 平均 2ms / 最大 15ms
判定规则: 重传率 > 1% → 排查物理链路或主机负载。
Modbus TCP 诊断
步骤 1: Function Code 支持
Modbus 设备常用 FC:
- 0x03 Read Holding Register
- 0x04 Read Input Register
- 0x06 Write Single Register
- 0x10 Write Multiple Register
常见错误:
- Exception 0x01 Illegal Function → 设备不支持该 FC
- Exception 0x02 Illegal Address → 地址越界
- Exception 0x03 Illegal Data → 数据范围错
- Exception 0x04 Slave Device Failure → 设备内部错误
- Timeout → 网络或设备未响应
步骤 2: 抓包验证
Wireshark 过滤 tcp.port == 502, 观察请求/响应:
Client -> Server : Transaction=0001 Unit=01 FC=03 Addr=0000 Qty=0010
Server -> Client : Transaction=0001 Unit=01 FC=03 ByteCount=20 Data=...
NDIS 绑定核查
DarraRT EtherCAT 网卡上应只绑定 DarraRT_Eth 协议, 其他协议全部解绑。
步骤 1: 查看绑定
# 查看指定网卡的绑定
Get-NetAdapterBinding -Name "EtherCAT"
# 预期
# DisplayName Enabled
# --------- -------
# DarraRT_Eth Protocol True
# Internet Protocol Version 4 (TCP/IPv4) False
# Internet Protocol Version 6 (TCP/IPv6) False
# Link-Layer Topology Discovery Mapper I/O Driver False
# ...
步骤 2: 关闭多余协议
Disable-NetAdapterBinding -Name "EtherCAT" -ComponentID ms_tcpip
Disable-NetAdapterBinding -Name "EtherCAT" -ComponentID ms_tcpip6
Disable-NetAdapterBinding -Name "EtherCAT" -ComponentID ms_lltdio
Disable-NetAdapterBinding -Name "EtherCAT" -ComponentID ms_rspndr
判定规则: 绑定项越少 → 实时性越好, ECAT 帧处理路径越短。
异常模式速查表
| 现象 | 根因 | 定位方法 | 解决 |
|---|---|---|---|
| Init 无法到 PreOP | 从站数量不匹配 / ENI 错 | debug_info.txt EnumSlaves | 重新生成 ENI |
| PreOP 无法到 SafeOP | SM/FMMU 配置错 | 看 SDO 返回的 AbortCode | 对照 ESI 修正 |
| SafeOP 无法到 OP | DC 未锁定 / PDO 长度不符 | DC 偏移 / PDO 映射 | 调整周期或 PDO 映射 |
| OP 后 WKC 偶尔少 1 | 线缆 CRC | Wireshark 看 CRC 错误帧 | 换线 / 端接 |
| OP 后 WKC 恒少 1 | 某从站掉线 | 拓扑视图找红色端口 | 检查物理 |
| 周期抖动 > 100μs | NDIS 中断亲和错 | 看 ISR 核 | 绑定到隔离核 |
| TCP 超时 | 防火墙 / 端口错 | Test-NetConnection | 开白名单 |
| Modbus Exception 02 | 寄存器越界 | Wireshark Modbus 解析 | 对照设备手册 |
| UDP 分片 | MTU 不匹配 | ping -f -l 1472 | 开 Jumbo 或降 KCP 包 |
| 网卡错误计数 > 0 | 物理层 | Get-NetAdapterStatistics | 换线/换网卡 |
高级技巧
- ECAT Capture Filter: Wireshark 用
ether proto 0x88a4降到网卡层直接过滤, CPU 占用远低于全量抓包。 - 双网卡冗余: DarraRT 支持 Main + Redundant 双网卡, 一条断线 ≤ 250μs 切换, 抓包时注意分别抓两张网卡。
- 从站一致性校验: IDE 每次连接时自动对比
SII (EEPROM)与 ENI 的VendorID/ProductCode, 不一致会在debug_info.txt标SII check FAIL。 - NDIS 版本定位:
DarraRT_Eth.sys使用NDIS 6.50, 在 Windows 10 之前版本 OS 上会 加载失败, 看驱动层日志NDIS_VERSION_MISMATCH。
相关文档
