⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtcardapi.cpp

📁 关于固高卡的包装的api函数和轴状态以及坐标系状态下的状态实时读取及显示
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*	Copyright (c) 2006, lihaizhou All rights reserved.
				华中科技大学国家数控系统工程技术研究中心
文件名称:GtCardApi.h
摘  要:固高GT-400-SP-PCI-G运动控制卡操作类
			
运行环境:Windows2000/Xp 
当前版本:0.1 
修改描述:
修改作者:
修改日期:
原 作 者:李海洲
主 管 人:李海洲
完成日期:2006年02月19日		*/

#include "stdafx.h"
#include "math.h"
#include "GtCardApi.h"

IMPLEMENT_DYNAMIC(Gt_Card_Api, CCncBase)

Gt_Card_Api::Gt_Card_Api()
{
	memset(m_home_step , 0 ,sizeof(m_home_step));
	error_msk = 0;
	axis_mode = 0;//都是私有成员变量

	acc_home_jog = 0.001;
	speed_jog = 6;
	speed_home = 6;
	
	speed_move_step = 10;
	acc_move_step = 0.001;
	jerk_move_step = 0.0001;

	for(int i=0; i<=Sys_Max_Axis_Num; i++)
	{ 
		m_axis_ratio[i] = 1.0;
	}
}

Gt_Card_Api::~Gt_Card_Api()
{

}

// 功  能:运动控制器初始化
//
// 返回值: 非0表示有错误发生
//			0表示没有有错误发生 
int Gt_Card_Api::InitNCCard(void) 
{ 
	int i;
	int nRet = 0; 

	if(GT_Open( ))//打开运动控制器设备
		nRet = 1;

	if(GT_Reset( ))//复位运动控制器
		nRet = 1;
	
//	if(GT_SwitchtoCardNo(1)) /* 将1 号卡设为当前卡(仅对于多卡系统,单卡系统可取消该行)*/ 
//		nRet = 1;

	if(GT_SetSmplTm(Sys_Control_Timer))//该函数设置运动控制器伺服周期。设定值的范围为:48~1966.08 微秒运动控制器推荐使用的伺服周期是200 微秒。
		nRet = 1;

	for( i=1; i<=Sys_Max_Axis_Num; i++) //屏蔽每一轴的中断
	{ 
		if(GT_Axis(i))
			nRet = 1;

		if(GT_SetIntrMsk(0))
			nRet = 1;
 
		if(GT_CtrlMode(1))	// 0表示为模拟电压输出模式,1 表示为脉冲输
			nRet = 1;
	} 

	m_bIsCardInitialized = nRet ? FALSE : TRUE;
	return nRet;
} 

// 功  能: 检测指定的轴是否是有效轴(1,2,3,4为有效轴)
//
// 返回值: 1表示无效轴
//			0表示有效轴
int Gt_Card_Api::check_axis_user(int axis)
{ 
	int rtn = 1; 

	if((axis <= Sys_Max_Axis_Num)&&(axis > 0))
		rtn = 0;

	return rtn;
} 

// 功  能: 设置指定轴的1um对应的脉冲数
//
// 参  数:axis的取值(1)  axis  <= 0 无效的参数
//					 (2)  1 , 2 , 3 ,4 时初始化指定的轴
//		   PerPlus的取值(1) 每转脉冲数目
//		   PerGap的取值 (1) 每转工作台移动的距离
void Gt_Card_Api::set_axis_ratio(int axis,long PerPlus , long PerGap)
{ 
	long tmpPos;
	double tmpDub;

	if(check_axis_user(axis))
		return ;

	tmpDub = PerPlus;
	tmpDub /= (double)PerGap;

	tmpPos = (long)(tmpDub *100000.0);

	if(tmpPos != 0)
		m_axis_ratio[axis] = tmpDub;

}

// 功  能:将指定轴对应的以um为单位的位置,转换成以脉冲为单位的位置
//
// 参  数:axis的取值(1)  axis  <= 0 无效的参数
//					 (2)  1 , 2 , 3 ,4 时初始化指定的轴
//		   pos的取值 (1)  以um为单位的位置
//
// 返回值: 以脉冲为单位的位置
long Gt_Card_Api::cmd_to_motion_pos(int axis,long pos)
{
	double tmpPos = m_axis_ratio[axis] * (double)pos;

	return (long)tmpPos;
}

