全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2634
推到 Plurk!
推到 Facebook!

新手寫BCB,我的迴圈哪裡出問題了

答題得分者是:ikk
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-04 00:21:01 IP:118.168.xxx.xxx 訂閱
各位先進大家好~
小弟我是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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-04 08:39:47 IP:163.28.xxx.xxx 訂閱
你的while迴圈作用似乎就等於if, while迴圈也只會跑一次...
是否是要在goto 前加上判斷??
------
FPGA驗證, FPGA開發平台, http://smims.com
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-04 10:09:19 IP:140.124.xxx.xxx 訂閱
你好~
感謝你的回覆
你的意思是說在goto前加上if的判斷式嗎?
像這種大於、小於或等於的寫法有沒有比較簡潔的呢?
謝謝你


===================引 用 ikk 文 章===================
你的while迴圈作用似乎就等於if, while迴圈也只會跑一次...
是否是要在goto 前加上判斷??
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-04 10:15:50 IP:163.28.xxx.xxx 訂閱
看你的code, 每按下按鈕 就會 呼叫4 次 P1240MotPtp(), 是這樣嗎??

如果是這樣, 就用if 即可, 不用要while與goto..
------
FPGA驗證, FPGA開發平台, http://smims.com
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-04 10:27:03 IP:140.124.xxx.xxx 訂閱
其實我的目標是要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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-04 10:43:01 IP:163.28.xxx.xxx 訂閱

那就應該是 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
編輯記錄
ikk 重新編輯於 2008-08-04 10:44:01, 註解 無‧
ikk 重新編輯於 2008-08-04 10:45:07, 註解 無‧
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-04 11:34:38 IP:140.124.xxx.xxx 訂閱
感謝ikk大,我現試試看while if的用法
有任何問題再跟你請教
再次的感謝妳

jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-08-05 11:23:43 IP:140.124.xxx.xxx 訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-08-05 11:26:19 IP:163.28.xxx.xxx 訂閱
你在每個if 都加上  return;
當然就會直接跳出, 只會run一次.
------
FPGA驗證, FPGA開發平台, http://smims.com
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-08-05 11:29:31 IP:140.124.xxx.xxx 訂閱
這樣的話return只需加再最後一行,是這個意思嗎?
謝謝你的回覆

===================引 用 ikk 文 章===================
你在每個if 都加上 return;
當然就會直接跳出, 只會run一次.
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-08-05 11:32:44 IP:163.28.xxx.xxx 訂閱
這個function, 不需return值, 所以不需要return;
------
FPGA驗證, FPGA開發平台, http://smims.com
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-08-05 11:36:59 IP:140.124.xxx.xxx 訂閱
謝謝ikk大的回覆~
我在去試試看
jayway
一般會員


發表:1
回覆:7
積分:1
註冊:2008-08-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-08-05 14:31:41 IP:140.124.xxx.xxx 訂閱
ikk大
我發現假如不加return的話
這個迴圈會變成無限回圈,AC伺服馬達回一直前進
像這種情況該如何解決呢?
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-08-08 16:30:40 IP:163.28.xxx.xxx 訂閱
從程式邏輯來看, lXPosi 和 ymm是變數, 在while迴圈中判斷.
所以這2個變數一定要有改變, 除非在迴圈中另有判斷式, 呼叫break.

我寫的也只是簡單的pseudo code.
因為我不了解實際馬達運作模式與API, 我只是提供程式上寫作的建議而已...
剩下的就是你要去修改成最適合馬達控制的程式流程...
------
FPGA驗證, FPGA開發平台, http://smims.com
系統時間:2024-05-01 18:11:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!