HEIDENHAIN IK220 高速计数卡在数控轧辊磨床上的应用
2012-07-08谢智立
谢智立
(上海机床厂有限公司 上海 200093)
数控轧辊磨床专用于冶金、造纸、橡胶、印机等行业磨削各类大型轧机工作辊及支承辊以及各种压机的金属、非金属压延辊等的磨削加工。可磨削圆柱形、圆锥形、辊面、辊颈、中凸、中凹正弦曲线,抛物线、弧线、CVC曲线以及用户自定义曲线辊面。采用德国SIEMENS数控系统分别控制拖板往复运动、砂轮架切入进给循环、砂轮偏小摆动进给、自动测量、砂轮磨损测量和快速接近等。并具有砂轮快速趋近工件、各类辊形曲线的生成、锥面磨削、端进给、锥度误差补偿、砂轮磨损补偿、曲线误差补偿、恒线速和恒功率等控制功能。配有自动测量装置,能测量工件直径、圆度、圆柱度、同心度、辊形误差,其测量数据可反馈到数控磨削程序并进行自动补偿。测量数据经过运算处理后按测量项目打印出曲线图形和误差数据。
1 机床的系统配置
机床数控系统采用SIEMENS840D系统,并在其基础上采用了自主开发的OEM控制软件,并且配备了HEIDENHAIN IK220高速计数卡用于闭环控制、自动测量、自动补偿。
2 HEIDENHAIN IK220 高速计数卡的原理、功能
将IK220 高速计数卡直接插入到一个计算机PCI扩展槽接口,如图1所示,可以直接支持HEIDENHAIN的编码器,也可以接受正弦电流信号(11 µApp),电压信号(1 Vpp),以及绝对值数据和小型工业接口SSI数据。同时在计算机屏幕上显示控制轴(2根)的位置编码器数据并保存在该计算机上作进一步的处理,常用于高分辨率的编码器信号和快速测量数据的采集。
图1 计算机PCI扩展槽接口
IK220 要正确执行所需的功能,则要设置所对应的操作参数。当用提供的操作软件下载参数时,功能参数则是按照默认来设置,可以通过修改参数来检查并改变功能,具体参数见表1。
通过在印刷电路板上的X1、X2这两个10芯接口(如图2所示)输入编码器信号,信号源为正弦电流信号(11 µApp)。相应功能软件产品提供了编码器信号补偿,编码器信号可以实现在线自动补偿。
作为一个选件,其中的一个组件可以通过1~2个细分接口和2根宽电缆扩展,如图3所示。
通过扩展可以连接不止一个高速计数卡来实现闭环测量,并且可以同时保存所有测量轴的测量数据,如图4所示。输出信号锁存器2引导所有相应的编码器输入,这样使所有的锁定轴采样同时在一个循环周期运行时毫无差异。
表1 操作参数设置
图2 印刷电路板
图3 编码器信号传输
图4 细分接口与扩展
3 HEIDENHAIN IK220 高速计数卡的应用实例及分析
在C++的编程语言环境下编制一个界面并用于测量数控系统中各数控轴的实际运动。
//设置操作界面,三根伺服轴,三个按钮,带零
位重启复位、带零位启动、带零位停止、重启
复位、启动、停止、参数设置、功能状态等功
能按键
m_Axis0 = _T("");
m_Axis1 = _T("");
m_Axis2 = _T("");
m_Check0 = FALSE;
m_Check1 = FALSE;
m_Check2 = FALSE;
DDX_Text(pDX, IDC_Axis0, m_Axis0);
DDX_Text(pDX, IDC_Axis1, m_Axis1);
DDX_Text(pDX, IDC_Axis2, m_Axis2);
DDX_Check(pDX, IDC_CHECK0, m_Check0);
DDX_Check(pDX, IDC_CHECK1, m_Check1);
DDX_Check(pDX, IDC_CHECK2, m_Check2);
BEGIN_MESSAGE_MAP(CIK220TSTDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_RESET_RI, OnResetREF)
ON_BN_CLICKED(IDC_START_RI, OnStartREF)
ON_BN_CLICKED(IDC_STOP_RI, OnStopREF)
ON_BN_CLICKED(IDC_RESET, OnReset)
ON_BN_CLICKED(IDC_START, OnStart)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_BN_CLICKED(IDC_CHECK0, OnCheck0)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_BN_CLICKED(IDC_Setup, OnSetup)
ON_BN_CLICKED(IDC_STATUS, OnStatus)
if (!IK220Find (IKCard)) //设置计数卡基础地址
{
m_IK220found = FALSE;
AfxMessageBox ("No IK 220 found", MB_ICONSTOP);
}
for (int Ax=0; Ax<3; Ax++)
{
m_Active[Ax] = FALSE;
OldSta[Ax] = 0xFFFF;
m_SignalPeriod[Ax]= 0.020; //默认的信号分辨率
m_EncoderType[Ax]= 0;// 默认的编码器类型 0:增量式
m_SignalType[Ax] = 1; // 默认的信号类型 1: 1Vss
}
for (int Ax=0; Ax<3; Ax++)
{
if (IKCard[Ax]!=0)
{
IK220Init (Ax); // 初始化高速计数卡
if ( !IK220WritePar (Ax, 1, m_EncoderType[Ax]) )
if ( !IK220WritePar (Ax, 2, m_SignalType[Ax] ) )
m_Active[Ax]=TRUE;
switch (Ax)
{
case 0: m_Check0=TRUE; break;
case 1: m_Check1=TRUE; break;
case 2: m_Check2=TRUE; break;
}
}
}
TimID = SetTimer (1, 150, NULL); //启动计数器显示数据值
return TRUE; }
void CIK220TSTDlg:OnCancel()
{
KillTimer (TimID);
CDialog:OnCancel();
}
void CIK220TSTDlg:OnTimer(UINT nIDEvent) //用于显示测量数值的定时器,通过它显示测量数据的实值
{
double Wert;
int Ax;
char buffer[25];
const char *format = "%1.6f";
const char *hexformat = "%04X";
CString Axis;
ULONG Stat;
CString StatusTXT;
USHORT EnStatus, EnAlarm;
for (Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
{
if ( m_EncoderType[Ax]==0 )
{
if ( IK220Read48 (Ax, 0, &Wert) ) //根据参数设定里数据类型为增量式编码器数据来读取增量式值
{
Wert = Wert*m_SignalPeriod[Ax];
sprintf(buffer, format, Wert);
Axis = buffer;
if (Wert>=0) Axis="+"+Axis;
}
else Axis = " Error ";
}
if ( m_EncoderType[Ax]==1 )
{
if ( IK220ReadEn (Ax, &EnStatus, &Wert, nAlarm) )
//根据参数设定里数据类型为增量式编码器数据来读取绝对值
{
Wert = Wert*m_SignalPeriod[Ax];
sprintf(buffer, format, Wert);
Axis = buffer;
if (Wert>=0) Axis="+"+Axis;
}
else Axis = " Error ";
}
switch (Ax) // 显示数控轴数据值
{
case 0: m_Axis0 = Axis; break;
case 1: m_Axis1 = Axis; break;
case 2: m_Axis2 = Axis; break;
}
}
UpdateData(FALSE); // 显示数据刷新
if (m_StatusOn && m_pModeless)
{
for (Ax=0; Ax<3; Ax++)
{
StatusTXT ="";
if (IKCard[Ax]!=0)
{
if (IK220Status(Ax, &Stat))
{
if (OldSta[Ax] != Stat)
{
OldSta[Ax] = Stat;
sprintf(buffer, hexformat, Stat);
StatusTXT=buffer;
StatusTXT="0x"+StatusTXT+": ";
if (Stat & 0x00000001) StatusTXT = StatusTXT + "Latch 0, ";
if (Stat & 0x00000002) StatusTXT = StatusTXT + "Latch 1, ";
if (Stat & 0x00000004) StatusTXT = StatusTXT + "Latch 2, ";
if (Stat & 0x00000020) StatusTXT = StatusTXT + "started,"; else StatusTXT = StatusTXT + "stopped, ";
if (Stat & 0x00000040) StatusTXT = StatusTXT +"REF-Function active, ";
if (Stat & 0x00000080) StatusTXT = StatusTXT +"Frequency Error, ";
if (Stat & 0x00000100) StatusTXT = StatusTXT +"Amplitude Error, ";
if ((Stat & 0x0000C000)==0x00000000) StatusTXT =
StatusTXT + "No REF";
if ((Stat & 0x0000C000)==0x00004000) StatusTXT =
StatusTXT + "Wait 1. REF";
if ((Stat & 0x0000C000)==0x00008000) StatusTXT =
StatusTXT + "Wait 2. REF";
if ((Stat & 0x0000C000)==0x0000C000) StatusTXT =
StatusTXT + "REF";
}
}
else
{
StatusTXT = " --- Status Error ---";
}
}
else
{
StatusTXT = " --- No IK 220 installed ---";
}
if (StatusTXT!="")
{
switch (Ax)
{
case 0: m_pModeless->m_STEXT1 = StatusTXT;
break;
case 1: m_pModeless->m_STEXT2 = StatusTXT; break;case 2: m_pModeless->m_STEXT3 = StatusTXT; break;
}
}
}
}
CDialog:OnTimer(nIDEvent);
}
void CIK220TSTDlg:OnReset()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220Reset (Ax); // 重置计数器
}
void CIK220TSTDlg:OnStart()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220Start (Ax);// 启动计数器
}
void CIK220TSTDlg:OnStop()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220Stop (Ax);// 停止计数器
}
void CIK220TSTDlg:OnResetREF()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220ResetRef (Ax);// 到参考点计数器清零
}
void CIK220TSTDlg:OnStartREF()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220StartRef (Ax); // 到参考点计数器启动
}
void CIK220TSTDlg:OnStopREF()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220StopRef (Ax); // 到参考点计数器停止
}
void CIK220TSTDlg:OnCheck0() //激活轴选项共有三个
{
if (IKCard[0]!=0)
{
m_Acti ve[0] = !m_Active[0];
m_Check0 = !m_Check0;
}
else m_Check0 = FALSE;
}
void CIK220TSTDlg:OnCheck1()
{
if (IKCard[1]!=0)
{
m_Active[1] = !m_Active[1];
m_Check1 = !m_Check1;
}
else m_Check1 = FALSE;
}
void CIK220TSTDlg:OnCheck2()
{
if (IKCard[2]!=0)
{
m_Active[2] = !m_Active[2];
m_Check2 = !m_Check2;
}
else m_Check2 = FALSE;
}
}
void CIK220TSTDlg:OnSetup() //参数设置
{
int Ax;
ULONG Para_1, Para_2;
USHORT EnStatus, EnType, EnTurns, EnRefDist,
EnCntDir;
ULONG EnPeriod, EnStep;
CSetupDlg dlgSetup;
Ax=0;
while ( ((IKCard[Ax]==0) || (!m_Active[Ax])) &&(Ax<=3) ) Ax++;
if (Ax<=3)
{
dlgSetup.m_Period = m_SignalPeriod[Ax];
if (!IK220ReadPar (Ax, 1, &Para_1))
if (!IK220ReadPar (Ax, 2, &Para_2))
dlgSetup.m_Encoder = Para_1;
dlgSetup.m_Signal = Para_2;
{
Para_1 = dlgSetup.m_Encoder;
Para_2 = dlgSetup.m_Signal;
for (Ax=0; Ax<3; Ax++)
if ( (IKCard[Ax]!=0) && (m_Active[Ax]) )
{
m_EncoderType[Ax] = dlgSetup.m_Encoder;
m_SignalType[Ax] = dlgSetup.m_Signal;
m_SignalPeriod[Ax] = dlgSetup.m_Period;
if (!IK220WritePar (Ax, 1, Para_1))
if (!IK220WritePar (Ax, 2, Para_2))
if ( m_EncoderType[Ax]==1)
{
}
}
void CIK220TSTDlg:OnStatus()
{
for (int Ax=0; Ax<3; Ax++) OldSta[Ax]=0xFFFF;
}
4 结语
随着世界经济的发展和生产的提高,人们开始对机床的多功能和先进性的要求越来越高。由于冶金钢铁及汽车行业的迅猛发展,对金属板材的精度要求越来越高。为了能压制出高精度的板材,轧机中轧辊表面精度是决定板材精度的最主要因素,因此,轧辊的测量与磨削控制就显得非常重要。基于SIEMENS 840D数控系统为机床厂家提供了极好的平台,高速计数卡的应用提供了强大的功能,使数控轧辊磨床的自动测量、数据采样更加准确,并得到了众多用户认可。经过努力,数控轧辊磨床一定会达到国际先进水平。
[1] 闫利文,丁晓燕,王妹婷.数控轧辊磨床测量系统软件开发[J].机床与液压, 2007, 35(7): 110-114.
[2] IK220 PC CounterCard for HEIDENHAIN Encoders[Z]. 2010.
[3] 赵长明,刘万菊.数控加工工艺及设备[M].北京:高等教育出版社, 2003.