跳转至

回零功能

1.1 简介

本章主要介绍运动控制器的标准回零功能,又称Standard Home。Standard Home是根据《BS EN 61800-7-201:2008》标准,实现了基于CANOpen的驱动电机的36种回零方式,把原来较为繁琐的回零过程固化到控制器,只需要调用简单指令就能够实现回原点,简化了用户程序。

1.2 指令说明

Standard Home功能指令列表

指令 说明
GTN_ExecuteStandardHome 启动Standard Home实现各种方式回原点。
GTN_GetStandardHomePrm 读取设置到控制器的Standard Home回原点参数。
GTN_GetStandardHomeStatus 读取Standard Home回原点的状态。

1.3 重点说明

1. 所有回零操作认为正限位是在规划位置不断增加的方向,负限位是在规划位置不断减小的方向,例如:规划运动从0(脉冲)运动到1000(脉冲),即为朝着正限位方向,规划运动从0(脉冲)运动到-1000(脉冲),即为朝着负限位方向。

2. 回零前控制器会自动清零当前位置,回零完成后是否需要自动清零,可以在调用GTN_ExecuteStandardHome指令启动回零时通过参数设置来决定是否自动清零控制器的规划位置和编码器的实际位置。

3. 由于不同电机的响应特性不一致,规划停止运动后,电机到位的时间也不一致,因此就需要用户根据实际电机的跟随特性来设置相关参数判断电机是否到位。判断电机到位的方式有两种:

(1) 根据到位延迟周期判断。用户可以设置规划到位后,再等多少周期后,再取判断编码器是否到位,认为编码器到位的条件是规划位置和编码器位置差值不大于5个脉冲。

(2) 根据编码器到位误差带及到位持续周期进行判断,用户通过GTN_SetAxisBand指令设置编码器到位误差带及到位持续周期,规划到位后,判断编码器进入误差带并持续相应的周期数,认为编码器到位。

用户通过GTN_ExecuteStandardHome指令中的参数选择其中一种即可。

4. 回零过程中如果规划器和编码器方向相反或者当量不一致,即电机到位后,通过GTN_GetPrfPos获取的规划位置和GTN_GetEncPos获取的编码器位置值偏差不在合理的范围内(一般为1~2个脉冲),则回零会失败。用户可以通过执行一段微小运动等电机到位时调用上述两条指令查看相关位置的偏差情况,也可以通过回零时设置自检参数让控制器自行判断(自检时也需要设置相关参数判断电机是否到位)。

(1) 如果编码器方向和规划器方向相反,可通过MotionStudio工具软件“控制器配置” → “编码器”(如图所示)设置正确的方向,生成配置文件,然后调用GTN_LoadConfig下载配置文件使设置生效。或直接调用指令GTN_SetSense设置使得两者方向一致。

设置编码器方向

(2) 如果编码器位置和规划器位置的脉冲当量不一致,建议取消控制器当量配置,通过驱动器设置脉冲当量。

5. 上述第2项和第4项中,控制器可以完成“自动清零”和“自检”。启用了 “自动清零”和“自检”,又没有设置判断电机到位相关参数,控制器会报错。如果用户对电机响应特性并不是很了解,建议不要使用“自动清零”或“自检”功能。设置判断电机到位的参数有2种方法:

(1) 调用GTN_ExecuteStandardHome设置了motorStopDelay参数。

(2) 调用GTN_SetAxisBand设置电机到位误差带。

6. 回零时要查看回零状态,如果发现电机不动了,并已经运动到设定的位置,但是回零状态没有显示回零完成,请检查Home开关和限位开关等硬件接线是否异常。

7. 关于Home及限位开关的触发边沿,用户配置好Home、限位开关的电平后,不需要考虑上升沿、下降沿,控制器根据配置及回零模式自动设置。上述涉及的正边沿、负边沿与上升沿、下降沿不是同一个概念,它们不考虑电平的高低,仅仅是指传感器的左右两侧,默认运动为负方向的一边为负边沿,运动正方向的一边为正边沿。

