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,确保能及时捕捉异常。
五、监控程序的调试与验证
编写完监控程序后,需要验证其正确性。最直接的方法是在 TwinCAT 的在线视图中观察每个动子的过程数据,手动触发异常条件,检查报警是否按预期置位。例如,可以临时把速度阈值改小,让正常运动的动子触发速度超限报警,确认报警号和复位逻辑正确。
另一个重要验证点是动子离线检测。可以在系统运行中拔掉一个动子的通信线(如果硬件允许),观察 bOnline 是否变为 FALSE,报警是否在延时后触发。如果没有条件做硬件测试,也可以在程序中临时强制 bOnline := FALSE,模拟离线状态。
调试时建议把每个动子的关键数据记录到数组或日志中,便于事后分析。例如,记录报警发生时刻的位置、速度、状态字和错误码,这些信息对定位故障原因非常有帮助。
六、常见问题与处理建议
实际工程中,动子状态监控常遇到以下问题:一是数据刷新周期与监控任务周期不匹配,导致读取到旧数据;二是状态字位定义与文档不一致,导致误判;三是报警复位逻辑不完善,导致报警无法清除。处理建议是:监控任务周期应小于等于 XTS 过程数据刷新周期;状态字位定义以实际系统文档为准,必要时用示波器或在线视图逐位验证;报警复位应区分自动和手动,并加入确认机制。
通过本节的位置读取与状态监控程序,PLC 可以实时掌握每个动子的在线状态、运动参数和故障信息,为后续的站点控制、路径规划和异常处理提供可靠的数据基础。