打印

激光加工机器人通信协议及其实现

[复制链接]
1558|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
udbit18|  楼主 | 2007-8-8 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要:介绍激光加工机器人系统的通信协议以及实现方法,其中涉及到实时多任务系统VRTXsa.串口通信控件编制。该通信协议和通信系统在应用中取得了满意的效果。


   机器人目前应用十分广泛,在工业、科研、医学等领域发挥了重要作用。我们知道,机器人的指令需要我们来提供。目前,工业机器人的指令一般都是通过示教盒输入的。示教盒提供了简单的人机界面,可以帮助完成简单的示教任务。但在许多应用中,仅通过示教输入是无法满足要求的。在激光加工机器人系统中,要给机器人的指令多达几万条,而且指令的参数不能示教得到,是由其他测量系统提供的。在这种情况下,需要通过上位机给机器人控制器发送指令。这就需要实现机器人控制器和上位机的实时通信。机器人指令有固定格式,机器人通信有其特殊性。为了保证通信的可靠性,提高通信效率,可根据机器人通信特点,制定了相应的通信协议,并制作了专用的、更适合于工业应用的上位机通信控件。


1机器人主控计算机
机器人控制器中最重要的是主控计算机。在激光加工机器人中,主控计算机采用基于PC总线S 104/486DX工业控制级嵌入式单板计算机,其核心是AMD 80486 DX微处理器。主控计算机提供串行接口,可以和它进行串口通信。
主控计算机内部的信息处理由机器人控制器操作系统来实现。整个系统采用了实时多任务操作系统VRTXsa来实现,它具有很好的实时性和可靠性,同时具有完善的任务管理机制。


2激光加工机器人通信系统结构

机器人的运动指令来自通信系统。在我们的通信系统中,主要包括上位机应用程序、串口控件、串口和机器人主控计算机(下称下位机)。上位机应用程序产生指令,通过控件访问串行端口,将指令传给下位机。下位机收到指令后,对指令进行分析处理。对于下位机来说,这些指令分两种:一种是解释执行指令,需要进入命令队列,排队执行,占用缓存;另一种是立即执行指令,不需要进入队列,不占用缓存。对于解释执行指令,下位机收到后,把指令放入队列后马上返回应答。对于立即执行指令,先执行该指令,然后才返回应答。查询指令属于立即执行指令,下位机除了返回命令在命令字外,还
同时返回相应的数值。上位机根据返回的应答判断通信的状态,并进行相应的处理。


3通信协议

我们的激光加工机器人通信系统具有以下特点:
1)机器人只会按指令进行工作,如果指令有问题,将会带来不可预测的后果。所以对于我们的通信系统来说,可靠性、安全性是首要的。
2)机器人工作环境比较恶劣,各种干扰比较大。通信的抗干扰能力、错误处理的能力非常重要。
3)为了提高加工效率,希望机器人能以较快的速度进行工作。
    为避免机器人出现“空指令”,通信速度要跟得上。基于机器人通信系统自身的特点,上位机和它进行通信,必须满足其特定的要求。我们采用如下的通信方式:
(1)主从方式。上位机为主机,下位机为从机。一般情
况下,下位机不能主动给上位机发送信息。只有上位机给下
位机发出指令后,下位机才能作出应答。这样通过上位机,
我们就可以很好地控制整个通信过程。
(2)数据帧方式。采用数据帧的方式,有利于保证数据
包的完整性,便于进行数据接收和处理。在我们的通信系统
中,上位机和下位机均采用相同的协议对通信数据进行打
包、解包。我们自己定义帧头为eb 90 82,帧尾为9082,帧
标志为f0。另外规定,有效数据中若出现90,则双写90,用
以区别帧尾中的900数据帧格式如下所示:


{帧头一帧标志一通信数据一帧尾一校验字}


