您现在的位置:首页 > 技术资料 | 上载库存 |
激光加工机器人通信协议及其实现 机器人目前应用十分广泛,在工业、科研、医学等领域发挥了重要作用。我们知道,机器人的指令需要我们来提供。目前,工业机器人的指令一般都是通过示教盒输入的。示教盒提供了简单的人机界面,可以帮助完成简单的示教任务。但在许多应用中,仅通过示教输入是无法满足要求的。在激光加工机器人系统中,要给机器人的指令多达几万条,而且指令的参数不能示教得到,是由其他测量系统提供的。在这种情况下,需要通过上位机给机器人控制器发送指令。这就需要实现机器人控制器和上位机的实时通信。机器人指令有固定格式,机器人通信有其特殊性。为了保证通信的可靠性,提高通信效率,可根据机器人通信特点,制定了相应的通信协议,并制作了专用的、更适合于工业应用的上位机通信控件。
机器人的运动指令来自通信系统。在我们的通信系统中,主要包括上位机应用程序、串口控件、串口和机器人主控计算机(下称下位机)。上位机应用程序产生指令,通过控件访问串行端口,将指令传给下位机。下位机收到指令后,对指令进行分析处理。对于下位机来说,这些指令分两种:一种是解释执行指令,需要进入命令队列,排队执行,占用缓存;另一种是立即执行指令,不需要进入队列,不占用缓存。对于解释执行指令,下位机收到后,把指令放入队列后马上返回应答。对于立即执行指令,先执行该指令,然后才返回应答。查询指令属于立即执行指令,下位机除了返回命令在命令字外,还同时返回相应的数值。上位机根据返回的应答判断通信的状态,并进行相应的处理。
我们的激光加工机器人通信系统具有以下特点:
2)机器人工作环境比较恶劣,各种干扰比较大。通信的抗干扰能力、错误处理的能力非常重要。 3)为了提高加工效率,希望机器人能以较快的速度进行工作。 为避免机器人出现“空指令”,通信速度要跟得上。基于机器人通信系统自身的特点,上位机和它进行通信,必须满足其特定的要求。我们采用如下的通信方式: (1)主从方式。上位机为主机,下位机为从机。一般情况下,下位机不能主动给上位机发送信息。只有上位机给下位机发出指令后,下位机才能作出应答。这样通过上位机,我们就可以很好地控制整个通信过程。 (2)数据帧方式。采用数据帧的方式,有利于保证数据包的完整性,便于进行数据接收和处理。在我们的通信系统中,上位机和下位机均采用相同的协议对通信数据进行打包、解包。我们自己定义帧头为eb 90 82,帧尾为9082,帧标志为f0。另外规定,有效数据中若出现90,则双写90,用以区别帧尾中的900数据帧格式如下所示:
(4)自动重发机制。下位机在接收到错误的数据帧时,将会把该数据帧遗弃掉,同时向上位机返回错误码报错。这时候,该帧数据需要重新发送。如果把重发任务交给应用程序,程序将变得比较复杂。我们把这个任务交给控件,可以很轻松的实现重发功能。在控件内部,当新的数据发送之前,都将数据做一个备份,直到确认接收正确了,才将其消除。如果发现有错误,将其再次发出去。 (
(6)成组指令发送方式。由于机器人的运行速度很快,为了能保证指令发送速度能跟上运行速度,因此在一个数据报里同时发送了多条指令,而下位机只需应答第一条指令。这样就减少了应答时间,提高了指令的发送速度。实际应用中,我们采用7条指令一个数据报,结果显示,速度快了大约37。为了安全和处理方便,控件只允许解释执行指令成组发送,对于立即指令,只能发送单指令数据报。
4.1下位机通信任务的实现
机器人收到上位机的指令后,串口2中断发生,它的中断服务程序启动。它将设置中断同步标志,触发串口2任务程序。串口2任务将处理接收到的上位机数据,将解释指令放入命令队列中,并设置相关标志。在一个时钟周期内(16ms),所有任务执行一遍,它们根据相关标志,完成相应的工作,如读取命令队列,执行命令,给上位机返回应答。 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:{//写事件 5结束语 我们根据激光加工机器人通信的特点,制定了相应的通信协议,同时采用了多种有效的编程方法,以达到安全、高效、实用的目的。经过大量的测试以及I年多工业运用表明,该通信协议及通信系统取得了很好的效果,完全达到了工业机器人通信的要求。 参考文献 3徐军.Visual C++5开发人员指南.北京:机械工业出版社,1998 4 Serial Communications in Win32. http://www自wtech.com/serialcomm
|