}
//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技术等,可以使监控软件具有较强的通用性、可扩展性和可靠性,同时进一步提高了控制系统的开放性和实时性。通过在物料搬运机械手控制中的应用表明:该控制系统运行可靠,能够完全满足设计要求。