8. 常开与常闭,如果Home开关为常开,则选择Home DI的reverse应该为1;如果Home开关为常闭,则选择Home DI的reverse应该为0。从站DI默认低电平有效(无论上位机配置的DI取反与否),因此Home开关触发时,电平由高变为低,为下降沿触发;离开Home开关时,电平由低变成高,为上升沿触发,如表所示。

Home开关电平详细说明

Home类型 reverse设置 触发时的沿 离开时的沿
常开 1 下降沿 上升沿
常闭 0 下降沿 上升沿

9. 上述回零方式中,触发反向或停止时所使用的减速度为通过规划器设置的轴急停减速度,用户可以通过MotionStudio的“控制器配置”页的“停止类型”项设置并保存成配置文件,调用GTN_LoadConfig下载配置文件使之生效,或在程序里面直接调用GTN_SetStopDec指令来设置。

设置停止类型参数

1.4 回零方式详细说明

控制器现有回零方式对应的硬件触发信号如下表所示,用户可根据实际需求选择合适的回零方式。

回零方式 回零硬件信号
方式1 负限位+Index
方式2 正限位+Index
方式3方式4方式5方式6 Home+Index
方式7方式8方式9方式10 Home+正限位+Index
方式11方式12方式13方式14 Home+负限位+Index
方式17 负限位
方式18 正限位
方式19方式20方式21方式22 Home
方式23方式24方式25方式26 Home+正限位
方式27方式28方式29方式30 Home+负限位
方式33方式34 Index

1.4.1 回零方式1

负向运动,不考虑Home开关,离开负限位后的第一个Index为零位。

1. 如果负限位没有触发,则往负向运动,触发到限位后反向运动,直到离开负限位后,第一个Index的位置就是零位(图示中负限位为高电平触发)。

2. 如果刚开始就处于负限位上,则直接往正向运动,直到离开负限位后,第一个Index的位置就是零位。

1.4.2 回零方式2

正向运动,不考虑Home开关,离开正限位后的第一个Index为零位。

1. 如果正限位没有触发,则往正向快速运动,触发到限位后低速反向运动,直到离开正限位后,第一个Index的位置就是零位。

2. 如果刚开始就处于正限位上,则直接往负向运动,直到离开正限位后,第一个Index的位置就是零位。

1.4.3 回零方式3

正向运动,Home左侧边沿的左侧第一个Index为零点。

1. Home未触发时,正向运动,Home左侧边沿触发后运动到触发位置,再向负向运动,碰到的第一个Index信号为零点。

启动回零时,Home未触发,捕获Home上升沿(用户可修改),捕获到Home开关,并停到捕获位置后,启动运动向Home的左侧(即负向)寻找Index,最终停在Index位置上。如图所示。

2. 如果刚开始就处于Home开关上,则往负向运动,Home左侧边沿触发后运动到触发位置,再向负向运动,碰到的第一个Index信号为零点。

3. 如果刚开始就处于正限位上,则无法运动,系统报错。

1.4.4 回零方式4

正向运动,Home+index,Home左侧边沿的右侧第一个Index为零点。

1. Home未触发时,正向运动,Home左侧边沿触发后运动到触发位置,再向正向运动,碰到的第一个Index信号为零点。

2. Home触发时,负向运动,Home左侧边沿触发后运动到触发位置,再向正向运动,碰到的第一个index信号为零点。

3. 如果刚开始就处于正限位上,则无法运动,系统报错。

1.4.5 回零方式5

负向运动,Home+Index,Home右侧边沿的右侧第一个Index为零点。

1. Home未触发时,负向运动,Home右侧边沿触发后运动到触发位置,再向正向运动,碰到的第一个Index信号为零点。

2. Home触发时,正向运动,Home右侧边沿触发后运动到触发位置,再向正向运动,碰到的第一个Index信号为零点。

