📄 gtcardapi.cpp
字号:
/* 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 + -