一.根据motionstudio软件检测各部件完备;
二.调试点位模式的CPP测试程序
其中,配置文件如下:
回零相关(就是轴状态同步):
下面是相关代码:
// 例程 7-1 点位运动
//#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "gts.h"
#include <iostream>
using namespace std;
#define AXIS 1
// 该函数检测某条GT指令的执行结果,command为指令名称,error为指令执行返回值
void commandhandler(const char* command, short error)
{
// 如果指令执行返回值为非0,说明指令执行错误,向屏幕输出错误结果
if (error)
{
printf("%s = %d\n", command, error);
}
}
int main(int argc, char* argv[])
{
short sRtn, rtn, status;
TTrapPrm trap;
long sts;
double prfPos;
long lAxisStatus; // 轴状态
unsigned short sHomeSts; // 回零状态
bool bStop = false;
long ecatEncpos;
// 打开运动控制器
sRtn = GTN_Open();
// 指令返回值检测
commandhandler("GTN_Open", sRtn);
rtn = GTN_InitEcatComm(1);
if (rtn) {
printf("EtherCAT communication error\n");
return -1;
}
//*wait untill EtherCAT comminication OK*/
do {
rtn = GTN_IsEcatReady(1, &status);
} while (status != 1 || rtn != 0);
rtn = GTN_StartEcatComm(1);
rtn = GTN_Reset(1);
rtn = GTN_LoadConfig(1, const_cast<char*>("test.cfg"));
// 清除各轴的报警和限位
sRtn = GTN_ClrSts(1, 1, 8);
commandhandler("GTN_ClrSts", sRtn);
// 伺服使能
sRtn = GTN_AxisOn(1, AXIS);
commandhandler("GTN_AxisOn", sRtn);
// 位置清零
sRtn = GTN_ZeroPos(1, AXIS);
commandhandler("GTN_ZeroPos", sRtn);
// AXIS轴规划位置清零
sRtn = GTN_SetPrfPos(1, AXIS, 0);
commandhandler("GTN_SetPrfPos", sRtn);
// 将AXIS轴设为点位模式
sRtn = GTN_PrfTrap(1, AXIS);
commandhandler("GTN_PrfTrap", sRtn);
// 读取点位运动参数
sRtn = GTN_GetTrapPrm(1, AXIS, &trap);
commandhandler("GTN_GetTrapPrm", sRtn);
trap.acc = 0.25;
trap.dec = 0.125;
trap.smoothTime = 50;
// 设置点位运动参数
sRtn = GTN_SetTrapPrm(1, AXIS, &trap);
commandhandler("GTN_SetTrapPrm", sRtn);
/*sRtn = GTN_GetEcatEncPos(1, 1, &ecatEncpos);
sRtn = GTN_SetPrfPos(1, 1, ecatEncpos);
sRtn = GTN_SetEncPos(1, 1, ecatEncpos);
sRtn = GTN_SynchAxisPos(1, 1);*/
// 设置AXIS轴的目标位置
sRtn = GTN_SetPos(1, AXIS, 500000L);
commandhandler("GTN_SetPos", sRtn);
// 设置AXIS轴的目标速度
sRtn = GTN_SetVel(1, AXIS, 30);
commandhandler("GTN_SetVel", sRtn);
// 启动AXIS轴的运动
sRtn = GTN_Update(1, 1 << (AXIS - 1));
commandhandler("GTN_Update", sRtn);
//std::cout << "ecatEncpos = " << ecatEncpos << std::endl;
do
{
// 读取AXIS轴的状态
sRtn = GTN_GetSts(1, AXIS, &sts);
// 读取AXIS轴的规划位置
sRtn = GTN_GetPrfPos(1, AXIS, &prfPos);
printf("sts=0x%-10lxprfPos=%-10.1lf\r", sts, prfPos);
} while (sts & 0x400); // 等待AXIS轴规划停止
sRtn = GTN_GetEcatEncPos(1, 1, &ecatEncpos);
std::cout << "ecatEncpos = " << ecatEncpos << std::endl;
// 伺服关闭
sRtn = GTN_AxisOff(1, AXIS);
printf("\nGTN_AxisOff()=%d\n", sRtn);
_getch();
return 0;
}
三.根据上述调试程序来调GTN中的绝对回零程序
1.首先加动态链接库的中的八个文件放入工作目录中;
2.再将Gecat.xml配置文件放到输出目录下;
3.清除底层下位机的相关配置(以下文件中的配置全删除)
4.在三个文件夹中加入新的配置
5.ethcat通讯初始化
GTN_InitEcatComm(1);
short rtn, status;
//*wait untill EtherCAT comminication OK*/
do {
rtn = GTN_IsEcatReady(1, &status);
} while (status != 1 || rtn != 0);
GTN_StartEcatComm(1);
6.注释以下代码;
7.用以下代码替换
if (m_pAxises[i]->inuse() && i != 7) {
GTN_GetEcatEncPos(1, i, &ecatEncpos);
GTN_SetPrfPos(1, i, ecatEncpos);
GTN_SetEncPos(1, i, ecatEncpos);
GTN_SynchAxisPos(1, 1);
m_pAxises[i]->move(0.0, 0.4 * m_pAxises[i]->maxVelocity(), 25/*平滑时间,单位:ms,取值范围:[0, 50]*/);
}
8.修改代码参数
9.轴参数配置
四.在第三点的绝对位置调零的基础上进行相对位置的回零
相对位置的回零即是,在机器人各轴运行的过程中将当前位置设为相对零点,就是要把当前位置的脉冲量给记录下来,然后在以后各轴的运动过程中,可以在点击回零键,各轴能自动调整到那个记录的相对位置;
1.在头文件中定义一个存储当前各轴位置脉冲量的double容器;
2.在GTN Open状态后对其进行初始化为0.0,若后面操作时不设零点,那么各轴就回到绝对零点;
3.在SetHome中,将当前各轴位置存入curRelZeroPos容器中;
4.将move函数中的位置改为存储的相对位置;