#pragma once #include "module.h" #include "WorkTime.h" //功率点检的参数 class CEnergyDensityPar { public: CEnergyDensityPar(void) { m_LaserDeviceType = 0; m_LaserFre = 1000;//点检时的频率Hz m_EdiK = 0;//功率密度的斜率 m_EdiPo = 0;//功率密度的截距 }; public: int m_LaserDeviceType;//激光的类型 double m_LaserFre;//点检时的频率Hz double m_EdiK;//功率密度的斜率 double m_EdiPo;//功率密度的截距 }; class CWorkCmdContainer; //激光 class CLaser :public CModule { public: CLaser(void); ~CLaser(void); virtual MODULE GetModuleType(){return _LASER_PROP;}; virtual CMFCPropertyGridProperty *CreatGridProperty(); virtual void OnAppInitialize(); virtual void WriteWorkFileExt(vector &LabVec); virtual void ReadWorkFile(CLabVecRang &LabVecRang); virtual void Draw(CDC* pDC); virtual void OnExitApp(); double GetBaseThickness(){return m_BaseThickness;}; void SetBaseThickness(double n){m_BaseThickness = n;}; void SetWorkThickness(double n){m_WorkThickness = n;}; double GetWorkThickness(){return m_WorkThickness;}; bool IsLaserSwitch(){return m_LaserSwitch;}; int GetLaserType(){return m_LaserType;}; int GetOpenLaserDelay(); double GetScanIntervals(double ScanOverlapRatio,bool bhorizontal); double GetScanOverlapRatio(){return m_ScanOverlapRatio;}; void SetScanOverlapRatio(double val){m_ScanOverlapRatio = val;}; void SetGateFre(); int GetGateOpDelay(){return m_GateOpDelay;}; void SetbLaserGateOpen(bool b){m_bLaserGateOpen = b;}; bool IsbLaserGateOpen(){return m_bLaserGateOpen;}; void SetbRedLaserGateOpen(bool b){m_bRedLaserGateOpen = b;}; bool IsbRedLaserGateOpen(){return m_bRedLaserGateOpen;}; void SetbMachineGateOpen(bool b){m_bMachineGateOpen = b;}; bool IsMachineGateOpen(){return m_bMachineGateOpen;}; int GetShortOpenLaserDelay(); bool IsbCloseAppCloseLaser(){return m_bCloseAppCloseLaser;}; void SetFocusZMoveUpVal(double ZFocus){m_FocusZMoveUpVal = ZFocus;}; double GetFocusZMoveUpVal(); bool IsbAutoCalScanSpeed(){return m_bAutoCalSpeedX;}; bool IsbAutoCalCurr(){return m_bAutoCalCurr;}; double GetLaserFocusDis(); void IOSwitchLaserDimmer(bool bOpen); void IOSwitchLaserDimmerByTargetCoord(Dbxy TargetCoord); void StartLaserSleepTime(); void StopLaserSleepTime(); void LaserSleepTimeExt(); CString GetCurSleepLeftTimes(); void CalEnergyDensity(eLaserDeviceType LaserDeviceType,double F,double I,double &Edi); void CalCurrByEdi(eLaserDeviceType LaserDeviceType,double F,double &I,double Edi); void LaserSleepImmediately(); double GetCurWorkFoucsZcoord(){return m_CurWorkFoucsZcoord;}; void SetCurWorkFoucsZcoord(double Coord); void ResetCurWorkFoucsZcoord(); bool IsbInited(){return m_bInited;}; void SetEnergyDensityPar(eLaserDeviceType LaserDeviceType,double Fre,double K,double Po); bool GetEnergyDensityPar(eLaserDeviceType LaserDeviceType,double Fre,double &K,double &Po); bool CheckEnergyDensityPar(eLaserDeviceType LaserDeviceType,double Fre,double K,double Po); int GetRedLaserDelayAdjust(){return m_RedLaserDelayAdjust;}; int GetRedLaserPowCheckPluseW(){return m_RedLaserPowCheckPluseW;}; DbSize GetSpotSize(eLaserDeviceType LaserDeviceType); bool IsbScanByDirX(){return m_bScanByDirX;}; CString GetLaserDeviceName(eLaserDeviceType LaserDeviceType); void IniEdiParList(CListCtrl &list); void UpdateEdiParList(CListCtrl &list); bool IsLaserSleepTimeRun(){return !m_bStopLaserSleepTime;};//休眠计时是否正在运行 double CalPowerByRecipePar(eLaserDeviceType LaserDeviceType,double Fre,double I); double CalPowerByDensityPar(double Po,double K,double I); bool IsbPowRecordWriteCalPow(){return m_bPowRecordWriteCalPow;}; double CalEnergyDensityByPow(eLaserDeviceType LaserDeviceType,double F,double P); int GetLaserCurrDigitsCnt(){return (m_LaserCurrDigitsCnt==1)?1:2;}; void UpdateLaserProp(); void GetLaserFixedCurrentPow(eLaserDeviceType LaserDeviceType,double Fre,double FixCurr,double &FixPow); private: double CalEnergyDensityExt(eLaserDeviceType LaserDeviceType,double F,double I,double K,double Po); double CalCurrByEdiExt(eLaserDeviceType LaserDeviceType,double F,double Edi,double K,double Po); void ReadEnergyDensityParFile(); void WriteEnergyDensityParFile(); double ReadCurSetLddCurrent(eLaserDeviceType LaserDeviceType); private: bool m_bInited;//是否初始化成功 DbSize m_SpotSize;//激光光斑的尺寸w表示X方向,h表示Y方向(保存值) double m_ScanOverlapRatio;//扫描重叠率,用来计算扫描间隔(0~100%) bool m_bAutoCalSpeedX;//根据重叠率自动计算扫描速度(保存值) bool m_bAutoCalCurr;//根据功率密度自动计算电流(保存值) bool m_LaserSwitch;//激光是否反向(保存值) bool m_bScanByDirX;//X方向扫描 int m_LaserType;//激光器类型(保存值) int m_OpenLaserDelay;//开激光后延时ms (长延时) (保存值) int m_OpenLaserDelayShort;//开激光后延时ms (短延时) (保存值) bool m_bLaserGateOpen;//激光gate 是否为打开状态 bool m_bRedLaserGateOpen;//激光2 gate 是否为打开状态(辅助激光) bool m_bSetGateFre;//是否设置了关闸的频率 bool m_bMachineGateOpen;//光闸是否打开 int m_GateOpDelay;//操作光闸后的延时ms(因为关闸偏转需要时间)(保存值) int m_GateFre;//关闸的频率(保存值) //激光焦距管理,Z 轴有电机的情况使用 bool m_bAdaptThickness;//是否适应产品的厚度 double m_BaseThickness;//用来调试焦距的基准产品厚度mm double m_WorkThickness;//当前加工的产品厚度mm double m_MaxThickness;//最大产品厚度mm double m_MinThickness;//最小产品厚度mm double m_FocusZMoveUpVal;//电机Z 的激光焦距位置(测距仪基准向上移动的值) bool m_bCloseAppCloseLaser;//是否在关闭软件时关闭激光(保存值) bool m_bCtrLaserDimmerByMotionIO;//控制激光衰减器(true 运动控制卡的IO )(false PLC控制) bool m_bCtrLaserDimmerRev;//光闸控制反向 CWorkTime m_LaserSleepTime;//用来控制激光器休眠的时间对象 bool m_bStopLaserSleepTime;//停止休眠计时 double m_EnergyParChangeScal;//用于判断点检后功率密度参数变化的范围比例(保存值) int m_RedLaserPowCheckPluseW;//红光点检时使用的脉宽us DbSize m_RedSpotSize;//红光激光光斑的尺寸w表示X方向,h表示Y方向(保存值) int m_RedLaserDelayAdjust;//红光延时补偿值(用于调整脉冲发生器的相位) bool m_bPowRecordWriteCalPow;//导出功率点检记录时输出计算功率P = Po+K*I; int m_LaserCurrDigitsCnt;//激光电流小数点的位数 vector m_EnergyDensityParVec;//当前点检过的功率密度参数 double m_CurWorkFoucsZcoord;//当前加工晶圆Z 轴坐标(绝对坐标) }; extern CLaser *gLaser;