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 - 全局变量