固高運動控制卡學習1--運動模式介紹(1)--點位,Gear,Jog,插補

        運動模式是指規劃一個或多個軸運動的方式。 運動控制器支持的運動模式有點位運動模式、 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

    例程:將第 軸設定爲點位運動模式,並且以速度 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 模式,從軸爲電子齒輪模式,傳動比爲主軸速度:從軸速度=21,主軸運動離合區位移後(圖中陰影部分的區域),從軸達到設定的傳動比

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_ArcXYRGT_ArcYZRGT_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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章