0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

分享一下EtherCAT運動控制卡的自定義運動曲線

伺服與運動控制 ? 來源:正運動技術 ? 作者:正運動技術 ? 2022-10-09 10:12 ? 次閱讀

今天,正運動小助手給大家分享一下EtherCAT運動控制卡的自定義運動曲線,主要介紹一下如何通過在線命令封裝自己想使用的Basic指令到上位機接口中供上位機調(diào)用。

一、ECI2828運動控制卡的硬件介紹

ECI2828系列控制卡支持最多達16軸直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸、機械手指令等。采用優(yōu)化的網(wǎng)絡通訊協(xié)議可以實現(xiàn)實時的運動控制。

ECI2828系列運動控制卡支持以太網(wǎng),232通訊接口和電腦相連,接收電腦的指令運行,可以通過EtherCAT總線和CAN總線去連接各個擴展模塊,從而擴展輸入輸出點數(shù)或運動軸。

ECI2828系列運動控制卡的應用程序可以使用 VC、VB、VS、C++C#等多種高級語言來開發(fā),程序運行時需要動態(tài)庫zmotion.dll。調(diào)試時可以把ZDevelop軟件同時連接到控制器,從而方便調(diào)試、方便觀察。

ab26015a-4279-11ed-96c9-dac502259ad0.png

ECI2828控制卡本身的硬件接口也十分豐富。具有8個本地脈沖軸,每個軸帶獨立編碼器,最多16個虛擬軸。板上自帶24個通用輸入口(其中4路是高速輸入口可以作為高速鎖存使用),16個通用輸出口(其中4路是高速輸出口可以實現(xiàn)4路的PSO),2路AD和DA。

自帶1個 RS232串口,1個以太網(wǎng)接口。帶一個CAN總線接口,支持通過ZCAN協(xié)議來連接擴展模塊。帶一個CANOPEN接口(功能需要軟件版本支持)。帶一個EtherCAT總線接口可擴展數(shù)字模擬IO以及脈沖定位模塊等,帶一個手輪接口。

二、運動控制卡的Qt開發(fā)流程 1.新建Qt 項目

ac022ebe-4279-11ed-96c9-dac502259ad0.png

圖 1-1新建Qt項目

ac1d2688-4279-11ed-96c9-dac502259ad0.png

圖 1-2選擇項目路徑

ac357af8-4279-11ed-96c9-dac502259ad0.png?

圖 1-3選擇Qt編譯套件(kits)

ac444f42-4279-11ed-96c9-dac502259ad0.png

圖1-4選擇基類

(1)將函數(shù)庫相關的文件復制到新建的項目中。

ac5e7c8c-4279-11ed-96c9-dac502259ad0.png

圖1-5庫文件復制

(2)向新建的項目里面添加函數(shù)庫的靜態(tài)庫。(zmotion.lib)

ac7cb9fe-4279-11ed-96c9-dac502259ad0.png

圖1-6添加函數(shù)庫1

ac977852-4279-11ed-96c9-dac502259ad0.png

圖1-7添加函數(shù)庫2

aca9bc4c-4279-11ed-96c9-dac502259ad0.png

圖 1-8添加函數(shù)庫3

(3)添加函數(shù)庫相關的頭文件到項目中(zmcaux.cpp、zmcaux.h、Zmotion.h)。

acba3c34-4279-11ed-96c9-dac502259ad0.png

圖 1-9添加頭文件

(4)聲明相關頭文件,并定義連接句柄。

ace2f084-4279-11ed-96c9-dac502259ad0.png

圖1-10聲明頭文件

2.PC函數(shù)介紹

(1)PC函數(shù)手冊也在光盤資料里面,具體路徑如下:“光盤資料8.PC函數(shù)函數(shù)庫2.1Motion函數(shù)庫編程手冊V2.1.pdf”。

acfe81fa-4279-11ed-96c9-dac502259ad0.png

(2)PC編程一般需要建立上位機和控制器之間的鏈接。和控制卡的連接一般習慣使用網(wǎng)口方式進行鏈接,具體接口說明如下。

