在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

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

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

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

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

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

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

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

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

二、運動控制卡的Qt開發流程 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)將函數庫相關的文件復制到新建的項目中。

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

圖1-5庫文件復制

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

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

圖1-6添加函數庫1

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

圖1-7添加函數庫2

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

圖 1-8添加函數庫3

(3)添加函數庫相關的頭文件到項目中(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函數介紹

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

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

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

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

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

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

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

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

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

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

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

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

//定義一個定時器
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
                運動軸數、軸列表
                運動時間 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];
    //輸入參數判斷
    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);
    //換行繼續封裝Basic指令
    strcat(cmdbuff, "
");
    //生成單位時間運動距離指令,......Basic指令通過Move_PT(ticks, dis1,dis2…)實現
    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);
    //調用命令執行函數
    //printf("%s",cmdbuff);
    return ZAux_DirectCommand(handle, cmdbuff, cmdbuffAck, 2048);
}
B.Qt例程調用剛剛封裝的接口MyApi::ZAux_Direct_MovePt()。

ad924c96-4279-11ed-96c9-dac502259ad0.png
//啟動Move_Pt運動
voidWidget::on_PtStartButton_clicked()
{
if(0==MotionStatus)
{
intbuffNum=0;
//獲取0軸剩余緩沖區數目,緩沖區數目足夠才下發指令
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();
}
//調用自己封裝的函數接口進行MOVE_PT運動
        myapi->ZAux_Direct_MovePt(g_handle,AxisNum,AxisList,(int)(DisList[i][0]),&DisList[i][1]);
}
}
else
{
QMessageBox::warning(this,"warning","軸緩沖區剩余不足");
}
    }
    else
    {
       QMessageBox::warning(this,"warning","系統在運行中......");
 }
}
C.示波器波形抓取。

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

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

/*************************************************************
Description:    一次發送多個單位時間距離指令
Input:          卡鏈接handle
                運動軸數、軸列表
                運動時間 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];
//輸入參數判斷
if((0>iAxisNum||iAxisNum>MAX_AXIS_AUX))returnERR_AUX_PARAERR;//軸數不正確
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數目不對
//生成指令選擇運動的軸......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…)實現
sprintf(tempbuff,"Move_PtAbs(%d,",iTime[j]);
strcat(cmdbuff,tempbuff);
//封裝各個軸的運動距離
for(inti=0;i

B.Qt例程調用剛封裝的接口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];
                    //發送在線命令啟動示波器
                    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抓取軸運動的位置數據,產生位置波形圖。
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);
        //發送觸發示波器抓取的命令
        if((CurTriggerNum>=SingTriggerNum))
        {
qDebug()<<"觸發示波器"<::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運動控制卡的自定義運動曲線,就分享到這里。



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 以太網
    +關注

    關注

    40

    文章

    5424

    瀏覽量

    171702
  • CAN總線
    +關注

    關注

    145

    文章

    1951

    瀏覽量

    130753
  • 上位機
    +關注

    關注

    27

    文章

    942

    瀏覽量

    54810
  • EtherCAT總線
    +關注

    關注

    5

    文章

    72

    瀏覽量

    5383

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

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

收藏 人收藏

    評論

    相關推薦

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

    今天,正運動小助手給大家分享一下EtherCAT運動控制卡自定義
    的頭像 發表于 09-27 11:19 ?1872次閱讀
    <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控制等,滿足多樣化的工業應用需求。正運動提供自主自研IDE-RTSys開發編程軟件,PCIE464
    發表于 01-24 09:48

    運動控制卡

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

    運動控制卡

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

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

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

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

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

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

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

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

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

    運動控制卡能仿真嗎?

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

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

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

    EtherCAT運動控制卡的總線軸參數設置和軸運動

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

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

    EtherCAT運動控制卡實現C#的單軸運動控制的例程
    的頭像 發表于 10-22 16:07 ?2881次閱讀
    <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封裝例程

    上節課程我們介紹了全國產EtherCAT運動控制邊緣控制器ZMC432H的硬件接口與功能,本節課程我們主要講解一下
    的頭像 發表于 08-28 15:08 ?1394次閱讀
    <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封裝例程

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

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

    EtherCAT運動控制器PT/PVT實現用戶自定義軌跡規劃

    EtherCAT運動控制器PT/PVT實現用戶自定義軌跡規劃。
    的頭像 發表于 08-15 11:49 ?637次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制</b>器PT/PVT實現用戶<b class='flag-5'>自定義</b>軌跡規劃
    主站蜘蛛池模板: 天天插综合网| 欧美1819| you ji z z日本人在线观看| 色射啪| 亚洲一卡2卡3卡4卡5卡乱码| 久久98精品久久久久久婷婷| 亚洲综合激情丁香六月| 福利精品| 好紧好爽的午夜寂寞视频| 色wwww| 亚色成人| 日本三级s级在线播放| 精品视频卡1卡2卡3| 宅宅午夜亚洲精品| 欧美黄业| 一区二区三区中文国产亚洲| 亚洲一区二区色| 国产欧美一区二区三区观看| 亚洲午夜视频| 国产高清网站| 亚洲国产精品乱码在线观看97| 欧美三级不卡在线观线看高清| 国产一级大片在线观看| 天天干 夜夜操| 韩国韩宝贝2020vip福利视频| 色草视频| 国产成人一区二区在线不卡| 日操夜干| 日本一区二区免费看| 六月激情网| 五月天欧美| 简单视频在线播放jdav| 性欧美网站| 一本高清在线视频| 美女扒开尿口给男人爽的视频| 久久中文字幕综合婷婷| 成年香蕉大黄美女美女| 色噜噜狠狠色综合中文字幕| 波多野结衣在线一区| 成人精品综合免费视频| 色多多·com|