// 功  能:将指定轴对应的以脉冲为单位的位置,转换成以um为单位的位置
//
// 参  数:axis的取值(1)  axis  <= 0 无效的参数
//					 (2)  1 , 2 , 3 ,4 时初始化指定的轴
//		   pos的取值 (1)  以um为单位的位置
//
// 返回值: 以um为单位的位置
long Gt_Card_Api::motion_to_cmd_pos(int axis,long pos)
{
	double tmpPos = (double)pos / m_axis_ratio[axis];

	return (long)tmpPos;
}

// 功  能:初始化轴指定的轴
//
// 参  数:axis的取值(1)  axis  <= 0 时初始化系统所有的轴
//					 (2)  1 , 2 , 3 ,4 时初始化指定的轴
//
// 返回值: 1表示有错误发生
//			0表示命令执行成功

// 功  能:控制使能或者关闭指定的轴
//
// 参  数: axis的取值 (1) axis  <= 0 时使能或者关闭系统所有的轴
//					  (2) 1 , 2 , 3 ,4 时使能或者关闭指定的轴
//
//         mode的取值 (1) Axis_On_Mode 打开轴驱动使能
//					  (2) Axis_Off_Mode 关闭轴驱动使能
//
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_axis_on_off(int axis , int mode) //控制轴初始化函数
{ 
	int i;
	int k;
	short rtn = 0; 

	if(axis > Sys_Max_Axis_Num)
		return 1;

	if(axis <= 0)
	{
		i = 1;
		k = Sys_Max_Axis_Num;
	}
	else
		{
			i = axis;
			k = axis;
		}

	for( ; i <= k  ; i++) 
	{ 
		if(GT_Axis(i))//设置第i 轴为当前轴
			rtn = 1;

		if(mode == Axis_On_Mode)
		{
			if(GT_AxisOn())//驱动使能 
				rtn = 1;
		}
		else
			{
				if(GT_AxisOff())//关闭轴驱动使能
					rtn = 1;
			}
	} 
	
	return rtn;
}

// 功  能:设置指定的轴手动和回零时的运动参数
//
// 参  数: speed的取值(1) speed > 0 指定的轴向以speed的速度向正方向手动 (-16384 -- 16384)
//					  (2) speed < 0 指定的轴向以speed的速度向负方向手动
//					  (3) speed = 0 指定的轴停止运动
//		   acc的取值  (1) 指定的轴加速度 0 -- 16383
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_jog_para(double speed , double acc)
{
	int rtn = 0;

	if(acc < 0.0 || acc > 16383.0)
		acc_home_jog = 0.001;
	else
		acc_home_jog = acc;

	if(speed < (-16384.0))
		speed_jog = -16383.0;
	else
		if(speed > 16384.0)
			speed_jog = 16383.0;
		else
			speed_jog = speed;

	return rtn;
}

// 功  能:设置指定的轴手动和回零时的运动参数
//
// 参  数: speed1的取值(1) speed1 > 0 指定的轴向以speed1的速度向正方向回零 (-16384 -- 16384)
//					   (2) speed1 < 0 指定的轴向以speed1的速度向负方向回零
//					   (3) speed1 = 0 指定的轴停止运动
//		   acc的取值  (1) 指定的轴加速度 0 -- 16383
void Gt_Card_Api::set_home_para(double speed1 , double acc)
{
	if(acc < 0.0 || acc > 16383.0)
		acc_home_jog = 0.001;
	else
		acc_home_jog = acc;

	if(speed1 < (-16384.0))
		speed_home = -16383.0;
	else
		if(speed1 > 16384.0)
			speed_home = 16383.0;
		else
			speed_home = speed1;
}

// 功  能:控制指定的轴回参考点
//
// 参  数: axis的取值 (1) axis  <= 0 无效的参数
//					  (2) 1 , 2 , 3 ,4 时使指定的轴回参考点
//
// start_stop参数:	1 指定的轴回零
//					0 指定的回零动作停止
//
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_axis_home(int axis,int start_stop)
{
	int rtn = 0;

	if(check_axis_user(axis))
		return 1;

	m_home_step[axis] = start_stop;
	
	if(start_stop == 0)
	{
		if(GT_ClrSts())//清状态
			rtn = -1;

		if(set_axis_stop(axis))
			rtn = -1;

		m_home_step[axis] = -1; 
	}

	return rtn;
}