3. 如果刚开始就处于负限位上,则无法运动,系统报错。

1.4.6 回零方式6

负向运动,Home+Index,Home右侧边沿的左侧第一个Index为零点。

1. Home未触发时,负向运动,Home右侧边沿触发后运动到触发位置,再向负向运动,碰到的第一个Index信号为零点。

2. Home触发时,正向运动,Home右侧边沿触发后运动到触发位置,再向负向运动,碰到的第一个Index信号为零点。

3. 如果刚开始就处于负限位上,则无法运动,系统报错。

1.4.7 回零方式7

正向运动,Home+正限位+Index,Home信号左侧边沿的左侧第一个Index为零点。

1. Home和正限位均未触发,轴正向运动,Home左侧边沿先触发后回到触发位置后负向运动,Home左侧边沿的左侧的第一个index信号为零点。

2. Home、正限位未触发,轴正向运动,正限位先触发后负向运动,Home左侧边沿先触发后回到触发位置后负向运动,Home左侧边沿的左侧的第一个Index信号为零点。

3. Home触发,正限位未触发,轴负向运动,Home左侧边沿触发后回到触发位置后负向运动,Home左侧边沿的的左侧的第一个Index信号为零点。

4. Home未触发,正限位触发,轴负向运动,Home左侧边沿触发后回到触发位置后负向运动,Home左侧边沿的的左侧的第一个Index信号为零点。

1.4.8 回零方式8

正向运动,Home+正限位+Index,Home信号左侧边沿的右侧第一个Index为零点。

1. Home和正限位均未触发,轴正向运动,Home左侧边沿先触发后回到触发位置后正向运动,Home左侧边沿的右侧的第一个Index信号为零点。

2.Home、正限位未触发,轴正向运动,正限位先触发后负向运动,Home左侧边沿先触发后回到触发位置后正向运动,Home左侧边沿的右侧的第一个Index信号为零点。

3. Home触发,正限位未触发,轴负向运动,Home左侧边沿触发后回到触发位置后正向运动,Home左侧边沿的的右侧的第一个Index信号为零点。

4. Home未触发,正限位触发,轴负向运动,Home左侧边沿触发后回到触发位置后正向运动,Home左侧边沿的的右侧的第一个Index信号为零点。

1.4.9 回零方式9

正向运动,Home+正限位+Index,Home信号右侧边沿的左侧第一个Index为零点。

1. Home和正限位均未触发,轴正向运动,Home右侧边沿先触发后回到触发位置后负向运动,Home右侧边沿的左侧的第一个Index信号为零点。

2. Home、正限位未触发,轴正向运动,正限位先触发后负向运动,Home右侧边沿先触发后回到触发位置后负向运动,Home右侧边沿的左侧的第一个Index信号为零点。

3. Home触发,正限位未触发,轴正向运动,Home右侧边沿触发后回到触发位置后负向运动,Home右侧边沿的的左侧的第一个Index信号为零点。

4. Home未触发,正限位触发,轴负向运动,Home右侧边沿触发后回到触发位置后负向运动,Home右侧边沿的的左侧的第一个Index信号为零点。

1.4.10 回零方式10

正向运动,Home+正限位+Index,Home信号右侧边沿的右侧第一个Index为零点。

1. Home和正限位均未触发,轴正向运动,Home右侧边沿先触发后回到触发位置后正向运动,Home左侧边沿的右侧的第一个Index信号为零点。

2.Home、正限位未触发,轴正向运动,正限位先触发后负向运动,Home右侧边沿先触发后回到触发位置后正向运动,Home右侧边沿的右侧的第一个Index信号为零点。

3. Home触发,正限位未触发,轴正向运动,Home右侧边沿触发后回到触发位置后正向运动,Home右侧边沿的的右侧的第一个Index信号为零点。

4. Home未触发,正限位触发,轴负向运动,Home右侧边沿触发后回到触发位置后正向运动,Home右侧边沿的的右侧的第一个Index信号为零点。

