固高卡使用

固高卡使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、GTS400
  • 二、使用步骤
    • 1.头文件.h
    • 2.执行文件
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

固高GTS脉冲控制卡,函数封装类


提示:以下是本篇文章正文内容,下面案例可供参考

一、GTS400

      固高脉冲卡DELL封装

二、使用步骤

1.头文件.h

代码如下(示例):

#ifndef GTSCTRL_H
#define GTSCTRL_H#include 
#include "gts.h"
#include 
#define GTS_RATE 1
#define AxisCount 2
#define gtsApp (GTSCtrl::getInstance())//错误定义
enum class MotionError
{SUCCESS = 0,//操作成功MOTION_FAILED = 1,//操作失败MOTION_STOPED = 2,//运动停止MOTION_RUNNING = 3,//正在运动MOTION_INIT_MOTION_FAILED = 4,//初始化失败LOAD_CONFIG_FAILED = 5,//载入配置文件失败EXCEPTION = 6//运行异常
};enum class CAPTURE
{HOME = 1,//Home信号INDEX = 2//Index信号
};class GTSCtrl : public QObject
{Q_OBJECTpublic:GTSCtrl(QObject *parent=0);~GTSCtrl();static GTSCtrl* getInstance();//轴回零状态QList<bool> m_AxisHomeFlag = {false,false};// 伺服使能void gts_AxisOn(int axisIndex);// 伺服关闭void gts_AxisOff(int axisIndex);// 带位置比较输出模式的绝对位移void gts_AbsMoveWithCompare(int axisIndex, long aimPos/*绝对位置p*/, long vel/*运动速度(p/ms)*/,long PInterVal/*脉冲间隔,像素当量(脉冲/像素)*/,short fwith/*脉宽*/,bool block=true);// 带位置比较输出模式的绝对位移void gts_AbsMoveWithCompare(int axisIndex, long aimPos/*绝对位置p*/, long vel/*运动速度(p/ms)*/,long acc/*加速度(p/ms)*/, long PInterVal/*脉冲间隔,像素当量(脉冲/像素)*/, short fwith/*脉宽*/, bool block = true);//位置清零void gts_PosZero(int axisIndex);//轴规划位置void gts_SetPrfPos(int axisIndex,long axisPos);//将轴设为点位模式 acc dac p/ms2  void gts_ProTrap(int axisIndex, double acc = 10, double dac = 10);//将轴设为点位模式 acc dac p/ms2  void gts_ProTrap(int axisIndex, double velStart, double acc, double dac);//读取点位运动参数void gts_GetTrapPrm(int axisIndex,TTrapPrm* prm);// 设置AXIS轴的目标位置void gts_SetPos(int axisIndex,long posValue);//获取轴的当前位置void gts_GetPos(int axisIndex,long* posValue);// 设置AXIS轴的目标速度void gts_SetVel(int axisIndex,int velValue);//启动AXIS轴的运动void gts_Start(int axisIndex);//停止AXIS轴的运动void gts_Stop(int axisIndex);// 读取AXIS轴的状态void gts_GetSts(int axisIndex,long* sts);// 读取AXIS轴的规划位置void gts_GetPrfPos(int axisIndex,double* prfPos);//AXIS轴是否规划停止bool gts_IsPrfStop(int axisIndex);//AXIS绝对位移  vel单位 pause/s   每秒脉冲个数void gts_AbsMove(int axisIndex, double aimPos, double vel, double acc, bool block=false);//设置AXIS加减速、速度void gts_SetAccDec(int axisIndex,double acc,double dec);//AXIS JOG  dir==0 正向  dir==1反向    vel单位 pause/s   每秒脉冲个数void gts_JogMove(int axisIndex, double vel,int dir);//设置输出为有效电平bool gts_SetOutputValid(int channel,int validValue=0);//设置输出为无效电平bool gts_SetOutputInValid(int channel,int invalidValue=1);//检测输入信号是否有效,控制卡默认低电平有效bool gts_IsInputValid(int channel, int validValue = 0, int Noise=50);//拓展io输入有效 默认低电平有效bool gts_isOn(int channel/*start 0*/,int exmdlIndex = 0,int validValue = 0, int Noise=5/*防噪声*/);//拓展io输出 默认低电平有效bool gts_SetOn(int channel, int exmdlIndex = 0, int validValue = 0);//默认高电平有效bool gts_SetOff(int channel, int exmdlIndex = 0, int validValue = 1);//读取当前通用输出点状态,有效返回true  无效返回falsebool gts_GetGPO(int channel, int validValue=0);//读取当前glink200输出点状态bool gts_GetGlinkO(int channel, int exmdlIndex=0, int validValue =0);//监控输入信号是否超时(输入通道,超时时间ms,有效电平0 1)bool gts_IsInputTimeOut(int channel,int timeout=500,int validValue=0);//AXIS回原点,返回值0-回原点成功;1-未找到原点;2-移动到原点失败int  gts_Home(int axisIndex);//AXIS智能回原点void gts_SmartHome(int axisIndex,long serachDistance);//多轴智能回原点void gts_2AxisMultiSmartHome(int *axisArr, long *serchDistanceArr);void gts_3AxisMultiSmartHome(int *axisArr, long *serchDistanceArr);//伺服电机运动到位bool gts_ServoArrive(int axisIndex);//多轴运动到位bool gts_ServoArrive2(int axisIndex,int validValue=0);//show errorMsgvoid showErrorMsg(int axisIndex,QString errInfo);//伺服限位报警,默认上升沿有效 type=0正限位  type=1 负限位bool gts_LimitAlarm(int axisIndex,int type);//伺服启动器报警,默认低电平有效bool gts_ServoAlarm(int axisIndex);// 清除故障报警状态void gts_ClrSts(int axisIndex);void gts_InCreMove(int axisIndex, double pauseNum/*要走的脉冲数*/, double vel,double acc,double dac);void gts_InCreMove(int axisIndex, double pauseNum/*要走的脉冲数*/,double velstart, double vel, double acc, double dac);//设置pidvoid setPID(int axisIndex,TPid pid);//自动对角到位bool gts_AutoFocusOK(int axis);//*****************************************************************************//轴卡状态short gts_SUCCESS = 0;//jog运动变量声明TJogPrm jog;///初始化运动控制卡/// /// MotionError InitCard();/// <关闭运动控制卡>/// /// MotionError DeInitCard();/// <获取指定控制器的锁存器的标志位>/// // 指定控制器的锁存器的标志位/// /// /// 原点锁存器标志位/// MotionError GetEzZeroFlag(int axis, bool *zero_flag);/// <以恒定的速度运动>/// 以恒定的速度运动/// /// 轴号/// 速度/// MotionError StartAxisVelocityMotion(int axis, double servo_velocity);/// <以恒定的速度运动>/// 以恒定的速度运动/// /// 轴号/// 速度/// 加速度/// MotionError StartAxisVelocityMotion(int axis, double servo_velocity, double servo_acc);/// <单轴相对运动>/// 单轴相对运动/// /// 轴号/// 运动到的点位/// 运动的速度/// MotionError StartAxisDistanceMotion(int axis, double servo_distance, double servo_velocity);/// <单轴绝对运动>/// 单轴绝对运动/// /// 轴号/// 坐标/// MotionError StartAxisAbsMotion(int axis, int servo_position, double servo_velocity);/// <单轴绝对运动>/// 单轴绝对运动/// /// 轴号/// 位置/// 速度/// 加速度单位pulse/ms2/// MotionError StartAxisAbsMotion(int axis, int servo_position, double servo_velocity, double acc);/// <单轴相对运动(指定点与加速)>/// 单轴相对运动(指定点与加速)/// /// 轴号/// 运动距离/// 运动速度/// 运动加速度/// MotionError StartAxisDistanceMotion(int axis, double servo_distance, double servo_velocity, double acc_time);/// <单轴相对运动(指定点与加速)>/// 单轴相对运动(指定点与加速)/// /// 轴号/// 运动距离/// 当前脉冲位置/// 运动速度/// 运动加速度/// MotionError StartAxisDistanceMotionWithCurPos(int axis, double servo_distance,double *encode_pos, double start_velocity, double servo_velocity, double acc_time);/// <减速制动>/// 开始减速直至减到起始速度后,停止运行/// /// 轴号/// MotionError DelStop(int axis);/// <紧急制动>/// 立即停止指定的运行轴,没有任何减速过程/// /// 轴号/// MotionError ImdStop(int axis);/// <设置轴的规划位置位置脉冲值>/// 设置控制器发出的指令计数器脉冲位置值/// /// 轴号/// 脉冲/// MotionError SetCommandPosition(int axis, int pulse_command);/// <获取轴的规划位置位置脉冲值>/// 获取控制器发出的指令计数器脉冲位置值/// /// 轴号/// 脉冲/// MotionError GetCommandPosition(int axis, double *pulse_command);/// <设置当前位置脉冲值>/// 设置外部机械反馈的计数器中脉冲位置值,该值是经过运动变比的数值/// /// 轴号/// 脉冲位置/// MotionError SetEncoderPosition(int axis, int encoder_position);/// <获取当前所处位置的脉冲值>/// 获取当前所处位置的脉冲值/// /// 轴号/// 脉冲位置/// MotionError GetEncoderPosition(int axis, double *encoder_position);/// <获取轴状态>/// 获取轴状态/// /// 轴号/// 伺服报警信号/// 正限位报警/// 负限位报警/// MotionError GetAxisSate(int axis, bool *alarm_on, bool *positive_limit_on, bool *negative_limit_on);/// <清除报警>/// 清除报警/// /// MotionError ClearAxisSate();/// <获取轴急停状态>/// 获取轴急停状态/// /// 急停标志位/// MotionError GetEmgSate(int axis,bool *emg_on);/// <获取轴运动完成状态>/// 获取轴运动完成状态/// /// 轴号/// MotionError GetAxisMotionDoneState(int axis);/// <获取轴运动编码器完成状态>/// 获取轴运动编码器完成状态/// /// 轴号/// MotionError GetAxisEncMotionDoneState(int axis);/// <设置捕获方式>/// /// 捕获方式/// MotionError SetEZMode(int axis, CAPTURE capture);/// <获取原点信号的位置>/// 获取原点信号的位置/// /// 轴号/// 位置/// MotionError GetEZMode(int axis, int *Postion);/// <位置清零>/// 位置清零/// /// 位置清零的起始轴号/// 轴数/// MotionError ZeroPos(int axis, int count);/// <设置和启动位置比较>/// 设置启动位置比较/// /// 轴号/// 起始位置/// 重复次数/// 间隔/// MotionError SetCompareData(int axis, int startPos, int repeatTime, int inverval);/// <停止启动位置比较>/// 停止启动位置比较/// /// MotionError StopCompare();/// <获取位置比较输出个数>/// 获取位置比较输出个数/// /// 0表示位置输出已完成,1表示还在进行/// 返回位置比较输出个数/// MotionError GetCompareData(short *nStatus, int *nNumber);/// <清楚捕获信号>/// 清楚捕获信号/// /// 轴号/// MotionError ClearEzFlag(int axis);/// <获取输入信号>/// 获取输入信号/// /// 轴号/// MotionError GetDiFlag(int diIndex, short diType, bool *Di_flag);/// <设置高速口IO输出高低电平>/// 设置高速口IO输出高低电平/// /// 输出的通道:1或者2/// 电平状态,0或1///输出电平或是脉冲,0为脉冲,1为电平///输出电平此参数无效,输出脉冲此参数是脉宽/// MotionError SetHighSpeedIO(short channel, short level, short pulseType, short time = 0);/// <设置DAC12输出高低电平>/// 设置DAC12输出高低电平/// /// 电平状态,0为低电平或1为高电平/// MotionError SetDACLevel(short level);/// <设置轴到位误差带>/// 设置轴到位误差带/// /// 轴号/// 误差带脉冲大小,单位:pulse/// 误差带保持时间,单位:us/// MotionError SetAxisStopBand(short axis,int band,int time);/// <获取轴到位误差带>/// 获取轴到位误差带/// /// 轴号/// 误差带脉冲大小,单位:pulse/// 误差带保持时间,单位:us/// MotionError GetAxisBand(short axis, int* band, int* time);/// <获取轴到位状态>/// 获取轴到位状态/// /// 轴号/// MotionError GetAxisMotionArrivedState(int axis);/// <设置输出信号>/// 设置输出信号/// /// 输出信号的点位/// MotionError SetDoFlag(short doIndex, short doType, bool Do_flag);/// <获取输出信号>/// 获取输出信号/// /// 信号的点位/// MotionError GetDoFlag(short doIndex, short doType, bool *Do_flag);/// <获取轴运动完成>/// 获取轴运动完成/// /// 轴号/// 目标位置/// MotionError GetAxisRunDistanceDone(int axis, double targetPos);/// <设置发送帧信号>
/// 获取轴运动完成
/// /// 发出帧信号目标位置
/// MotionError SetFrameSignal(double targetPos);private:static GTSCtrl* m_pInstance;static QMutex m_mutex;short m_bFlagAlarm= false;			// 伺服报警标志short m_bFlagMError= false;			// 跟随误差越限标志short m_bFlagPosLimit= false;		// 正限位触发标志short m_bFlagNegLimit = false;		// 负限位触发标志short m_bFlagSmoothStop = false;		// 平滑停止标志short m_bFlagAbruptStop = false;		// 急停标志short m_bFlagServoOn = false;			// 伺服使能标志short m_bFlagMotion = false;			// 规划器运动标志int m_nHomeVel;//home 速度double m_curPos = 0;//当前位置long m_lastAimPos=0;  //目标位置
};#endif // GTSCTRL_H