// 功  能:控制指定的轴进行回参考点动作,此函数需不断执行,直到返回0或者-1
//
// 参  数: axis的取值 (1) axis  <= 0 无效的参数
//					  (2) 1 , 2 , 3 ,4 时使指定的轴回参考点
//
// 返回值: 1 表示正在回零
//		   -1 表示回零失败
//		    0 表示回零完成
int Gt_Card_Api::set_axis_homeing(int axis)
{
	int rtn = 1;
	unsigned short status; 
	long actl_pos;

	if(check_axis_user(axis))
		return -1;

	switch(m_home_step[axis])
	{
		case 0:
		default:
				break;
		case 1:
				if(GT_Axis(axis))//设置第i 轴为当前轴
					rtn = -1;

				if(GT_ClrSts())//清状态
					rtn = -1;

				if(GT_CaptHome()) //设置捕获Home 
					rtn = -1;

				if(GT_PrflV()) //设置速度控制模式
					rtn = -1;
	
				axis_mode = 0;

				if(GT_SetAcc(acc_home_jog))//设置加速度
					rtn = 1;

				if(GT_SetVel(speed_home)) // 设置速度为目标速度
					rtn = 1;

				if(GT_Update()) //刷新参数 
					rtn = -1;
				
				m_home_step[axis] = 2; 
				break;
		case 2:
				if(GT_Axis(axis))//设置第i 轴为当前轴
					rtn = -1;

				if(GT_GetSts(&status))//读取轴状态值 
					rtn = -1;

				if((status&0x8)) //等待Home 捕获 
				{ 
					m_home_step[axis] = 3; 
				} 
				break;
		case 3:
				if(GT_Axis(axis))//设置第i 轴为当前轴
					rtn = -1;

				if(GT_GetCapt(&actl_pos)) //读取捕获位置 
					rtn = -1;

				if(GT_PrflS()) //设置S-曲线控制模式
					rtn = 1;
				
				axis_mode = 0;

				if(GT_SetJerk(jerk_move_step))//设置加加速度
					rtn = 1;

				if(GT_SetMAcc(acc_move_step))//设置加速度为
					rtn = 1;

				if(GT_SetVel(speed_move_step)) // 设置速度为目标速度
					rtn = 1;

				if(GT_SetPos(actl_pos)) //设置捕获位置为目标位置 
					rtn = -1;
				
				if(GT_ClrSts()) //清状态 
					rtn = -1;

				if(GT_Update()) //刷新参数 
					rtn = -1;

				m_home_step[axis] = 4; 
				break;
		case 4:
				if(check_axis_done(axis)) //等待运动完成
					break;

				if(GT_Axis(axis))//设置第i 轴为当前轴
					rtn = -1;

				if(GT_ZeroPos()) //清零
					rtn = -1;
				m_home_step[axis] = -1; 
				rtn = 0;
				break;

	} 

	return rtn;
}

// 功  能:控制指定的轴以某一速度一直运动
//
// 参  数: axis的取值 (1) axis  <= 0 无效的参数
//					  (2) 1 , 2 , 3 ,4 时使指定的轴
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_axis_jog(int axis)
{
	int rtn = 0;

	if(check_axis_user(axis))
		return 1;

	if(GT_Axis(axis))//设置第i 轴为当前轴
		rtn = 1;

	if(GT_PrflV()) //设置速度控制模式
		rtn = 1;

	axis_mode = 0;

	if(GT_SetAcc(acc_home_jog))//设置加速度 
		rtn = 1;

	if(GT_SetVel(speed_jog)) // 设置速度为目标速度
		rtn = 1;

	if(GT_Update()) //刷新参数 
		rtn = 1;

	return rtn;
}

// 功  能:设置指定的轴步进或者单轴运动时的运动参数
//
// 参  数: speed的取值(1) speed > 0 指定的轴向以speed的速度运动0 -- 16383
//		   acc的取值  (1) 指定的轴加速度 0 -- 0.5
//		   jerk的取值  (1) 指定的轴加加速度 0 -- 0.5
void Gt_Card_Api::set_move_step_para(double speed ,double acc,double jerk)
{
	if(jerk < 0.0 || jerk > 0.5)
		jerk_move_step = 0.0001;
	else
		jerk_move_step = jerk;

	if(acc < 0.0 || acc > 0.5)
		acc_move_step = 0.001;
	else
		acc_move_step = acc;

	if(speed < (0.0))
		speed_move_step = 0.0;
	else
		if(speed > 16384.0)
			speed_move_step = 16383.0;
		else
			speed_move_step = speed;
}

