時間:2020-11-27 15:55:27來源:正運動技術(shù)
今天,我們來講解一下正運動技術(shù)運動控制卡應(yīng)用開發(fā)教程之Qt。
此前,我們與大家分享過“開放式Linux平臺控制器XPLC516E及其Linux下的Qt開發(fā)”,我們知道正運動部分控制器支持Linux系統(tǒng),支持嵌入式Qt開發(fā)。
正運動技術(shù)支持功能強大的Qt動態(tài)鏈接庫以及擁有簡單易讀的運動控制庫函數(shù)手冊說明,代碼移植性強,非常方便運動控制開發(fā)上手,能極大縮短開發(fā)人員開發(fā)智能裝備的時間周期。
在正式學(xué)習(xí)之前,我們先了解一下正運動技術(shù)的運動控制卡ECI2418和ECI2618。這兩款產(chǎn)品分別是4軸,6軸運動控制卡。
ECI2418支持4軸脈沖輸入與編碼器反饋,板載24點輸入,16點輸出,2AD,2DA,支持手輪接口,其中特定輸出支持高速PWM控制。
ECI2618支持6軸脈沖輸入與編碼器反饋,板載24點輸入,16點輸出,2AD,2DA,支持手輪接口,其中特定輸出支持高速PWM控制。
ECI2418,ECI2618均使用同一套API函數(shù),均支持C、C++、C#、LabView、Python、Delphi等開發(fā)語言,支持VC6.0、VB6.0、Qt、.Net等平臺,支持Windows、Linux、WinCE、iMac等操作系統(tǒng)。
一、運動控制卡應(yīng)用之Qt開發(fā)流程
1、使用Qt軟件新建Qt項目
2、將動態(tài)庫以及相關(guān)文件“l(fā)ibzmotion.so、zaux.cpp、zaux.h、zmotion.h”復(fù)制到新建的Qt項目里面。
在光盤資料里面,下載上圖圈出的四個文件,并通過終端復(fù)制到新建的Qt工程里面。
3、在Qt項目里面添加動態(tài)庫“l(fā)ibzmotion.so”
A、首先右鍵項目,點擊添加庫。
B、選擇外部庫,點擊Next。
C、點擊瀏覽庫文件,選擇剛剛復(fù)制進去的動態(tài)庫,點擊Next。
D、最后點擊finish即可完成動態(tài)庫添加。
注意事項:Linux環(huán)境下動態(tài)庫的名字必須是lib開頭才能識別。
4、在Qt項目里面添加頭文件“zmotion.h、zaux.h”
A、首先右鍵Headers,點擊Add Existing Files...
B、找到剛剛復(fù)制放進項目的zmotion.h文件,雙擊zmotion.h即可添加頭文件zmotion.h到項目中。
C、重復(fù)上面兩個步驟,將zaux.h文件也添加到項目中。
5、在Qt項目里面添加cpp源文件"zaux.cpp”
A、首先右鍵Sources,點擊Add Existing Files...
B、找到剛剛復(fù)制放進項目的zaux.cpp文件,雙擊zaux.cpp文件即可添加源文件zaux.cpp到項目中。
6、在mainwindow.h中添加 #include “zmotion.h”、 #include “zaux.h”和定義控制器的連接句柄g_handle。
7、使用link按鈕的槽函數(shù)用以太網(wǎng)連接控制器
A、在Qt的ui設(shè)計界面中添加一個按鈕重命名為Link,右擊Link按鈕點擊Go to slot...跳轉(zhuǎn)到該按鈕的槽函數(shù)。
B、查閱ZMotion PC 編程手冊,了解用以太網(wǎng)連接控制器接口函數(shù)的用法 。
C、參考光盤資料里面的PC編程手冊中ZAux_OpenEth函數(shù)的用法在槽函數(shù)中編寫代碼,進行功能實現(xiàn)。
8、控制器實現(xiàn)插補運動,代碼實現(xiàn)過程。
A、在Qt的ui設(shè)計界面中添加一個按鈕重命名為move,右擊move按鈕點擊Go to slot...跳轉(zhuǎn)到該按鈕的槽函數(shù)。
B、查閱ZMotion PC 編程手冊,了解用以插補運動接口函數(shù)的用法 。
C、根據(jù)PC編程手冊中ZAux_Direct_Move函數(shù)的用法在槽函數(shù)中編寫代碼,進行功能實現(xiàn)。
9、運動程序設(shè)計完畢,點擊運行按鈕。
注意:上位機用以太網(wǎng)連接控制器時,需要控制器和PC在同一網(wǎng)段下才能連接成功。
二、運動控制卡應(yīng)用之Qt例程講解
1、在正運動技術(shù)的光盤資料里有很多Qt的例程,通過這些例程可以更容易的上手正運動技術(shù)的控制器。以下是一個詳細例程的講解。
2、例程的單軸運動的功能說明
a、通過以太網(wǎng)鏈接到指定IP的控制器;
b、設(shè)置運動軸參數(shù);
c、選擇運動軸對象;
d、選擇運動方式,實現(xiàn)持續(xù)運動和寸動;
3、例程的單軸運動的具體實現(xiàn)
(1)實現(xiàn)以網(wǎng)口方式鏈接控制器
A、在下拉框中手動添加IP:進入uI設(shè)計界面雙擊下拉框加入控制器Ip,方法如下。
B、參考ZMotion PC函數(shù)編程手冊,熟悉ZAux_OpenEth()接口用法。
C、通過Open按鈕的槽函數(shù)( on_pushButton_OpenEth_clicked()),調(diào)用動態(tài)庫(zmotion.so)提供的鏈接控制器接口(ZAux_OpenEth()),實現(xiàn)與控制器的鏈接。
//以太網(wǎng)連接控制器
void MainWindow::on_pushButton_OpenEth_clicked()
{
int32 iresult;
char * tmp_buff = new char[16];
QString str, str_title;
/*從下拉框中獲取IP*/
str = ui->comboBox_IP->currentText();
QByteArray ba = str.toLatin1();
tmp_buff = ba.data();
/*鏈接控制器*/
iresult = ZAux_OpenEth(tmp_buff,&g_handle);
if(0 == iresult)
{
str_title = ("linked:");
str_title += tmp_buff;
setWindowTitle(str_title);
/*開啟定時器*/
m_nTimerId = startTimer(10);
}
else
{
setWindowTitle("no link!");
}
}
D、參考ZMotion PC函數(shù)編程手冊,熟悉ZAux_OpenEth()接口用法。
E、通過Close按鈕的槽函數(shù)( on_pushButton_CloseEth_clicked()),調(diào)用動態(tài)庫(zmotion.so)提供的斷開鏈接控制器的接口(ZAux_Close()),實現(xiàn)斷開與控制器的鏈接。
//斷開網(wǎng)口連接
void MainWindow::on_pushButton_CloseEth_clicked()
{
if(0 != g_handle)
{
/*斷開鏈接*/
ZAux_Close(g_handle);
g_handle = NULL;
setWindowTitle("no line");
/*關(guān)閉定時器*/
killTimer(m_nTimerId);
m_nTimerId=-1;
}
}
(2)獲取軸運動的信息以及輸入輸出口的信息
A、將X、Y、Z、R單選框設(shè)置到同一個按鈕組中用于軸選擇。
B、通過定時器超時處理函數(shù),調(diào)用動態(tài)庫“zmotion.so”提供的獲取軸dpos、vpspeed、idle信息的接口和輸入輸出口狀態(tài)信息獲取接口,實現(xiàn)對控制器狀態(tài)的監(jiān)控。
//定時器超時處理函數(shù)
void MainWindow::timerEvent(QTimerEvent *event)
{
if(m_nTimerId == event->timerId())
{
int idle;
float fdpos, fvspeed;
QString str_tmp;
/*獲取軸狀態(tài)*/
ZAux_Direct_GetIfIdle(g_handle,AxisGroup->checkedId(),&idle);
str_tmp = QString("Idle : %1").arg(idle?"stop":"run");
ui->label_statue->setText(str_tmp);
/*獲取dpos*/
ZAux_Direct_GetDpos(g_handle,AxisGroup->checkedId(),&fdpos);
str_tmp = QString("Dpos : %1").arg(fdpos);
ui->label_dpos->setText(str_tmp);
/*獲取vspeed*/
ZAux_Direct_GetVpSpeed(g_handle,AxisGroup->checkedId(),&fvspeed);
str_tmp = QString("Vspeed : %1").arg(fvspeed);
ui->label_vspeed->setText(str_tmp);
uint8 in, out, i=0,j=0,k=0;
char buff[128]={0};
/*獲取輸入口狀態(tài)*/
ZAux_GetModbusIn(g_handle, 0, 7, &in); //獲取in0-in7狀態(tài)
/*獲取輸出口狀態(tài)*/
ZAux_GetModbusOut(g_handle, 0, 7, &out);//獲取out0-out7狀態(tài)
/*十進制轉(zhuǎn)二進制*/
for(i=0; i<8; i++)
{
buff[i]=in%2;
in = in/2;
if(1 >= in)
{
buff[i+1]=in;
break;
}
}
/*更新UI信息*/
buff[0]? ui->checkBox_IN0->setChecked(true):ui->checkBox_IN0->setChecked(false);
buff[1]? ui->checkBox_IN1->setChecked(true):ui->checkBox_IN1->setChecked(false);
buff[2]? ui->checkBox_IN2->setChecked(true):ui->checkBox_IN2->setChecked(false);
buff[3]? ui->checkBox_IN3->setChecked(true):ui->checkBox_IN3->setChecked(false);
buff[4]? ui->checkBox_IN4->setChecked(true):ui->checkBox_IN4->setChecked(false);
buff[5]? ui->checkBox_IN5->setChecked(true):ui->checkBox_IN5->setChecked(false);
buff[6]? ui->checkBox_IN6->setChecked(true):ui->checkBox_IN6->setChecked(false);
buff[7]? ui->checkBox_IN7->setChecked(true):ui->checkBox_IN7->setChecked(false);
memset(buff,0,8);
/*十進制轉(zhuǎn)二進制*/
for(i=0; i<8; i++)
{
buff[i]=out%2;
out = out/2;
if(1 >= out)
{
buff[i+1]=out;
break;
}
}
/*更新UI信息*/
buff[0]? ui->checkBox_OUT0->setChecked(true):ui->checkBox_OUT0->setChecked(false);
buff[1]? ui->checkBox_OUT1->setChecked(true):ui->checkBox_OUT1->setChecked(false);
buff[2]? ui->checkBox_OUT2->setChecked(true):ui->checkBox_OUT2->setChecked(false);
buff[3]? ui->checkBox_OUT3->setChecked(true):ui->checkBox_OUT3->setChecked(false);
buff[4]? ui->checkBox_OUT4->setChecked(true):ui->checkBox_OUT4->setChecked(false);
buff[5]? ui->checkBox_OUT5->setChecked(true):ui->checkBox_OUT5->setChecked(false);
buff[6]? ui->checkBox_OUT6->setChecked(true):ui->checkBox_OUT6->setChecked(false);
buff[7]? ui->checkBox_OUT7->setChecked(true):ui->checkBox_OUT7->setChecked(false);
}
}
(3)軸參數(shù)設(shè)置
通過參數(shù)生效按鈕的槽函數(shù)“on_ParaSet_clicked()”,調(diào)用動態(tài)庫(zmotion.so)提供的獲取軸參數(shù)設(shè)置接口,對軸參數(shù)進行設(shè)置。
//參數(shù)設(shè)置
void MainWindow::on_ParaSet_clicked()
{
QString str_tmp;
float float_tmp;
int isidle = 0;
/*獲取軸號*/
axis_num = AxisGroup->checkedId();
/*軸正在運行無法運動*/
ZAux_Direct_GetIfIdle(g_handle,axis_num,&isidle);
if(!isidle)
{
return;
}
/*設(shè)置units */
str_tmp = ui->lineEdit_Units->text();
float_tmp = str_tmp.toFloat();
ZAux_Direct_SetUnits(g_handle, axis_num, float_tmp);
/*設(shè)置 speed */
str_tmp = ui->lineEdit_Speed->text();
float_tmp = str_tmp.toFloat();
ZAux_Direct_SetSpeed(g_handle,axis_num,float_tmp);
/*設(shè)置 accel */
str_tmp = ui->lineEdit_Accel->text();
float_tmp = str_tmp.toFloat();
ZAux_Direct_SetAccel(g_handle,axis_num,float_tmp);
/*設(shè)置 decel */
str_tmp = ui->lineEdit_Decel->text();
float_tmp = str_tmp.toFloat();
ZAux_Direct_SetDecel(g_handle,axis_num,float_tmp);
/*設(shè)置sramp */
str_tmp = ui->lineEdit_Sramp->text();
float_tmp = str_tmp.toFloat();
ZAux_Direct_SetSramp(g_handle,axis_num,float_tmp);
}
(4)單軸寸動/持續(xù)運動
A、通過Run按鈕的槽函數(shù)“on_pushButton_Run_clicked()”,調(diào)用動態(tài)庫“zmotion.so”提供的相關(guān)接口函數(shù),對軸進行運動控制。
//Run按鈕的槽函數(shù)
void MainWindow::on_pushButton_Run_clicked()
{
QString str_tmp;
float float_tmp;
int isidle = 0;
ZAux_Direct_GetIfIdle(g_handle,axis_num,&isidle);
if(!isidle)
{
qDebug()<<"not stop";
return;
}
/*示波器觸發(fā)*/
ZAux_Trigger(g_handle);
/*單軸運動*/
if(1 == RunModeGroup->checkedId())//inch
{
str_tmp = ui->lineEdit_inchdis->text();
float_tmp = str_tmp.toFloat();
ZAux_Direct_Singl_Move(g_handle,axis_num,ui->checkBox_dir->checkState()?-float_tmp:float_tmp);
}
else if(0 == RunModeGroup->checkedId())//continue
{
ZAux_Direct_Singl_Vmove(g_handle,axis_num,ui->checkBox_dir->checkState()?-1:1);
}
}
B、通過Stop按鈕的槽函數(shù)“on_pushButton_Stop_clicked()”調(diào)用相關(guān)接口實現(xiàn)停止軸運動的功能。
//Stop按鈕的槽函數(shù)
void MainWindow::on_pushButton_Stop_clicked()
{
int isidle = 0;
ZAux_Direct_GetIfIdle(g_handle,AxisGroup->checkedId(),&isidle);
if(isidle) return;
/*單軸停止*/
ZAux_Direct_Singl_Cancel(g_handle,AxisGroup->checkedId(),2);
}
(5)編譯運行調(diào)試
在自己開發(fā)程序連接的同時,還可以通過ZDevelop來調(diào)試與診斷控制器的狀態(tài)。
配合ZDevelop軟件進行調(diào)試,通過ZDevelop中的軸參數(shù),輸入口,輸出口,示波器,等等小工具可以更直觀的對控制器的狀態(tài)進行監(jiān)控。
在示波器窗口中可以看到單軸移動300用戶單位的曲線圖。
今天,正運動技術(shù)的運動控制卡應(yīng)用開發(fā)教程之Qt就分享到這里。更多精彩內(nèi)容,請關(guān)注我們的公眾號。
本文由正運動小助手原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責(zé)任。