2.执行文件

代码如下(示例):


#include "gtsctrl.h"
#include 
#include 
#include 
#include 
#include "ExtMdl.h"
#include 
#include 
#include "qapplication.h"
#include "qmath.h"#pragma execution_character_set("utf-8")#define SEARCH_HOME		-200000000
#define HOME_OFFSET		-2000
GTSCtrl* GTSCtrl::m_pInstance = NULL;
QMutex GTSCtrl::m_mutex;
void commandhandler(char *command, short error)
{// 如果指令执行返回值为非0,说明指令执行错误,向屏幕输出错误结果if (error){//qDebug() << command << "=" << error;}
}
GTSCtrl::GTSCtrl(QObject *parent): QObject(parent)
{QString filePath = QCoreApplication::applicationDirPath() + "/System/Machine.ini";QSettings moduleSetting(filePath, QSettings::IniFormat);moduleSetting.setIniCodec("GB2312");m_nHomeVel = moduleSetting.value("GTS/homeVel", 2).toInt();//初始化板卡short sRtn;// 打开运动控制器sRtn = GT_Open();commandhandler("GT_Open", sRtn);// 复位运动控制器//sRtn = GT_Reset();//commandhandler("GT_Reset", sRtn);// 配置运动控制器// 注意:配置文件取消了各轴的报警和限位QString path = QCoreApplication::applicationDirPath() + "/GTS800.cfg";QByteArray tmp = path.toLocal8Bit();char* charPath = tmp.data();sRtn = GT_LoadConfig(charPath);commandhandler("GT_LoadConfig ", sRtn);QThread::msleep(50);// 清除各轴的报警和限位sRtn = GT_ClrSts(1, 8);commandhandler("GT_ClrSts", sRtn);//关闭Z轴刹车SetDoFlag(1,MC_GPO,false);上电需要保持DAC11通道有5V电压,不然相机端不能接收信号//short tmp = 16384;tmp = 32767;tmp = 0;//GT_SetDac(11, &tmp);//以下为io拓展模块操作//连接IO扩展模块//sRtn = GT_OpenExtMdl("gts.dll");//commandhandler("GT_OpenExtMdl", sRtn);//加载配置文件,配置IO扩展模块//sRtn = GT_LoadExtConfig("extmdl.cfg");//commandhandler("GT_LoadExtConfig", sRtn);/*TPid pid;// 配置轴2为模拟量输出模式sRtn = GT_CtrlMode(2, 0);// 配置轴2报警输出无效//sRtn = GT_AlarmOff(2);// 配置轴1正负限位无效//sRtn = GT_LmtsOff(2, -1);// 配置完成后要更新状态sRtn = GT_ClrSts(2);// 获取当前pid参数sRtn = GT_GetPid(1, 2, &pid);// 调试阶段,只需修改一下kp到一个较小的值//pid.kp = 0.15;pid.kp = 2;pid.kd = 2;// 设置PID参数sRtn = GT_SetPid(1, 2, &pid);*/SetAxisStopBand(1, 20, 1);SetAxisStopBand(2, 10, 1);short dac11 = 16384;short dac12 = 0;GT_SetDac(12, &dac12);GT_SetDac(11, &dac11);dac11 = 0;dac11 = 32767;
}GTSCtrl::~GTSCtrl()
{//打开Z轴刹车SetDoFlag(1, MC_GPO, true);
}GTSCtrl* GTSCtrl::getInstance()
{if (m_pInstance == NULL){m_pInstance = new GTSCtrl();}return m_pInstance;
}void GTSCtrl::gts_AxisOn(int axisIndex)
{short sRtn;sRtn = GT_AxisOn(axisIndex);commandhandler("gts_AxisOn",sRtn);
}void GTSCtrl::gts_PosZero(int axisIndex)
{short sRtn;sRtn = GT_ZeroPos(axisIndex);commandhandler("gts_PosZero", sRtn);
}void GTSCtrl::gts_SetPrfPos(int axisIndex, long axisPos)
{short sRtn;sRtn = GT_SetPrfPos(axisIndex,axisPos);commandhandler("gts_SetPrfPos", sRtn);
}void GTSCtrl::gts_ProTrap(int axisIndex, double acc, double dac)
{short sRtn;sRtn = GT_PrfTrap(axisIndex);commandhandler("gts_ProTrap", sRtn);TTrapPrm prm;sRtn = GT_GetTrapPrm(axisIndex, &prm);prm.acc = acc;prm.dec = dac;prm.velStart = 0;prm.smoothTime = 20;sRtn = GT_SetTrapPrm(axisIndex,&prm);
}void GTSCtrl::gts_ProTrap(int axisIndex, double velStart,double acc, double dac)
{short sRtn;sRtn = GT_PrfTrap(axisIndex);commandhandler("gts_ProTrap", sRtn);TTrapPrm prm;sRtn = GT_GetTrapPrm(axisIndex, &prm);prm.acc = acc;prm.dec = dac;prm.velStart = velStart;prm.smoothTime = 10;sRtn = GT_SetTrapPrm(axisIndex, &prm);
}void GTSCtrl::gts_GetTrapPrm(int axisIndex, TTrapPrm* prm)
{short sRtn;sRtn = GT_GetTrapPrm(axisIndex,prm);commandhandler("gts_GetTrapPrm", sRtn);
}void GTSCtrl::gts_SetPos(int axisIndex, long posValue)
{short sRtn;sRtn = GT_SetPos(axisIndex, posValue);commandhandler("gts_SetPos", sRtn);
}void GTSCtrl::gts_SetVel(int axisIndex, int velValue)
{short sRtn;sRtn = GT_SetVel(axisIndex, velValue);commandhandler("gts_SetVel", sRtn);
}void GTSCtrl::gts_Start(int axisIndex)
{short sRtn;sRtn = GT_Update(1<<(axisIndex-1));commandhandler("gts_Start", sRtn);
}void GTSCtrl::gts_GetSts(int axisIndex,long *sts)
{short sRtn;sRtn = GT_GetSts(axisIndex,sts);long lAxisStatus = *sts;// 伺服报警标志if (lAxisStatus & 0x2){m_bFlagAlarm = true;showErrorMsg(axisIndex,"伺服报警");}else{m_bFlagAlarm = false;}// 跟随误差越限标志if (lAxisStatus & 0x10){m_bFlagMError = true;showErrorMsg(axisIndex,"跟随误差越限");}else{m_bFlagMError = false;}// 正向限位if (lAxisStatus & 0x20){m_bFlagPosLimit = true;showErrorMsg(axisIndex,"正限位触发");}else{m_bFlagPosLimit = false;}// 负向限位if (lAxisStatus & 0x40){m_bFlagNegLimit = true;showErrorMsg(axisIndex,"负限位触发");}else{m_bFlagNegLimit = false;}// 平滑停止if (lAxisStatus & 0x80){m_bFlagSmoothStop = true;showErrorMsg(axisIndex,"平滑停止触发");}else{m_bFlagSmoothStop = false;}// 急停标志if (lAxisStatus & 0x100){m_bFlagAbruptStop = true;showErrorMsg(axisIndex,"急停触发");}else{m_bFlagAbruptStop = false;}// 伺服使能标志if (lAxisStatus & 0x200){m_bFlagServoOn = true;showErrorMsg(axisIndex,"伺服使能");}else{m_bFlagServoOn = false;}// 规划器正在运动标志if (lAxisStatus & 0x400){m_bFlagMotion = true;printf("规划器正在运动\n");}else{m_bFlagMotion = false;printf("规划器已停止\n");}commandhandler("gts_GetSts", sRtn);
}void GTSCtrl::gts_GetPrfPos(int axisIndex, double* prfPos)
{QMutexLocker locker(&m_mutex);  // 自解锁short sRtn;//m_mutex.lock();sRtn = GT_GetPrfPos(axisIndex, prfPos);(*prfPos) = (*prfPos) / GTS_RATE;//m_mutex.unlock();//commandhandler("gts_GetPrfPos", sRtn);
}void GTSCtrl::gts_AxisOff(int axisIndex)
{short sRtn;sRtn = GT_AxisOff(axisIndex);commandhandler("gts_AxisOff",sRtn);
}void GTSCtrl::gts_AbsMoveWithCompare(int axisIndex, long aimPos/*绝对位置p*/, long vel/*运动速度(p/ms)*/,long PInterVal/*脉冲间隔,像素当量(脉冲/像素)*/, short fwith/*脉宽*/, bool block)
{StartAxisAbsMotion(axisIndex, (aimPos) / GTS_RATE, vel  / GTS_RATE, 100);if (block){short sRtn, pSts;long sts, pCount[2];double prfPos;while (true){if (gtsApp->GetAxisMotionDoneState(axisIndex) == MotionError::MOTION_STOPED)//if (gtsApp->GetAxisMotionArrivedState(axisIndex) == MotionError::MOTION_STOPED){							 // 读取比较输出脉冲个数sRtn = GT_CompareStatus(&pSts, pCount);				qDebug() << "状态=" << pSts << ",输出脉冲个数1=" << pCount[0]<< ",输出脉冲个数2=" << pCount[1];gtsApp->StopCompare();//DelStop(axisIndex);break;}QThread::msleep(50);}}
}void GTSCtrl::gts_AbsMoveWithCompare(int axisIndex, long aimPos/*绝对位置p*/, long vel/*运动速度(p/ms)*/, long acc/*加速度(p/ms)*/,long PInterVal/*脉冲间隔,像素当量(脉冲/像素)*/, short fwith/*脉宽*/,bool block)
{StartAxisAbsMotion(axisIndex, (aimPos) / GTS_RATE, vel / GTS_RATE, acc  / GTS_RATE);if (block) {short sRtn, pSts;long sts, pCount[2];double prfPos;while (true){if (gtsApp->GetAxisMotionDoneState(axisIndex) == MotionError::MOTION_STOPED)//if (gtsApp->GetAxisMotionArrivedState(axisIndex) == MotionError::MOTION_STOPED){// 读取比较输出脉冲个数sRtn = GT_CompareStatus(&pSts, pCount);qDebug() << "状态=" << pSts << ",输出脉冲个数1=" << pCount[0] << ",输出脉冲个数2=" << pCount[1];gtsApp->StopCompare();//DelStop(axisIndex);break;}QThread::msleep(50);}//do//{//	// 读取AXIS轴的状态//	sRtn = GT_GetSts(axisIndex, &sts);////} while (sts & 0x400);	// 等待AXIS轴规划停止}
}bool GTSCtrl::gts_IsPrfStop(int axisIndex)
{long sts;gts_GetSts(axisIndex,&sts);if (sts & 0x400){return false;}return true;
}void GTSCtrl::gts_AbsMove(int axisIndex, double aimPos/*mm/s*/, double vel,double acc, bool block)
{//gts_ProTrap(axisIndex);//点位运动模式//long actPos;//GT_GetPos(axisIndex,&actPos);qDebug() << QStringLiteral("绝对位移->当前位置:") << actPos/GTS_RATE;//gts_SetPos(axisIndex, aimPos/GTS_RATE);qDebug() << QStringLiteral("绝对位移->目标位置:") << aimPos;//gts_SetVel(axisIndex,vel/1000/GTS_RATE);//转换为   脉冲数/毫秒//gts_Start(axisIndex);StartAxisAbsMotion(axisIndex, aimPos / GTS_RATE, vel  / GTS_RATE, acc );//QThread::msleep(200);if (block){short sRtn, pSts;long sts, pCount;double prfPos;while (true){if (gtsApp->GetAxisMotionDoneState(axisIndex) == MotionError::MOTION_STOPED){//DelStop(axisIndex);break;}QThread::msleep(50);}//do//{//	// 读取AXIS轴的状态//	sRtn = GT_GetSts(axisIndex, &sts);//} while (sts & 0x400);	// 等待AXIS轴规划停止}
}
void GTSCtrl::gts_InCreMove(int axisIndex, double pauseNum/*要走的脉冲数*/, double vel, double acc, double dac)
{gts_ProTrap(axisIndex,acc,dac);//点位运动模式double actPos;GT_GetEncPos((short)axisIndex, &actPos, 1);//获取当前轴的坐标gts_SetPos(axisIndex, (actPos + pauseNum));//qDebug() << "当前位置,"<gts_SetVel(axisIndex, vel / 1000 / GTS_RATE);//转换为   脉冲数/毫秒gts_Start(axisIndex);}
void GTSCtrl::gts_InCreMove(int axisIndex, double pauseNum/*要走的脉冲数*/, double velstart,double vel, double acc, double dac)
{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();double velStart = velstart / 1000 / GTS_RATE;gts_ProTrap(axisIndex, velStart, acc, dac);//点位运动模式double actPos;GT_GetEncPos((short)axisIndex, &actPos, 1);//获取当前轴的坐标gts_SetPos(axisIndex, (actPos + pauseNum));//qDebug() << "当前位置,"<gts_SetVel(axisIndex, vel / 1000 / GTS_RATE);//转换为   脉冲数/毫秒gts_Start(axisIndex);//m_mutex.unlock();}void GTSCtrl::setPID(int axisIndex, TPid pid)
{//short ret = GT_SetPid()
}
bool GTSCtrl::gts_AutoFocusOK(int axisIndex)
{GT_GetPos(axisIndex, &m_lastAimPos);GT_GetEncPos((short)axisIndex, &m_curPos, 1);if (abs(m_curPos - m_lastAimPos)<10) {return true;}return false;
}
void GTSCtrl::showErrorMsg(int axisIndex, QString errInfo)
{QString strInfo = QString::number(axisIndex)+"号轴"+errInfo;
}bool GTSCtrl::gts_SetOutputValid(int channel, int validValue)
{ushort nRlt = GT_SetDoBit(MC_GPO,channel,validValue);//commandhandler("gts_SetOutputValid",nRlt);return true;
}bool GTSCtrl::gts_IsInputValid(int channel, int validValue, int Noise)
{short sRtn;long lGpiValue;sRtn = GT_GetDi(MC_GPI, &lGpiValue);if ((lGpiValue & (1<<channel))==0 && validValue==0){QThread::msleep(Noise);if ((lGpiValue & (1 << channel)) == 0 && validValue == 0){return true;}	}return false;
}int GTSCtrl::gts_Home(int axisIndex)
{short sRtn;TTrapPrm trapPrm;short  capture;long status, pos;double prfPos, encPos, axisPrfPos, axisEncPos;sRtn = GT_SetCaptureMode(axisIndex, CAPTURE_HOME);sRtn = GT_PrfTrap(axisIndex);// 读取点位模式运动参数sRtn = GT_GetTrapPrm(axisIndex, &trapPrm);trapPrm.acc = 0.25;trapPrm.dec = 0.25;// 设置点位模式运动参数sRtn = GT_SetTrapPrm(axisIndex, &trapPrm);// 设置点位模式目标速度,即回原点速度sRtn = GT_SetVel(axisIndex, 2);//testdouble searchHome = 0;GT_GetEncPos(axisIndex, &searchHome);//sRtn = GT_SetPos(axisIndex, SEARCH_HOME);sRtn = GT_SetPos(axisIndex, -searchHome);commandhandler("gts_Home", sRtn);// 启动运动sRtn = GT_Update(axisIndex);commandhandler("gts_Home", sRtn);qDebug() << "Waiting for home signal..." << endl;do{// 读取轴状态sRtn = GT_GetSts(axisIndex, &status);// 读取捕获状态sRtn = GT_GetCaptureStatus(axisIndex, &capture, &pos);// 读取规划位置sRtn = GT_GetPrfPos(axisIndex, &prfPos);// 读取编码器位置sRtn = GT_GetEncPos(axisIndex, &encPos);qDebug() << "capture =" << capture << ",prfPos=" << prfPos << ",encPos=" << encPos;// 如果运动停止,返回出错信息if (0 == (status & 0x400)){qDebug() << "no home found" << endl;return 1;}// 等待捕获触发} while (0 == capture);// 显示捕获位置printf("\ncapture pos = %ld\n", pos);// 运动到"捕获位置+偏移量"sRtn = GT_SetPos(axisIndex, pos + HOME_OFFSET);commandhandler("gts_Home", sRtn);// 在运动状态下更新目标位置sRtn = GT_Update(axisIndex);commandhandler("gts_Home", sRtn);do{// 读取轴状态sRtn = GT_GetSts(axisIndex, &status);// 读取规划位置sRtn = GT_GetPrfPos(axisIndex, &prfPos);// 读取编码器位置sRtn = GT_GetEncPos(axisIndex, &encPos);printf("status=0x%-8lx prfPos=%-10.1lf encPos=%-10.1lf\r", status, prfPos, encPos);// 等待运动停止} while (status & 0x400);// 检查是否到达"Home捕获位置+偏移量"if (prfPos != pos + HOME_OFFSET){qDebug() << "move to home pos error" << endl;return 2;}qDebug() << "Home finish" << endl;return 0;
}bool GTSCtrl::gts_IsInputTimeOut(int channel, int timeout, int validValue)
{short sRtn,sRtn2;long lGpiValue;int sts, sts2;sRtn = GT_GetDi(MC_GPI, &lGpiValue);sts = lGpiValue & (1 << channel);QTime time;time.start();while(time.elapsed()<timeout){sRtn2 = GT_GetDi(MC_GPI, &lGpiValue);sts2 = lGpiValue & (1 << channel);if (sts2 == validValue /*&& sts!=sts2*/){return false;}}return true;}bool GTSCtrl::gts_SetOutputInValid(int channel, int invalidValue/*=1*/)
{ushort nRlt = GT_SetDoBit(MC_GPO, channel, invalidValue);commandhandler("gts_SetOutputInValid", nRlt);return true;
}void GTSCtrl::gts_SmartHome(int axisIndex,long serachDistance)
{short sRtn;short gAxis = axisIndex;THomeStatus tHomeSts;short capture;long pos;//sRtn = GT_AlarmOff(gAxis);//轴报警无效//sRtn = GT_LmtsOff(gAxis);//轴限位无效sRtn = GT_LmtsOn(gAxis);//sRtn = GT_LmtSns(3);限位触发取反//sRtn = GT_EncSns(1);编码器取反sRtn = GT_ClrSts(gAxis);//清除轴的报警和限位sRtn = GT_ZeroPos(gAxis);//设置smart home 回原点参数THomePrm tHomePrm;sRtn = GT_GetHomePrm(gAxis, &tHomePrm);tHomePrm.mode = HOME_MODE_LIMIT_HOME;//tHomePrm.mode = HOME_MODE_LIMIT_HOME;//tHomePrm.mode = 11;tHomePrm.moveDir = -1;//tHomePrm.moveDir = 0;tHomePrm.indexDir = 1;//tHomePrm.edge = 1;tHomePrm.edge = 0;m_nHomeVel = 5;tHomePrm.velHigh = m_nHomeVel/GTS_RATE;qDebug() << "HomeVel=" << m_nHomeVel;tHomePrm.velLow = 2;tHomePrm.acc = 0.1;tHomePrm.dec = 0.1;tHomePrm.homeOffset = 0;tHomePrm.searchHomeDistance = 0/*serachDistance*/;tHomePrm.searchIndexDistance = 0;tHomePrm.escapeStep = 0;sRtn = GT_GoHome(gAxis, &tHomePrm);do {sRtn = GT_GetHomeStatus(gAxis, &tHomeSts);} while (tHomeSts.run /*capture == 0*/);//gts_Stop(gAxis);//QThread::msleep(100);sRtn = GT_ZeroPos(gAxis);long actPos;sRtn = GT_GetPos(gAxis,&actPos);qDebug() << QStringLiteral("回原点完成,当前位置:") << actPos << endl;sRtn = GT_AlarmOn(gAxis);//轴报警有效sRtn = GT_LmtsOn(gAxis);//轴限位有效
}bool GTSCtrl::gts_ServoArrive(int axisIndex)//di 电机到位 取反
{//捕获下降沿short sRtn;long lGpiValue;//sRtn = GT_GetDi(MC_ARRIVE, &lGpiValue);bool last = false;bool now = false;while (1){last = now;sRtn = GT_GetDi(MC_ARRIVE, &lGpiValue);now = lGpiValue & (1 << axisIndex - 1);if (now ==true /*&& now== false*/)//1->0{return true;}qDebug() << "0";}
}void GTSCtrl::gts_2AxisMultiSmartHome(int *axisArr, long *serchDistanceArr)
{THomeStatus tHomeSts[2];short sRtn;for (int i=0; i<2; i++){short gAxis = axisArr[i];sRtn = GT_AlarmOff(gAxis);sRtn = GT_LmtsOff(gAxis);sRtn = GT_LmtSns(3);//sRtn = GT_EncSns(1);编码器取反sRtn = GT_ClrSts(gAxis);//sRtn = GT_ZeroPos(gAxis);//设置smart home 回原点参数THomePrm tHomePrm;sRtn = GT_GetHomePrm(gAxis, &tHomePrm);tHomePrm.mode = HOME_MODE_HOME;tHomePrm.moveDir = -1;tHomePrm.indexDir = 1;tHomePrm.edge = 0;tHomePrm.velHigh = 100;tHomePrm.velLow = 10;tHomePrm.acc = 0.1;tHomePrm.dec = 0.1;tHomePrm.searchHomeDistance = serchDistanceArr[i];tHomePrm.searchIndexDistance = 3000;tHomePrm.escapeStep = 1000;sRtn = GT_GoHome(gAxis, &tHomePrm);}do{sRtn = GT_GetHomeStatus(axisArr[0], &tHomeSts[0]);sRtn = GT_GetHomeStatus(axisArr[1], &tHomeSts[1]);} while (tHomeSts[0].run || tHomeSts[1].run);for (int i=0; i<2; i++){sRtn = GT_ZeroPos(axisArr[i]);}}void GTSCtrl::gts_3AxisMultiSmartHome(int *axisArr, long *serchDistanceArr)
{THomeStatus tHomeSts[3];short sRtn;for (int i = 0; i < 3; i++){short gAxis = axisArr[i];sRtn = GT_AlarmOff(gAxis);sRtn = GT_LmtsOff(gAxis);sRtn = GT_LmtSns(3);//sRtn = GT_EncSns(1);编码器取反sRtn = GT_ClrSts(gAxis);//sRtn = GT_ZeroPos(gAxis);//设置smart home 回原点参数THomePrm tHomePrm;sRtn = GT_GetHomePrm(gAxis, &tHomePrm);tHomePrm.mode = HOME_MODE_HOME;tHomePrm.moveDir = -1;tHomePrm.indexDir = 1;tHomePrm.edge = 0;tHomePrm.velHigh = 100;tHomePrm.velLow = 10;tHomePrm.acc = 0.1;tHomePrm.dec = 0.1;tHomePrm.searchHomeDistance = serchDistanceArr[i];tHomePrm.searchIndexDistance = 3000;tHomePrm.escapeStep = 1000;sRtn = GT_GoHome(gAxis, &tHomePrm);}do{sRtn = GT_GetHomeStatus(axisArr[0], &tHomeSts[0]);sRtn = GT_GetHomeStatus(axisArr[1], &tHomeSts[1]);sRtn = GT_GetHomeStatus(axisArr[1], &tHomeSts[1]);} while (tHomeSts[0].run || tHomeSts[1].run || tHomeSts[2].run);for (int i = 0; i < 3; i++){sRtn = GT_ZeroPos(axisArr[3]);}
}bool GTSCtrl::gts_ServoArrive2(int axisIndex,int validValue)
{short sRtn;long lGpiValue;bool now = 0;sRtn = GT_GetDi(MC_ARRIVE, &lGpiValue);now = lGpiValue & (1 << axisIndex - 1);if (now == (bool)validValue){return true;}return false;
}bool GTSCtrl::gts_isOn(int channel, int exmdlIndex,int validValue, int Noise)//拓展io输入有效
{short rtn;unsigned short diValue;//采集第一个(默认)模块数字量输入值rtn = GT_GetExtIoValue(exmdlIndex, &diValue);if ((diValue & (1<<channel)) == validValue){QThread::msleep(Noise);rtn = GT_GetExtIoValue(exmdlIndex, &diValue);if ((diValue & (1 << channel)) == validValue){return true;}}return false;
}bool GTSCtrl::gts_SetOn(int channel, int exmdlIndex, int validValue)
{GT_SetExtIoBit(exmdlIndex, channel, validValue);return true;
}bool GTSCtrl::gts_SetOff(int channel, int exmdlIndex, int validValue)
{GT_SetExtIoBit(exmdlIndex, channel, validValue);return true;
}void GTSCtrl::gts_JogMove(int axisIndex, double vel,int dir)
{short sRtn;TJogPrm jog;// 将AXIS轴设为Jog模式sRtn = GT_PrfJog(axisIndex);// 读取Jog运动参数sRtn = GT_GetJogPrm(axisIndex, &jog);jog.acc = 0.0625;jog.dec = 0.0625;// 设置Jog运动参数sRtn = GT_SetJogPrm(axisIndex, &jog);// 设置AXIS轴的目标速度if (dir == 0){sRtn = GT_SetVel(axisIndex, vel/1000/GTS_RATE);  //转换成pause/ms} else if(dir == 1){sRtn = GT_SetVel(axisIndex, (-1)*vel / 1000 / GTS_RATE);//转换成pause/ms}// 启动AXIS轴的运动sRtn = GT_Update(1 << (axisIndex-1));
}void GTSCtrl::gts_GetPos(int axisIndex, long* posValue)
{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_GetPos(axisIndex,posValue);//m_mutex.unlock();
}bool GTSCtrl::gts_GetGPO(int channel, int validValue/*=0*/)
{short sRtn;long value;sRtn = GT_GetDo(MC_GPO,&value);if ((value & (1<<(channel-1))) == validValue){return true;}return false;}bool GTSCtrl::gts_GetGlinkO(int channel, int exmdlIndex/*=0*/, int validValue /*=0*/)
{return true;
}void GTSCtrl::gts_SetAccDec(int axisIndex,double acc, double dec)
{TTrapPrm trapPrm;GT_GetTrapPrm(axisIndex, &trapPrm);trapPrm.acc = acc;trapPrm.dec = dec;GT_SetTrapPrm(axisIndex, &trapPrm);
}void GTSCtrl::gts_Stop(int axisIndex)
{GT_Stop(1<<(axisIndex-1),1<<(axisIndex-1));
}bool GTSCtrl::gts_LimitAlarm(int axisIndex, int type)
{long value;GT_GetDi(type,&value);if ((value & 1<<(axisIndex-1))){return true;}return false;
}bool GTSCtrl::gts_ServoAlarm(int axisIndex)
{long value;GT_GetDi(MC_ALARM,&value);if ((value&1<<(axisIndex-1))==0){return true;}return false;
}void GTSCtrl::gts_ClrSts(int axisIndex)
{short axis = axisIndex;GT_ClrSts(axis);
}//*******************************************************************************
MotionError GTSCtrl::InitCard()
{short sRtn;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();//打开控制卡sRtn = GT_Open();if (sRtn != gts_SUCCESS) return MotionError::MOTION_INIT_MOTION_FAILED;//载入配置文件QString path = QCoreApplication::applicationDirPath() + "\\GTS800.cfg";QByteArray tmp = path.toLocal8Bit();char* charPath = tmp.data();sRtn = GT_LoadConfig(charPath);if (sRtn != gts_SUCCESS) return MotionError::LOAD_CONFIG_FAILED;//清除各轴报警和限位(不在限位才能清楚报警)sRtn = GT_ClrSts(1, 8);if (sRtn != gts_SUCCESS) return MotionError::MOTION_INIT_MOTION_FAILED;//轴使能for (short i = 1; i <= AxisCount; i++){sRtn = GT_AxisOn(i);if (sRtn != 0) return MotionError::MOTION_INIT_MOTION_FAILED;}//m_mutex.unlock();return MotionError::SUCCESS;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::DeInitCard()
{try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();//关闭运动控制卡if (GT_Close() != gts_SUCCESS){//m_mutex.unlock();return MotionError::MOTION_FAILED;}//m_mutex.unlock();return MotionError::SUCCESS;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetEzZeroFlag(int axis, bool *zero_flag)
{short result;short Status;long  pValue;unsigned long clk;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);result = GT_GetCaptureStatus((short)axis,  &Status,  &pValue, 1, &clk);//m_mutex.unlock();*zero_flag = false;if (result == gts_SUCCESS){if (Status == 1)*zero_flag = true;return MotionError::SUCCESS;}return MotionError::MOTION_FAILED;}catch (...){return MotionError::EXCEPTION;}
}//MotionError GTSCtrl::StartAxisVelocityMotion(int axis, double servo_velocity)
//{
//	short result;
//	long tmp;
//	unsigned long clk;
//	try
//	{
//		m_mutex.lock();
//		//设置为jog模式
//		GT_ClrSts(1, 8);
//		GT_PrfJog((short)axis);
//		//GT_GetJogMode((short)axis, &tmp, 1, &clk);
//		//if (tmp != 0)
//		//{
//		//	m_mutex.unlock();
//		//	return MotionError::MOTION_FAILED;
//		//}
//		jog.acc = 5;
//		jog.dec = 5;
//		jog.smooth = 15;
//		GT_SetJogPrm((short)axis, &jog);
//		GT_SetVel((short)axis, servo_velocity);
//		result = GT_Update(1 << (axis - 1));
//		m_mutex.unlock();
//		if (result == gts_SUCCESS) return MotionError::SUCCESS;
//		return MotionError::MOTION_FAILED;
//	}
//	catch (const std::exception&)
//	{
//		return MotionError::EXCEPTION;
//	}
//}MotionError GTSCtrl::StartAxisVelocityMotion(int axis, double servo_velocity, double servo_acc)
{short result;unsigned long clk;TTrapPrm trap;double encpos;long tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁GT_ClrSts(1, 8);GT_PrfTrap((short)axis);GT_GetPrfMode((short)axis, &tmp, 1, &clk);GT_GetPrfPos( (short)axis, &encpos, 1, &clk);//获取当前轴的坐标if (servo_velocity > 0){tmp = encpos + 173741823;}else{tmp = encpos - 173741823;servo_velocity = abs(servo_velocity);}trap.acc = servo_acc;trap.dec = servo_acc;trap.smoothTime = 15;trap.velStart = 0;GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数GT_SetVel((short)axis, servo_velocity);//设置目标速度result = GT_SetPos((short)axis, tmp);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动设置为jog模式//GT_ClrSts(1, 8);//GT_PrfJog((short)axis);//jog.acc = servo_acc;//jog.dec = servo_acc;//GT_SetJogPrm((short)axis, &jog);//GT_SetVel((short)axis, servo_velocity);//result = GT_Update(1 << (axis - 1));//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::StartAxisVelocityMotion(int axis, double servo_velocity)
{short result;unsigned long clk;TTrapPrm trap;double encpos;long tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);GT_PrfTrap((short)axis);GT_GetPrfMode((short)axis, &tmp, 1, &clk);if (tmp != 0){//m_mutex.unlock();return MotionError::MOTION_FAILED;}trap.acc = 5;trap.dec = 5;trap.smoothTime = 15;trap.velStart = 0;GT_GetPrfPos((short)axis, &encpos, 1, &clk);//获取当前轴的坐标GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数if (servo_velocity < 0){tmp = encpos - 173741823;}else{tmp = encpos + 173741823;}GT_SetVel((short)axis,abs(servo_velocity));//设置目标速度		GT_SetPos((short)axis, tmp);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::StartAxisDistanceMotion(int axis, double servo_distance, double servo_velocity)
{short result;unsigned long clk;TTrapPrm trap;double encpos;long tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);GT_PrfTrap((short)axis);GT_GetPrfMode((short)axis, &tmp, 1, &clk);if (tmp != 0){//m_mutex.unlock();return MotionError::MOTION_FAILED;}				trap.acc = 5;trap.dec = 5;trap.smoothTime = 15;trap.velStart = 0;GT_GetPrfPos((short)axis, &encpos, 1, &clk);//获取当前轴的坐标GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数GT_SetVel((short)axis, servo_velocity);//设置目标速度tmp = encpos + servo_distance;GT_SetPos((short)axis, tmp);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::StartAxisDistanceMotion(int axis, double servo_distance, double servo_velocity, double acc_time)
{short result;unsigned long clk;TTrapPrm trap;double encpos;long tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);GT_PrfTrap((short)axis);GT_GetPrfMode((short)axis, &tmp, 1, &clk);if (tmp != 0) {//m_mutex.unlock();return MotionError::MOTION_FAILED;}trap.acc = acc_time;trap.dec = acc_time;trap.smoothTime = 15;trap.velStart = 0;GT_GetEncPos((short)axis, &encpos, 1, &clk);//获取当前轴的坐标GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数GT_SetVel((short)axis, servo_velocity);//设置目标速度tmp = encpos + servo_distance;GT_SetPos((short)axis, tmp);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}}MotionError GTSCtrl::StartAxisDistanceMotionWithCurPos(int axis, double servo_distance, double *encode_pos, double start_velocity,double servo_velocity, double acc_time){short result;unsigned long clk;TTrapPrm trap;double encpos;long tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);GT_PrfTrap((short)axis);GT_GetPrfMode((short)axis, &tmp, 1, &clk);if (tmp != 0) {//m_mutex.unlock();return MotionError::MOTION_FAILED;}trap.acc = acc_time;trap.dec = acc_time;trap.smoothTime = 15;trap.velStart = start_velocity;GT_GetEncPos((short)axis, &encpos, 1, &clk);//获取当前轴的坐标*encode_pos = encpos;GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数GT_SetVel((short)axis, servo_velocity);//设置目标速度tmp = encpos + servo_distance;GT_SetPos((short)axis, tmp);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}}MotionError GTSCtrl::StartAxisAbsMotion(int axis, int servo_position, double servo_velocity)
{short result;unsigned long clk;TTrapPrm trap;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);GT_PrfTrap((short)axis);long tmp;GT_GetPrfMode((short)axis, &tmp, 1, &clk);if (tmp != 0) {//m_mutex.unlock();return MotionError::MOTION_FAILED;}trap.acc = 5;trap.dec = 5;trap.smoothTime = 15;trap.velStart = 0;GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数GT_SetVel((short)axis, servo_velocity);//设置目标速度GT_SetPos((short)axis, servo_position);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::StartAxisAbsMotion(int axis, int servo_position, double servo_velocity, double acc)
{short result;unsigned long clk;TTrapPrm trap;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_ClrSts(1, 8);GT_PrfTrap((short)axis);long tmp;GT_GetPrfMode((short)axis, &tmp, 1, &clk);if (tmp != 0) {//m_mutex.unlock();return MotionError::MOTION_FAILED;}trap.acc = acc;//这里指的是加速度不是加速时间 单位pulse/ms2trap.dec = acc;trap.smoothTime = 15;trap.velStart = 0;GT_SetTrapPrm((short)axis, &trap);//设置点位运动参数//qDebug() << "当前轴:" + QString::number(axis) + "速度:" + QString::number(servo_velocity) + "加速度:" + QString::number(acc);GT_SetVel((short)axis, servo_velocity);//设置目标速度GT_SetPos((short)axis, servo_position);//设置目标位置result = GT_Update(1 << (axis - 1));//更新轴运动//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::DelStop(int axis)
{short result;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_SetStopDec((short)axis, 100, 30767);result = GT_Stop(1 << (axis - 1), 0 << (axis - 1));//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;	}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::ImdStop(int axis)
{short result;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();GT_SetStopDec((short)axis, 50, 30767);GT_SetStopIo((short)axis, 1, MC_ALARM, (short)axis);result = GT_Stop(1 << (axis - 1), 1 << (axis - 1));	//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetCommandPosition(int axis, int pulse_command)
{short result;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_SetPrfPos((short)axis, pulse_command);GT_SynchAxisPos(axis - 1);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetCommandPosition(int axis, double *pulse_command)
{short result;unsigned long clk;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();result = GT_GetPrfPos((short)axis, &*pulse_command, 1, &clk);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetEncoderPosition(int axis, int encoder_position)
{short result;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_SetEncPos((short)axis, encoder_position);GT_SynchAxisPos(axis - 1);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;	}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetEncoderPosition(int axis, double *encoder_position)
{short result;unsigned long	 clk;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_GetEncPos((short)axis, &*encoder_position,1, &clk);GT_SynchAxisPos(axis - 1);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetAxisSate(int axis, bool *alarm_on, bool *positive_limit_on, bool *negative_limit_on)
{short result;unsigned long clk;long AxisStatus;//轴状态try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁GT_ClrSts(1, 8);result = GT_GetSts((short)axis, &AxisStatus, 1, &clk);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;//伺服报警信号if ((AxisStatus & 0x2) == 0){*alarm_on = false;}else{*alarm_on = true;}//正限位if ((AxisStatus & 0x20) == 0){*positive_limit_on = false;}else{*positive_limit_on = true;}//负限位if ((AxisStatus & 0x40) == 0){*negative_limit_on = false;}else{*negative_limit_on = true;}return MotionError::SUCCESS;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::ClearAxisSate()
{short result;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();		result = GT_ClrSts(1, 8);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetEmgSate(int axis,bool *emg_on)
{short result;long AxisStatus;unsigned long clk;//short axis = 1;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_GetSts((short)axis, &AxisStatus, 1, &clk);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;if((AxisStatus & 0x100) == 0){*emg_on = false;}else{*emg_on = true;}return MotionError::SUCCESS;}catch (const std::exception&){return MotionError::EXCEPTION;}	
}MotionError GTSCtrl::GetAxisMotionDoneState(int axis)
{short result;long AxisStatus;unsigned long clk;//short axis = 1;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();		result = GT_GetSts((short)axis, &AxisStatus, 1, &clk);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;if ((AxisStatus & 0x400) != 0){return MotionError::MOTION_RUNNING;}else{return MotionError::MOTION_STOPED;}		}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetEZMode(int axis, CAPTURE capture)
{short result;short Mode;try{if (capture == CAPTURE::HOME){Mode = 1;}else{Mode = 2;}//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁//GT_SetCaptureSense((short)axis, Mode, 0);result = GT_SetCaptureMode((short)axis, Mode);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetEZMode(int axis, int *Postion)
{short result;short Status;long tmp;unsigned long clk;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_GetCaptureStatus((short)axis, &Status, &tmp, 1, &clk);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;*Postion = tmp;return MotionError::SUCCESS;}catch (const std::exception&){return MotionError::EXCEPTION;}}MotionError GTSCtrl::ZeroPos(int axis, int count)
{short result;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();		result = GT_ZeroPos((short)axis, (short)count);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetCompareData(int axis, int startPos, int repeatTime, int inverval)
{short result;try{long tmp = startPos;QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();		result = GT_CompareLinear((short)axis, 1, tmp, repeatTime, inverval, 5, 1);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::StopCompare()
{short result;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_CompareStop();GT_2DCompareStop(0);GT_2DCompareClear(0);GT_2DCompareStop(1);GT_2DCompareClear(1);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetCompareData(short *nStatus, int *nNumber)
{short result;long tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();result = GT_CompareStatus(&*nStatus, &tmp);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;*nNumber = tmp;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::ClearEzFlag(int axis)
{short result;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁result = GT_ClearCaptureStatus((short)axis);//m_mutex.unlock();if (result == gts_SUCCESS) return MotionError::SUCCESS;return MotionError::MOTION_FAILED;}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetDiFlag(int diIndex,short diType, bool *Di_flag)
{short result;long  pValue;unsigned long clk;try{//m_mutex.lock();QMutexLocker locker(&m_mutex);  // 自解锁GT_ClrSts(1, 8);result = GT_GetDi(diType, &pValue);//m_mutex.unlock();*Di_flag = false;if (result == gts_SUCCESS){if (pValue &(1 << (diIndex -1)))*Di_flag = true;return MotionError::SUCCESS;}return MotionError::MOTION_FAILED;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetHighSpeedIO(short channel, short level, short pulseType, short time)
{short result;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();if (level == 0){result = GT_ComparePulse(0 << (channel - 1), pulseType, time);}else{result = GT_ComparePulse(1 << (channel - 1), pulseType, time);}//m_mutex.unlock();return MotionError::SUCCESS;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetAxisEncMotionDoneState(int axis)
{short result;double Vel;unsigned long clk;//short axis = 1;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();result = GT_GetAxisEncVel(axis,&Vel);//m_mutex.unlock();if (abs(Vel) > 0){return MotionError::MOTION_RUNNING;}else{return MotionError::MOTION_STOPED;}}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetDACLevel(short level)
{short result;short tmp;short tmp1;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();if (level == 0){tmp = 0;tmp1 = 32768;result = GT_SetDac(12, &tmp);	qDebug() << "当前设置的Dac12的值为:" << QString::number(tmp);//result = GT_SetDac(11, &tmp1);short curDac;result = GT_GetDac(12, &curDac);qDebug() << "当前获取Dac12的值为:" << QString::number(curDac);}else{tmp = 32768;tmp1 = 0;result = GT_SetDac(12, &tmp);qDebug() << "当前设置的Dac12的值为:" << QString::number(tmp);//result = GT_SetDac(11, &tmp1);short curDac;result = GT_GetDac(12, &curDac);qDebug() << "当前获取Dac12的值为:" << QString::number(curDac);}//m_mutex.unlock();return MotionError::SUCCESS;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetAxisStopBand(short axis, int band, int time)
{short result;short tmp;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();result = GT_SetAxisBand(axis, band, time);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;return MotionError::SUCCESS;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetAxisBand(short axis, int* band, int* time)
{short result;long tmp1,tmp2;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();result = GT_GetAxisBand(axis, &tmp1, &tmp2);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;*band = tmp1;*time = tmp2;return MotionError::SUCCESS;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetAxisMotionArrivedState(int axis){short result;long AxisStatus;unsigned long clk;//short axis = 1;try{QMutexLocker locker(&m_mutex);  // 自解锁//m_mutex.lock();result = GT_GetSts((short)axis, &AxisStatus, 1, &clk);//m_mutex.unlock();if (result != gts_SUCCESS) return MotionError::MOTION_FAILED;if ((0x800 != (AxisStatus & 0x800))){return MotionError::MOTION_RUNNING;}else{return MotionError::MOTION_STOPED;}}catch (const std::exception&){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetDoFlag(short doIndex, short doType, bool Do_flag)
{short result;long  pValue;unsigned long clk;try{QMutexLocker locker(&m_mutex);  // 自解锁//int nDoIndex = -1;GT_ClrSts( 1, 8);GT_SetDoBit(doType, (doIndex), Do_flag);//m_mutex.unlock();return MotionError::MOTION_FAILED;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetDoFlag(short doIndex, short doType, bool *Do_flag)
{short result;long  pValue;unsigned long clk;try{QMutexLocker locker(&m_mutex);  // 自解锁GT_ClrSts( 1, 8);result = GT_GetDo( doType, &pValue);//m_mutex.unlock();*Do_flag = false;if (result == gts_SUCCESS){if (pValue &(1 << (doIndex - 1)))*Do_flag = true;return MotionError::SUCCESS;}return MotionError::MOTION_FAILED;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::GetAxisRunDistanceDone(int axis, double targetPos)
{short result;double  dValue;unsigned long clk;double encoder_position , pulse_command;try{QMutexLocker locker(&m_mutex);  // 自解锁//获取当前规划轴的位置result = GT_GetPrfPos((short)axis, &pulse_command, 1, &clk);//获取当前的编码器位置result = GT_GetEncPos((short)axis, &encoder_position, 1, &clk);//计算编码器位置和当前位置的坐标偏差dValue = abs(targetPos - encoder_position);if (dValue <= 2){return MotionError::MOTION_STOPED;}dValue = abs(pulse_command - encoder_position);if (dValue <= 2){return MotionError::MOTION_STOPED;}return MotionError::MOTION_RUNNING;}catch (...){return MotionError::EXCEPTION;}
}MotionError GTSCtrl::SetFrameSignal(double targetPos)
{try{QMutexLocker locker(&m_mutex);  // 自解锁GT_2DCompareClear(1);T2DCompareData dataBuf[1];T2DComparePrm Prm;short rtn = GT_2DCompareMode(1, COMPARE2D_MODE_1D);  //HSIO0通道使用二维位置比较触发Prm.encx = 1;  //绑定比较轴XPrm.ency = 1;  //绑定比较轴YPrm.maxerr = 30; //位置比较允许误差Prm.outputType = 0;  //输出类型 0:脉冲;1:电平Prm.source = 1;      //比较源:0为规划器,1为编码器Prm.startLevel = 0;  // 起始电平方式,0:电平复位 ;1:电平取反Prm.threshold = 0;   //该参数设置为0Prm.time = 30000;     // 脉冲方式的脉冲宽度 usrtn = GT_2DCompareSetPrm(1, &Prm); // 如果返回值7 请注意 配置的是脉冲计数还是编码器计数(看说明文档)short sts, fifo, pfifo, pCount;long Count = 0;rtn = GT_2DCompareStatus(1, &sts, &Count, &fifo, &pfifo, &pCount);dataBuf[0].px = targetPos; //保证位置数组中的数据在运动过程中均能达到触发位置dataBuf[0].py = targetPos;rtn = GT_2DCompareData(1, 1, dataBuf, fifo);rtn = GT_2DCompareStart(1); // 启动二维位置比较输出 之后压入比较数据if (rtn == gts_SUCCESS){return MotionError::SUCCESS;}else{return MotionError::MOTION_FAILED;}}catch (...){return MotionError::EXCEPTION;}
}

总结

提示:这里对文章进行总结:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部