指令7 ZAux_OpenEth
指令原型 int32 __stdcall ZAux_OpenEth(char *ipaddr, ZMC_HANDLE * phandle)
指令說明 以太網(wǎng)鏈接控制器。
輸入參數(shù) 輸入?yún)?shù)1個,詳細見下面說明。
ipaddr 鏈接的IP地址。
輸出參數(shù) 輸出參數(shù)1個,詳細見下面說明。
Phandle 返回的鏈接句柄。
返回值 詳細見錯誤碼說明。

(3)如果想將Basic指令封裝成上位機可以直接調(diào)用的接口就必須使用在線命令這個接口進行函數(shù)封裝,在線命令接口說明如下。

指令 說明
ZAux_Execute 直接發(fā)送指令(當控制器沒有緩沖時自動阻塞)
ZAux_DirectCommand 直接發(fā)送指令(用于調(diào)試,只支持少數(shù)命令暫時不支持)
指令1 ZAux_Execute
指令原型 int32 __stdcall ZAux_Execute(ZMC_HANDLE handle, const char *pszCommand, char *psResponse, uint32 uiResponseLength)
指令說明 發(fā)送字符串命令到控制器(當控制器沒有緩沖時自動阻賽)。
輸入?yún)?shù) 共有3個輸入?yún)?shù),見下方說明。
handle 鏈接句柄。
pszCommand 發(fā)送的命令字符串。
uiResponseLength 返回的字符長度。
輸出參數(shù) 共有1個輸出參數(shù),見下方說明。
psResponse 返回的字符串。
返回值 見錯誤碼詳細說明。
指令2 ZAux_DirectCommand
指令原型 int32 __stdcall ZAux_DirectCommand(ZMC_HANDLE handle, const char *pszCommand,char *psResponse, uint32 uiResponseLength)
指令說明 發(fā)送字符串命令到控制器(用于調(diào)試,只支持少數(shù)命令,暫時不支持)。
輸入?yún)?shù) 共有3個輸入?yún)?shù),見下方說明。
handle 鏈接句柄。
pszCommand 發(fā)送的命令字符串。
uiResponseLength 返回的字符長度。
輸出參數(shù) 共有1個輸出參數(shù),見下方說明。
uiResponseLength 返回的字符串。
返回值 見錯誤碼詳細說明。

(4)Basic指令SPEED的封裝示例。

ad1d8d3e-4279-11ed-96c9-dac502259ad0.png

3.Qt進行Move_Pt指令的封裝,實現(xiàn)自定義曲線的運動。

(1)自定義曲線運動例程Qt界面如下。

ad4404d2-4279-11ed-96c9-dac502259ad0.png

(2)通過Qt的connect將【連接按鈕】的單擊事件綁定一個槽函數(shù)進行鏈接控制器的操作。

