You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

487 lines
14 KiB
C++

#include "StdAfx.h"
#include "GratingRuler.h"
#include "Propertie.h"
#include "PropertieMgr.h"
#include "CommPortMgr.h"
#include "LogMgr.h"
#include "BitOperation.h"
#include "AuthorityMgr.h"
#define WE6800_RETURN_BTYE_CNT 17//WE6800 <20><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ֽ<EFBFBD><D6BD><EFBFBD>
CGratingRuler *gGratingRuler = new CGratingRuler;
CGratingRuler::CGratingRuler(void)
{
m_bIni = false;//<2F><>դ<EFBFBD><D5A4><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ʼ<EFBFBD><CABC>
m_bUseGratingRuler = false;//<2F>Ƿ<EFBFBD>ʹ<EFBFBD>ù<EFBFBD>դ<EFBFBD><D5A4>
m_CommPort = -1;//<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>
m_OriginCalibrationError = 0.02;//ԭ<><D4AD>У׼<D0A3><D7BC><EFBFBD><EFBFBD>(mm)
m_MaxCalibrationTimes = 10;//<2F><><EFBFBD><EFBFBD>У׼<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
m_MeasureErrorGap = 1;//У׼ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>(mm)(ԽС<D4BD>ֵ<EFBFBD>Խϸ)
m_MaxOriginError = 10;//<2F><>ԭ<EFBFBD><D4AD>ʱƽ̨ԭ<CCA8><D4AD><EFBFBD>͹<EFBFBD>դ<EFBFBD><D5A4>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(mm)
}
CGratingRuler::~CGratingRuler(void)
{
}
#if 1
CMFCPropertyGridProperty *CGratingRuler::CreatGridProperty()
{
CString PropertyName;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CString Description;//<2F><><EFBFBD><EFBFBD>
CString Path = _T("GratingRuler");;//<2F>洢·<E6B4A2><C2B7>
CString Name;
//-------------------------------------------------------------------------------//
PropertyName = _T("<EFBFBD><EFBFBD>դ<EFBFBD><EFBFBD>");
CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(PropertyName);
//-------------------------------------------------------------------------------//
if(gAuthorityMgr->CheckAuthority(_FACTORY))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
Name = _T("m_CommPort");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_CommPort);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
PropertyName = _T("<EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>");
Description = _T("<EFBFBD><EFBFBD>դ<EFBFBD>ߺ<EFBFBD>PC ͨѶ<CDA8>Ĵ<EFBFBD><C4B4>ں<EFBFBD>(0~16)");
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_CommPort, Description);
pGroup->AddSubItem(p1);
gDevicePropertieMgr.Insert(p1, pPropertie);
}
if(gAuthorityMgr->CheckAuthority(_FACTORY))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
Name = _T("m_bUseGratingRuler");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_bUseGratingRuler);
pPropertie->SetType(_PROP_TYPE_BOOL);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
PropertyName = _T("<EFBFBD><EFBFBD>դ<EFBFBD><EFBFBD>");
Description = _T("<EFBFBD><EFBFBD>դ<EFBFBD><EFBFBD>У׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bUseGratingRuler, Description);
pGroup->AddSubItem(p1);
gDevicePropertieMgr.Insert(p1, pPropertie);
}
if(gAuthorityMgr->CheckAuthority(_FACTORY))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
Name = _T("m_OriginCalibrationError");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_OriginCalibrationError);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
PropertyName = _T("ԭ<EFBFBD><EFBFBD>У׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
Description = _T("ƽ̨<EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>λ: mm)");
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_OriginCalibrationError, Description);
pGroup->AddSubItem(p1);
gDevicePropertieMgr.Insert(p1, pPropertie);
}
if(gAuthorityMgr->CheckAuthority(_FACTORY))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
Name = _T("m_MaxCalibrationTimes");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MaxCalibrationTimes);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
PropertyName = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
Description = _T("ƽ̨<EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>");
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxCalibrationTimes, Description);
pGroup->AddSubItem(p1);
gDevicePropertieMgr.Insert(p1, pPropertie);
}
if(gAuthorityMgr->CheckAuthority(_FACTORY))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
Name = _T("m_MeasureErrorGap");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MeasureErrorGap);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
PropertyName = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
Description = _T("У׼ƽ̨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>(<28><>λ: mm)");
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MeasureErrorGap, Description);
pGroup->AddSubItem(p1);
gDevicePropertieMgr.Insert(p1, pPropertie);
}
//-------------------------------------------------------------------------------//
return pGroup;
}
void CGratingRuler::ExportPar(ofstream *pFile)
{
(*pFile)<<"<><C4A3>] [CGratingRuler]------------------------------------------------"<<endl;
(*pFile)<<"[<5B><>դ<EFBFBD><D5A4>][m_bUseGratingRuler] = "<<m_bUseGratingRuler<<endl;
(*pFile)<<"[<5B><><EFBFBD>ں<EFBFBD>][m_CommPort] = "<<m_CommPort<<endl;
(*pFile)<<"<><D4AD>У׼<D0A3><D7BC><EFBFBD><EFBFBD>][m_OriginCalibrationError] = "<<m_OriginCalibrationError<<endl;
(*pFile)<<"[<5B><><EFBFBD><EFBFBD>У׼<D0A3><D7BC><EFBFBD><EFBFBD>][m_MaxCalibrationTimes] = "<<m_MaxCalibrationTimes<<endl;
(*pFile)<<"[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>][m_MeasureErrorGap] = "<<m_MeasureErrorGap<<endl;
(*pFile)<<"<><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>][m_MaxOriginError] = "<<m_MaxOriginError<<endl;
}
void CGratingRuler::ExportErrorTable(ofstream *pFile,vector<TypePosError> &ErrorTable)
{
}
#endif
#if 1//<2F><>ȡ<EFBFBD><C8A1>դ<EFBFBD><D5A4>
//<2F><>ȡ<EFBFBD><C8A1>դ<EFBFBD><D5A4>
bool CGratingRuler::ReadGratingRuler(Dbxy &pt)
{
CCommPortMgr com;
//<2F>򿪴<EFBFBD><F2BFAAB4><EFBFBD>
if(com.Open(m_CommPort)==false)
{
return false;
}
int DelayTime = 100;
CString str1 = "R";
CString str = str1+char(13)+char(10);
com.Write(str);
Sleep(DelayTime);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>
char Buffer[WE6800_RETURN_BTYE_CNT];
int len = com.Read(Buffer,WE6800_RETURN_BTYE_CNT);
if(len<WE6800_RETURN_BTYE_CNT)
{
com.Close();
return false;
}
for(int i=0;i<WE6800_RETURN_BTYE_CNT;i++)
{
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
if(AnalysisRulerRet(Buffer,pt)==false)
{
com.Close();
return false;
}
com.Close();
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>դ<EFBFBD>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CGratingRuler::AnalysisRulerRet(char *Buffer,Dbxy &pt)
{
bool bIsNegativeX = false;
bool bIsNegativeY = false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ-------------------------------------------
if(AnalysisSymbol(Buffer[1],bIsNegativeX,bIsNegativeY)==false)
{
return false;
}
//<2F><><EFBFBD><EFBFBD>XY <20><><EFBFBD><EFBFBD>״̬
if(AnalysisXYState(Buffer[2])==false)
{
return false;
}
//<2F><><EFBFBD><EFBFBD>X <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
pt.x = AnalysisCoord(Buffer[3],Buffer[4],Buffer[5],Buffer[6]);
//<2F><><EFBFBD><EFBFBD>Y <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
pt.y = AnalysisCoord(Buffer[7],Buffer[8],Buffer[9],Buffer[10]);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(bIsNegativeX)
{
pt.x *= -1;
}
if(bIsNegativeY)
{
pt.y *= -1;
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
bool CGratingRuler::AnalysisSymbol(BYTE byte,bool &bIsNegativeX,bool &bIsNegativeY)
{
if(IsBitOn(byte,4))//<2F>жϵ<D0B6>λ0 <20>Ǻ<EFBFBD><C7BA><EFBFBD>1 <20><>Ӣ<EFBFBD><D3A2>
{
CString str = "[error] [<5B><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ΪӢ<CEAA><D3A2>]";
gLogMgr->WriteDebugLog(str);
return false;
}
if(IsBitOn(byte,0))//<2F>ж<EFBFBD>x <20><><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
{
bIsNegativeX = true;
}
if(IsBitOn(byte,1))//<2F>ж<EFBFBD>Y <20><><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
{
bIsNegativeY = true;
}
return true;
}
//<2F><><EFBFBD><EFBFBD>XY <20><><EFBFBD><EFBFBD>״̬
bool CGratingRuler::AnalysisXYState(BYTE byte)
{
if(IsBitOn(byte,0))
{
CString str = "[error] [X <20><><EFBFBD><EFBFBD>դ<EFBFBD><D5A4><EFBFBD>쳣]";
gLogMgr->WriteDebugLog(str);
return false;
}
if(IsBitOn(byte,1))
{
CString str = "[error] [Y <20><><EFBFBD><EFBFBD>դ<EFBFBD><D5A4><EFBFBD>쳣]";
gLogMgr->WriteDebugLog(str);
return false;
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(ѹ<><D1B9>BCD <20><><EFBFBD><EFBFBD>ʽ)
double CGratingRuler::AnalysisCoord(BYTE byte1,BYTE byte2,BYTE byte3,BYTE byte4)
{
double coord = 0;
double coefficient = 0.0001;//<2F><><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>Ǹ<EFBFBD><C7B8>ݹ<EFBFBD>դ<EFBFBD>ߵľ<DFB5><C4BE><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
double Increment = 10;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ӵı<D3B5><C4B1><EFBFBD>
//ǧ<><C7A7>λ,<2C>ٷ<EFBFBD>λ
{
double high = 0;
double low = 0;
GetTwoNum(byte1,high,low);
coord += low*coefficient;
coefficient *= Increment;
coord += high*coefficient;
coefficient *= Increment;
}
//ʮ<><CAAE>λ,<2C><>λ
{
double high = 0;
double low = 0;
GetTwoNum(byte2,high,low);
coord += low*coefficient;
coefficient *= Increment;
coord += high*coefficient;
coefficient *= Increment;
}
//ʮλ<CAAE><CEBB><EFBFBD><EFBFBD>λ
{
double high = 0;
double low = 0;
GetTwoNum(byte3,high,low);
coord += low*coefficient;
coefficient *= Increment;
coord += high*coefficient;
coefficient *= Increment;
}
//ǧλ<C7A7><CEBB><EFBFBD><EFBFBD>λ
{
double high = 0;
double low = 0;
GetTwoNum(byte4,high,low);
coord += low*coefficient;
coefficient *= Increment;
coord += high*coefficient;
}
return coord;
}
//<2F><>ȡbyte <20><><EFBFBD><EFBFBD>λ<EFBFBD>͸<EFBFBD><CDB8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ֵ
void CGratingRuler::GetTwoNum(BYTE byte,double &high,double &low)
{
//<2F><><EFBFBD><EFBFBD>λ
{
BYTE byte1 = byte<<4;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
int tmp = (int)(byte1>>4);//<2F><>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
low = tmp;
}
//<2F><><EFBFBD><EFBFBD>λ
{
BYTE byte1 = byte>>4;//<2F>ұ<EFBFBD><D2B1><EFBFBD>0
int tmp = (int)(byte1);//<2F><>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
high = tmp;
}
}
#endif
#if 1//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD>õ<EFBFBD>ǰλ<C7B0><CEBB>Ϊ<EFBFBD><CEAA>դ<EFBFBD>ߵ<EFBFBD>ԭ<EFBFBD><D4AD>
bool CGratingRuler::SetOriginCoord()
{
Dbxy pt;
if(ReadGratingRuler(pt)==false)//<2F><>ȡ<EFBFBD><C8A1>ǰֵ
{
return false;
}
m_bIni = true;//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
m_OriginCoord = pt;//<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
return true;
}
//<2F><>ȡ<EFBFBD><C8A1>դ<EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CGratingRuler::GetCurCoord(Dbxy &pt)
{
if(!m_bIni)
{
return false;
}
Dbxy ReadPt;
if(ReadGratingRuler(ReadPt)==false)
{
return false;
}
//ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pt.x = ReadPt.x - m_OriginCoord.x;
pt.y = ReadPt.y - m_OriginCoord.y;
return true;
}
#endif
#if 1//ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD>
//ƽ̨ԭ<CCA8><D4AD>У׼(ƽ̨<C6BD><CCA8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>ԭ<EFBFBD><EFBFBD><E3A3AC>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>դ<EFBFBD><D5A4><EFBFBD><EFBFBD>У׼<D0A3><D7BC>λ<EFBFBD><CEBB>)
bool CGratingRuler::PlatformOriginCalibration(CPlatformXY &PlatformXY)
{
if(IsUsed()==false)//û<><C3BB>ʹ<EFBFBD>ù<EFBFBD>դ<EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>Ѿ<EFBFBD>У׼
{
return true;
}
if(!m_bIni)
{
return false;
}
int i=0;
for(;i<m_MaxCalibrationTimes;i++)
{
//<2F><>ȡ<EFBFBD><C8A1>դ<EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Dbxy pt;
if(GetCurCoord(pt)==false)
{
return false;
}
if(pt.x>m_MaxOriginError || pt.y>m_MaxOriginError)
{
//<2F><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
return false;
}
//XY <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EEB6BC><D0A1>m_OriginCalibrationError ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У׼
if(abs(pt.x)<m_OriginCalibrationError && abs(pt.y)<m_OriginCalibrationError)
{
break;
}
//<2F><><EFBFBD>򲹳<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if(abs(pt.x)>m_OriginCalibrationError)
{
if(pt.x>0)
{
PlatformXY.MoveDistance(pt.x,_DIR_L,false);
}
else
{
PlatformXY.MoveDistance(pt.x,_DIR_R,false);
}
}
if(abs(pt.y)>m_OriginCalibrationError)
{
if(pt.y>0)
{
PlatformXY.MoveDistance(pt.x,_DIR_D,false);
}
else
{
PlatformXY.MoveDistance(pt.x,_DIR_U,false);
}
}
}
if(i==m_MaxCalibrationTimes)
{
return false;
}
return true;
}
//<2F><><EFBFBD><EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD>
//rect <20><><EFBFBD><EFBFBD>ҪУ׼<D0A3>ķ<EFBFBD>Χ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
//PlatformXY <20><>ҪУ׼<D0A3><D7BC>ƽ̨
bool CGratingRuler::MeasurePlatfromError(DbRect rect,CPlatformXY &PlatformXY)
{
if(IsUsed()==false)
return true;
if(!m_bIni)
{
return false;
}
//x <20><>
if(MeasureMotorError(PlatformXY,_X,rect.L,rect.R,m_ErrorTableX)==false)
{
return false;
}
//y <20><>
if(MeasureMotorError(PlatformXY,_Y,rect.B,rect.T,m_ErrorTableY)==false)
{
return false;
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Start,End <20>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD>Χ)
bool CGratingRuler::MeasureMotorError(CPlatformXY &PlatformXY,X_OR_Y xy,double Start,double End,vector<TypePosError> &ErrorTable)
{
ErrorTable.clear();
Dbxy CurPt = PlatformXY.GetCoord();//<2F><>ǰƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><><D3A6><EFBFBD><EFBFBD>0,0
Dbxy OriginPt;//ԭ<><D4AD>
double CurPos = Start;
while(CurPos <= End)
{
Dbxy MovePt;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if(xy == _X)
{
MovePt.x = CurPos;
MovePt.y = CurPt.y;
}
else
{
MovePt.x = CurPt.x;
MovePt.y = CurPos;
}
PlatformXY.Move(false,MovePt,OriginPt);//<2F>ƶ<EFBFBD>
//<2F><>ȡ<EFBFBD><C8A1>դ<EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
Dbxy RulerCoord;//<2F><>դ<EFBFBD><D5A4>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(GetCurCoord(RulerCoord)==false)
{
return false;
}
//<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><><CAB5><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBCB4>)
double Error;
if(xy == _X)
{
Error = RulerCoord.x - CurPos;
}
else
{
Error = RulerCoord.y - CurPos;
}
TypePosError PosError;
PosError.first = CurPos;
PosError.second = Error;
ErrorTable.push_back(PosError);
}
return true;
}
#endif