另外,在我们的通信过程中,要处理各种不同类型的数
据,包括char' , short型、float型、byte型等,在有效数据前
加入标识符来识别它们。如f0 06表示6个浮点数,f3 05表示
5个字符。
(3)校验和。这是一种简单而实用的校验方式。在上位
机发送指令前,自动计算数据的和,并将它附在数据帧的末
端,一起发送给下位机。下位机在接收到数据帧后,先解
包,然后再计算一次数据和,用它与数据帧末端的校验和进
行比较。反之亦然。使用这种方式可以检验数据在传输的过
程中是否发生了变异。
(4)自动重发机制。下位机在接收到错误的数据帧时,
将会把该数据帧遗弃掉,同时向上位机返回错误码报错。这
时候,该帧数据需要重新发送。如果把重发任务交给应用程
序,程序将变得比较复杂。我们把这个任务交给控件,可以
很轻松的实现重发功能。在控件内部,当新的数据发送之
前,都将数据做一个备份,直到确认接收正确了,才将其消
除。如果发现有错误,将其再次发出去。
(5)应答方式。在通信过程,下位机对上位机每一帧数
据都必须做出的应答。上位机根据返回的应答判断通信状
态,然后进行下一步动作。为了安全起见,规定只有在确认
前一包指令正确应答之后,才可以发下一包指令。
对于非查询指令(包括全部解释执行指令和部分立即执
行指令),下位机收到后,返回该指令的命令字;对于查询
指令,除了返回命令字之外,同时还返回查询数据,如机器
人的位置、各轴转角等。如果下位机检测到数据帧有问题,
如无帧头、校验和错等,则返回相应的错误码。
上位机在发送指令的时候,同时记录下了该指令的命令
字。在接收到下位机返回的应答后,将其中的命令字与保留
的命令字比较,如果一样,则说明发送正确,可以发送下一
条指令;反之,则说明指令发送有问题,根据错误码进行错
误处理,并重发当前指令包。指令的发送和应答的接收过程
如图1所示。

图1 指令的发送和应答的接收过程(点击可看图)

(6)成组指令发送方式。由于机器人的运行速度很快,
为了能保证指令发送速度能跟上运行速度,因此在一个数据
报里同时发送了多条指令,而下位机只需应答第一条指令。
这样就减少了应答时间,提高了指令的发送速度。实际应用
中,我们采用7条指令一个数据报,结果显示,速度快了大
约37。为了安全和处理方便,控件只允许解释执行指令成
组发送,对于立即指令,只能发送单指令数据报。


4通信的实现

4.1下位机通信任务的实现


在实时多任务系统中,一项工作的完成往往需要通过多
个任务(中断)共同完成的。这需要各任务及中断协调动作,
相互配合,甚至进行通信。VRTXsa提供了邮箱(mailbox),
队列(queue)、事件标志(event flag)、信号量(semaphore)互斥
体(mutexes) 5种通信机制。
在下位机通信系统中,通信工作由串口2中断、时钟中
断、监控任务、显示任务、执行任务等共同协调完成的。如
图2所示。


图2控制器任务间数据流图(点击可看图)


机器人收到上位机的指令后,串口2中断发生,它的中
断服务程序启动。它将设置中断同步标志,触发串口2任务
程序。串口2任务将处理接收到的上位机数据,将解释指令
放入命令队列中,并设置相关标志。在一个时钟周期内
(16ms),所有任务执行一遍,它们根据相关标志,完成相应
的工作,如读取命令队列,执行命令,给上位机返回应答。
串口2任务程序如下:
void far com2_ task(void)
{刀初始化
刀装载串口2中断
sys_ load vrtx_ isr(Ox34,com- isr);
刀允许串口2中断
n8259_ inerrupt enable(4);
while(true)
刀等待串口2中断
ev_group=sc_ fpend(group_ id,0,4,0,&erro);
刀中断到来,清中断同步标志
ev_group=sc_ fclear(gruop_ id,4,&err);
read_ CommData();//处理并读取数据
刀处理各种指令,并设置各相关标志
process_ Comm (BYTE *Buff,BYTE *cPtr);
}


4.2上位机通信控件的实现