//定義一個定時器
QTimer *UpData = new QTimer(this);
connect(UpData,&QTimer::timeout,this,[=](){
if(g_handle!=0)
{
//獲取軸位置信息
ZAux_Direct_GetAllAxisPara(g_handle,"DPOS",AxisNum,Dpos);
ui->DposX->setText(QString("%1").arg(Dpos[0]));
ui->DposY->setText(QString("%1").arg(Dpos[1]));
ui->DposZ->setText(QString("%1").arg(Dpos[2]));
ui->DposU->setText(QString("%1").arg(Dpos[3]));
//獲取軸速度信息
ZAux_Direct_GetAllAxisPara(g_handle,"MSPEED",AxisNum,Mspeed);
ui->MspeedX->setText(QString("%1").arg(Mspeed[0]));
ui->MspeedY->setText(QString("%1").arg(Mspeed[1]));
ui->MspeedZ->setText(QString("%1").arg(Mspeed[2]));
ui->MspeedU->setText(QString("%1").arg(Mspeed[3]));
//獲取各個軸的運動情況
floatidle[4]={0};
ZAux_Direct_GetAllAxisPara(g_handle,"idle",AxisNum,idle);
idle[0]=idle[0]+idle[1]+idle[2]+idle[3];
if(idle[0]>(-4))
{
MotionStatus=1;//運動中
}
else
{
MotionStatus=0;
}
}
 }
(3)通過定時器更新控制器各個軸的位置和速度信息。
//定義一個定時器
QTimer*UpData =newQTimer(this);
connect(UpData,&QTimer::timeout,this,[=](){
    if(g_handle!=0)
    {
        //獲取軸位置信息
       ZAux_Direct_GetAllAxisPara(g_handle,"DPOS",AxisNum,Dpos);
       ui->DposX->setText(QString("%1").arg(Dpos[0]));
       ui->DposY->setText(QString("%1").arg(Dpos[1]));
       ui->DposZ->setText(QString("%1").arg(Dpos[2]));
       ui->DposU->setText(QString("%1").arg(Dpos[3]));
        //獲取軸速度信息
       ZAux_Direct_GetAllAxisPara(g_handle,"MSPEED",AxisNum,Mspeed);
       ui->MspeedX->setText(QString("%1").arg(Mspeed[0]));
       ui->MspeedY->setText(QString("%1").arg(Mspeed[1]));
       ui->MspeedZ->setText(QString("%1").arg(Mspeed[2]));
       ui->MspeedU->setText(QString("%1").arg(Mspeed[3]));
        //獲取各個軸的運動情況
        floatidle[4]={0};
       ZAux_Direct_GetAllAxisPara(g_handle,"idle",AxisNum,idle);
       idle[0]=idle[0]+idle[1]+idle[2]+idle[3];
        if(idle[0]>(-4))
        {
            MotionStatus=1;//運動中
        }
        else
        {
            MotionStatus=0;
        }
    }
}

(4)Basic指令Move_Pt的介紹。

ad5ca618-4279-11ed-96c9-dac502259ad0.png

(5)Move_Pt的接口封裝。

A.通過在線命令ZAux_DirectCommand()進行接口封裝。

/*************************************************************
Description:    單位時間距離
Input:          卡鏈接handle
                運動軸數(shù)、軸列表
                運動時間 ticks單位, 1ticks≈1ms
                運動距離 units單位
Output:         無
Return:         錯誤碼
*************************************************************/
int32  MyApi::ZAux_Direct_MovePt(ZMC_HANDLE handle, int iAxisNum, int *piAxisList, int iTime, float *pfDisList)
{
    char  cmdbuff[2048],tempbuff[2048];
    char  cmdbuffAck[2048];
    //輸入?yún)?shù)判斷
    if((0 > iAxisNum || iAxisNum > MAX_AXIS_AUX)) return  ERR_AUX_PARAERR;
    if(NULL == piAxisList)      return  ERR_AUX_PARAERR;
    if(iTime<=0)                return  ERR_AUX_PARAERR;
    if(NULL == pfDisList)       return  ERR_AUX_PARAERR;
    //生成指令選擇運動的軸......Basic指令BASE(0,1,2,3)表示選擇軸0、軸1、軸2、軸3
    //通過字符串拼接指令封裝Basic選擇軸指令BASE(piAxisList[0],piAxisList[1],.....piAxisList[i])
    strcpy(cmdbuff, "BASE(");
    for(int i = 0; i< iAxisNum-1; i++)
    {
        sprintf(tempbuff, "%d,",piAxisList[i]);
        strcat(cmdbuff, tempbuff);
    }
    sprintf(tempbuff, "%d)",piAxisList[iAxisNum-1]);
    strcat(cmdbuff, tempbuff);
    //換行繼續(xù)封裝Basic指令
    strcat(cmdbuff, "
");
    //生成單位時間運動距離指令,......Basic指令通過Move_PT(ticks, dis1,dis2…)實現(xiàn)
    sprintf(tempbuff, "Move_PT(%d,",iTime);
    strcat(cmdbuff, tempbuff);
    //封裝各個軸的運動距離
    for(int i = 0; i< iAxisNum-1; i++)
    {
        sprintf(tempbuff, "%f,",pfDisList[i]);
        strcat(cmdbuff, tempbuff);
    }
    sprintf(tempbuff, "%f)",pfDisList[iAxisNum-1]);
    strcat(cmdbuff, tempbuff);
    //調(diào)用命令執(zhí)行函數(shù)
    //printf("%s",cmdbuff);
    return ZAux_DirectCommand(handle, cmdbuff, cmdbuffAck, 2048);
}
B.Qt例程調(diào)用剛剛封裝的接口MyApi::ZAux_Direct_MovePt()。

ad924c96-4279-11ed-96c9-dac502259ad0.png
//啟動Move_Pt運動
voidWidget::on_PtStartButton_clicked()
{
if(0==MotionStatus)
{
intbuffNum=0;
//獲取0軸剩余緩沖區(qū)數(shù)目,緩沖區(qū)數(shù)目足夠才下發(fā)指令
ZAux_Direct_GetRemain_LineBuffer(g_handle,0,&buffNum);
if(buffNum>3)
{
intAxisList[4]={0,1,2,3};
floatDisList[3][5];
for(inti=0;i<3;i++)
?????????{
????????????for(intj=0;j<5;j++)
????????????{
???????????????DisList[i][j]=LineData[i][j]->text().toFloat();
}
//調(diào)用自己封裝的函數(shù)接口進行MOVE_PT運動
        myapi->ZAux_Direct_MovePt(g_handle,AxisNum,AxisList,(int)(DisList[i][0]),&DisList[i][1]);
}
}
else
{
QMessageBox::warning(this,"warning","軸緩沖區(qū)剩余不足");
}
    }
    else
    {
       QMessageBox::warning(this,"warning","系統(tǒng)在運行中......");
 }
}
C.示波器波形抓取。

ada8abe4-4279-11ed-96c9-dac502259ad0.png

(6)封裝一個API可以下發(fā)多個move_ptabs指令進行加工。 A.一次下發(fā)多個move_ptabs指令的封裝。

/*************************************************************
Description:    一次發(fā)送多個單位時間距離指令
Input:          卡鏈接handle
                運動軸數(shù)、軸列表
                運動時間 ticks單位, 1ticks≈1ms
                運動距離 units單位
Output:         無
Return:         錯誤碼
*************************************************************/
int32  MyApi::ZAux_Direct_MovePtAbsS(ZMC_HANDLE handle, int iAxisNum, int *piAxisList, int ApiNum,int *iTime, float *pfDisList)
{
charcmdbuff[2048*128],tempbuff[2048];
charcmdbuffAck[2048];
//輸入?yún)?shù)判斷
if((0>iAxisNum||iAxisNum>MAX_AXIS_AUX))returnERR_AUX_PARAERR;//軸數(shù)不正確
if(NULL==piAxisList)returnERR_AUX_PARAERR;//軸列表空
if(iTime==0)returnERR_AUX_PARAERR;//時間列表空
if(NULL==pfDisList)returnERR_AUX_PARAERR;//運動距離列表空
if((ApiNum<0)||(ApiNum>50))returnERR_AUX_PARAERR;//Api數(shù)目不對
//生成指令選擇運動的軸......Basic指令BASE(0,1,2,3)表示選擇軸0、軸1、軸2、軸3
//通過字符串拼接指令封裝Basic選擇軸指令BASE(piAxisList[0],piAxisList[1],.....piAxisList[i])
strcpy(cmdbuff,"BASE(");
for(inti=0;i0)
{
//生成單位時間運動距離指令,......Basic指令通過Move_PT(ticks,dis1,dis2…)實現(xiàn)
sprintf(tempbuff,"Move_PtAbs(%d,",iTime[j]);
strcat(cmdbuff,tempbuff);
//封裝各個軸的運動距離
for(inti=0;i

B.Qt例程調(diào)用剛封裝的接口MyApi::ZAux_Direct_MovePtAbsS()。

//獲取軸運動緩沖剩余情況
ZAux_Direct_GetRemain_LineBuffer(g_handle,0,&buffNum);       
if((buffNum>ApiNum*2)&&(SendNum*1<(4*ui->HorizoScale->text().toFloat())))
{
                Num = (float) 4*ui->HorizoScale->text().toFloat();
                switch (RunType) {
                //((-sin(PI*2*i/T)/(PI*2))+i/T)*500
                case 0:
                    for(int i=0;iCanvas->StartPoint.setX(0);
                    ui->Canvas->StartPoint.setY(-DisList[0]*EquivalentY);
                    ui->Canvas->StopPoint.setX(0);
                    ui->Canvas->StopPoint.setY(-DisList[0]*EquivalentY);
                    TimerWaveform->start(10);
                    QString Str;
                    char buff[1204];
                    //發(fā)送在線命令啟動示波器
                    Str=QString("%1%2%3%4%5").arg("SCOPE(ON,1,").arg(0).arg(",").arg(3500).arg(",DPOS(0))");
                    ZAux_Execute(g_handle,Str.toLatin1().data(),buff,1024);
                    ZAux_Trigger(g_handle);
                    QThread::msleep(1);
                }
myapi->ZAux_Direct_MovePtAbsS(g_handle,1,&AxisList,ApiNum,TimeList,DisList);
}
C.Qt抓取軸運動的位置數(shù)據(jù),產(chǎn)生位置波形圖。
oidDraw::paintEvent(QPaintEvent*event)
{
    if(DrawFlag!=0)
    {
        //實例化一個畫家this指繪圖設備
        QPainterPainter(WaveformFigure);
        Painter.translate(0,(int)(ImgH/2));
        //設置畫筆
        QPenPen(QColor(255,0,0));
        Pen.setWidth(4);
        Pen.setStyle(Qt::SolidLine);
        Painter.setPen(Pen);
        //發(fā)送觸發(fā)示波器抓取的命令
        if((CurTriggerNum>=SingTriggerNum))
        {
qDebug()<<"觸發(fā)示波器"<::iteratoriet;
        for(inti=0;i0))
           {
              Painter.drawLine(StartPoint,StopPoint);
           }
        }
    }
}
D.抓波形圖查看效果。

a.Y=((-sin(PI*2*i/T)/(PI*2))+i/T)*500速度和位置曲線。

addf4514-4279-11ed-96c9-dac502259ad0.png

b.Qt抓取Y=((-sin(PI*2*i/T)/(PI*2))+i/T)*500的位置曲線。

adf8f400-4279-11ed-96c9-dac502259ad0.png

本次,正運動技術EtherCAT運動控制卡的自定義運動曲線,就分享到這里。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 以太網(wǎng)

    關注

    40

    文章

    5343

    瀏覽量

    170797
  • CAN總線
    +關注

    關注

    145

    文章

    1911

    瀏覽量

    130560
  • 上位機
    +關注

    關注

    27

    文章

    930

    瀏覽量

    54696
  • EtherCAT總線
    +關注

    關注

    5

    文章

    68

    瀏覽量

    5359

原文標題:EtherCAT運動控制卡的自定義運動曲線

文章出處:【微信號:伺服與運動控制,微信公眾號:伺服與運動控制】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    EtherCAT運動控制卡自定義運動曲線

    今天,正運動小助手給大家分享一下EtherCAT運動控制卡自定義
    的頭像 發(fā)表于 09-27 11:19 ?1823次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制卡</b>的<b class='flag-5'>自定義</b><b class='flag-5'>運動</b><b class='flag-5'>曲線</b>

    【正運動】高速高精,超高實時性的PCIe EtherCAT實時運動控制卡 | PCIE464

    軌跡的小線段前瞻,各種機器人與自定義機器人算法的控制,多種PSO控制等,滿足多樣化的工業(yè)應用需求。正運動提供自主自研IDE-RTSys開發(fā)編程軟件,PCIE464
    發(fā)表于 01-24 09:48

    運動控制卡

    本人對運動控制卡無所知,想問一下運動控制是不是也像數(shù)據(jù)采集
    發(fā)表于 06-05 00:45

    運動控制卡

    有沒有高手懂得弄運動控制卡?可以教一下小白我,怎么入門,用什么軟件去編程他。
    發(fā)表于 06-13 10:50

    ACS運動控制卡 精選資料分享

    簡介: ACS是款以色列的運動控制卡,控制直線電機,運動精度到u級別。常用在工業(yè)領域。1.使用:運動
    發(fā)表于 09-01 07:31

    分享一下運動控制卡應用開發(fā)教程之Python

    與大家分享一下運動控制卡應用開發(fā)教程之Python。 、ECI2828硬件介紹ECI2828系列運動
    發(fā)表于 09-01 08:36

    EtherCAT運動控制卡之ECI2820如何使用

    今天,正運動技術給大家分享一下EtherCAT運動控制卡之ECI2820如何使用C#實現(xiàn)運動暫停
    發(fā)表于 09-01 06:24

    EtherCAT運動控制器進行自定義API封裝例程

    本節(jié)課程我們主要講解一下運動API函數(shù)封裝原理以及自定義API封裝例程。 正運動技術運動控制
    發(fā)表于 10-26 15:11

    運動控制卡能仿真嗎?

    其實不同品牌運動控制卡對仿真的支持是不樣的,有些品牌不支持,有的品牌則支持,今天跟大家分享一下,基于正運動Zmotion
    的頭像 發(fā)表于 02-22 15:54 ?1286次閱讀
    <b class='flag-5'>運動</b><b class='flag-5'>控制卡</b>能仿真嗎?

    EtherCAT運動控制卡的硬件接線與C#的硬件外設讀寫與回零運動

    EtherCAT運動控制卡進行硬件接線與C#的硬件外設讀寫與回零運動
    的頭像 發(fā)表于 11-08 16:26 ?2306次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制卡</b>的硬件接線與C#的硬件外設讀寫與回零<b class='flag-5'>運動</b>

    EtherCAT運動控制卡的總線軸參數(shù)設置和軸運動

    EtherCAT運動控制卡的總線軸參數(shù)設置和軸運動設定
    的頭像 發(fā)表于 11-08 16:34 ?3568次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制卡</b>的總線軸參數(shù)設置和軸<b class='flag-5'>運動</b>

    EtherCAT運動控制卡的硬件接線與C#的單軸運動控制

    EtherCAT運動控制卡實現(xiàn)C#的單軸運動控制的例程
    的頭像 發(fā)表于 10-22 16:07 ?2715次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制卡</b>的硬件接線與C#的單軸<b class='flag-5'>運動</b><b class='flag-5'>控制</b>

    EtherCAT運動控制邊緣控制器功能簡介和自定義API封裝例程

    上節(jié)課程我們介紹了全國產(chǎn)EtherCAT運動控制邊緣控制器ZMC432H的硬件接口與功能,本節(jié)課程我們主要講解一下
    的頭像 發(fā)表于 08-28 15:08 ?1319次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制</b>邊緣<b class='flag-5'>控制</b>器功能簡介和<b class='flag-5'>自定義</b>API封裝例程

    運動控制卡伺服電機如何控制

    運動控制卡伺服電機控制是現(xiàn)代工業(yè)自動化領域中項重要的技術,它涉及到運動控制卡、伺服電機、
    的頭像 發(fā)表于 06-12 14:13 ?744次閱讀

    EtherCAT運動控制器PT/PVT實現(xiàn)用戶自定義軌跡規(guī)劃

    EtherCAT運動控制器PT/PVT實現(xiàn)用戶自定義軌跡規(guī)劃。
    的頭像 發(fā)表于 08-15 11:49 ?510次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制</b>器PT/PVT實現(xiàn)用戶<b class='flag-5'>自定義</b>軌跡規(guī)劃