#pragma once #include "CModule.h" #include "CCameraBase.h" #include "CRCalib.h" #include "CXYCalib.h" #include "HorizMeasure.h" enum SOFTLIMITTYPE { SL_NONE = 0, SL_CIRCLE, SL_RECT }; //SL_NONE: 不使用, SL_CIRCLE: 圆形范围限位, SL_RECT: 矩形范围限位 enum SEARCH_DIRECTION { WAF_LEFT = 0, WAF_DOWN, WAF_RIGHT, WAF_UP, WAF_MAX }; enum FIND_DIE { U_L = 0, U_C, U_R, C_L, C_C, C_R, D_L, D_C, D_R, MAX }; typedef struct { X_Y_R_STRUCT stCurPickPosn; //晶片台当前取晶位置 DOUBLE dDistanceX; //晶片台上晶片间距X DOUBLE dDistanceY; //晶片台上晶片间距Y SEARCH_DIRECTION enDirMain; //首选搜索方向 SEARCH_DIRECTION enDirMinor; //次选搜索方向 }WAFER_SEARCHDIE; typedef struct _SAVE_FIND_DIE { bool bUse; X_Y_R_STRUCT stPosition; _SAVE_FIND_DIE() { bUse = false; stPosition = { 0.0,0.0,0.0 }; } }SAVE_FIND_DIE; class __declspec(dllexport) CWaferTable : public CModule { #define SAVE_DIE_POSITION_CONUT 3 typedef struct { bool UseMatrix; //采用设置矩阵的取晶方式 MATRIX_SEARCH_DIR SearchMatrixDir; //搜矩阵顺序 UINT TemplateId; //搜晶拍照模板 UINT DelayTakePicture; //拍图延时 UINT LoseDieCount; //晶片台失晶数量,找寻下一颗晶片时,连续找不到LoseDieCount颗晶片则换行或报警 UINT PickDieAgainNum; //重复取晶次数 UINT ForecastCount; //提前告警数量 X_Y_Z_R_STRUCT SafePosition; //安全位置 X_Y_Z_R_STRUCT DownRingPosition; //上、下晶环位置 XY_DOUBLE_STRUCT stWorkRangeCenter; //晶环中心 DOUBLE dSoftLimitRadius; //3点画圆软限位半径(圆心就是旋转中心) SOFTLIMITTYPE enSoftLimitType; //是否使用3点画圆的软限位,一般情况下只有使用蓝膜的晶片台使用 } WAFERTABLE_CONFIG_STRUCT; //晶片台参数配置 public: CWaferTable(MODULE_LIST eModuleType); ~CWaferTable(){} void SetCamera(CCameraBase* camera) { m_pCamera = camera; } virtual LONG AllocateAxis(vector vecAxis) override; virtual LONG AllocateIo(vector vecIo) override; void SetCoord(CCoord* pCrd) { m_pCoord = pCrd; } CXYCalib* GetWaferXYCalib() { return m_pXYCalib; } CRCalib* GetWaferRCalib() { return m_pRCalib; } virtual LONG ToHome() override; virtual LONG Sync() override; virtual LONG ToSafePosition() override; virtual LONG InitResource() override; //到起始晶片位置 LONG ToFirstDie(); //去到上一颗晶片位置 LONG ToPreDie(); //去到下一颗晶片位置 LONG ToNextDie(); //去到指定序号的晶片位置 LONG ToIndexDie(UINT nIndex); //移至当前晶片中心 LONG ToDieCenter(); //搜索芯片 LONG SearchDie(); //到上下晶环位置 LONG ToChangeRingPosition(); //更换晶环完成 LONG ChangeRingDone(); //设置3点画圆软限位的半径及圆心(圆心就是旋转中心) LONG SetSoftLimitRadius(SOFTLIMITTYPE nSoftLimitType, XY_LONG_STRUCT stPosn1, XY_LONG_STRUCT stPosn2, XY_LONG_STRUCT stPosn3); LONG CreateTemplate(SEARCH_OUT eResultSelect, UINT& iTemplateId); LONG CreatePrStrategy(vector vecTemplateId); private: CAxis* m_pXAxis = nullptr; CAxis* m_pYAxis = nullptr; CAxis* m_pZAxis = nullptr; CAxis* m_pRAxis = nullptr; CIO* m_pRingDone = nullptr; CCameraBase* m_pCamera = nullptr; CCoord* m_pCoord = nullptr; CXYCalib* m_pXYCalib = nullptr; CRCalib* m_pRCalib = nullptr; CHorizMeasure* m_pHorizMeasure = nullptr; CPRStrategy* m_pPR = nullptr; CProduct* m_pCProduct = nullptr; CWaferMatrix* m_pWaferMatrix = nullptr; //晶片台参数 WAFERTABLE_CONFIG_STRUCT m_stConfig; WAFER_SEARCHDIE m_stSearchDie; private: void DataChangNotice(string strDbName, string strTableName); virtual void SetDataChangFunction() override; virtual LONG SetParam() override;//保存配置参数 virtual LONG GetParam() override;//加载配置参数 //Z轴上 LONG AxisZ_Up(); //Z轴下 LONG AxisZ_Down(); //Z轴是下在下限位位置。如果不在,需禁止晶片台移动 bool AxisZIsDown(); LONG MoveTo(double x, double y, bool bSync = true); LONG MoveTo(double dX,double dY,double dR, bool bSync = true); LONG Move(double dX, double dY, double dR, bool bSync = true); bool bChangDirMain; //是否更换主搜索方向 //记录已找到晶片的绝对位置 SAVE_FIND_DIE m_SaveDiePosition[SAVE_DIE_POSITION_CONUT];//保存三颗反向方的晶片位置 void ChangeCurrentPickPosition(); void ChangeDirMain(); //修改主搜索方向 //选择下颗晶片位置 FIND_DIE SelectNextDiePos(FIND_OUTPUT_STRUCT arrayDie[]); void CalcSearchDiePosition(X_Y_R_STRUCT stCurrentPosition, FIND_OUTPUT_STRUCT DiePosition, SAVE_FIND_DIE& OutPosition); void SaveSearchDiePosition(X_Y_R_STRUCT stCurrentPosition, FIND_OUTPUT_STRUCT ArrayDie[FIND_DIE::MAX]); //判断目标位置是否在范围内 true:在范围内 false:在范围外 bool CheckPurPosnInRange(XY_DOUBLE_STRUCT stPurPosn); };