#pragma once #include "CManageDB.h" #include #include #ifdef BOND_MATRIX_EXPORTS #define BOND_CMATRIX_DLL_API __declspec(dllexport) #else #define BOND_CMATRIX_DLL_API //__declspec(dllimport) #endif using namespace ns_db; namespace ns_mat { typedef struct { PICKBOND_PARAM_STRUCT stWaferParam; //晶片台\华夫盒取晶参数 PICKBOND_PARAM_STRUCT stCalibBondParam; //校准台放晶参数 UINT nTemplate_Pick; //取晶模板号 UINT nPickHeadIdByTable; //取晶吸嘴在吸嘴架上的Id号 UINT nMatrixId; //使用的晶片台\华夫盒号(矩阵号) }PICK_PARAM; typedef struct { //固晶过程中用到得数据,且由用户设置,需保存到数据库的参数 PICKBOND_PARAM_STRUCT stCalibPickParam; //校准台取晶参数 PICKBOND_PARAM_STRUCT stBondParam; //固晶台固晶参数 UINT nTemplate_BondFront; //固前检测模板ID号 0为不检测 UINT nTemplate_BondBack; //固后检测模板ID号 0为不检测 //UINT nTemplate_SearchModel; //到模板位置后是否拍照 0为不拍照 UINT nTemplate_Bond; //固晶点对点模板ID号 UINT nTemplate_Calib; //中转台校准模板号 0为不拍照 UINT nTemplate_LookUp; //上视对点模板号 0为不拍照 UINT nBondHeadIdByTable; //固晶吸嘴在吸嘴架上的Id号 X_Y_ANGLE_STRUCT stOffset; //固晶点补偿(从编程的固晶点位置偏移) }BOND_PARAM; //固晶参数,由用于设置得到 typedef struct { //全局把握的参数 UINT iPcbMatId; //对应的pcb号 CALIB_DIE_TYPE nCalibType; //校准方式 0:不校准 1:下视校准 2:校准台校准 DIE_SOURCE nWaffleOrWaffer; //0:华夫盒,1:晶圆台 PICK_PARAM nPickParam; BOND_PARAM nBondParam; }PROCESS_INFO_STRUCT; //固晶顺序 enum BOND_DIR { //order顺序,按照遍历大矩阵第一格所有小矩阵再遍历第二格 //Alternate顺序,按照遍历完相同的小矩阵再遍历第二种小矩阵 OrderAndS = 0,/*弓字型*/ AlternateAndZ = 1, OrderAndZ = 2,/*之字型*/ AlternateAndS = 3, }; typedef struct _BOND_INDEX_STRUCT { //UINT iProductId = 1; //固晶点所在产品Id UINT iPcbMatId = 1; //固晶点所在PCB Id UINT iPcbRow = 1; //固晶点在PCB中所在行 UINT iPcbCol = 1; //固晶点在PCB中所在列 UINT iPtMatId = 1; //固晶点所在Pt矩阵Id UINT iPtRow = 1; //固晶点在矩阵中所在行 UINT iPtCol = 1; //固晶点在矩阵中所在列 UINT iIndex = 1; //当前Point在整个Bond矩阵中的序号 } BOND_MATRIX_POINT_INFO_STRUCT; //固晶点 enum DIE_STATUS { //NO_PICK = 0, /*未取晶*/ //WAF_PICK_DONE, /*已从晶片台取晶*/ //TRANSFER_BOND_DONE, /*已将晶片放到中转台*/ NO_BOND, //未进入固晶状态 TRANSFER_PICK_DONE, /*已从中转台取晶*/ LOOKUP_CALIB_DONE, /*已上视校准*/ BOND_DONE, /*已固晶*/ BOND_DEL /*不固晶点*/ }; enum PICK_STATUS { NO_PICK = 0, /*未取晶*/ WAF_PICK_DONE, /*已从晶片台取晶*/ TRANSFER_BOND_DONE, /*已将晶片放到中转台*/ }; //过程产生的关联数据 typedef struct _BONDED_STATUS_STRUCT { //流程过程中的状态数据,不保存到数据库中 DIE_STATUS bDieStatus; //固晶状态 PICK_STATUS bPickStatus; //取晶状态 bool bAlnStatus; //对点状态,是否已对点 bool bIsCheck; //是否固后检测完成 X_Y_ANGLE_STRUCT stLookUpOffset; //上视拍照偏差结果 XY_DOUBLE_STRUCT stSetBondPosition; //程序设置的固晶位置 XY_DOUBLE_STRUCT stAlnBondPosition; //对点后的固晶位置 XY_DOUBLE_STRUCT stAlnOffset; //固晶点对点偏移 double dAlnAngle; //对点角度 XY_DOUBLE_STRUCT stCheckOffset; //固后检测结果 double dCheckAngle; //固后检测角度 _BONDED_STATUS_STRUCT() { bDieStatus = NO_BOND; bPickStatus = NO_PICK; bAlnStatus = false; bIsCheck = false; stSetBondPosition = 0; stAlnBondPosition = 0; dAlnAngle = 0; dCheckAngle = 0; stCheckOffset = 0.0; } } BOND_STATUS_STRUCT; typedef struct _POINT_INFO_STRUCT { BOND_MATRIX_POINT_INFO_STRUCT stIndex; BOND_STATUS_STRUCT stBondStatus; PROCESS_INFO_STRUCT stBondInfo; } POINT_INFO_STRUCT; /// /// 固晶、取晶编程位置信息 /// class BOND_CMATRIX_DLL_API CBondMatrix { //enum type { pick, bond }; private: static std::mutex m_MatrixMutex; bool bIsInitSuccess = false; //当前点 //UINT m_iCurrentBondIndex = 0; //矩阵总数 UINT m_iBondAmount = 0; int m_iWaferDieNum = 0; int m_iWaffleDieNum = 0; BOND_DIR m_eBondDir = BOND_DIR::OrderAndS; CProduct* m_pCProduct = nullptr; vector m_vetBondMatrix; //Pcb矩阵,从数据库读出来未经处理的数据 map m_mapBondMatrixInfo; void Sort_OrderAndZ(); void Sort_AlternateAndZ(); void Sort_OrderAndS(); void Sort_AlternateAndS(); POINT_INFO_STRUCT CalPointInfo(UINT iPtId, PROGRAM_BOND_MATRIX_STRUCT pcbMatrix, PROGRAM_POINT_MATRIX_STRUCT ptMatrix, int pcbRow, int pcbCol, int pointRow, int pointCol); LONG BondInfoConvertPorcessInfo(UINT iPcbId, BOND_INFO_STRUCT stBondInfo, PROCESS_INFO_STRUCT& stProcessInfo); void ProcessPointMatrix(const PROGRAM_BOND_MATRIX_STRUCT& pcbMatrix, const PROGRAM_POINT_MATRIX_STRUCT& pointMatrix, int i, int j); //void RecvTableChangNoticeFunction(string dbname, string tabname); public: CBondMatrix(); LONG LoadMatrix(BOND_DIR dir); public: //返回0表示没找到 //UINT GetCurrentIndex(); //获取当前固晶点 //LONG SetCurrentIndex(UINT nIndex); //设置当前固晶点 //获取包括当前固晶点开始的下个固晶点 UINT GetNextBondIndex(UINT nIndex); //获取从当前固晶点开始的下个固晶点 UINT GetPrevBondIndex(UINT nIndex); UINT GetNextPickIndex(UINT nIndex,DIE_SOURCE eSource = DIE_SOURCE::BY_NUL); //获取从当前固晶点开始的下个固晶点 UINT GetPrevPickIndex(UINT nIndex, DIE_SOURCE eSource = DIE_SOURCE::BY_NUL); //获取从当前固晶点开始的上个固晶点 UINT GetAmount(); //获取总数 int GetWaferPickAmount(); int GetWafflePickAmount(); //获取指定晶圆的位置信息 LONG GetPintInfoByIndex(UINT nPtIndex, POINT_INFO_STRUCT& stPointInfo); LONG SetPintInfoByIndex(UINT nPtIndex, POINT_INFO_STRUCT stPointInfo); LONG GetAllBondParam(UINT nPtIndex,BOND_PARAM& bondParam); LONG GetAllPickParam(UINT nPtIndex, PICK_PARAM& pickParam); LONG SetBondParam(int nPtIndex, BOND_PARAM bondParam); LONG SetPickParam(int nPtIndex, PICK_PARAM pickParam); /// /// 设置固晶点对点信息,设置时,固晶点编号所应就的PCB一起设置并计算对点的位置 /// /// 固晶点编号 /// 基准位置 /// 基准角度 /// 对点位置 /// 对点角度 /// LONG SetBondAlnInfo(UINT nPtIndex, XY_DOUBLE_STRUCT stBasePosn, DOUBLE dBaseAngle, XY_DOUBLE_STRUCT stAlnPosn, DOUBLE dAlnAngle); LONG SetBondAlnOffset(int index, X_Y_ANGLE_STRUCT offset); LONG SetLookupOffset(int index, X_Y_ANGLE_STRUCT offset); LONG ResetAlnStatus(UINT nPtIndex); //清除对点状态,固晶点编号所对应的PCB一起清除 LONG SetDieStatus(UINT nPtIndex, DIE_STATUS eStatus); //设置固晶状态 LONG SetPickStatus(UINT nPtIndex, PICK_STATUS eStatus); //设置取晶状态 LONG ClearWaferPickStatus(); LONG ClearWafflePickStatus(); LONG ClearAllBondInfo(); //清除所有固晶点的状态及信息 }; }