
下面,我們分享研控運動控制卡的編程小技巧!
希望對你有所幫助!
運動順序執行
編程技巧
1 問題描述
我們使用上位機編程軟件對控制卡進行點位、插補等多段軌跡運動時,軌跡間需判斷上段軌跡運動停止狀(YK_check_done(CardNo,axis_no)),上段軌跡運動停止則立即啟動下段軌跡運動。
如果編程時只是單獨使用While循環,執行后會發現上位機界面被卡死,按鍵不能響應。
如以下用例程序,將出現上述問題:
研控控制卡MCC800從位置dist_0運動到位置dist_1,程序如下:
//設定運動速度參數
rtn =YK_set_profile(mCardNo,Axis,atof(mMinVel),atof(mMaxVel),atof(mAccTime),atof(mDecTime),atof(mEndVel));
//設定S段時間
rtn =YK_set_s_profile(mCardNo,Axis,0,atof(mSmoothTime));
//啟動第一段運動軌跡
rtn= YK_pmove(mCardNo, Axis, dist_0, 0);
//判斷當前軸狀態
status= YK_check_done(mCardNo, Axis );
//循環判斷當前軸運動狀態
while (status ==0)
{
// "當前狀態:運動",繼續循環判斷;
status = YK_check_done(mCardNo,Axis );
}
//啟動第二段運動軌跡
rtn= YK_pmove(mCardNo, Axis, dist_1, 0);
//指令執行完成
2 原因分析
上述程序,在啟動運動位置到dist_0過程中需不斷循環判斷運動是否停止,在條件不滿足即運動沒有停止時程序一直處于循環中,程序將會占用整個軟件的進程時間資源,即進入了死循環,其它進程消息不能及時響應,導致上位機界面卡死。
因此我們需要軟件在循環判斷運動狀態的同時還需響應其它進程消息。
3 解決方案
軟件多線程可解決上述問題,但多線程較麻煩。可以使用軟件自動函數實現。
1 VB編程
VB編程軟件中有系統自動線程函數“DoEvents”。
//循環判斷當前軸運動狀態
while (status ==0)
{
// "當前狀態:運動",繼續循環判斷;
status = YK_check_done(mCardNo,Axis );
// 使用VB編程中自帶線程函數“DoEvents”
DoEvents
}
2 VC編程
VC編程軟件中有類似線程查詢函數“PeekMessage”。
//循環定義函數名DoEvents
void CMCC800VCTestMotionDlg::DoEvents()
{
static MSG msg;
if(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
3 C# 編程
C#編程軟件中有系統自動線程函數“DoEvents”。
//循環判斷當前軸運動狀態
while (status == 0)
{
// "當前狀態:運動",繼續循環判斷;
status=MCC. YK_check_done(mCardNo, Axis );
// 使用C#編程中自帶線程函數“DoEvents”
Application.DoEvents();
}
4 Labview 編程
Labview編程軟件中在循環框中添加延時時間。
