#include "StdAfx.h" #include "LaserPowCheckMgr.h" #include "LogMgr.h" #include "FileMgr.h" #include "WorkTime.h" #include "CStringFuc.h" #include "MsgBox.h" #include "ExceptionMsg.h" #include "MsgBox.h" #include "WorkCmdInvoker.h" #include "Propertie.h" #include "PropertieMgr.h" #include "AuthorityMgr.h" #include "CommonFlowMgr.h" #include "GlobalFunction.h" #include "RecipeMgr.h" #include "Laser.h" #define POW_CHECK_FILE_PATH _T("\\LaserPowerCheckData\\") #define POW_CHECK_PAR_FILE _T("\\Parameter\\LaserMeasureData\\LaserPowCheckPar.par") #define FIX_POW_PARA_FILE _T("\\CommPar\\LaserFixCurrentPower.bin") #define TAB_STR " " #define SPECIAL_CHAR '#' void CPowCheckPar::Serialize( CArchive& ar) { if(ar.IsStoring()) { ar<>m_PulseFre;//激光脉冲频率Hz ar>>m_StartCurr;//开始电流值A ar>>m_EndCurr;//结束电流值A ar>>m_GapCurr;//间隔电流值A ar>>m_CheckDelay;//每个电流值测量的延时ms ar>>m_FirstCheckDelay;//第一个电流值测量的延时ms } } CLaserPowCheckMgr *gLaserPowCheckMgr = new CLaserPowCheckMgr; CLaserPowCheckMgr::CLaserPowCheckMgr(void) { m_CurPowCheckType = _LaserDeviceType_MainLaser1;//当前功率点检的类型 m_ParList = NULL; m_CurSelCheckRecordIdx = -1; m_CurExtLaserType = 0; } CLaserPowCheckMgr::~CLaserPowCheckMgr(void) { } void CLaserPowCheckMgr::OnAppInitialize() { //创建功率点检数据目录 CString DirPath = GetPowCheckFilePath(); CFileMgr FileMgr; if(!FileMgr.IsDirectoryExists(DirPath)) FileMgr.CreatDir(DirPath); } //获取功率点检的文件路径 CString CLaserPowCheckMgr::GetPowCheckFilePath() { CString DirPath = gProgramLaserTuiHuo->GetLaipuLaserDataDir(POW_CHECK_FILE_PATH); return DirPath; } #if 1 void CLaserPowCheckMgr::InitSelYearComb(CComboBox &ComboBox) { CString FilePath = GetPowCheckFilePath(); InitYearComb(FilePath,ComboBox); } void CLaserPowCheckMgr::InitSelMonthComb(CComboBox &ComboBox) { InitMonthComb(ComboBox); } void CLaserPowCheckMgr::InitSelLaserComb(CComboBox &ComboBox) { int idx = 0; ComboBox.InsertString(idx++,"绿光1"); ComboBox.InsertString(idx++,"绿光2"); ComboBox.InsertString(idx++,"红光"); //设置默认选择项 ComboBox.SetCurSel(0); } void CLaserPowCheckMgr::IniParList(CListCtrl &list,int AddW) { //设置风格 list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置列 int idx = 0; list.InsertColumn(idx,"Idx",LVCFMT_LEFT,35,-1); idx++; list.InsertColumn(idx,"Current(A)",LVCFMT_LEFT,70+AddW,-1); idx++; list.InsertColumn(idx,"Laser Po(W)",LVCFMT_LEFT,90+AddW,-1); idx++; list.InsertColumn(idx,"Valid Po(W)",LVCFMT_LEFT,90+AddW,-1); idx++; } void CLaserPowCheckMgr::IniRecordList(CListCtrl &list) { //设置风格 list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置列 int idx = 0; list.InsertColumn(idx,"Idx",LVCFMT_LEFT,35,-1); idx++; list.InsertColumn(idx,"Time",LVCFMT_LEFT,120,-1); idx++; list.InsertColumn(idx,"Fre",LVCFMT_LEFT,70,-1); idx++; list.InsertColumn(idx,"K ",LVCFMT_LEFT,100,-1); idx++; list.InsertColumn(idx,"Po ",LVCFMT_LEFT,100,-1); idx++; } #endif #if 1//点检参数相关 //设置当前功率点检的类型 void CLaserPowCheckMgr::SetCurPowCheckType(int idx) { eLaserDeviceType Type = (eLaserDeviceType)idx; m_CurPowCheckType = Type; } //设置当前点检的频率(CreatCurPowCheckData之前使用) void CLaserPowCheckMgr::SetCurPowCheckFre(double Fre) { CPowCheckPar &CurPowCheckPar = (*GetCurPowCheckPar()); if(Fre>0)//使用指定的激光频率 { CurPowCheckPar.m_PulseFre = Fre; } } //获取当前的检测结果 CPowCheckPar *CLaserPowCheckMgr::GetCurPowCheckPar() { CPowCheckPar *p; p = &m_MainPowCheckPar; return p; } void CLaserPowCheckMgr::SetPowCheckPar(CPowCheckPar CheckPar) { CPowCheckPar &CurPowCheckPar = (*GetCurPowCheckPar()); CurPowCheckPar = CheckPar; } #endif #if 1 //获取当前的功率密度参数(显示用) void CLaserPowCheckMgr::GetEnergyDensityPar(double &K,double &Po) { K = m_CurPowCheckData.m_EnergyDensityK; Po = m_CurPowCheckData.m_EnergyDensityPo; } //计算功率密度参数(K和Po)(不满足会产生报警信息) bool CLaserPowCheckMgr::CalEnergyDensityPar() { gLogMgr->WriteDebugLog("Func---->CalEnergyDensityPar"); vector&PowCheckPtVec = m_CurPowCheckData.m_PowCheckPtVec; int size = PowCheckPtVec.size(); if(size<2) return false; double SumK = 0; double SumP = 0;//功率和 double SumI = 0;//电流和 bool bSaveToPar = true;//是否保存到参数 for(int k=0;kWriteDebugLog(LogStr); //将功率点检计算的功率密度参数值设置为保存值 bool Ret = false; if(bSaveToPar) { //获取绿光/红光的点检参数 CPowCheckPar &CheckPar = (*GetCurPowCheckPar()); //检查点检结果是否满足设定条件 //Ret = gLaser->CheckEnergyDensityPar(m_CurPowCheckType,CheckPar.m_PulseFre,m_CurPowCheckData.m_EnergyDensityK,m_CurPowCheckData.m_EnergyDensityPo); } return Ret; } //计算两个点的功率密度斜率 double CLaserPowCheckMgr::CalTwoPtK(CPowCheckPt CheckPt1,CPowCheckPt CheckPt2) { double K = (CheckPt2.m_SurfacePow - CheckPt1.m_SurfacePow)/(CheckPt2.m_SetCurr - CheckPt1.m_SetCurr); return K; } //恢复最近一次的点检数据 void CLaserPowCheckMgr::RecoverLastPowCheckData(eLaserDeviceType LaserDeviceType) { if(LaserDeviceType==_LaserDeviceType_MainLaser1) m_CurPowCheckData = m_LastPow1CheckData; if(LaserDeviceType==_LaserDeviceType_MainLaser2) m_CurPowCheckData = m_LastPow2CheckData; if(LaserDeviceType==_LaserDeviceType_RedLaser) m_CurPowCheckData = m_LastRedPowCheckData; } void CLaserPowCheckMgr::GetLastPowCheckPar(eLaserDeviceType LaserDeviceType,double &K,double &Po) { if(LaserDeviceType==_LaserDeviceType_MainLaser1) { K = m_LastPow1CheckData.m_EnergyDensityK; Po = m_LastPow1CheckData.m_EnergyDensityPo; } if(LaserDeviceType==_LaserDeviceType_MainLaser2) { K = m_LastPow2CheckData.m_EnergyDensityK; Po = m_LastPow2CheckData.m_EnergyDensityPo; } if(LaserDeviceType==_LaserDeviceType_RedLaser) { K = m_LastRedPowCheckData.m_EnergyDensityK; Po = m_LastRedPowCheckData.m_EnergyDensityPo; } } //创建当前的点检数据 void CLaserPowCheckMgr::CreatCurPowCheckData() { vector&PowCheckPtVec = m_CurPowCheckData.m_PowCheckPtVec; m_CurPowCheckData.m_CheckType = m_CurPowCheckType; m_CurPowCheckData.m_EnergyDensityK = 0; m_CurPowCheckData.m_EnergyDensityPo = 0; PowCheckPtVec.clear(); //获取绿光/红光的点检参数 CPowCheckPar &CheckPar = (*GetCurPowCheckPar()); //生成相同电流的检测点 if(CheckPar.m_StartCurr == CheckPar.m_EndCurr) { int Cnt = CheckPar.m_GapCurr;//间隔就是点的个数 for(int k=0;k=0 && SelIdx&PowCheckPtVec = PowCheckData.m_PowCheckPtVec; int size = PowCheckPtVec.size(); for(int i=0;i PowCheckPtPowCheckPVec; ReadLaserFixedCurrentPowFile(PowCheckPtPowCheckPVec); vector &PowCheckPtVec = m_CurPowCheckData.m_PowCheckPtVec; int PtCnt = PowCheckPtVec.size(); for(int k=0;k &PowCheckPtPowCheckPVec) { CFileMgr FileMgr; CString FilePath; FileMgr.GetFullFilePath(FilePath,FIX_POW_PARA_FILE); vector> StrVec; FileMgr.ReadFileToStrVec(FilePath,StrVec); int size = StrVec.size(); for(int k=0;k DataFilePathVec; CFileMgr FileMgr; FileMgr.GetChildFileOrDirName(false,FilePath,DataFilePathVec,".pow"); m_CurPowCheckRecordVec.clear(); int size = DataFilePathVec.size(); for(int k=0;k=size) { return; } CPowCheckData &PowCheckData = m_CurPowCheckRecordVec[m_CurSelCheckRecordIdx]; double Po = PowCheckData.m_EnergyDensityPo; double K = PowCheckData.m_EnergyDensityK; TCHAR szFilters[]=("TXT 文件(*.txt)|*.txt"); CString FileName; FileName = PowCheckData.m_DateTime; CString s; s.Format("Laser%ld_",m_CurExtLaserType); FileName = s+ FileName; CFileDialog dlg(FALSE,("txt"),FileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilters); if(dlg.DoModal()==IDOK) { ofstream ar(dlg.GetPathName()); ar<<"斜率K : "<IsbPowRecordWriteCalPow()) { ar<&PowCheckPtVec = PowCheckData.m_PowCheckPtVec; int size = PowCheckPtVec.size(); for(int i=0;iCalPowerByDensityPar(Po,K,CheckPt.m_SetCurr); ar<IsbPowRecordWriteCalPow()) { ar<