多媒体定时器由于定时精度高,因而在数据采集方面应用广泛。采用多媒体定时器对基于PMAC的数控机床进行运动参数采集,如果采集量较多而时间间隔较短,将会发生内存读取错误乃至死机,使加工程序中断CONTROL ENGINEERING China版权所有,如不及时清除缓冲区内未执行的加工数据,下次启动时,将会造成开环“飞车”,这是十分危险的。但采用PMAC的双端口RAM进行数据读取,不但有效避免了这一问题,而且还大大简化了数据采集过程CONTROL ENGINEERING China版权所有,在数控凸轮轴磨床上进行的采集应用过程中,取得了满意的效果。该方法与采用多线程技术进行数据采集相比,优势明显。
1 PMAC卡简介
PMAC(ProgrammableMulti-AxisController控制工程网版权所有,可编程多轴控制器)是美国DeltaTau公司九十年代推出的基于PC平台的开放式多轴运动控制器。它采用了Motorola公司的DSP56系列高性能数字信号处理器作为CPU,是目前世界上功能最强大的运动控制器之一,一个PMAC可以同时控制1~8根轴,多个PMAC级联最多可以控制128根轴,能够精确定位,在包装、装配、医药工业、机床等行业应用广泛。
2 多媒体定时器技术
2.1 多媒体定时器与普通定时器的比较
普通的定时器用函数SetTimer来设定,以毫秒为单位,但由于受到消息队列的处理速度和系统时钟频率的影响,采样周期最少为54.925ms,也就是说SetTimer(1,1,NULL)、SetTimer(1,50,NULL),采样的周期都大概为55ms。但使用Windows的多媒体定时器来代替常规的定时器,通过编程可以获得采集间隔为1ms或更短、分辨率为1µm的定时,定时精度非常高,并且稳定性特别好[1]。
2.2 多媒体定时器的使用方法
在使用多媒体定时器前,需要确定操作系统多媒体定时器的分辨率范围。可以通过函数timeGetDevCaps来获得本计算机的多媒体定时器分辨率范围。使用多媒体定时器,主要分为以下几步:
1)设置多媒体定时器,采用timeSetEvent函数,该函数可以初始化多媒体定时器,确定采集时间间隔,并设置一个定时回调事件。
2)利用函数TimeProc定义回调函数,可以在该函数中添加代码,实现各种操作。
3)调用函数timeKillEvent结束多媒体定时器。
3 基于双端口RAM技术的数据实时采集方式
3.1 PMAC数据读取的方式
现在通常采取两种PMAC数据读取的方式:一种方法是通过设置I变量来确定采集源和采集周期,从缓冲区中获得采集数据,这种方法可以采集任何PMAC有效地址中的数据,但比较复杂;另一种方法从I/O及运动寄存器中直接采集数据,通过设置M变量与运动参数在寄存器中的地址相对应,读取M变量的值采集数据,这种方法相对简单一些。
本文采取了另外一种PMAC数据读取方式:启动双端口RAM,利用双端口RAM所带的函数进行数据采集。这种方法更加方便,双端口RAM的函数封装了PMAC数据读取数据的过程,用户只须调用相关的函数即可从双端口RAM中直接读取运动参数,不需要设定采集源和数据地址。双端口RAM提供了许多运动参数采集函数,可以通过这些函数采集各个电机的状态、位置、速度、跟随误差等。例如:DoublePmacDPRPosition(DWORDdwDevicewww.cechina.cn,intmotor,doubleunits),该函数返回指定电机的实际位置。参数dwDevice为PMAC卡的卡号,motor指电机号,units表示单位。通过适当的单位换算可以将电机的运动参数转换成相应轴的运动参数。如果PMAC的双端口RAM提供的函数仍不能满足需要,也可采用寄存器采集数据,双端口RAM也支持寄存器读取方式。
3.2 双端口RAM技术
PMAC的Option2提供了一个8K×16位的RAM,允许PMAC和PC机之间共享一块快速内存,实现数据的快速传递。在机床的加工过程中需要在实时状态下进行快速的、大量的数据信息下载,同时又需要重复、快速的从PMAC中读取各电机的状态信息。电机的状态信息数据可以不停的更新并被PLC程序或被PMAC自动地写入双端口RAM中,如果不使用双端口RAM,这些数据必须使用PAMC的在线命令通过PC总线来存取。由于使用双端口RAM存取不需要经过通讯口发送命令和等待响应时间,所以要快的多[2]。下面是几个主要的双端口RAM后台定点数据报告功能函数[3]:
·函数PmacDPRRealTime用于开启或关闭PMAC卡双端口RAMCONTROL ENGINEERING China版权所有,并规定伺服更新周期。
·函数PmacDPRSetMotors用于设置PMAC卡,将电机的相关数据复制到双端口RAM中。
·函数PmacDPRSetHostBusyBit用于通知PMAC卡,客户端将要“读”双端口RAM中的数据。