一、問題現(xiàn)象及分析
問題經(jīng)常通過以下編程表現(xiàn)出來:

//X發(fā)出脈沖后,等待脈沖發(fā)完后再做其它事情
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 );">

国产精品久久人妻互换毛片,国产av国片偷人妻麻豆,国产精品第12页,国产高清自产拍av在线,潮喷大喷水系列无码久久精品

技術(shù)頻道

DMC1000控制卡不能響應(yīng)系統(tǒng)消息

一、問題現(xiàn)象及分析
問題經(jīng)常通過以下編程表現(xiàn)出來:

//X發(fā)出脈沖后,等待脈沖發(fā)完后再做其它事情
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 );

老版本的庫函數(shù)如下:

d1000_start_tr_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 );

或者:
d1000_wait_done( 0 );
此函數(shù)內(nèi)部實(shí)際上包含類似于while( d1000_check_done(0) == 0 );的語句

以上可以看出,在檢測脈沖是否發(fā)完時(shí),此段代碼的執(zhí)行完全獨(dú)占了CPU分配給當(dāng)前進(jìn)程的所有時(shí)間,
因而也排擠了其它消息的響應(yīng),當(dāng)然也就不能響應(yīng)定時(shí)器讀取位置,或其它停止操作等.

二、解決方法
解決此問題關(guān)鍵是讓while循環(huán)時(shí)能檢測系統(tǒng)消息,以下分別介紹在VB,VC,CB下的解決措施:

注:以下編程全以DMC1000最新的驅(qū)動(dòng)庫函為參考

1.VB編程
d1000_start_t_move 0, 6400, 3200, 6400, 0.1
DO
DoEvents
LOOP WHILE (d1000_check_done(0) = 0)

2.VC編程
在VC下編程關(guān)鍵是要解決類似于VB的DoEvnets函數(shù)

void DoEvents()
{
static MSG msg;
if( ::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) ){
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}

然后編程如下:

d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 )
::DoEvents();

3.CB編程
同樣也需要完成一個(gè)DoEvents函數(shù)的定義:
void DoEvents()
{
Application->ProcessMessages();//VCL給程序帶來極大簡化
}
編程如下:
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 )
::DoEvents();

三、技巧提升
有了自產(chǎn)的DoEvents函數(shù),是否就可以一切OK了呢。試想一個(gè)問題,實(shí)際加工時(shí),
通常會(huì)有大量的小線段(即短脈沖距離)出現(xiàn),若頻繁的調(diào)用DoEvents勢必帶來新的麻煩,因?yàn)榧庸?
需要連續(xù)的進(jìn)行,設(shè)備的運(yùn)動(dòng)之間停頓時(shí)間過長,會(huì)形成設(shè)備的多次啟停,進(jìn)而易產(chǎn)生振動(dòng),造成
設(shè)備的加速磨損,并且速度也快不起來。因此添加一小小技巧(實(shí)用又省錢),判斷脈沖距離是否過小
若過小則不執(zhí)行DoEvents函數(shù),過小量可以根據(jù)自己的需求也定義一個(gè)參考量。當(dāng)然程序的執(zhí)行順序也
可以優(yōu)化一下,以上面程序?yàn)槔?
if( d1000_check_done(0) != 0 ) return;
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1);
咋一看沒有什么特別的,但是請看下加工程序的部分簡化代碼,也許會(huì)有新的啟示:

for( int i(0); i
{

if( d1000_check_done(0) == 0 )
{
if( Len > 2.0 )DoEvents();
//小于2單位(可以指為毫米,或其它單位)則不執(zhí)行DoEvents函數(shù)
continue;
}
Len = dist[i].Len;
d1000_start_t_move( 0, dist[i], speed );
i ++;
}
當(dāng)然,世界上做事情的方法多的是,有高手則愿意動(dòng)用復(fù)雜的多任務(wù)編程方法來完成操作,
最后經(jīng)過努力,事情也可以解決,若有興趣,可參見另一篇《控制卡的多任務(wù)編程》,然后自行做
編程測試。不過本人的理論是,解決事情的方法越簡單越好,據(jù)本人了解,大師之所以為大師,通常
不是把問題搞得高深莫測,而是通俗易懂。

四、其它應(yīng)用
此方法對(duì)所有DMC系列的控制卡的編程都可以運(yùn)用,還可用在自定義的Arc(圓弧運(yùn)動(dòng))函數(shù)
上,參見下面?zhèn)未a(Arc的直線擬合算法參見DMC2000的ARC算法):

for( int i(0); i
{
while( IsRunning(X) || IsRunning(Y) )
{
if( i%16 == 0 ) DoEvents();//每16再運(yùn)行一次
}
start_line2( newx, newy );
}

文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。