新手寫BCB,我的迴圈哪裡出問題了 |
答題得分者是:ikk
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
各位先進大家好~
小弟我是BCB的新手,老師叫我使用BCB控制軸卡與伺服馬達 要做一個閉回路系統,以達到精準定位 現再在程式上遇到一些瓶頸 希望各位先進能幫我一下 以下是我的程式,程式好像只有RUN到移動的部份結束了 還請各位幫我看看程式哪裡出問題了 謝謝各位先進 void __fastcall TForm1::Button1Click(TObject *Sender) { int ymm,dmm,XPosi,byDriveAxes; dmm = StrToFloat(Edit3->Text); Edit2->Text = (LONG)lXPosi; { ULONG ErrCode; LONG ymm = StrToFloat(Edit1->Text); LONG lPulseNum = ymm*10000; ErrCode = P1240MotPtp( gCurrentBoard, // Board ID 15, // Which axes RelativeCoordinate, // Relative or Absolute lPulseNum, // X axis value lPulseNum, // Y axis value lPulseNum, // Z axis value lPulseNum); // U axis value } if ( ErrCode != 0 ) { //ShowMessage("Error " IntToStr(ErrCode) ); MyShowErrorMsg(ErrCode); return; } while(lXPosi!=ymm*10000) { ShowMessage("next"); goto nextloop; } nextloop: while(lXPosi>ymm*10000) { ShowMessage("RUN"); { LONG lPulseNum=-20; ErrCode = P1240MotPtp( gCurrentBoard, // Board ID 15, // Which axes RelativeCoordinate, // Relative or Absolute lPulseNum, // X axis value lPulseNum, // Y axis value lPulseNum, // Z axis value lPulseNum); // U axis value goto nextloop1; } } nextloop1: while(lXPosi>ymm*10000) { LONG lPulseNum=-10; ErrCode = P1240MotPtp( gCurrentBoard, // Board ID 15, // Which axes RelativeCoordinate, // Relative or Absolute lPulseNum, // X axis value lPulseNum, // Y axis value lPulseNum, // Z axis value lPulseNum); // U axis value goto nextloop2; } nextloop2: while(lXPosi==ymm) { ULONG ErrCode; // Stop continue drive ErrCode = P1240MotStop( gCurrentBoard, // Board ID XYZU_Axis, // Which axis to stop 0 ); // Buffer ID goto endloop; } endloop: } |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
其實我的目標是要lXPosi與ymm*10000的比較
我一開始會先由P1240MotPtp()送pulse給AC伺服 但是因為有螺距背隙的問題,所以每次都不會精準到位 所以我有加裝光學尺,lXPosi為光學尺的值,ymm*10000為移動目標值 在送完pulse之後就做lXPosi與ymm*10000的比較 假如lXPosi大於ymm*10000,就做負方向移動 假如lXPosi小於ymm*10000,就持續送pulse lXPosi等於ymm*10000,此時就結束程式 ikk大, 這樣用if會比較簡單處理嗎? 謝謝你 |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
那就應該是 while if 的程式邏輯.. [code cpp] 送pulse; while ( lXPosi != ymm*10000 ) { if ( lXPosi > ymm*10000) { 負方向移動; } else if ( lXPosi < ymm*10000) { 送pulse; } else { //In right place. } } [/code] ===================引 用 jayway 文 章=================== 其實我的目標是要lXPosi與ymm*10000的比較 我一開始會先由P1240MotPtp()送pulse給AC伺服 但是因為有螺距背隙的問題,所以每次都不會精準到位 所以我有加裝光學尺,lXPosi為光學尺的值,ymm*10000為移動目標值 在送完pulse之後就做lXPosi與ymm*10000的比較 假如lXPosi大於ymm*10000,就做負方向移動 假如lXPosi小於ymm*10000,就持續送pulse lXPosi等於ymm*10000,此時就結束程式 ikk大, 這樣用if會比較簡單處理嗎? 謝謝你
------
FPGA驗證, FPGA開發平台, http://smims.com |
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
ikk大
我試了while if 的程式邏輯 但是程式好像跑不到比較那幾行程式就結束了 可以麻煩妳幫我看看哪裡出錯嗎? 萬分感謝妳 void __fastcall TForm1::Button1Click(TObject *Sender) { int x,ymm,dmm,XPosi,lPulseNum; dmm = StrToFloat(Edit3->Text); ymm = StrToFloat(Edit1->Text); x=ymm*10000; ULONG ErrCode; lPulseNum = 10000; LONG lXPosi = StrToFloat(Edit2->Text); ErrCode = P1240MotPtp( gCurrentBoard, // Board ID 1, // Which axes RelativeCoordinate, // Relative or Absolute lPulseNum, // X axis value lPulseNum, // Y axis value lPulseNum, // Z axis value lPulseNum); // U axis value goto whileloop; //我覺得好像沒有跑到while if 所以我自己加了以下這兩行 whileloop: while ( lXPosi != ymm*10000) { if ( lXPosi < ymm*10000) { lPulseNum = 1; LONG lXPosi = StrToFloat(Edit2->Text); ErrCode = P1240MotPtp( gCurrentBoard, // Board ID 1, // Which axes RelativeCoordinate, // Relative or Absolute lPulseNum, // X axis value lPulseNum, // Y axis value lPulseNum, // Z axis value lPulseNum); // U axis value return; } else if ( lXPosi > ymm*10000) { lPulseNum = -1; LONG lXPosi = StrToFloat(Edit2->Text); ErrCode = P1240MotPtp( gCurrentBoard, // Board ID 1, // Which axes RelativeCoordinate, // Relative or Absolute lPulseNum, // X axis value lPulseNum, // Y axis value lPulseNum, // Z axis value lPulseNum); // U axis value return; } else if ( lXPosi == ymm*10000) { ULONG ErrCode; // Stop continue drive ErrCode = P1240MotStop( gCurrentBoard, // Board ID XYZU_Axis, // Which axis to stop 0 ); // Buffer ID //In right place. return; } } } ===================引 用 ikk 文 章=================== 那就應該是 while if 的程式邏輯.. [code cpp] 送pulse; while ( lXPosi != ymm*10000 ) { if ( lXPosi > ymm*10000) { 負方向移動; } else if ( lXPosi < ymm*10000) { 送pulse; } else { //In right place. } } [/code]
編輯記錄
jayway 重新編輯於 2008-08-05 11:27:12, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
|
jayway
一般會員 發表:1 回覆:7 積分:1 註冊:2008-08-04 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |