運動模式是指規劃一個或多個軸運動的方式。 運動控制器支持的運動模式有點位運動模式、 Jog運動模式、電子齒輪(即 Gear) 運動模式和插補運動模式
GT_PrfTrap | 設置指定軸爲點位模式 |
GT_PrfJog | 設置指定軸爲 Jog 模式 |
GT_PrfGear | 設置指定軸爲電子齒輪模式 |
GT_GetPrfMode | 查詢指定軸的運動模式 |
在設置或切換運動模式時,要保證軸處於規劃靜止狀態。如果軸正在運動,請先調用GT_Stop 指令停止一個或多個軸的運動,然後再調用上表中的指令切換到想要的運動模式下。
一·、點位模式(PT)
每一個軸在規劃靜止時都可以設置爲點位運動。在點位運動模式下,各軸可以獨立設置目標位置、目標速度、加速度、減速度、起跳速度、平滑時間等運動參數,能夠獨立運動或停止。
GT_PrfTrap | 設置指定軸爲點位運動模式 |
GT_SetTrapPrm | 設置點位運動模式下的運動參數 |
GT_GetTrapPrm | 讀取點位運動模式下的運動參數 |
GT_SetPos | 設置目標位置 |
GT_GetPos | 讀取目標位置 |
GT_SetVel | 設置目標速度 |
GT_GetVel | 讀取目標速度 |
GT_Update | 啓動點位運動 |
JOG模式關鍵程序步驟:
(1)配置運動控制器 --GT_LoadConfig
(2)將 AXIS 軸設爲點位模式 --GT_PrfTrap
(3)設置需要修改的運動參數 --GT_GetTrapPrm
public struct TTrapPrm
{
public double acc;//加速度
public double dec;//減速度
public double velStart;//起始速度
public short smoothTime;//平滑時間
}
(4)設置 AXIS 軸的目標位置 --GT_SetPos
(5)設置 AXIS 軸的目標速度 --GT_SetVel
(6)啓動AXIS軸運動 --GT_Update
(7)等待AXIS軸規劃停止
(8)電機伺服關閉 --GT_AxisOff
例程:將第 1 軸設定爲點位運動模式,並且以速度 50pulse/ms,加速度 0.25pulse/ms2,減速度0.125pulse/ms2,平滑時間爲 25ms 的運動參數正向運動 50000 個脈衝。
int main(int argc, char* argv[])
{
short sRtn;
TTrapPrm trap;
long sts;
double prfPos;
// 1、打開運動控制器
sRtn = GT_Open();
//2、復位運動控制器
sRtn = GT_Reset();
commandhandler("GT_Reset", sRtn);
//3、 配置運動控制器
// 注意:配置文件取消了各軸的報警和限位
sRtn = GT_LoadConfig("test.cfg");
// 4、清除各軸的報警和限位
sRtn =GT_ClrSts(1, 8);
///5、伺服使能
sRtn =GT_AxisOn(AXIS);
// 位置清零
sRt6、n = GT_ZeroPos(AXIS);
//7、將 AXIS 軸設爲點位模式
sRtn = GT_PrfTrap(AXIS);
//8、讀取點位運動參數(需要讀取所有運動參數到上位機變量)
sRtn = GT_GetTrapPrm(AXIS, &trap);
//9、設置需要修改的運動參數
trap.acc = 0.25;
trap.dec = 0.125;
trap.smoothTime = 25;
//10、設置點位運動參數
sRtn = GT_SetTrapPrm(AXIS, &trap);
//11、設置 AXIS 軸的目標位置
sRtn = GT_SetPos(AXIS, 50000L);
//12、設置AXIS軸的目標速度
sRtn = GT_SetVel(AXIS, 50);
//13、啓動AXIS軸的運動
sRtn = GT_Update(1<<(AXIS-1));
do
{
// 讀取AXIS軸的狀態
sRtn = GT_GetSts(AXIS, &sts);
// 讀取AXIS軸的規劃位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
printf("sts=0x%-10lxprfPos=%-10.1lf\r", sts, prfPos);
}while(sts&0x400);
//14、等待AXIS軸規劃停止
//15、伺服關閉
sRtn = GT_AxisOff(AXIS);
printf("\nGT_AxisOff()=%d\n", sRtn);
getch();
return 0;
}
二、JOG運動模式
在 Jog 運動模式下,各軸可以獨立設置目標速度、加速度、減速度、平滑係數等運動參數,能夠獨立運動或停止
GT_PrfJog | 設置指定軸爲 Jog 運動模式 |
GT_SetJogPrm | 設置 Jog 運動模式下的運動參數 |
GT_GetJogPrm | 讀取 Jog 運動模式下的運動參數 |
GT_SetVel | 設置目標速度 |
GT_GetVel | 讀取目標速度 |
GT_Update | 啓動 Jog 運動 |
JOG模式關鍵程序步驟:
(1)配置運動控制器 --GT_LoadConfig
(2)將 AXIS 軸設爲JOG模式 --GT_PrfJog
(3)設置JOG運動參數 --GT_SetJogPrm
public struct TJogPrm
public double acc;
public double dec;
public double smooth;
}
(4)設目標速度 --GT_SetVel
(5)啓動 AXIS 軸的運動 --GT_Update
(6)在運動過程中可以更改運動速度 --GT_SetVel GT_Update
(7)伺服關閉 --GT_AxisOff例程:軸 1 運動在 Jog 模式下,初始目標速度爲 100pulse/ms。動態改變目標速度,當規劃位置超過100000pulse 時,修改目標速度爲 50 pulse/ms。
int main(int argc, char* argv[])
{
short sRtn;
TJogPrm jog;
long sts;
double prfPos, prfVel;
// 打開運動控制器
sRtn = GT_Open();
// 指令返回值檢測,請查閱例程 3-1
// 復位運動控制器
sRtn = GT_Reset();
// 配置運動控制器
// 注意:配置文件取消了各軸的報警和限位
sRtn = GT_LoadConfig("test.cfg");
// 清除各軸的報警和限位
sRtn =GT_ClrSts(1, 8);
// 伺服使能
sRtn = GT_AxisOn(AXIS);
// 位置清零
sRtn = GT_ZeroPos(AXIS);
// 將 AXIS 軸設爲 Jog 模式
sRtn = GT_PrfJog(AXIS);
// 讀取 Jog 運動參數(需要讀取全部運動參數到上位機變量)
sRtn =GT_GetJogPrm(AXIS, &jog);
//設置需要修改的運動參數
jog.acc = 0.0625;
jog.dec = 0.0625;
// 設置 Jog 運動參數
sRtn = GT_SetJogPrm(AXIS, &jog);
// 設置 AXIS 軸的目標速度
sRtn = GT_SetVel(AXIS, 100);
// 啓動 AXIS 軸的運動
sRtn = GT_Update(1<<(AXIS-1));
while(1)
{
// 讀取AXIS軸的狀態
sRtn = GT_GetSts(AXIS, &sts);
// 讀取AXIS軸的規劃位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 讀取AXIS軸的規劃速度
sRtn = GT_GetPrfVel(AXIS, &prfVel);
printf("sts=0x%-10lxprfPos=%-10.1lfprfVel=%-10.1lf\r", sts, prfPos, prfVel);
if(prfPos>= 100000)
{
// 設置AXIS軸新的目標速度
sRtn = GT_SetVel(AXIS, 50);
// AXIS軸新的目標速度生效
sRtn = GT_Update(1<<(AXIS-1));
break;
}
}
while(!kbhit())
{
// 讀取AXIS軸的狀態
sRtn = GT_GetSts(AXIS, &sts);
// 讀取AXIS軸的規劃位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 讀取AXIS軸的規劃速度
sRtn = GT_GetPrfVel(AXIS, &prfVel);
printf("sts=0x%-10lxprfPos=%-10.1lfprfVel=%-10.1lf\r", sts, prfPos, prfVel);
}
// 伺服關閉
sRtn = GT_AxisOff (AXIS);
printf("\nGT_AxisOff()=%d\n", sRtn);
getch();
return 0;
}
三、電子齒輪模式(Gear)
電子齒輪模式能夠將兩軸或多軸聯繫起來,實現精確的同步運動,從而替代傳統的機械齒輪連接。
我們把被跟隨的軸叫主軸,把跟隨的軸叫從軸。電子齒輪模式下, 1 個主軸能夠驅動多個從軸,從軸可以跟隨主軸的規劃位置、編碼器位置。
傳動比:主軸速度與從軸速度的比例。電子齒輪模式能夠靈活的設置傳動比,節省機械系統的安裝時間。當主軸速度變化時,從軸會根據設定好的傳動比自動改變速度。電子齒輪模式也能夠在運動過程中修改傳動比。
GT_PrfGear | 設置指定軸爲電子齒輪運動模式 |
GT_SetGearMaster | 設置電子齒輪運動跟隨主軸 |
GT_GetGearMaster | 讀取電子齒輪運動跟隨主軸 |
GT_SetGearRatio | 設置電子齒輪比 |
GT_GetGearRatio | 讀取電子齒輪比 |
GT_GearStart | 啓動電子齒輪運動 |
Gear模式關鍵程序步驟:
1、控制卡配置
(1)配置運動控制器 --GT_LoadConfig
2、主軸配置
(1)將 AXIS 軸設爲JOG模式 --GT_PrfJog
(2)設置JOG運動參數 --GT_SetJogPrm
public struct TJogPrm
{
public double acc;
public double dec;
public double smooth;
}
(3)設目標速度 --GT_SetVel
(4)啓動主軸的運動 --GT_Update
3、從軸配置
(1)將從軸設爲 Gear 模式 --GT_PrfGear
(2)設置主軸,默認跟隨主軸規劃位置 --GT_SetGearMaster(SLAVE, MASTER)
(3)設置從軸的傳動比和離合區 --GT_SetGearRatio(SLAVE, 2, 1, 100000)
說明:
1) 調 用 GT_SetGearRatio(short profile, long masterEven, long slaveEven, long masterSlope)
指令來設置傳動比和離合區。 profile 是從軸軸號; masterEven 是主軸位
移, slaveEven 是從軸位移, masterEven/slaveEven 等於傳動比; slope 是主軸離合
區位移,即主軸在離合區內走過的位移,用戶應自行計算出來。
2) 如果從軸軸號爲 slave,當主軸位移 alpha 時從軸位移 beta,主軸運動 slope 位移後從
軸到達設定傳動比,應當調用以下指令:GT_SetGearRatio(slave, alpha, beta, slope);
(4)啓動從軸 --GT_GearStart
示例:主軸爲 Jog 模式,從軸爲電子齒輪模式,傳動比爲主軸速度:從軸速度=2: 1,主軸運動離合區位移後(圖中陰影部分的區域),從軸達到設定的傳動比。
int main(int argc, char* argv[])
{
short sRtn;
double prfVel[8];
TJogPrm jog;
// 打開運動控制器
sRtn = GT_Open();
// 復位運動控制器
sRtn = GT_Reset();
// 配置運動控制器
// 注意:配置文件 test.cfg 取消了各軸的報警和限位
sRtn = GT_LoadConfig("test.cfg");
// 清除各軸的報警和限位
sRtn =GT_ClrSts(1, 8);
// 伺服使能
sRtn = GT_AxisOn(MASTER);
sRtn = GT_AxisOn(SLAVE);
// 位置清零
sRtn = GT_ZeroPos(MASTER);
sRtn = GT_ZeroPos(SLAVE);
// 1、將主軸設爲 Jog 模式
sRtn = GT_PrfJog(MASTER);
//2、設置主軸運動參數
sRtn =GT_GetJogPrm(MASTER, &jog);
jog.acc = 1;
sRtn = GT_SetJogPrm(MASTER, &jog);
sRtn = GT_SetVel(MASTER, 100);
//3、啓動主軸
sRtn = GT_Update(1<<(MASTER-1));
// 將從軸設爲 Gear 模式
sRtn = GT_PrfGear(SLAVE);
// 設置主軸,默認跟隨主軸規劃位置
sRtn = GT_SetGearMaster(SLAVE, MASTER);
// 設置從軸的傳動比和離合區
sRtn = GT_SetGearRatio(SLAVE, 2, 1, 100000);
// 啓動從軸
sRtn =GT_GearStart(1<<(SLAVE-1));
while(!kbhit())
{
// 查詢各軸的規劃速度
sRtn = GT_GetPrfVel(1, prfVel, 8);
printf("master vel=%-10.2lf\tslave vel=%-10.2lf\r",
prfVel[MASTER-1], prfVel[SLAVE-1]);
}
// 伺服關閉
sRtn = GT_AxisOff (MASTER);
printf("\nGT_AxisOff()=%d, Axis:%d\n", sRtn, MASTER);
sRtn = GT_AxisOff (SLAVE);
printf("\nGT_AxisOff()=%d, Axis:%d\n", sRtn, SLAVE);
getch();
return 0;
}
四、插補運動模式
GT_SetCrdPrm | 設置座標系參數,確立座標系映射,建立座標系 |
GT_GetCrdPrm | 查詢座標系參數 |
GT_CrdData | 向插補緩存區增加插補數據 |
GT_LnXY | 緩存區指令,二維直線插補 |
GT_LnXYZ | 緩存區指令,三維直線插補 |
GT_LnXYZA | 緩存區指令,四維直線插補 |
GT_LnXYG0 | 緩存區指令,二維直線插補(終點速度始終爲 0) |
GT_LnXYZG0 | 緩存區指令,三維直線插補(終點速度始終爲 0) |
GT_LnXYZAG0 | 緩存區指令,四維直線插補(終點速度始終爲 0) |
GT_ArcXYR | 緩存區指令, XY 平面圓弧插補(以終點位置和半徑爲輸入參數) |
GT_ArcXYC | 緩存區指令, XY 平面圓弧插補(以終點位置和圓心位置爲輸入參數) |
GT_ArcYZR | 緩存區指令, YZ 平面圓弧插補(以終點位置和半徑爲輸入參數) |
GT_ArcYZC | 緩存區指令, YZ 平面圓弧插補(以終點位置和圓心位置爲輸入參數) |
GT_ArcZXR | 緩存區指令, ZX 平面圓弧插補(以終點位置和半徑爲輸入參數) |
GT_ArcZXC | 緩存區指令, ZX 平面圓弧插補(以終點位置和圓心位置爲輸入參數) |
GT_BufIO | 緩存區指令,緩存區內數字量 IO 輸出設置指令 |
GT_BufDelay | 緩存區指令,緩存區內延時設置指令 |
GT_BufDA | 緩存區指令,緩存區內輸出 DA 值 |
GT_BufLmtsOn | 緩存區指令,緩存區內有效限位開關 |
GT_BufLmtsOff | 緩存區指令,緩存區內無效限位開關 |
GT_BufSetStopIo | 緩存區指令,緩存區內設置 axis 的停止 IO 信息 |
GT_BufMove | 緩存區指令,實現刀向跟隨功能,啓動某個軸點位運動 |
GT_BufGear | 緩存區指令,實現刀向跟隨功能,啓動某個軸跟隨運動 |
GT_CrdSpace | 查詢插補緩存區剩餘空間 |
GT_CrdClear | 清除插補緩存區內的插補數據 |
GT_CrdStart | 啓動插補運動 |
GT_CrdStatus | 查詢插補運動座標系狀態 |
GT_SetUserSegNum | 緩存區指令,設置自定義插補段段號 |
GT_GetUserSegNum | 讀取自定義插補段段號 |
GT_GetRemainderSegNum | 讀取未完成的插補段段數 |
GT_SetOverride | 設置插補運動目標合成速度倍率 |
GT_SetCrdStopDec | 設置插補運動平滑停止、急停合成加速度 |
GT_GetCrdStopDec | 查詢插補運動平滑停止、急停合成加速度 |
GT_GetCrdPos | 查詢該座標系的當前座標位置值 |
GT_GetCrdVel | 查詢該座標系的合成速度值 |
GT_InitLookAhead | 初始化插補前瞻緩存區 |
使用插補模式需要至少兩步操作:建立座標系和向緩存區存入數據。下面分別就這兩個步驟分別進行詳細講解。
(一)建立座標系
建立座標系就是初始化 TCrdPrm 結構體。
public struct TCrdPrm
{
public short dimension; //表示所建立的座標系的維數,取值範圍:[1, 4]
public short profile1; // 分別規劃軸1~8.如果規劃軸.沒有對應到該座標系,則 profile[x]的值爲 0;
public short profile2;
public short profile3; //如果對應到了 X 軸,則 profile[x]爲 1,Y 軸對應爲 2, Z 軸對應爲 3, A 軸對應爲 4。
public short profile4;
public short profile5; //每個元素的取值範圍: [0, 4]
public short profile6;
public short profile7;
public short profile8;
public double synVelMax; //該座標系所能承受的最大合成速度 ,取值範圍: (0, 32767)
public double synAccMax; //該座標系所能承受的最大合成加速度 ,取值範圍: (0, 32767)
public short evenTime; //最小勻速時間 ,取值範圍: (0, 32767)
public short setOriginFlag; //是否需要指定座標系的原點座標的規劃位置.0:不需要指定原點座標值,則座標系
//的原點在當前規劃位置上。 1:需要指定原點座標值,座標系的原點在 originPos指
//定的規劃位置上。
public int originPos1;
public int originPos2; //指定的座標系原點的規劃位置值
public int originPos3;
public int originPos4;
public int originPos5;
public int originPos6;
public int originPos7;
public int originPos8;
}
例程:建立了一個二維座標系,規劃軸 1 對應爲 x 軸,規劃軸 2 對應爲 y 軸,座標系原點的規劃位置是(100, 100), 單位: pulse,在此座標系內運動的最大合成速度爲 500pulse/ms,最大合成加速度爲 1pulse/ms^2, 最小勻速時間爲 50ms。
TCrdPrm crdPrm;
// 將結構體變量初始化爲0
memset(&crdPrm, 0, sizeof(crdPrm));
// 爲結構體賦值
crdPrm.dimension=2; // 座標系爲二維座標系
crdPrm.synVelMax=500; // 最大合成速度: 500pulse/ms
crdPrm.synAccMax=1; // 最大加速度: 1pulse/ms^2
crdPrm.evenTime = 50; // 最小勻速時間: 50ms
crdPrm.profile[0] = 1; // 規劃器1對應到X軸
crdPrm.profile[1] = 2; // 規劃器2對應到Y軸
crdPrm.setOriginFlag = 1; // 表示需要指定座標系的原點座標的規劃位置
crdPrm.originPos[0] = 100; // 座標系的原點座標的規劃位置爲(100, 100)
crdPrm.originPos[1] = 100;
// 建立1號座標系,設置座標系參數
sRtn = GT_SetCrdPrm(1, &crdPrm);
(二)向緩存區存入數據
步驟:
(a)首先清除緩存區中的數據。--GT_CrdClear(座標系號,緩衝區號)
(b)向對應座標系的相應緩衝區添加運行或動作數據。 --GT_ArcXYR,GT_LnXYZG0,GT_LnXY,GT_BufDelay等
(c)啓動插補運動。 --GT_CrdStart
(1)直線插補例程
假設某數控機牀刀具在 xy 平面從原點出發,走一段如圖 6-12 所示的正六邊形軌跡。一共需要
走七段軌跡,圖中標號已標出。每走完一段軌跡會輸出一次 IO 信號,並且暫停 400ms。
// 即將把數據存入座標系1的FIFO0中,所以要首先清除此緩存區中的數據
sRtn = GT_CrdClear(1, 0);
// 向緩存區寫入第一段插補數據
sRtn = GT_LnXY(
1, // 該插補段的座標系是座標系1
200000, 0, // 該插補段的終點座標(200000, 0)
100, // 該插補段的目標速度: 100pulse/ms
0.1, // 插補段的加速度: 0.1pulse/ms^2
0, // 終點速度爲0
0); // 向座標系1的FIFO0緩存區傳遞該直線插補數據
// 向緩存區寫入第二段插補數據
sRtn = GT_LnXY(1, 100000, 173205, 100, 0.1, 0, 0);
// 緩存區數字量輸出
sRtn =GT_BufIO(
1, // 座標系是座標系1
MC_GPO, // 數字量輸出類型:通用輸出
0xffff, // bit0~bit15全部都輸出
0x55, // 輸出的數值爲0x55
0); // 向座標系1的FIFO0緩存區傳遞該數字量輸出
// 緩存區延時指令
sRtn =GT_BufDelay(
1, // 座標系是座標系1
400, // 延時400ms
0); // 向座標系1的FIFO0緩存區傳遞該延時
// 啓動座標系1的FIFO0的插補運動
sRtn = GT_CrdStart(1, 0);
do
{
// 查詢座標系1的FIFO的插補運動狀態
sRtn = GT_CrdStatus(
1, // 座標系是座標系1
&run, // 讀取插補運動狀態
&segment, // 讀取當前已經完成的插補段數
0); // 查詢座標系1的FIFO0緩存區
// 座標系在運動, 查詢到的run的值爲1
}while(run == 1);
......
(2)圓弧插補指令分爲兩種:
a) 半徑描述方法 --GT_ArcXYR、 GT_ArcYZR、 GT_ArcZXR
b) 圓心座標描述方法 -- GT_ArcXYC、 GT_ArcYZC、 GT_ArcZXC
// 即將把數據存入座標系1的FIFO0中,所以要首先清除此緩存區中的數據
sRtn = GT_CrdClear(1, 0);
// 向緩存區寫入第一段插補數據
sRtn = GT_LnXY(
1, // 該插補段的座標系是座標系1
200000, 0, // 該插補段的終點座標(200000, 0)
100, // 該插補段的目標速度: 100pulse/ms
0.1, // 插補段的加速度: 0.1pulse/ms^2
0, // 終點速度爲0
0); // 向座標系1的FIFO0緩存區傳遞該直線插補數據
// 向緩存區寫入第二段插補數據,該段數據是以圓心描述方法描述了一個整圓
sRtn = GT_ArcXYC(
1, // 座標系是座標系1
200000, 0, // 該圓弧的終點座標(200000, 0)
-100000, 0, // 圓弧插補的圓心相對於起點位置的偏移量(-100000, 0)
0, // 該圓弧是順時針圓弧
100, // 該插補段的目標速度: 100pulse/ms
0.1, // 該插補段的加速度: 0.1pulse/ms^2
0, // 終點速度爲0
0); // 向座標系1的FIFO0緩存區傳遞該直線插補數據
// 向緩存區寫入第三段插補數據,該段數據是以半徑描述方法描述了一個1/4圓弧
sRtn = GT_ArcXYR(
1, // 座標系是座標系1
0, 200000, // 該圓弧的終點座標(0, 200000)
200000, // 半徑: 200000pulse
1, // 該圓弧是逆時針圓弧
100, // 該插補段的目標速度: 100pulse/ms
0.1, // 該插補段的加速度: 0.1pulse/ms^2
0, // 終點速度爲0
0); // 向座標系1的FIFO0緩存區傳遞該直線插補數據
// 向緩存區寫入第四段插補數據,回到原點位置
sRtn = GT_LnXY(1, 0, 0, 100, 0.1, 0, 0);
//啓動座標系1的FIFO0的插補運動
sRtn = GT_CrdStart(1, 0);
do
{
// 查詢座標系1的FIFO的插補運動狀態
sRtn = GT_CrdStatus(
1, // 座標系是座標系1
&run, // 讀取插補運動狀態
&segment, // 讀取當前已經完成的插補段數
0); // 查詢座標系1的FIFO0緩存區
// 座標系在運動, 查詢到的run的值爲1
}while(run == 1);