3. TwinCAT系统状态与错误码解析

在 TwinCAT 故障诊断中,最容易被忽视的不是“不会修”,而是“看错了信息”。同一个 ADS 通信失败,可能来自路由缺失、目标机未启动、PLC 停止或权限不足;同一个 EtherCAT 从站掉线,可能是线缆、拓扑、DC 同步或看门狗触发。要快速定位,必须把四类信息源分开理解:ADS 错误码回答“通信与请求为什么失败”,EtherCAT 状态机回答“从站处于哪个链路阶段”,PLC 运行时错误回答“程序执行时发生了什么异常”,系统事件日志回答“操作系统与 TwinCAT 服务层面记录了什么”。

下面这张图给出四类信息源在诊断链路中的位置与相互关系,可作为后续分析的定位地图。

TwinCAT 故障诊断四类信息源定位图 ADS 通信层 错误码 = 0x + 主码 + 子码 0x0000 成功 / 0x0700 路由 0x0709 目标机不可达 0x070C 端口未打开 / 权限 EtherCAT 状态机 Init → PreOp → SafeOp → Op 状态码 0x0011 无效请求 0x001A 同步错误 / DC 0x0024 看门狗超时 PLC 运行时错误 异常类型 + 任务 + 行号 除零 / 数组越界 看门狗 / 循环超时 指针非法 / 栈溢出 Windows 事件查看器 / TwinCAT 系统事件日志 来源:TcSysSrv、TcRouter、TwinCAT Real-Time、EtherCAT Master 级别:错误 / 警告 / 信息 → 时间戳 + 来源 + 事件 ID + 描述 典型事件:路由建立失败、实时网卡丢包、从站配置不匹配 作用:提供时间线,判断“先发生什么、后发生什么” 诊断顺序建议:先看事件日志时间线 → 再查 ADS 错误码 → 最后核对 EtherCAT 状态与 PLC 异常

ADS 错误码:先分清“谁在拒绝请求”

ADS 错误码通常以十六进制显示,例如 0x0709。高位部分表示错误类别,低位部分表示具体原因。实际排查时,不要只记数字,而要按“类别”判断责任方:0x07xx 属于 ADS 路由与连接类,说明请求根本没有到达目标;0x08xx 属于 ADS 服务类,说明目标收到了请求但拒绝执行;0x09xx 属于 ADS 端口类,说明端口未打开或权限不足。

以 0x0709(目标机不可达)为例,常见原因有三类:一是本机与目标机之间没有建立 ADS 路由;二是目标机 TwinCAT 系统服务未运行;三是防火墙拦截了 TCP 48898 或 UDP 48899。排查时先在开发机上执行 ping 确认网络可达,再在 TwinCAT 系统托盘图标中查看路由是否显示为“已连接”。如果路由存在但仍报 0x0709,则检查目标机是否处于 Config 模式而非 Run 模式,因为部分 ADS 服务在 Config 模式下不会响应。

再看 0x070C(端口未打开)。它通常出现在 PLC 程序尚未下载、PLC 运行时未启动,或目标端口号写错时。例如调用 TC3_PLC_System 的 851 端口,但实际 PLC 运行在 852 端口,就会返回该错误。此时应打开 TwinCAT 的“路由与端口”查看实际端口分配,而不是反复重启。

EtherCAT 状态机:从 Init 到 Op 的每一步都有含义

EtherCAT 从站上电后依次经历 Init → PreOp → SafeOp → Op 四个状态。每个状态转换都有明确的检查条件,失败时主站会记录状态码。理解这些状态,比记住错误码更重要。

  • Init → PreOp:主站读取从站 EEPROM 和基本信息。失败常见于从站未上电、ESI 文件不匹配或拓扑顺序错误。
  • PreOp → SafeOp:主站配置过程数据映射和同步管理器。失败常见于 PDO 配置冲突、DC 同步参数不一致。
  • SafeOp → Op:从站开始输出过程数据。失败常见于看门狗超时、输入数据无效或 DC 漂移过大。

状态码 0x001A 表示同步错误,通常与分布式时钟(DC)有关。例如从站参考时钟与主站时钟偏差超过允许窗口,或 DC 模式设置不一致。此时应检查从站是否支持 DC、是否启用了“DC 模式”,以及 Sync0 周期是否与任务周期匹配。状态码 0x0024 表示看门狗超时,说明从站在规定时间内没有收到有效过程数据帧,常见于网线接触不良、交换机拥塞或主站任务周期过长。

PLC 运行时错误:定位到任务与行号

PLC 运行时错误与 ADS、EtherCAT 不同,它发生在程序执行阶段。TwinCAT 3 会在“PLC 运行时错误”窗口中显示异常类型、任务名称、程序名和行号。常见类型包括:

  • 除零:整数除法中分母为 0,例如 nResult := nA / nB; 且 nB = 0。
  • 数组越界:索引超出声明范围,例如数组声明为 ARRAY[0..9],却访问了 arr[10]。
  • 看门狗超时:任务执行时间超过设定阈值,通常由死循环或过长循环引起。
  • 指针非法:访问了未初始化或已释放的指针。

排查时先看行号,再结合调用栈判断是哪个功能块触发。如果是看门狗超时,应检查该任务周期与程序执行时间是否匹配。例如任务周期设为 1 ms,但程序中有 5 ms 的循环,就会触发看门狗。此时要么优化程序,要么调整任务周期,但调整周期前必须确认 EtherCAT 从站和 DC 同步是否允许。

系统事件日志:建立时间线,判断先后顺序

Windows 事件查看器中的 TwinCAT 日志,是判断“谁先出问题”的关键。常见来源包括 TcSysSrv(系统服务)、TcRouter(路由服务)、TwinCAT Real-Time(实时网卡)和 EtherCAT Master。每条事件包含时间戳、级别、来源、事件 ID 和描述。

例如,若日志中先出现“实时网卡丢包”,再出现“EtherCAT 从站看门狗超时”,最后出现“ADS 通信失败”,那么根因在网卡丢包,而不是 ADS 或 PLC。反之,若先出现“路由建立失败”,再出现“ADS 0x0709”,则根因在路由配置。建议按以下顺序读取:先按时间排序,再筛选“错误”级别,最后对照 ADS 错误码和 EtherCAT 状态码交叉验证。

实用判断口诀:ADS 看“通不通”,EtherCAT 看“到没到 Op”,PLC 看“哪一行”,事件日志看“谁先谁后”。四者交叉,才能避免只修表面现象。

一个综合排查示例

假设现场现象为:HMI 上某个变量不更新,PLC 程序仍在运行。排查过程如下:

  1. 打开事件查看器,筛选 TwinCAT 来源,发现 10:23:15 有“EtherCAT 从站 3 看门狗超时”,10:23:16 有“ADS 0x0709”。
  2. 判断根因在 EtherCAT 从站 3,而非 ADS。因为 ADS 错误发生在 EtherCAT 错误之后。
  3. 检查从站 3 的网线,发现水晶头松动。重新插紧后,从站状态从 SafeOp 恢复到 Op。
  4. 观察 PLC 变量恢复更新,ADS 错误不再出现。

这个示例说明:错误码本身不是结论,时间线和状态转换才是定位依据。先看事件日志建立顺序,再用 ADS 错误码确认通信层,最后用 EtherCAT 状态机和 PLC 运行时错误确认具体对象,才能形成完整的诊断闭环。