1.4.11 回零方式11

负向运动,Home+负限位+Index,Home信号右侧边沿的右侧第一个Index为零点。

1. Home和负限位均未触发,轴负向运动,Home右侧边沿先触发后回到触发位置后正向运动,Home右侧边沿的右侧的第一个Index信号为零点。

2. Home、负限位未触发,轴负向运动,负限位先触发后正向运动,Home右侧边沿先触发后回到触发位置后正向运动,Home右侧边沿的右侧的第一个Index信号为零点。

3. Home触发,负限位未触发,轴正向运动,Home右侧边沿触发后回到触发位置后正向运动,Home右侧边沿的的右侧的第一个Index信号为零点。

4. Home未触发,负限位触发,轴正向运动,Home右侧边沿触发后回到触发位置后正向运动,Home右侧边沿的的右侧的第一个Index信号为零点。

1.4.12 回零方式12

负向运动,Home+负限位+Index,Home信号右侧边沿的左侧第一个Index为零点。

1. Home和负限位均未触发,轴负向运动,Home右侧边沿先触发后回到触发位置后负向运动,Home右侧边沿的左侧的第一个Index信号为零点。

2.Home和负限位未触发,轴负向运动,负限位先触发后正向运动,Home右侧边沿先触发后回到触发位置后负向运动,Home右侧边沿的左侧的第一个Index信号为零点。

3. Home触发,负限位未触发,轴正向运动,Home右侧边沿触发后回到触发位置后负向运动,Home右侧边沿的的左侧的第一个Index信号为零点。

4. Home未触发,负限位触发,轴正向运动,Home右侧边沿触发后回到触发位置后负向运动,Home右侧边沿的的左侧的第一个Index信号为零点。

1.4.13 回零方式13

负向运动,Home+正限位+Index,Home信号左侧边沿的右侧第一个Index为零点。

1. Home和负限位均未触发,轴负向运动,Home左侧边沿先触发后回到触发位置后正向运动,Home左侧边沿的右侧的第一个Index信号为零点。

2. Home和负限位未触发,轴负向运动,负限位先触发后正向运动,Home左侧边沿先触发后回到触发位置后正向运动,Home左侧边沿的右侧的第一个Index信号为零点。

3. Home触发,负限位未触发,轴负向运动,Home左侧边沿触发后回到触发位置后正向运动,Home左侧边沿的的右侧的第一个Index信号为零点。

4. Home未触发,负限位触发,轴正向运动,Home左侧边沿触发后回到触发位置后正向运动,Home左侧边沿的的右侧的第一个Index信号为零点。

1.4.14 回零方式14

负向运动,Home+负限位+Index,Home信号左侧边沿的左侧第一个Index为零点。

1. Home和正限位均未触发,轴负向运动,Home左侧边沿先触发后回到触发位置后负向运动,Home左侧边沿的左侧的第一个Index信号为零点。

2.Home、负限位未触发,轴负向运动,负限位先触发后正向运动,Home左侧边沿先触发后回到触发位置后负向运动,Home左侧边沿的左侧的第一个Index信号为零点。

3. Home触发,负限位未触发,轴负向运动,Home左侧边沿触发后回到触发位置后负向运动,Home左侧边沿的的左侧的第一个Index信号为零点。

4. Home未触发,负限位触发,轴正向运动,Home左侧边沿触发后回到触发位置后负向运动,Home左侧边沿的的左侧的第一个Index信号为零点。

1.4.15 回零方式15

保留。

1.4.16 回零方式16

保留。

1.4.17 回零方式17

负限位触发时位置为零点。

1. 负限位未触发,轴往负向运动,负限位触发时为零点。

2. 负限位触发,轴往正向运动,脱离负限位时为零点。

1.4.18 回零方式18

正限位触发时位置为零点。

1. 正限位未触发,轴往正向运动,正限位触发时为零点。