// 功  能:控制指定的轴以某一速度,以当前设定的目标位置为基础,增量运行displacement指定的距离
//
//
// 参  数: axis的取值 (1) axis  <= 0 无效的参数
//					  (2) 1 , 2 , 3 ,4 时使指定的轴
//
//         displacement的取值(1) displacement > 0 指定的轴向以speed的速度向正方向运动
//							 (2) displacement < 0 指定的轴向以speed的速度向负方向运动
//
//         speed的取值(1) speed > 0 指定的轴向以speed的速度运动0 -- 16383
//		   acc的取值  (1) 指定的轴加速度 0 -- 0.5
//		   jerk的取值  (1) 指定的轴加加速度 0 -- 0.5
//					  
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_axis_step(int axis,long displacement)
{
	int rtn = 0;
	long actl_pos;

	if(check_axis_user(axis))
		return 1;

	if(GT_Axis(axis))//设置第i 轴为当前轴
		rtn = 1;

	if(get_axis_den(axis)) //检测指定轴是否在运动
		return 1;

	if(GT_PrflS()) //设置S-曲线控制模式
		rtn = 1;

	axis_mode = 0;

	if(GT_SetJerk(jerk_move_step))//设置加加速度
		rtn = 1;

	if(GT_SetMAcc(acc_move_step))//设置加速度为
		rtn = 1;

	if(GT_SetVel(speed_move_step)) // 设置速度为目标速度
		rtn = 1;

	if(GT_GetPos(&actl_pos)) //Atl取得当前轴的实际位置
		rtn = 1;

	actl_pos += cmd_to_motion_pos(axis,actl_pos + displacement);

	if(GT_SetPos(actl_pos)) //设置目标位置 
		rtn = 1;

	if(GT_Update()) //刷新参数 
		rtn = 1;

	return rtn;
}

// 功  能:控制指定的轴以某一速度,运动到指定的位置
//
//
// 参  数: axis的取值 (1) axis  <= 0 无效的参数
//					  (2) 1 , 2 , 3 ,4 时使指定的轴
//
//         position的取值(1) 指定的轴要运动到的位置
//
//         speed的取值(1) speed > 0 指定的轴向以speed的速度运动
//					  
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_axis_moveto(int axis,long position)
{
	int rtn = 0;

	if(check_axis_user(axis))
		return 1;

	if(GT_Axis(axis))//设置第i 轴为当前轴
		rtn = 1;

	if(get_axis_den(axis)) //检测指定轴是否在运动
		return 1;

	if(GT_PrflS()) //设置S-曲线控制模式
		rtn = 1;

	axis_mode = 0;

	if(GT_SetJerk(jerk_move_step))//设置加加速度
		rtn = 1;

	if(GT_SetMAcc(acc_move_step))//设置加速度为
		rtn = 1;

	if(GT_SetVel(speed_move_step)) // 设置速度为目标速度
		rtn = 1;

	position = cmd_to_motion_pos(axis , position);

	if(GT_SetPos(position)) //设置捕获位置为目标位置 
		rtn = 1;

	if(GT_Update()) //刷新参数 
		rtn = 1;

	return rtn;
}

// 功  能:平滑停止指定轴
//
//
// 参  数: axis的取值 (1) axis  <= 0 平滑停止所有的轴
//					  (2) 1 , 2 , 3 ,4 时使指定的轴
//
// 返回值: 1表示有错误发生
//			0表示命令执行成功
int Gt_Card_Api::set_axis_stop(int axis)
{
	int i;
	int k;
	int rtn = 0;

	if(axis > Sys_Max_Axis_Num)
		return 1;

	if(axis <= 0)
	{
		i = 1;
		k = Sys_Max_Axis_Num;
	}
	else
		{
			i = axis;
			k = axis;
		}

	for( ; i <= k  ; i++) 
	{ 
		if(GT_Axis(i))//设置第i 轴为当前轴
		{
			rtn = 1;
		}

		if(GT_SmthStp())
		{
			rtn = 1;
		}

		if(GT_Update())
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -