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 的常用位定义如下,读取后按位判断动子当前处于哪种状态:

位名称含义
0Ready驱动就绪,可接受运动指令
1Enabled动子已使能,处于闭环控制
2InPosition动子已到达目标位置
3Moving动子正在运动
4Error动子存在故障
5Warning动子存在警告

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 上的显示结果:

XTS 电机模块 EtherCAT 从站 过程数据上传 位置 / 速度 / 状态字 EtherCAT PLC 过程映像 起始地址 16#1000 动子1: 偏移 +0 动子2: 偏移 +16 动子3: 偏移 +32 动子4: 偏移 +48 读取 ST_XtsMoverState 数组 nMoverId fPosition (mm) fVelocity (mm/s) wStatusWord bEnabled / bInPosition / bError 状态字位判读 bit0 Ready → 驱动就绪 bit1 Enabled → 闭环使能 bit2 InPosition → 到位 bit4 Error → 故障 HMI 状态监控画面 动子1: 位置 125.3 mm | 速度 0.0 mm/s | 绿色 动子2: 位置 340.7 mm | 速度 250.0 mm/s | 绿色 动子3: 位置 0.0 mm | 速度 0.0 mm/s | 红色(故障) 汇总判断 bAnyMoverError nActiveMovers 遍历判断

验证与判读要点

  • 在线模式下观察 aMoverState 数组,确认每个动子的 fPosition 随手动推动动子而变化,说明过程数据映射正确。
  • 检查 wStatusWord 的 bit1 是否为 1,若为 0 则动子未使能,HMI 上应显示灰色或黄色。
  • 人为触发一个动子故障(如断开使能),确认 bAnyMoverError 变为 TRUE,HMI 汇总指示变红。
  • 若所有动子位置始终为 0,优先检查过程数据起始地址与每动子字节数是否与 XTS 配置一致。
过程数据地址与字节数必须与 XTS 配置中的映射表严格一致。不同固件版本或不同轨道配置下,每个动子的过程数据长度可能不同,不能直接套用示例中的 16 字节。