?? gtcardapi.cpp
字號(hào):
/* Copyright (c) 2006, lihaizhou All rights reserved.
華中科技大學(xué)國家數(shù)控系統(tǒng)工程技術(shù)研究中心
文件名稱:GtCardApi.h
摘 要:固高GT-400-SP-PCI-G運(yùn)動(dòng)控制卡操作類
運(yùn)行環(huán)境:Windows2000/Xp
當(dāng)前版本: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()
{
}
// 功 能:運(yùn)動(dòng)控制器初始化
//
// 返回值: 非0表示有錯(cuò)誤發(fā)生
// 0表示沒有有錯(cuò)誤發(fā)生
int Gt_Card_Api::InitNCCard(void)
{
int i;
int nRet = 0;
if(GT_Open( ))//打開運(yùn)動(dòng)控制器設(shè)備
nRet = 1;
if(GT_Reset( ))//復(fù)位運(yùn)動(dòng)控制器
nRet = 1;
// if(GT_SwitchtoCardNo(1)) /* 將1 號(hào)卡設(shè)為當(dāng)前卡(僅對(duì)于多卡系統(tǒng),單卡系統(tǒng)可取消該行)*/
// nRet = 1;
if(GT_SetSmplTm(Sys_Control_Timer))//該函數(shù)設(shè)置運(yùn)動(dòng)控制器伺服周期。設(shè)定值的范圍為:48~1966.08 微秒運(yùn)動(dòng)控制器推薦使用的伺服周期是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;
}
// 功 能: 檢測(cè)指定的軸是否是有效軸(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;
}
// 功 能: 設(shè)置指定軸的1um對(duì)應(yīng)的脈沖數(shù)
//
// 參 數(shù):axis的取值(1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)初始化指定的軸
// PerPlus的取值(1) 每轉(zhuǎn)脈沖數(shù)目
// PerGap的取值 (1) 每轉(zhuǎn)工作臺(tái)移動(dòng)的距離
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;
}
// 功 能:將指定軸對(duì)應(yīng)的以u(píng)m為單位的位置,轉(zhuǎn)換成以脈沖為單位的位置
//
// 參 數(shù):axis的取值(1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)初始化指定的軸
// pos的取值 (1) 以u(píng)m為單位的位置
//
// 返回值: 以脈沖為單位的位置
long Gt_Card_Api::cmd_to_motion_pos(int axis,long pos)
{
double tmpPos = m_axis_ratio[axis] * (double)pos;
return (long)tmpPos;
}
// 功 能:將指定軸對(duì)應(yīng)的以脈沖為單位的位置,轉(zhuǎn)換成以u(píng)m為單位的位置
//
// 參 數(shù):axis的取值(1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)初始化指定的軸
// pos的取值 (1) 以u(píng)m為單位的位置
//
// 返回值: 以u(píng)m為單位的位置
long Gt_Card_Api::motion_to_cmd_pos(int axis,long pos)
{
double tmpPos = (double)pos / m_axis_ratio[axis];
return (long)tmpPos;
}
// 功 能:初始化軸指定的軸
//
// 參 數(shù):axis的取值(1) axis <= 0 時(shí)初始化系統(tǒng)所有的軸
// (2) 1 , 2 , 3 ,4 時(shí)初始化指定的軸
//
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
// 功 能:控制使能或者關(guān)閉指定的軸
//
// 參 數(shù): axis的取值 (1) axis <= 0 時(shí)使能或者關(guān)閉系統(tǒng)所有的軸
// (2) 1 , 2 , 3 ,4 時(shí)使能或者關(guān)閉指定的軸
//
// mode的取值 (1) Axis_On_Mode 打開軸驅(qū)動(dòng)使能
// (2) Axis_Off_Mode 關(guān)閉軸驅(qū)動(dòng)使能
//
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
int Gt_Card_Api::set_axis_on_off(int axis , int mode) //控制軸初始化函數(shù)
{
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))//設(shè)置第i 軸為當(dāng)前軸
rtn = 1;
if(mode == Axis_On_Mode)
{
if(GT_AxisOn())//驅(qū)動(dòng)使能
rtn = 1;
}
else
{
if(GT_AxisOff())//關(guān)閉軸驅(qū)動(dòng)使能
rtn = 1;
}
}
return rtn;
}
// 功 能:設(shè)置指定的軸手動(dòng)和回零時(shí)的運(yùn)動(dòng)參數(shù)
//
// 參 數(shù): speed的取值(1) speed > 0 指定的軸向以speed的速度向正方向手動(dòng) (-16384 -- 16384)
// (2) speed < 0 指定的軸向以speed的速度向負(fù)方向手動(dòng)
// (3) speed = 0 指定的軸停止運(yùn)動(dòng)
// acc的取值 (1) 指定的軸加速度 0 -- 16383
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
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;
}
// 功 能:設(shè)置指定的軸手動(dòng)和回零時(shí)的運(yùn)動(dòng)參數(shù)
//
// 參 數(shù): speed1的取值(1) speed1 > 0 指定的軸向以speed1的速度向正方向回零 (-16384 -- 16384)
// (2) speed1 < 0 指定的軸向以speed1的速度向負(fù)方向回零
// (3) speed1 = 0 指定的軸停止運(yùn)動(dòng)
// 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;
}
// 功 能:控制指定的軸回參考點(diǎn)
//
// 參 數(shù): axis的取值 (1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)使指定的軸回參考點(diǎn)
//
// start_stop參數(shù): 1 指定的軸回零
// 0 指定的回零動(dòng)作停止
//
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
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())//清狀態(tài)
rtn = -1;
if(set_axis_stop(axis))
rtn = -1;
m_home_step[axis] = -1;
}
return rtn;
}
// 功 能:控制指定的軸進(jìn)行回參考點(diǎn)動(dòng)作,此函數(shù)需不斷執(zhí)行,直到返回0或者-1
//
// 參 數(shù): axis的取值 (1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)使指定的軸回參考點(diǎn)
//
// 返回值: 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))//設(shè)置第i 軸為當(dāng)前軸
rtn = -1;
if(GT_ClrSts())//清狀態(tài)
rtn = -1;
if(GT_CaptHome()) //設(shè)置捕獲Home
rtn = -1;
if(GT_PrflV()) //設(shè)置速度控制模式
rtn = -1;
axis_mode = 0;
if(GT_SetAcc(acc_home_jog))//設(shè)置加速度
rtn = 1;
if(GT_SetVel(speed_home)) // 設(shè)置速度為目標(biāo)速度
rtn = 1;
if(GT_Update()) //刷新參數(shù)
rtn = -1;
m_home_step[axis] = 2;
break;
case 2:
if(GT_Axis(axis))//設(shè)置第i 軸為當(dāng)前軸
rtn = -1;
if(GT_GetSts(&status))//讀取軸狀態(tài)值
rtn = -1;
if((status&0x8)) //等待Home 捕獲
{
m_home_step[axis] = 3;
}
break;
case 3:
if(GT_Axis(axis))//設(shè)置第i 軸為當(dāng)前軸
rtn = -1;
if(GT_GetCapt(&actl_pos)) //讀取捕獲位置
rtn = -1;
if(GT_PrflS()) //設(shè)置S-曲線控制模式
rtn = 1;
axis_mode = 0;
if(GT_SetJerk(jerk_move_step))//設(shè)置加加速度
rtn = 1;
if(GT_SetMAcc(acc_move_step))//設(shè)置加速度為
rtn = 1;
if(GT_SetVel(speed_move_step)) // 設(shè)置速度為目標(biāo)速度
rtn = 1;
if(GT_SetPos(actl_pos)) //設(shè)置捕獲位置為目標(biāo)位置
rtn = -1;
if(GT_ClrSts()) //清狀態(tài)
rtn = -1;
if(GT_Update()) //刷新參數(shù)
rtn = -1;
m_home_step[axis] = 4;
break;
case 4:
if(check_axis_done(axis)) //等待運(yùn)動(dòng)完成
break;
if(GT_Axis(axis))//設(shè)置第i 軸為當(dāng)前軸
rtn = -1;
if(GT_ZeroPos()) //清零
rtn = -1;
m_home_step[axis] = -1;
rtn = 0;
break;
}
return rtn;
}
// 功 能:控制指定的軸以某一速度一直運(yùn)動(dòng)
//
// 參 數(shù): axis的取值 (1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)使指定的軸
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
int Gt_Card_Api::set_axis_jog(int axis)
{
int rtn = 0;
if(check_axis_user(axis))
return 1;
if(GT_Axis(axis))//設(shè)置第i 軸為當(dāng)前軸
rtn = 1;
if(GT_PrflV()) //設(shè)置速度控制模式
rtn = 1;
axis_mode = 0;
if(GT_SetAcc(acc_home_jog))//設(shè)置加速度
rtn = 1;
if(GT_SetVel(speed_jog)) // 設(shè)置速度為目標(biāo)速度
rtn = 1;
if(GT_Update()) //刷新參數(shù)
rtn = 1;
return rtn;
}
// 功 能:設(shè)置指定的軸步進(jìn)或者單軸運(yùn)動(dòng)時(shí)的運(yùn)動(dòng)參數(shù)
//
// 參 數(shù): speed的取值(1) speed > 0 指定的軸向以speed的速度運(yùn)動(dòng)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;
}
// 功 能:控制指定的軸以某一速度,以當(dāng)前設(shè)定的目標(biāo)位置為基礎(chǔ),增量運(yùn)行displacement指定的距離
//
//
// 參 數(shù): axis的取值 (1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)使指定的軸
//
// displacement的取值(1) displacement > 0 指定的軸向以speed的速度向正方向運(yùn)動(dòng)
// (2) displacement < 0 指定的軸向以speed的速度向負(fù)方向運(yùn)動(dòng)
//
// speed的取值(1) speed > 0 指定的軸向以speed的速度運(yùn)動(dòng)0 -- 16383
// acc的取值 (1) 指定的軸加速度 0 -- 0.5
// jerk的取值 (1) 指定的軸加加速度 0 -- 0.5
//
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
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))//設(shè)置第i 軸為當(dāng)前軸
rtn = 1;
if(get_axis_den(axis)) //檢測(cè)指定軸是否在運(yùn)動(dòng)
return 1;
if(GT_PrflS()) //設(shè)置S-曲線控制模式
rtn = 1;
axis_mode = 0;
if(GT_SetJerk(jerk_move_step))//設(shè)置加加速度
rtn = 1;
if(GT_SetMAcc(acc_move_step))//設(shè)置加速度為
rtn = 1;
if(GT_SetVel(speed_move_step)) // 設(shè)置速度為目標(biāo)速度
rtn = 1;
if(GT_GetPos(&actl_pos)) //Atl取得當(dāng)前軸的實(shí)際位置
rtn = 1;
actl_pos += cmd_to_motion_pos(axis,actl_pos + displacement);
if(GT_SetPos(actl_pos)) //設(shè)置目標(biāo)位置
rtn = 1;
if(GT_Update()) //刷新參數(shù)
rtn = 1;
return rtn;
}
// 功 能:控制指定的軸以某一速度,運(yùn)動(dòng)到指定的位置
//
//
// 參 數(shù): axis的取值 (1) axis <= 0 無效的參數(shù)
// (2) 1 , 2 , 3 ,4 時(shí)使指定的軸
//
// position的取值(1) 指定的軸要運(yùn)動(dòng)到的位置
//
// speed的取值(1) speed > 0 指定的軸向以speed的速度運(yùn)動(dòng)
//
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
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))//設(shè)置第i 軸為當(dāng)前軸
rtn = 1;
if(get_axis_den(axis)) //檢測(cè)指定軸是否在運(yùn)動(dòng)
return 1;
if(GT_PrflS()) //設(shè)置S-曲線控制模式
rtn = 1;
axis_mode = 0;
if(GT_SetJerk(jerk_move_step))//設(shè)置加加速度
rtn = 1;
if(GT_SetMAcc(acc_move_step))//設(shè)置加速度為
rtn = 1;
if(GT_SetVel(speed_move_step)) // 設(shè)置速度為目標(biāo)速度
rtn = 1;
position = cmd_to_motion_pos(axis , position);
if(GT_SetPos(position)) //設(shè)置捕獲位置為目標(biāo)位置
rtn = 1;
if(GT_Update()) //刷新參數(shù)
rtn = 1;
return rtn;
}
// 功 能:平滑停止指定軸
//
//
// 參 數(shù): axis的取值 (1) axis <= 0 平滑停止所有的軸
// (2) 1 , 2 , 3 ,4 時(shí)使指定的軸
//
// 返回值: 1表示有錯(cuò)誤發(fā)生
// 0表示命令執(zhí)行成功
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))//設(shè)置第i 軸為當(dāng)前軸
{
rtn = 1;
}
if(GT_SmthStp())
{
rtn = 1;
}
if(GT_Update())
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -