3. TwinCAT系统状态与错误码解析
在 TwinCAT 故障诊断中,最容易被忽视的不是“不会修”,而是“看错了信息”。同一个 ADS 通信失败,可能来自路由缺失、目标机未启动、PLC 停止或权限不足;同一个 EtherCAT 从站掉线,可能是线缆、拓扑、DC 同步或看门狗触发。要快速定位,必须把四类信息源分开理解:ADS 错误码回答“通信与请求为什么失败”,EtherCAT 状态机回答“从站处于哪个链路阶段”,PLC 运行时错误回答“程序执行时发生了什么异常”,系统事件日志回答“操作系统与 TwinCAT 服务层面记录了什么”。
下面这张图给出四类信息源在诊断链路中的位置与相互关系,可作为后续分析的定位地图。
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 状态码交叉验证。
一个综合排查示例
假设现场现象为:HMI 上某个变量不更新,PLC 程序仍在运行。排查过程如下:
- 打开事件查看器,筛选 TwinCAT 来源,发现 10:23:15 有“EtherCAT 从站 3 看门狗超时”,10:23:16 有“ADS 0x0709”。
- 判断根因在 EtherCAT 从站 3,而非 ADS。因为 ADS 错误发生在 EtherCAT 错误之后。
- 检查从站 3 的网线,发现水晶头松动。重新插紧后,从站状态从 SafeOp 恢复到 Op。
- 观察 PLC 变量恢复更新,ADS 错误不再出现。
这个示例说明:错误码本身不是结论,时间线和状态转换才是定位依据。先看事件日志建立顺序,再用 ADS 错误码确认通信层,最后用 EtherCAT 状态机和 PLC 运行时错误确认具体对象,才能形成完整的诊断闭环。