謝智立
(上海機床廠有限公司 上海 200093)
數(shù)控軋輥磨床專用于冶金、造紙、橡膠、印機等行業(yè)磨削各類大型軋機工作輥及支承輥以及各種壓機的金屬、非金屬壓延輥等的磨削加工??赡ハ鲌A柱形、圓錐形、輥面、輥頸、中凸、中凹正弦曲線,拋物線、弧線、CVC曲線以及用戶自定義曲線輥面。采用德國SIEMENS數(shù)控系統(tǒng)分別控制拖板往復(fù)運動、砂輪架切入進給循環(huán)、砂輪偏小擺動進給、自動測量、砂輪磨損測量和快速接近等。并具有砂輪快速趨近工件、各類輥形曲線的生成、錐面磨削、端進給、錐度誤差補償、砂輪磨損補償、曲線誤差補償、恒線速和恒功率等控制功能。配有自動測量裝置,能測量工件直徑、圓度、圓柱度、同心度、輥形誤差,其測量數(shù)據(jù)可反饋到數(shù)控磨削程序并進行自動補償。測量數(shù)據(jù)經(jīng)過運算處理后按測量項目打印出曲線圖形和誤差數(shù)據(jù)。
機床數(shù)控系統(tǒng)采用SIEMENS840D系統(tǒng),并在其基礎(chǔ)上采用了自主開發(fā)的OEM控制軟件,并且配備了HEIDENHAIN IK220高速計數(shù)卡用于閉環(huán)控制、自動測量、自動補償。
將IK220 高速計數(shù)卡直接插入到一個計算機PCI擴展槽接口,如圖1所示,可以直接支持HEIDENHAIN的編碼器,也可以接受正弦電流信號(11 μApp),電壓信號(1 Vpp),以及絕對值數(shù)據(jù)和小型工業(yè)接口SSI數(shù)據(jù)。同時在計算機屏幕上顯示控制軸(2根)的位置編碼器數(shù)據(jù)并保存在該計算機上作進一步的處理,常用于高分辨率的編碼器信號和快速測量數(shù)據(jù)的采集。
圖1 計算機PCI擴展槽接口
IK220 要正確執(zhí)行所需的功能,則要設(shè)置所對應(yīng)的操作參數(shù)。當(dāng)用提供的操作軟件下載參數(shù)時,功能參數(shù)則是按照默認來設(shè)置,可以通過修改參數(shù)來檢查并改變功能,具體參數(shù)見表1。
通過在印刷電路板上的X1、X2這兩個10芯接口(如圖2所示)輸入編碼器信號,信號源為正弦電流信號(11 μApp)。相應(yīng)功能軟件產(chǎn)品提供了編碼器信號補償,編碼器信號可以實現(xiàn)在線自動補償。
作為一個選件,其中的一個組件可以通過1~2個細分接口和2根寬電纜擴展,如圖3所示。
通過擴展可以連接不止一個高速計數(shù)卡來實現(xiàn)閉環(huán)測量,并且可以同時保存所有測量軸的測量數(shù)據(jù),如圖4所示。輸出信號鎖存器2引導(dǎo)所有相應(yīng)的編碼器輸入,這樣使所有的鎖定軸采樣同時在一個循環(huán)周期運行時毫無差異。
表1 操作參數(shù)設(shè)置
圖2 印刷電路板
圖3 編碼器信號傳輸
圖4 細分接口與擴展
在C++的編程語言環(huán)境下編制一個界面并用于測量數(shù)控系統(tǒng)中各數(shù)控軸的實際運動。
//設(shè)置操作界面,三根伺服軸,三個按鈕,帶零
位重啟復(fù)位、帶零位啟動、帶零位停止、重啟
復(fù)位、啟動、停止、參數(shù)設(shè)置、功能狀態(tài)等功
能按鍵
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)) //設(shè)置計數(shù)卡基礎(chǔ)地址
{
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); // 初始化高速計數(shù)卡
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); //啟動計數(shù)器顯示數(shù)據(jù)值
return TRUE; }
void CIK220TSTDlg:OnCancel()
{
KillTimer (TimID);
CDialog:OnCancel();
}
void CIK220TSTDlg:OnTimer(UINT nIDEvent) //用于顯示測量數(shù)值的定時器,通過它顯示測量數(shù)據(jù)的實值
{
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) ) //根據(jù)參數(shù)設(shè)定里數(shù)據(jù)類型為增量式編碼器數(shù)據(jù)來讀取增量式值
{
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) )
//根據(jù)參數(shù)設(shè)定里數(shù)據(jù)類型為增量式編碼器數(shù)據(jù)來讀取絕對值
{
Wert = Wert*m_SignalPeriod[Ax];
sprintf(buffer, format, Wert);
Axis = buffer;
if (Wert>=0) Axis="+"+Axis;
}
else Axis = " Error ";
}
switch (Ax) // 顯示數(shù)控軸數(shù)據(jù)值
{
case 0: m_Axis0 = Axis; break;
case 1: m_Axis1 = Axis; break;
case 2: m_Axis2 = Axis; break;
}
}
UpdateData(FALSE); // 顯示數(shù)據(jù)刷新
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); // 重置計數(shù)器
}
void CIK220TSTDlg:OnStart()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220Start (Ax);// 啟動計數(shù)器
}
void CIK220TSTDlg:OnStop()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220Stop (Ax);// 停止計數(shù)器
}
void CIK220TSTDlg:OnResetREF()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220ResetRef (Ax);// 到參考點計數(shù)器清零
}
void CIK220TSTDlg:OnStartREF()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220StartRef (Ax); // 到參考點計數(shù)器啟動
}
void CIK220TSTDlg:OnStopREF()
{
for (int Ax=0; Ax<3; Ax++)
if (IKCard[Ax]!=0)
if (m_Active[Ax]) IK220StopRef (Ax); // 到參考點計數(shù)器停止
}
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() //參數(shù)設(shè)置
{
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;
}
隨著世界經(jīng)濟的發(fā)展和生產(chǎn)的提高,人們開始對機床的多功能和先進性的要求越來越高。由于冶金鋼鐵及汽車行業(yè)的迅猛發(fā)展,對金屬板材的精度要求越來越高。為了能壓制出高精度的板材,軋機中軋輥表面精度是決定板材精度的最主要因素,因此,軋輥的測量與磨削控制就顯得非常重要。基于SIEMENS 840D數(shù)控系統(tǒng)為機床廠家提供了極好的平臺,高速計數(shù)卡的應(yīng)用提供了強大的功能,使數(shù)控軋輥磨床的自動測量、數(shù)據(jù)采樣更加準確,并得到了眾多用戶認可。經(jīng)過努力,數(shù)控軋輥磨床一定會達到國際先進水平。
[1] 閆利文,丁曉燕,王妹婷.數(shù)控軋輥磨床測量系統(tǒng)軟件開發(fā)[J].機床與液壓, 2007, 35(7): 110-114.
[2] IK220 PC CounterCard for HEIDENHAIN Encoders[Z]. 2010.
[3] 趙長明,劉萬菊.數(shù)控加工工藝及設(shè)備[M].北京:高等教育出版社, 2003.