为了便于用户使用,把上位机的通信功能封装到
ActiveX控件中。选择VC++6进行通信控件的开发,串口操
作使用API函数来实现。
控件中采用了多线程技术。为监控串口任务创建了一个
工作线程,以免它堵塞主线程,提高了系统的响应性。
通信控件采用了异步v0方式,以提高发送、接收和处
理数据的效率。异步v0操作建立后会立即返回,即使操作
还未完成。这样把费时的v0操作放在后台进行,线程就可
以干别的事情,极大地提高了程序的运行效率。
在串口通信中,有几种读取串口数据的方式,其中事件
驱动是最有效率的方式。在监视串口的辅助线程中,当有数
据到达时串口是,串口事件触发,控件开始读取串口输入缓
冲区的数据。如果没有数据到达,那么使用
WaitForMultipleObjects 0'数堵塞监测线程,把资源让给其它
线程。在使用线程堵塞技术之后,监视串口线程占用的系统
资源大大减少,同时提高了指令的发送效率。
串口读写和监控是通信的最主要部分,采用了异步v0
操作,使得程序复杂化。异步v0操作分两部分:一是创建
该v0操作,然后返回;二是探测操作的完成。下面是读串
口的部分程序清单:
void CCommCtrl::ReadChar(COMSTAT comstat)
{
while (comstat.cbInQue>0)f
C1earCommError(mJWomm,&dwError,&comstat);
if(!ReadFile(hcomm,&RXBuf,l,&dwRead,&m_ ov))
f //ReadFile返回FALSE,判断是出错还是没完成
if(GetLastError()==ERROR IO_PENDING) f
//没完成,需要等待
if(!GetOverlappedResult(hComm,&m- ov,
&dwRead,TRUE)) //等待读操作完成
{…}刀完成读操作,但出错
else //正确完成读操作
{…}//处理接收的字符
else(…}/赎操作出错
else //读操作在函数返回前已经完成
{…}刀处理接收的字符
}
return; //没有字符了,返回
}
写串口程序和读串口类似。监视线程的部分代码如下:
DINT CommWatch(LPVOID pParam)
{刀清缓存
PurgeComm(hcom,PURGE_ RXCLEAR I PURGE一XCLEAR I
PURGE_ RXABORTIPURGE一XABORT);
for(;;) f
bResult2=WaitCommEvent(hcom,&dwEvtMask,&m一 ov);
刀等待串口事件的发生
if(!bResult2)//事件WaitCommEvent返回假
switch (dw=GetLastError(川
case ERROR-10-PENDING://异步I/O操作(WaitCommEvent)/
/进行中,正常情况
{break;}
default:[ // I/O操作出现错误
ProcessErrorMessage("WaitCommEvent()");
break;}}}
else{//事件WaitCommEven岖回真,操作完成
bResult2=C1earCommError(hcom,&dw, &commstat);
if (commstat.cbInQue==0)
continue;}
刀堵塞线程,等待事件组发生。事件组包括:关闭线程事件、
刀读事件、写事件
Event=WaitForMultipleObjects(3, m- hEventArray, FALSE,
INFINITE);
switch (Event){//判断是哪个事件发生
case 0:f//关闭事件
mJbThreadAlive= FALSE;
AfxEndThread(100);//关闭线程
break;)
case 1:f//字符到达,读字符
bRead=TRUE;
bResult=TRUE;
GetCommMask(hcom, &CommEvent);
if(CommEvent&EV_ RXCHAR)(
刀通知控件句柄读取字符
::SendMessage(CommWnd,WM_ COMM_ READ,0,0);)
break;)
case 2:{//写事件
//通知控件句柄写串口
::SendMessage(CommWnd,WM_ COMM_ WRITE,0,0);)}}
刀主循环结束
return 0;}
 


5结束语

我们根据激光加工机器人通信的特点,制定了相应的通
信协议,同时采用了多种有效的编程方法,以达到安全、高
效、实用的目的。经过大量的测试以及I年多工业运用表
明,该通信协议及通信系统取得了很好的效果,完全达到了
工业机器人通信的要求。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

42

帖子

0

粉丝