123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #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<CAxis*> vecAxis) override;
- virtual LONG AllocateIo(vector<CIO*> 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<UINT> 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);
- };
|