求救:机器人手指的控制直流电机的C++程序死循环,原因何在?

54hfzm 2003-12-03 04:18:45
说明:
0. 整个C++程序是用来控制手指运动的,运行在DOS下的BorlandC。下面这段程序片断是用于初始化手指,初始化成功后,手指便可以执行控制信号。
解释U11:#define U11 0x230+5 //74LS374 position ,read only
手指的起始位置和结束位置分别实时存放在U11_buf[0]和U11_buf[1]
1. 为分析程序运行状态,我用清屏和显示“OK1,OK2,……”的方法,检查程序问题。
2. 有问题的源程序如下:
int hand::ini()//If complete,return TRUE
{
outportb(U13,SHUT);
clrscr();
cout<<"Initializing! Wait ..."<<endl;
oldhandler1=getvect(VECT);
disable();
setvect(VECT,workint);
mask=inportb(0x21);
mask=mask&ENABLE_MASK;
outportb(0x21,mask);
outportb(U36_3,0x36); //transport CW to U36 (8253) port0 mode 3
outportb(U36_0,0x44); //transport data to U36 count0 2ms
outportb(U36_0,0x10);
enable();
cout<<"OK1"<<endl;
move(-200);
delay(300);
U11_buf[0]=U11_buf[1];
cout<<"OK2"<<endl;
for(;;)
{
delay(200);
if(U11_buf[1]-U11_buf[0]==0)
{
U11_buf[0]=U11_buf[1];
for(int i=0;i<10;i++)
cout<<"OK3.0"<<endl;
{
delay(200);
if(U11_buf[1]-U11_buf[0]==0i_count++;
U11_buf[0]=U11_buf[1];
cout<<"OK3.1"<<endl;
}
cout<<"OK3.2"<<endl;
if(i_count==10)
{
cout<<"OK4.0"<<endl;
former_work=TRUE;
position=0;
ini_position=U11_buf[1];
move_position(10.0);
do{}
while(fabs(actual_position-10.0>0.2);
return(0);
cout<<"OK4.1"<<endl;
}
else
cout<<"OK4.2"<<endl;
{
i_count=0;
former_work=FALSE;
}
cout<<"OK5"<<endl;
}
else U11_buf[0]=U11_buf[1];
cout<<"OK6"<<endl;
}
}

3. 屏幕显示:
OK1
OK2
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.1
OK3.2
OK4.2
OK5
OK6
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.0
OK3.1
OK3.2
OK4.2
OK5
OK6
……死循环

控制手指的电机根本没有电流过来。
请大家帮忙啊!

补充1:
感谢大家的指教.
但是,我的程序原先没有加入“OK3.1”到“OK4.2”时,还是经常运行良好的,当时屏幕显示:
OK1
OK2
OK6
……(n个OK6)
OK3
end ini!

注:
本机器人手执行两套独立的任务:1.主从遥操作抓取物体,2.自动识别与抓取物体
1.主从遥操作抓取物体:(以下称为1系统)
我使用主手,我的大臂小臂手指分别驱动机器人手的大臂小臂手指,延时50毫秒内机器人手与我同步运动。在任何时刻我停止系统时,机器人手指的间距停留在最后一个执行位置,间距值为n毫米。每次我重新启动整个主从遥操作系统时,手指这个子系统也要一起初始化,就是手指先自动合并一次,于是间距由n毫米减小为0毫米,如果手指系统初始化成功,屏幕如上显示。
2. 自动识别与抓取物体:(以下称为2系统)
控制机器人手的下位机系统还要执行来自串口的多任务:上位机图像识别物体后通过串口通信,要
下位机控制机器人手自动靠近被识别物体,并用手指抓取物体和把拿到指定的地点。

早期只有1系统,以上源程序中,我也没有加入“OK*”。
目前2系统开始壮大,下位机频繁启动2系统,于是1系统的经常出现手指初始化不成功的问题,于是我检查程序死在何处?于是加入“OK1”、“OK2”、“OK3”、“OK4”、“OK5”,“OK6”,系统开始时运行良好,屏幕显示:
OK1
OK2 //(出现"OK2",手指开始合并)
OK6
……n个OK //(手指间距为n毫米,合并后,就出现n个OK)
OK3 //(delay()语句,使手指停顿不到1秒)
end ini //(出现"end ini",表示手指初始化成功,手指于是张开几毫米,处于伺服状态,我
就可以遥控手指了)

最近1系统中的手指子系统几乎就是死掉了,原因就是初始化问题,而初始化问题的原因就是上面一段程序有问题,于是昨天我又加进了“OK3.1”到“OK4.2”,于是,看到程序死循环(屏幕显示如本页顶部所表示)。
我个人感觉:
1.disable()到enable()之间的中断有问题,于是move()语句没有被电机执行,于是
手指没有动。于是,U11_buf[]没用。
2.74LS3748D触发器出了问题。它是用了保存手指的实时位置的,
于是U11_buf[0]和U11_buf[1]混乱。这就导致i_count++的最后值不是10。
3.1或者2的问题就导致了"OK4.2"的出现,即former_work=false.

对大家的解释,我的看法:
1.TinyAnt():程序原来就没有break。因为for(;;)就是要循环跟踪手指的初始化过程中每 个周期内手指的开始和结束的位置。而且,在没有2系统之前,程序运行良好。您的分析目前不
合理,请您再仔细想想有没有其他可能。
2.fierygnu(va_list):您的分析也不成立,我已经在上文介绍中回答了。也请您再想想。
3.lhlemail(就随风):您也提出了break,呵呵。您看3.0的确出现了10次,但是,i_count!=10,
否则就不会出现"OK4.2".您能帮我分析一下,为什么出现了"OK6"后,又回到了"OK3.0"

感谢以上3位朋友的支持,欢迎更多的朋友帮帮我啊!!
...全文
129 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