2. XTS 动子位置读取与状态监控
XTS 动子状态数据从哪里来
XTS 系统中,每个动子(Mover)的位置、速度与状态字由电机模块通过 EtherCAT 过程数据周期性上传。TwinCAT 3 中通常使用 AX5000 或 AX8000 系列驱动配合 XTS 专用功能块,将每个动子的过程数据映射到 PLC 的输入过程映像区。读取前需要确认三件事:
- XTS 系统已通过
TC3 XTS库或XTS功能块完成初始化,动子数量与轨道配置与例1扫描结果一致。 - 每个动子的过程数据在 EtherCAT 过程映像中有固定偏移,偏移量由 XTS 配置决定,不能凭经验猜测。
- 位置与速度的物理单位由驱动参数决定,常见为
mm与mm/s,读取后需按实际单位换算。
过程数据映射与读取结构
XTS 动子的过程数据通常以数组形式组织,每个动子占一段连续字节。以下结构体用于承载单个动子的实时数据,字段与 XTS 过程数据一一对应:
TYPE ST_XtsMoverState :
STRUCT
nMoverId : INT; // 动子编号,从 1 开始
fPosition : LREAL; // 当前位置,单位 mm
fVelocity : LREAL; // 当前速度,单位 mm/s
wStatusWord : WORD; // 状态字,位定义见下表
bEnabled : BOOL; // 使能状态
bInPosition : BOOL; // 到位标志
bError : BOOL; // 故障标志
END_STRUCT
END_TYPE
状态字 wStatusWord 的常用位定义如下,读取后按位判断动子当前处于哪种状态:
| 位 | 名称 | 含义 |
|---|---|---|
| 0 | Ready | 驱动就绪,可接受运动指令 |
| 1 | Enabled | 动子已使能,处于闭环控制 |
| 2 | InPosition | 动子已到达目标位置 |
| 3 | Moving | 动子正在运动 |
| 4 | Error | 动子存在故障 |
| 5 | Warning | 动子存在警告 |
PLC 读取程序
以下程序在 MAIN 中循环执行,将过程映像中的原始数据转换为结构体数组,并计算动子数量与在线状态。假设过程数据起始地址为 nXtsBaseAddr,每个动子占 16 字节:
PROGRAM MAIN
VAR
nXtsBaseAddr : UINT := 16#1000; // XTS 过程数据起始地址(示例值)
nMoverCount : INT := 4; // 动子数量,与例1扫描结果一致
aMoverState : ARRAY[1..4] OF ST_XtsMoverState;
nIndex : INT;
pMoverData : POINTER TO BYTE;
nOffset : UINT;
END_VAR
FOR nIndex := 1 TO nMoverCount DO
nOffset := nXtsBaseAddr + UINT_TO_UINT((nIndex - 1) * 16);
pMoverData := ADR(nOffset);
aMoverState[nIndex].nMoverId := nIndex;
aMoverState[nIndex].fPosition := WORD_TO_LREAL(pMoverData^) * 0.001; // 原始值 0.001 mm/LSB
aMoverState[nIndex].fVelocity := WORD_TO_LREAL((pMoverData + 4)^) * 0.001;
aMoverState[nIndex].wStatusWord := (pMoverData + 8)^;
aMoverState[nIndex].bEnabled := (aMoverState[nIndex].wStatusWord AND 16#0002) <> 0;
aMoverState[nIndex].bInPosition := (aMoverState[nIndex].wStatusWord AND 16#0004) <> 0;
aMoverState[nIndex].bError := (aMoverState[nIndex].wStatusWord AND 16#0010) <> 0;
END_FOR
上述地址
16#1000、每动子 16 字节、0.001 mm/LSB 均为教学示例值。实际项目中必须根据 XTS 配置中的过程数据映射表填写,不能直接照搬。状态监控与 HMI 显示
读取到的结构体数组可直接绑定到 HMI 变量。建议在 HMI 上为每个动子显示以下字段:动子编号、当前位置、当前速度、使能状态、到位标志、故障标志。位置与速度建议以数值显示并保留 1 位小数,状态用颜色区分:绿色表示使能且无故障,黄色表示警告,红色表示故障。
为了在 HMI 上快速判断整条输送线是否正常,可增加一个汇总变量:
VAR_GLOBAL
bAnyMoverError : BOOL;
nActiveMovers : INT;
END_VAR
bAnyMoverError := FALSE;
nActiveMovers := 0;
FOR nIndex := 1 TO nMoverCount DO
IF aMoverState[nIndex].bError THEN
bAnyMoverError := TRUE;
END_IF;
IF aMoverState[nIndex].bEnabled THEN
nActiveMovers := nActiveMovers + 1;
END_IF;
END_FOR
数据流与状态判读
下图展示从 XTS 电机模块到 HMI 的完整数据流,以及状态字各位如何决定 HMI 上的显示结果:
验证与判读要点
- 在线模式下观察
aMoverState数组,确认每个动子的fPosition随手动推动动子而变化,说明过程数据映射正确。 - 检查
wStatusWord的 bit1 是否为 1,若为 0 则动子未使能,HMI 上应显示灰色或黄色。 - 人为触发一个动子故障(如断开使能),确认
bAnyMoverError变为 TRUE,HMI 汇总指示变红。 - 若所有动子位置始终为 0,优先检查过程数据起始地址与每动子字节数是否与 XTS 配置一致。
过程数据地址与字节数必须与 XTS 配置中的映射表严格一致。不同固件版本或不同轨道配置下,每个动子的过程数据长度可能不同,不能直接套用示例中的 16 字节。