2. 正限位触发,轴往负向运动,脱离正限位时为零点。

1.4.19 回零方式19

正向运动,Home信号触发位置或者脱离Home信号为零点。

1. Home未触发,轴往正向运动,Home触发时为零点。

2. Home触发,轴往负向运动,脱离Home时为零点。

1.4.20 回零方式20

和回零模式19一样,请参考模式19。正向运动,Home信号触发位置或者脱离Home信号为零点。

1.4.21 回零方式21

负向运动,Home信号触发位置或者脱离Home信号为零点。

1. Home未触发,轴往负向运动,Home触发时为零点。

2. Home触发,轴往正向运动,脱离Home时为零点。

1.4.22 回零方式22

和回零模式21一样,请参考模式21。负向运动,Home信号触发位置或者脱离Home信号为零点。

1.4.23 回零方式23

正向运动,Home+正限位,Home信号左侧边沿触发位置为零点。

1. Home和正限位均未触发,轴往正向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

2. Home和正限位均未触发,轴往正向运动,正限位先触发后负向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

3. Home触发,正限位未触发,轴往负向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

4. Home未触发,正限位触发,轴往负向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

1.4.24 回零方式24

和回零模式23一样,请参考模式23。正向运动,Home+正限位,Home信号左侧边沿触发位置为零点。

1.4.25 回零方式25

正向运动,Home+正限位,Home信号右侧边沿触发位置为零点。

1. Home和正限位均未触发,轴往正向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

2. Home和正限位均未触发,轴往正向运动,正限位先触发后负向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

3. Home触发,正限位未触发,轴往正向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

4. Home未触发,正限位触发,轴往负向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

1.4.26 回零方式26

和回零模式26一样,请参考模式26。正向运动,Home+正限位,Home信号右侧边沿触发位置为零点。

1.4.27 回零方式27

负向运动,Home+负限位,Home信号右侧边沿触发位置为零点。

1. Home和负限位均未触发,轴往负向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

2. Home和负限位均未触发,轴往负向运动,负限位先触发后正向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

3. Home触发,负限位未触发,轴往正向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

4. Home未触发,负限位触发,轴往正向运动,Home右侧边沿触发后回到触发位置,Home右侧边沿为零点。

1.4.28 回零方式28

和回零模式27一样,请参考模式27。负向运动,Home+负限位,Home信号右侧边沿触发位置为零点。

1.4.29 回零方式29

负向运动,Home+负限位,Home信号左侧边沿触发位置为零点。

1. Home和负限位均未触发,轴往负向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

2. Home和负限位均未触发,轴往负向运动,负限位先触发后正向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

3. Home触发,负限位未触发,轴往负向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

4. Home未触发,负限位触发,轴往正向运动,Home左侧边沿触发后回到触发位置,Home左侧边沿为零点。

1.4.30 回零方式30

和回零模式29一样,请参考模式29。负向运动,Home+负限位,Home信号左侧边沿触发位置为零点。

1.4.31 回零方式31

保留。

1.4.32 回零方式32

保留。

1.4.33 回零方式33

负向运动,第一个Index为零点。

1.4.34 回零方式34

正向运动,第一个Index为零点。

1.4.35 回零方式35

当前位置作为零点。

1.4.36 回零方式36

保留。

1.5 回零方式例程

例程

回零方式3例程:

// StandardHome.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
// 该例程仅用于功能演示,请保证安全的情况下使用

// 测试功能:StandardHome示例
// 测试平台:网络型运动控制器
// 测试环境:Windows
// 测试流程:
//           (1)初始化控制器
//           (2)轴启动回零
//           (3)运动完成,关闭控制器
// 注意事项:
//           (1)本例程使用的“例程专用.xml”、“例程专用.cfg”,仅用于本例程
//           (2)实际使用时,需要使用MotionStudio生成网络配置xml

