跳转至

Status 状态读取

通过 Controller.Commands.Status 访问轴状态、任务状态和系统状态。

AxisStatusSignal 常用项

AxisStatusSignal 枚举定义所有可读取的状态项编号。部分项标记为 [EditorBrowsable(Never)],表示在 IDE 属性浏览器中不显示,但 API 仍可使用。

枚举值 编号 说明
PositionFeedback 0 位置反馈(编码器值)
PositionCommand 1 位置指令值
PositionError 2 位置误差(指令-反馈)
VelocityFeedback 3 速度反馈
VelocityCommand 4 速度指令
VelocityError 5 速度误差
AccelerationCommand 6 加速度指令
CurrentFeedback 7 电流反馈(q轴电流)
CurrentCommand 8 电流指令
CurrentError 9 电流误差
AnalogInput0 10 模拟输入 0
AnalogInput1 11 模拟输入 1
DigitalInput 15 数字输入
DigitalOutput 16 数字输出
DriveStatus 47 驱动器状态字
AxisStatus 48 轴状态字
AxisFault 49 轴故障字
VelocityFeedbackAverage 72 速度反馈(平均)
CurrentFeedbackAverage 73 电流反馈(平均)

StatusCommands 方法

AxisStatus

public double AxisStatus(string Axis, AxisStatusSignal DataItem)
public double AxisStatus(int Axis, AxisStatusSignal DataItem)
public double AxisStatus(string Axis, AxisStatusSignal DataItem, int AdditionalData)
public double AxisStatus(int Axis, AxisStatusSignal DataItem, int AdditionalData)

读取指定轴的指定状态项。AdditionalData 参数用于扩展状态项(如需要额外索引时)。

返回值double 类型的值(具体含义取决于 DataItem)。

TaskStatus

public double TaskStatus(TaskId Task, TaskStatusSignal DataItem)
public double TaskStatus(TaskId Task, TaskStatusSignal DataItem, int AdditionalData)

读取指定任务的状态项。

AxisStatus 状态字位

AxisStatus 类封装轴状态字的位解析。轴状态字是 32 位整数,通过位测试获取各标志位状态。

属性 位值 说明
Homed 0x1 轴已完成回零
Homing 0x10 轴正在回零
Jogging 0x100 轴处于 Jog 模式
MoveDone 0x400000 轴运动完成
NotVirtual 0x2000 轴为真实物理轴
CalibrationEnabled1D 0x4000 一维校准已启用
PcoArmed 0x10000000 PCO 已武装

转换为 int

AxisStatus 支持显式转换为 int,获取原始状态字值:

double raw = controller.Commands.Status.AxisStatus("X", AxisStatusSignal.AxisStatus);
int statusWord = (int)raw;
bool done = (statusWord & 0x400000) != 0;

MoveDone 轮询模式

以下代码演示典型的 MoveDone 轮询等待模式:

private const long MoveDoneBit = 0x400000;

private static void WaitForMoveDone(Controller controller, string axis, int timeoutMs = 30000)
{
    int elapsed = 0;
    while (elapsed < timeoutMs)
    {
        double status = controller.Commands.Status.AxisStatus(axis, AxisStatusSignal.AxisStatus);
        if (((long)status & MoveDoneBit) != 0)
            return;
        Thread.Sleep(50);
        elapsed += 50;
    }
    throw new TimeoutException($"Move done timeout on axis {axis}.");
}

// 使用
controller.Commands.Motion.MoveAbs("X", 10.0, 10.0);
WaitForMoveDone(controller, "X");

相关页面

  • Commands - 命令树完整结构
  • Variables - 全局变量