4. 动子位置读取与状态监控

XTS 的动子(Mover)在轨道上运动时,PLC 侧真正能“看见”的并不是动子本身,而是每个动子周期性刷新到过程映像中的一组过程数据。TwinCAT 通过 XTS 功能组件(TF5850)把这些数据映射成可读写的 PLC 变量,典型包括位置、速度、加速度、状态字以及错误码。本节的核心任务,就是把这些变量读出来,并据此判断动子是否在线、是否处于正常状态,并在异常时给出报警。

一、动子过程数据的来源与结构

在 TwinCAT 中,XTS 系统由 AXS 或 XTS 功能对象管理,每个动子对应一个过程数据槽位。以常见的 ITcXtsMover 接口为例,PLC 侧通常通过结构体数组访问,例如:

TYPE ST_MoverData :
STRUCT
    bOnline      : BOOL;      // 动子是否在线
    nPosition    : LREAL;     // 位置,单位 mm
    nVelocity    : LREAL;     // 速度,单位 mm/s
    nAcceleration: LREAL;     // 加速度,单位 mm/s²
    wStatusWord  : WORD;      // 状态字
    wErrorCode   : WORD;      // 错误码
END_STRUCT
END_TYPE

位置、速度、加速度都是浮点量,单位由系统配置决定,常见为 mm、mm/s、mm/s²。状态字是位域,每一位代表一种状态或故障,例如 bit0 表示使能,bit1 表示运动,bit2 表示到位,bit8 表示过温,bit9 表示位置偏差过大等。错误码则是更具体的故障编号,用于定位问题。

需要特别说明的是:位置是相对于轨道坐标系的绝对位置,速度的正负号表示运动方向,加速度的正负号表示加速或减速。这些约定在后续监控程序中必须保持一致,否则判断逻辑会出错。

二、读取动子数据的实现方式

在 PLC 程序中,读取动子数据通常有两种方式:一是直接访问 XTS 功能块输出的过程数据数组;二是通过 Tc2_Xts 库提供的读取函数。无论哪种方式,关键都是把动子编号与数组下标对应起来。例如,系统中有 8 个动子,编号 0~7,则数组下标即为动子编号。

下面是一段典型的读取与监控程序框架,使用结构化文本(ST)编写:

FOR i := 0 TO 7 DO
    stMover[i].bOnline      := aXtsMover[i].bOnline;
    stMover[i].nPosition    := aXtsMover[i].nPosition;
    stMover[i].nVelocity    := aXtsMover[i].nVelocity;
    stMover[i].nAcceleration:= aXtsMover[i].nAcceleration;
    stMover[i].wStatusWord  := aXtsMover[i].wStatusWord;
    stMover[i].wErrorCode   := aXtsMover[i].wErrorCode;
END_FOR

这段代码把 XTS 过程数据复制到自定义结构体数组中,便于后续统一处理。复制动作本身不改变数据,但让程序结构更清晰,也方便在监控画面中绑定变量。

三、状态监控程序的编写

状态监控的核心是“判断条件 + 报警输出”。判断条件包括:动子是否在线、状态字是否异常、错误码是否非零、速度或加速度是否超出合理范围。报警输出则可以是布尔量、报警号或写入报警数组。

以下是一个动子在线检测与异常报警的示例逻辑:

FOR i := 0 TO 7 DO
    // 在线检测
    IF NOT stMover[i].bOnline THEN
        bAlarm[i] := TRUE;
        nAlarmCode[i] := 100 + i;   // 100 系列:动子离线
    END_IF

    // 错误码检测
    IF stMover[i].wErrorCode <> 0 THEN
        bAlarm[i] := TRUE;
        nAlarmCode[i] := 200 + i;   // 200 系列:动子故障
    END_IF

    // 状态字异常位检测
    IF (stMover[i].wStatusWord AND 16#0300) <> 0 THEN
        bAlarm[i] := TRUE;
        nAlarmCode[i] := 300 + i;   // 300 系列:过温或位置偏差
    END_IF

    // 速度超限检测
    IF ABS(stMover[i].nVelocity) > 3000.0 THEN
        bAlarm[i] := TRUE;
        nAlarmCode[i] := 400 + i;   // 400 系列:速度超限
    END_IF
END_FOR

这里 16#0300 是掩码,用于同时检查 bit8 和 bit9。如果状态字中这两位任意一位为 1,就触发报警。速度阈值 3000 mm/s 是示例值,实际应根据机械设计和工艺要求设定。

四、异常报警与在线检测的工程要点

报警不是简单地把布尔量置位,还需要考虑去抖、复位和分级。动子离线可能是通信瞬时中断,也可能是动子真的掉电或脱落。如果一检测到离线就立即停机,可能造成误报。因此,通常需要加入延时确认,例如连续 3 个 PLC 周期都检测到离线才触发报警。

报警复位也需要设计。对于可恢复故障(如速度超限),可以在动子恢复正常后自动复位;对于不可恢复故障(如错误码非零),则需要人工确认后手动复位。报警号的设计应具有可读性,例如 100 系列表示离线,200 系列表示故障,300 系列表示状态异常,400 系列表示超限,这样在 HMI 上可以快速定位问题类型。

此外,状态监控程序应独立于运动控制程序运行,避免因运动控制逻辑复杂而影响监控实时性。通常把监控放在一个单独的任务中,周期设为 1~10 ms,确保能及时捕捉异常。

XTS 动子位置读取与状态监控数据流 XTS 轨道(Track) M0 M1 M2 M3 M4 PLC 过程数据(Process Data) nPosition 位置 (mm) nVelocity 速度 (mm/s) nAcceleration 加速度 (mm/s²) wStatusWord 状态字 (WORD) wErrorCode 错误码 (WORD) 状态监控逻辑(判断条件) bOnline = FALSE? wErrorCode ≠ 0? 状态字异常位? 速度超限? 报警输出:bAlarm[i] + nAlarmCode[i] 动子过程数据 监控判断条件 报警输出 PLC 过程数据

五、监控程序的调试与验证

编写完监控程序后,需要验证其正确性。最直接的方法是在 TwinCAT 的在线视图中观察每个动子的过程数据,手动触发异常条件,检查报警是否按预期置位。例如,可以临时把速度阈值改小,让正常运动的动子触发速度超限报警,确认报警号和复位逻辑正确。

另一个重要验证点是动子离线检测。可以在系统运行中拔掉一个动子的通信线(如果硬件允许),观察 bOnline 是否变为 FALSE,报警是否在延时后触发。如果没有条件做硬件测试,也可以在程序中临时强制 bOnline := FALSE,模拟离线状态。

调试时建议把每个动子的关键数据记录到数组或日志中,便于事后分析。例如,记录报警发生时刻的位置、速度、状态字和错误码,这些信息对定位故障原因非常有帮助。

六、常见问题与处理建议

实际工程中,动子状态监控常遇到以下问题:一是数据刷新周期与监控任务周期不匹配,导致读取到旧数据;二是状态字位定义与文档不一致,导致误判;三是报警复位逻辑不完善,导致报警无法清除。处理建议是:监控任务周期应小于等于 XTS 过程数据刷新周期;状态字位定义以实际系统文档为准,必要时用示波器或在线视图逐位验证;报警复位应区分自动和手动,并加入确认机制。

通过本节的位置读取与状态监控程序,PLC 可以实时掌握每个动子的在线状态、运动参数和故障信息,为后续的站点控制、路径规划和异常处理提供可靠的数据基础。