// 加载固高运动控制库头文件
#include "gxn.h"
// 动态加载固高运动控制gxn.lib库
#pragma comment(lib,"gxn.lib")

/**
 * @brief 指令出错打印函数
 * @param command 打印信息字符串
 * @param error 错误码
 * @return 错误码
*/
short CommandHandler(char* command, short error)
{
    printf("%s = %d\n", command, error);
    getchar();

    return error;
}

/**
 * @brief 初始化运动控制器(开卡 + 初始化网络拓扑 + 初始化轴)
 * @param core 需要初始化的核号,从1开始
 * @param axis 需要初始化的轴起始索引,从1开始
 * @param axisCount 需要初始化的轴数量,从起始索引axis开始计数,必须大于0
 * @return 0表示初始化成功,非0表示初始化失败
*/
short InitMc(short core,short axis,short axisCount)
{
    short rtn;
    short overTime;
    long status;

    // 打开运动控制器
    rtn = GTN_OpenCard(CHANNEL_PCIE,NULL,NULL);
    if ( 0 != rtn )
    {
        return CommandHandler("GTN_OpenCard",rtn);
    }
    printf("Open Card Success !\n");

    // 初始化网络
    // 注意:(1)“例程专用.xml”仅用于本例程
    //       (2)实际使用时,需要使用MotionStudio生成对应的网络配置文件
    // overTime:网络初始化超时时间,单位:秒
    overTime = 120;
    rtn = GTN_NetInit(NET_INIT_MODE_XML_STRICT,"例程专用.xml",overTime,&status);
    if ( 0 != rtn )
    {
        printf("status = %d\n",status);
        return CommandHandler("GTN_NetInit",rtn);
    }
    printf("Init Net Success !\n");

    // 加载配置文件到控制器
    // 注意:(1)“例程专用.cfg”仅用于本例程
    //       (2)实际使用时,需要使用MotionStudio生成对应的配置文件
    rtn = GTN_LoadConfig(core,"例程专用.cfg");
    if ( 0 != rtn )
    {
        return CommandHandler("GTN_LoadConfig(\"例程专用.cfg\")",rtn);
    }

    // 清除轴状态
    rtn = GTN_ClrSts(core,axis,axisCount);
    if ( 0 != rtn )
    {
        return CommandHandler("GTN_ClrSts",rtn);
    }
    printf("Init Mc Config Success !\n");

    return rtn;
}

