本文重点阐述了该机械手控制系统的结构组成,并从多个方面对控制系统软件的设计方法作了进一步分析。
2 机械手基本结构
物料搬运机械手由机械手和物料分拣两部分装置组成。如图1所示,机械手主要由机座(采用步进电机驱动旋转)、水平手臂(采用直线坐标气缸HMP-20-200)、垂直手臂(采用滑块气缸SLT-16-50)、气爪(采用平行气爪HGP-10-A)等部分组成。物料分拣装置则由三个普通气缸构成,用以将不同长度的工件送至不同的轨道中,供机械手分别抓取和搬运。
图1 物料搬运机械手结构简图
3 基于CAN总线的机械手控制系统组成
在机械手控制系统的开发中,我们始终立足于开放结构机械手控制器的设计思想,主要体现在以下几方面:
(1) 硬件基于标准总线结构,能实现现场设备之间、设备与各种传感器之间以及现场设备与控制室之间的数据通信。
现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。CAN(controller Area Network)总线是现场总线的一个分支,是应用于生产现场控制设备之间实现双向串行多节点数字通信的系统,是开放式、数字式的底层控制网络。因其具有很高的可靠性和性能价格比,已经成为国际标准,受到工业界的广泛重视,并已被公认为几种最有前途的现场总线之一。机械手控制系统建立在CAN总线网络基础上,能够更好地满足其开放性和可靠性的要求。
如图2所示,控制系统中上位机采用PC机,在上位机的PCI总线插槽中安装了瑞隆德公司的CANPCA单口CAN总线适配卡。下位机则采用若干CAN总线智能节点,分别与气阀、步进电机驱动器、传感器、开关等相连。上、下位机间的数据通信都是通过各自的CAN总线控制器SJA1000芯片和CAN总线收发器82C250芯片来实现的。其中,SJA1000具有完成CAN总线通信协议所要求的全部特性,它与独立CAN总线控制器82C200完全兼容,并有支持CAN2.0B协议、扩展接收缓冲器、增强错误处理能力和增强验收滤波等新增功能。四个下位机智能节点各自独立完成现场数据采集和运行控制任务,并通过SJA1000实现与上位机间的数据接收和发送。而上位机则通过PCI桥和接口控制电路来访问CAN控制器,从而实现与下位机间的数据通信。
图2 物料搬运机械手CAN总线控制系统示意图
(2)使用基于非专用计算机平台的开发系统(本控制系统中采用PC机)。
(3)使用标准的操作系统和标准的控制语言。
机械手控制系统监控软件采用Visual C++6.0作为开发工具,运行于Windows98平台上。VC是一种面向对象的编程语言,它提供了可视化编程环境,特别是提供了MFC类库,封装了Windows API接口函数,并建立了应用程序框架,使程序开发人员可以将主要精力集中于所要解决的具体问题上。
另外,在机械手的水平手臂气缸伺服控制中,采用德国Festo公司的伺服定位控制器SPC200以及与之配套的内置位移传感器MLO-POT-0225、伺服定位控制连接器SPC-AIF-POT和比例方向流量阀MPYE-5-1/8-LF-010-B等装置。机械手的回转控制则采用北京凯恩帝数控公司的BD-3Y三相混和式步进电机驱动器。
4 机械手控制系统监控软件设计
4.1 监控软件基本结构
机械手监控软件采用VC++6.0作为开发工具,应用其提供的MFC类库和APPWizard功能生成SDI单文档界面应用程序。VC++6.0提供了现成的窗口、工具条等制作手段,大大简化了界面的开发过程,并且使得开发出的界面具有组态软件风格,使用起来方便、灵活。如图3所示,监控软件主要由系统界面、CAN总线通信、机械手监控以及运行状态显示等模块组成。下面就其中的数据通信、运行监控及动态显示部分作进一步分析。
图3 机械手监控软件功能框图
4.2 CAN总线数据通信
CAN总线是一种有效支持分布式控制及实时控制的多主串行总线,它具有短报文帧收发灵活、非破坏性基于优先权的总线仲裁技术等多种优越性能。在机械手控制系统中,CAN总线数据通信是通过与CANPCA适配卡一起提供Pcicandrv.LIB(CAN总线函数库)中的相关函数调用实现的[5]。为了及时准确地了解CAN总线状态,并尽可能减少故障和缩小故障范围,在控制软件中专门设计了测试程序,负责CAN总线接口及通信部分的调试、运行任务。只有在测试正常的前提下,才能进一步运用CAN总线对机械手进行控制。CAN总线数据有标准帧和扩展帧之分,它们都是由信息和数据两部分组成的,只是地址标识符的位数不同。下面是CAN总线初始化及CAN标准帧数据收发的部分代码。
//CAN总线初始化 void CWuLiao::InitCAN() { int retval; retval =CAN_Open(); //打开PCI适配卡函数 if(retval!=1) AfxMessageBox("打开PCI卡失败!"); ptrConfig = &Config; ptrStruct = &Struct; //定义CAN数据帧结构指针 ptrConfig->timer0=0x3f; ptrConfig->timer1=0xff; //设置波特率为5K ptrConfig->workMode=0; //使用11位的CAN节点地址 ptrStruct->card=0; //PCI适配卡卡号 ptrConfig->accCode=0; //CAN接收码 ptrConfig->accMask=0xff; //CAN屏蔽码 ptrConfig->Control=1; //开放中断 ptrConfig->filterMode=0; //CAN控制器采用单滤波方式 retval =CAN_Init(ptrStruct,ptrConfig); //调CAN初始化函数 if(retval!=1) AfxMessageBox("初始化失败!"); } //CAN数据发送 void CWuLiao::OutputCAN(unsigned int CanID,unsigned char H8B,unsigned char L8B) { int retval; ptrPacket = &Packet; ptrStruct = &Struct; ptrStruct->card=0; ptrPacket->length=4;//发送数据长度4个字节 ptrPacket->rtr=0;//表示发送的是数据帧,而非远程帧 ptrPacket->CAN_ID=CanID;//定义CAN节点地址 ptrPacket->data[0]=0x44; ptrPacket->data[1]=0x4f;//CAN数据发送命令字 ptrPacket->data[2]=H8B; ptrPacket->data[3]=L8B;//要发送的高、低字节 retval=CAN_Trans(ptrStruct,ptrPacket);//调发送数据帧函数 } //CAN数据接收 void CWuLiao::InputCAN(unsigned int ID) { ptrPacket = &Packet; ptrStruct = &Struct; int Rece_Length,retval,n; ptrStruct->card=0; ptrPacket->length=2; ptrPacket->rtr=0; ptrPacket->CAN_ID=ID; ptrPacket->data[0]=0x44; ptrPacket->data[1]=0x49; //CAN数据接收命令字 retval=CAN_Trans(ptrStruct,ptrPacket); //调发送数据帧函数,发出接收命令 if(retval==1) { retval=CAN_Rece(ptrStruct,ptrPacket); //调接收数据帧函数 if(retval==1) //接收成功,则返回值为1 { Rece_Length=ptrPacket->length; //取接收到的数据长度 for(n=0;n { Rece_Data[n]=ptrPacket->data[n]; //接收到的数据从ptrPacket的成员变量Data中读取,Race.Data[8]已 设置为全局变量 } } } }
4.3 多线程技术在机械手实时监控中的应用
机械手控制程序是在Windows98下开发的,除了具有丰富的用户图形操作界面,该控制程序还需完成实时数据采集和控制任务。然而Windows98并不是实时操作系统,它是基于消息驱动机制的抢先式多任务系统,没有提供足够的实时处理功能。因此,在程序开发中,我们采用多线程技术来实现系统的实时功能。线程是多任务的基本单元,是操作系统用来调度执行的最小单位。一个进程可以由多个线程组成,系统调度程序将CPU时间片划分给各个线程,各个线程在各自的时间片内使用CPU,从而实现了微观上轮流执行、宏观上并发运行的多任务效果。
为了避免机械手控制软件前台显示界面因CAN总线数据采集和机械手控制指令的程序循环而导致响应过慢或任务阻塞(Blocking)现象,增强应用程序的快速响应特性,我们将主要的数据采集和控制任务:“机械手搬运”及“物料分拣”定义成独立的可以按并行方式执行的工作线程,让这个工作线程在后台通过对CAN总线节点的读写完成数据输入和控制参数输出的任务。前台显示界面则通过PostMessage()函数与后台数据采集及控制程序进行通信,以共享数据单元的方式得到实时采集数据并加以显示。在“机械手系统运行”界面中设置了一个按钮用于数据采集和控制线程的启动。以下给出部分“送料缸”运行控制代码: //设置全局变量 int Rece_Data[8]; //CAN输入数据数组 //以下是主线程 …… #define WM_THREADCAN WMUSER+10 //用户消息定义 …… ON_MESSAGE(WM_THREADCAN,OnThreadCAN) //用宏将消息和处理函数联系起来 …… LRESULT CWuLiao::OnThreadCAN(WPARAM wParam,LPARAM lParam) { CWuLiao::InputCAN(0x10); //读2#CAN节点输入状态 if (Rece_Data[2]==0x7e) CWuLiao::OutputCAN(0x10,0x00,0x55); //满足条件,则输出控制送料缸运动 …… return 0; } void CWuLiao::OnWuLiaoThread() { InitCAN(); //CAN总线初始化 pThread=AfxBeginThread(CAN_IN,GetSafeHwnd(),THREAD_PRIORITY_NORMAL); //创建工作线程 } //以下是CAN数据采集和控制子线程 UINT CAN_IN(LPVOID pParam) { HWND hWnd; hWnd=(HWND)param; do { PostMessage(hWnd,WM_THREADCAN,0,0); Sleep(10); } while (Rece_Data[2]!=0xef); //停止按钮按下则中止工作线程 return 0; } 上述代码中,由主线程建立并初始化子线程,而子线程负责读取CAN节点的状态数据,并通过分析、计算给出相应的控制信号,完成控制任务。子线程一旦被创建,它将独立于创建它的主线程运行。由于一个进程中的所有线程都共享该进程的虚拟地址空间,从而可以通过将主线程和子线程间需共享的数据声明为全局变量的方法来访问该进程的所有全局变量。在机械手监控程序中引入多线程机制,充分利用了Windows系统的多任务特点,可以有效地克服CAN总线数据采集和控制过程中的停滞和反应不及时现象,并能大大提高程序的运行效率和可靠性。
4.4 机械手运行过程的动态显示
工业监控软件中,现场采集来的数据都需要以某种方式表示在屏幕上。在机械手系统中,主要的控制对象是气缸和步进电机,为了能直观地反映出它们的运行状态,必须将CAN总线采集到的各传感器状态以及运动部件的运行情况以动画的形式表现出来。为此,我们采用了ActiveX控件开发及应用技术。ActiveX控件是微软公司提供的功能强大的程序设计和开发技术,它是提高程序开放性和可重用性的重要手段。在机械手控制程序中,通过MFC ActiveX Control Wizard建立了一个名为jixieshou的ActiveX控制的应用程序框架,并在其中生成了可动态显示的机械手装置图形控件。通过对该控件中诸如气缸宽度、高度等属性的设置来改变控件的形状;通过气缸活塞每移动一步的延时和每移动一步的距离来改变气缸的运动速度;通过调用该控件的接口函数来显示气缸、步进电机、传感器等的运动和状态。而上述行为的发生是由CAN总线数据采集和控制子线程向主线程传递相应全局变量的值引发的,由此将图形显示与实物动作紧密联系。
5 结束语
利用CAN总线技术,并采用面向对象的程序设计方法以及多线程技术、ActiveX技术等,可以使监控软件具有较强的通用性、可扩展性和可靠性,同时进一步提高了控制系统的开放性和实时性。通过在物料搬运机械手控制中的应用表明:该控制系统运行可靠,能够完全满足设计要求。
上一篇:OPC服务器的研究及其在CAN总线系统中的实现
下一篇:基于CAN总线的智能家电远程监控系统
推荐阅读最新更新时间:2024-05-02 21:27