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

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

      技術(shù)頻道

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

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

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

      老版本的庫(kù)函數(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í)際上包含類(lèi)似于while( d1000_check_done(0) == 0 );的語(yǔ)句

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

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

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

      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)鍵是要解決類(lèi)似于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給程序帶來(lái)極大簡(jiǎn)化
      }
      編程如下:
      d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
      while( d1000_check_done(0) == 0 )
      ::DoEvents();

      三、技巧提升
      有了自產(chǎn)的DoEvents函數(shù),是否就可以一切OK了呢。試想一個(gè)問(wèn)題,實(shí)際加工時(shí),
      通常會(huì)有大量的小線段(即短脈沖距離)出現(xiàn),若頻繁的調(diào)用DoEvents勢(shì)必帶來(lái)新的麻煩,因?yàn)榧庸?
      需要連續(xù)的進(jìn)行,設(shè)備的運(yùn)動(dòng)之間停頓時(shí)間過(guò)長(zhǎng),會(huì)形成設(shè)備的多次啟停,進(jìn)而易產(chǎn)生振動(dòng),造成
      設(shè)備的加速磨損,并且速度也快不起來(lái)。因此添加一小小技巧(實(shí)用又省錢(qián)),判斷脈沖距離是否過(guò)小
      若過(guò)小則不執(zhí)行DoEvents函數(shù),過(guò)小量可以根據(jù)自己的需求也定義一個(gè)參考量。當(dāng)然程序的執(zhí)行順序也
      可以?xún)?yōu)化一下,以上面程序?yàn)槔?
      if( d1000_check_done(0) != 0 ) return;
      d1000_start_t_move( 0, 6400, 3200, 6400, 0.1);
      咋一看沒(méi)有什么特別的,但是請(qǐng)看下加工程序的部分簡(jiǎn)化代碼,也許會(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ù)編程方法來(lái)完成操作,
      最后經(jīng)過(guò)努力,事情也可以解決,若有興趣,可參見(jiàn)另一篇《控制卡的多任務(wù)編程》,然后自行做
      編程測(cè)試。不過(guò)本人的理論是,解決事情的方法越簡(jiǎn)單越好,據(jù)本人了解,大師之所以為大師,通常
      不是把問(wèn)題搞得高深莫測(cè),而是通俗易懂。

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

      主站蜘蛛池模板: 风间由美在线亚洲一区| 亚洲一区精品无码| 亚洲日韩AV一区二区三区中文| 亚洲日韩国产精品第一页一区| 国产成人无码AV一区二区| 久久久久久综合一区中文字幕| 一区二区视频在线观看| 亚洲视频一区在线| 亚洲一区二区三区写真| 无码人妻精品一区二区三区99不卡| 无码人妻久久一区二区三区蜜桃| 中文字幕人妻无码一区二区三区| 亚洲高清美女一区二区三区| 多人伦精品一区二区三区视频| 国产在线精品一区二区夜色| 亚洲区精品久久一区二区三区| 国产精品亚洲一区二区无码| 中文字幕乱码一区二区免费| 亚洲精品无码一区二区| AV天堂午夜精品一区| 波多野结衣一区视频在线| 日韩精品无码Av一区二区| 少妇精品无码一区二区三区| 国产日韩精品一区二区三区 | 中文字幕一区二区精品区| 国产一区二区好的精华液| 中文字幕亚洲一区二区三区| 成人区精品一区二区不卡亚洲| 国产精品毛片一区二区| 国产一区二区不卡老阿姨| 国精产品一区一区三区| 大香伊蕉日本一区二区| 亚洲日本va午夜中文字幕一区| 免费一区二区无码视频在线播放 | 日本一区二区三区精品国产| 国产精品视频一区二区三区| 国产成人精品一区二区三区| 国产精品无码一区二区在线观| 久久精品一区二区三区日韩| 538国产精品一区二区在线| 无码精品一区二区三区|