int _tmain(int argc, _TCHAR* argv[])
{
    short rtn;                         // 指令返回值
    short core;                        // 需要执行例程的运动控制器核号
    short axis;                        // 需要初始化的轴起始索引号
    short axisCount;                   // 需要初始化的轴数量,从轴起始索引号开始算起
    TStandardHomePrm homePrm;          // 回零运动参数
    TStandardHomeStatus homeSts;       // 回零状态
    double prfPos;                     // 实时读取的规划位置
    long axisSts;                      // 轴状态
    unsigned long clock;               // 控制器时钟
    // 初始化运动控制器
    // 开卡 + 初始化网络拓扑 + 初始化核1的1-8轴
    core = 1;
    axis = 1;
    axisCount = 8;
    rtn = InitMc(core,axis,axisCount);
    if ( 0 != rtn )
    {
        return CommandHandler("InitMc",rtn);
    }

    // 轴上使能,如果需要测试实际驱动器、电机的运动,请将此注释代码打开
    /*rtn = GTN_AxisOn(core,axis);
    if (0 != rtn)
    {
        return CommandHandler("GTN_AxisOn", rtn);
    }*/

    homePrm.mode = 3;                     // 正向运动,不考虑限位,Home开关左侧边沿后的左侧第一个Index为零点
    homePrm.highSpeed = 10;               // 搜索Home的速度,单位:pulse/ms
    homePrm.lowSpeed = 5;                 // 搜索Index的速度,单位:pulse/ms
    homePrm.acc = 1;                      // Home的加速度,单位:pulse/ms^2
    homePrm.offset = 0;                   // 回零完成后的偏移量,单位:pulse
    homePrm.check = 0;                    // 是否启动回零前的自检功能,即检验编码器和规划器运动1000pulse后是否到位
    homePrm.autoZeroPos = 0;              // 回零完成后是否自动清零
    homePrm.motorStopDelay = 0;           // 电机到位延时时间,单位:控制器的规划周期个数。
                                          // 如果motorStopDelay = 0,规划运动完成后,采用编码器是否进入误差带的方式进行判断电机是否到位;
                                          // 如果motorStopDelay > 0,规划运动完成后,采用等待motorStopDelay个规划周期个数后,再判断编码器器和规划差值是否是否小于5个脉冲,如果小于则认为编码器到位;
    rtn = GTN_ExecuteStandardHome(core,axis,&homePrm);

    // 读取轴运动状态
    axisCount = 1;
    do
    {
        // 读取轴的状态
        rtn = GTN_GetSts(core,axis,&axisSts,axisCount,&clock);
        if(0 != rtn)
        {
            CommandHandler("GTN_GetSts",rtn);
        }
        // 读取轴的规划位置
        rtn =  GTN_GetPrfPos(core,axis,&prfPos,axisCount,&clock);
        if(0 != rtn)
        {
            CommandHandler("GTN_GetPrfPos",rtn);
        }

        // 读取轴的回零状态
        rtn = GTN_GetStandardHomeStatus(core,axis,&homeSts);
        if(0 != rtn)
        {
            CommandHandler("GTN_GetStandardHomeStatus",rtn);
        }
        //打印运动轴的状态及其规划位置值
        printf("\r%-100s\r", "");  // 100个空格覆盖
        switch(homeSts.stage)
        {
        case STANDARD_HOME_STAGE_IDLE:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 未启动回零点\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_START:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 启动回零点\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_SEARCH_LIMIT:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 寻找限位\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_LEAVE_LIMIT:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 脱离限位\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_TRY_HOME_LIMIT:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 搜索到Home或者限位\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_SEARCH_HOME:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 正在搜索Home\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_RETURN_HOME :
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 运动到捕获位置=%ld\r", axis,axisSts,prfPos,homeSts.capturePos);
            break;
        case STANDARD_HOME_STAGE_RETURN_HOME_WAIT_STOP:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 等待运动停止\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_SEARCH_INDEX:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 正在搜索Index\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_GO_HOME:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 正在运动到零点\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_END:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 回零点结束\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_START_CHECK:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 启动回零点前自检\r", axis,axisSts,prfPos);
            break;
        case STANDARD_HOME_STAGE_CHECKING:
            printf("轴Axis  %d ,轴状态sts=0x%-10lx 规划位置prfPos=%-10.1lf 启动回零点前自检中\r", axis,axisSts,prfPos);
            break;
        }
        if((0 == homeSts.run) && ( 0 != homeSts.error))
        {
            printf("\r\n");
            printf("轴回零状态  %d\r\n", homeSts.run);
            printf("轴回零阶段  %d\r\n", homeSts.stage);
            printf("轴回零阶段错误信息  %d\r\n", homeSts.error);
            break;
        }
        // 规划器处于运动状态时bit10为1
    }while( 0x400 == (axisSts & 0x400) ); // 规划到位后退出循环


    // 轴规划完成后,下使能(默认代码屏蔽,接实际电机时才调用)
    // 轴下使能,如果需要测试实际驱动器、电机的运动,请将此注释代码打开
   /* rtn = GTN_AxisOff(core,axis);
    if (0 != rtn)
    {
        return CommandHandler("GTN_AxisOff", rtn);
    }*/

    // 关闭控制器
    rtn = GTN_Close();
    if ( 0 != rtn )
    {
        return CommandHandler("GTN_Close",rtn);
    }

    printf("Press Any Key To Exit !\n");
    getchar();

    return 0;
}