CBondMatrix.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #pragma once
  2. #include "CManageDB.h"
  3. #include <map>
  4. #include <mutex>
  5. #ifdef BOND_MATRIX_EXPORTS
  6. #define BOND_CMATRIX_DLL_API __declspec(dllexport)
  7. #else
  8. #define BOND_CMATRIX_DLL_API //__declspec(dllimport)
  9. #endif
  10. using namespace ns_db;
  11. namespace ns_mat
  12. {
  13. typedef struct
  14. {
  15. PICKBOND_PARAM_STRUCT stWaferParam; //晶片台\华夫盒取晶参数
  16. PICKBOND_PARAM_STRUCT stCalibBondParam; //校准台放晶参数
  17. UINT nTemplate_Pick; //取晶模板号
  18. UINT nPickHeadIdByTable; //取晶吸嘴在吸嘴架上的Id号
  19. UINT nMatrixId; //使用的晶片台\华夫盒号(矩阵号)
  20. }PICK_PARAM;
  21. struct BOND_PARAM
  22. {
  23. //固晶过程中用到得数据,且由用户设置,需保存到数据库的参数
  24. PICKBOND_PARAM_STRUCT stCalibPickParam; //校准台取晶参数
  25. PICKBOND_PARAM_STRUCT stBondParam; //固晶台固晶参数
  26. UINT nTemplate_BondFront = 0; //固前检测模板ID号 0为不检测
  27. UINT nTemplate_BondBack = 0; //固后检测模板ID号 0为不检测
  28. //UINT nTemplate_SearchModel; //到模板位置后是否拍照 0为不拍照
  29. UINT nTemplate_Bond = 0; //固晶点对点模板ID号
  30. UINT nTemplate_Calib = 0; //中转台校准模板号 0为不拍照
  31. UINT nTemplate_LookUp = 0; //上视对点模板号 0为不拍照
  32. UINT nBondHeadIdByTable = 0; //固晶吸嘴在吸嘴架上的Id号
  33. X_Y_ANGLE_STRUCT stOffset; //固晶点补偿(从编程的固晶点位置偏移)
  34. };
  35. //固晶参数,由用于设置得到
  36. typedef struct
  37. {
  38. //全局把握的参数
  39. UINT iPcbMatId; //对应的pcb号
  40. CALIB_DIE_TYPE nCalibType; //校准方式 0:不校准 1:下视校准 2:校准台校准
  41. DIE_SOURCE nWaffleOrWaffer; //0:华夫盒,1:晶圆台
  42. PICK_PARAM nPickParam;
  43. BOND_PARAM nBondParam;
  44. }PROCESS_INFO_STRUCT;
  45. //固晶顺序
  46. enum BOND_DIR {
  47. NO_SET = 0,
  48. //order顺序,按照遍历大矩阵第一格所有小矩阵再遍历第二格
  49. //Alternate顺序,按照遍历完相同的小矩阵再遍历第二种小矩阵
  50. OrderAndS = 1,/*弓字型*/
  51. AlternateAndZ = 2,
  52. OrderAndZ = 3,/*之字型*/
  53. AlternateAndS = 4,
  54. };
  55. typedef struct _BOND_INDEX_STRUCT
  56. {
  57. int iInfoId = 1;
  58. //UINT iProductId = 1; //固晶点所在产品Id
  59. UINT iPcbMatId = 1; //固晶点所在PCB Id
  60. UINT iPcbRow = 1; //固晶点在PCB中所在行
  61. UINT iPcbCol = 1; //固晶点在PCB中所在列
  62. UINT iPtMatId = 1; //固晶点所在Pt矩阵Id
  63. UINT iPtRow = 1; //固晶点在矩阵中所在行
  64. UINT iPtCol = 1; //固晶点在矩阵中所在列
  65. UINT iIndex = 1; //当前Point在整个Bond矩阵中的序号
  66. } BOND_MATRIX_POINT_INFO_STRUCT; //固晶点
  67. enum DIE_STATUS {
  68. //NO_PICK = 0, /*未取晶*/
  69. //WAF_PICK_DONE, /*已从晶片台取晶*/
  70. //TRANSFER_BOND_DONE, /*已将晶片放到中转台*/
  71. NO_BOND, //未进入固晶状态
  72. TRANSFER_PICK_DONE, /*已从中转台取晶*/
  73. LOOKUP_CALIB_DONE, /*已上视校准*/
  74. BOND_DONE, /*已固晶*/
  75. BOND_DEL /*不固晶点*/
  76. };
  77. enum PICK_STATUS
  78. {
  79. NO_PICK = 0, /*未取晶*/
  80. WAF_PICK_DONE, /*已从晶片台取晶*/
  81. TRANSFER_BOND_DONE, /*已将晶片放到中转台*/
  82. };
  83. //过程产生的关联数据
  84. typedef struct _BONDED_STATUS_STRUCT
  85. {
  86. //流程过程中的状态数据,不保存到数据库中
  87. DIE_STATUS bDieStatus; //固晶状态
  88. PICK_STATUS bPickStatus; //取晶状态
  89. bool bAlnStatus; //对点状态,是否已对点
  90. bool bIsCheck; //是否固后检测完成
  91. X_Y_ANGLE_STRUCT stLookUpOffset; //上视拍照偏差结果
  92. XY_DOUBLE_STRUCT stSetBondPosition; //程序设置的固晶位置
  93. XY_DOUBLE_STRUCT stAlnBondPosition; //对点后的固晶位置
  94. XY_DOUBLE_STRUCT stAlnOffset; //固晶点对点偏移
  95. double dAlnAngle; //对点角度
  96. XY_DOUBLE_STRUCT stCheckOffset; //固后检测结果
  97. double dCheckAngle; //固后检测角度
  98. _BONDED_STATUS_STRUCT()
  99. {
  100. bDieStatus = NO_BOND;
  101. bPickStatus = NO_PICK;
  102. bAlnStatus = false;
  103. bIsCheck = false;
  104. stSetBondPosition = 0;
  105. stAlnBondPosition = 0;
  106. dAlnAngle = 0;
  107. dCheckAngle = 0;
  108. stCheckOffset = 0.0;
  109. }
  110. } BOND_STATUS_STRUCT;
  111. typedef struct _POINT_INFO_STRUCT
  112. {
  113. BOND_MATRIX_POINT_INFO_STRUCT stIndex;
  114. BOND_STATUS_STRUCT stBondStatus;
  115. PROCESS_INFO_STRUCT stBondInfo;
  116. } POINT_INFO_STRUCT;
  117. /// <summary>
  118. /// 固晶、取晶编程位置信息
  119. /// </summary>
  120. class BOND_CMATRIX_DLL_API CBondMatrix
  121. {
  122. //enum type { pick, bond };
  123. private:
  124. static std::mutex m_MatrixMutex;
  125. bool bIsInitSuccess = false;
  126. //当前点
  127. //UINT m_iCurrentBondIndex = 0;
  128. //矩阵总数
  129. UINT m_iBondAmount = 0;
  130. int m_iWaferDieNum = 0;
  131. int m_iWaffleDieNum = 0;
  132. BOND_DIR m_eBondDir = BOND_DIR::NO_SET;
  133. CProduct* m_pCProduct = nullptr;
  134. //缓存数据结构建议修改
  135. vector<PROGRAM_BOND_MATRIX_STRUCT> m_vetBondMatrix; //Pcb矩阵,从数据库读出来未经处理的数据
  136. std::vector<BOND_INFO_STRUCT> m_vetBondInfo;
  137. map<int, POINT_INFO_STRUCT> m_mapBondMatrixInfo;
  138. private:
  139. void Sort_OrderAndZ();
  140. void Sort_AlternateAndZ();
  141. void Sort_OrderAndS();
  142. void Sort_AlternateAndS();
  143. POINT_INFO_STRUCT CalPointInfo(UINT iPtId, PROGRAM_BOND_MATRIX_STRUCT pcbMatrix, PROGRAM_POINT_MATRIX_STRUCT ptMatrix,
  144. int pcbRow, int pcbCol, int pointRow, int pointCol);
  145. LONG BondInfoConvertPorcessInfo(UINT iPcbId, BOND_INFO_STRUCT stBondInfo, PROCESS_INFO_STRUCT& stProcessInfo);
  146. void ProcessPointMatrix(const PROGRAM_BOND_MATRIX_STRUCT& pcbMatrix, const PROGRAM_POINT_MATRIX_STRUCT& pointMatrix, int i, int j);
  147. //void RecvTableChangNoticeFunction(string dbname, string tabname);
  148. void DataChangNotice(string strDbName, string strTableName);
  149. void SetAllData();
  150. void SetDBBondInfo(int ptIndex, POINT_INFO_STRUCT pointIndo);
  151. public:
  152. CBondMatrix();
  153. LONG LoadMatrix(BOND_DIR dir);
  154. public:
  155. //返回0表示没找到
  156. //UINT GetCurrentIndex(); //获取当前固晶点
  157. //LONG SetCurrentIndex(UINT nIndex); //设置当前固晶点
  158. LONG GetAllBondMatrixInfo(std::vector <POINT_INFO_STRUCT>& stPointInfo);
  159. //获取包括当前固晶点开始的下个固晶点
  160. UINT GetNextBondIndex(UINT nIndex); //获取从当前固晶点开始的下个固晶点
  161. UINT GetPrevBondIndex(UINT nIndex);
  162. UINT GetNextPickIndex(UINT nIndex,DIE_SOURCE eSource = DIE_SOURCE::BY_NUL); //获取从当前固晶点开始的下个固晶点
  163. UINT GetPrevPickIndex(UINT nIndex, DIE_SOURCE eSource = DIE_SOURCE::BY_NUL); //获取从当前固晶点开始的上个固晶点
  164. UINT GetAmount(); //获取总数
  165. int GetWaferPickAmount();
  166. int GetWafflePickAmount();
  167. //获取指定晶圆的位置信息
  168. LONG GetPintInfoByIndex(UINT nPtIndex, POINT_INFO_STRUCT& stPointInfo);
  169. LONG SetPintInfoByIndex(UINT nPtIndex, POINT_INFO_STRUCT stPointInfo); //要找到同一矩阵的所有点?
  170. LONG GetAllBondParam(UINT nPtIndex,BOND_PARAM& bondParam);
  171. LONG GetAllPickParam(UINT nPtIndex, PICK_PARAM& pickParam);
  172. LONG SetBondParam(int nPtIndex, BOND_PARAM bondParam); //要找到同一矩阵的所有点?
  173. LONG SetPickParam(int nPtIndex, PICK_PARAM pickParam); //要找到同一矩阵的所有点?
  174. /// <summary>
  175. /// 设置固晶点对点信息,设置时,固晶点编号所应就的PCB一起设置并计算对点的位置
  176. /// </summary>
  177. /// <param name="nPtIndex">固晶点编号</param>
  178. /// <param name="stBasePosn">基准位置</param>
  179. /// <param name="dBaseAngle">基准角度</param>
  180. /// <param name="stAlnPosn">对点位置</param>
  181. /// <param name="dAlnAngle">对点角度</param>
  182. /// <returns></returns>
  183. LONG SetBondAlnInfo(UINT nPtIndex, XY_DOUBLE_STRUCT stBasePosn, DOUBLE dBaseAngle, XY_DOUBLE_STRUCT stAlnPosn, DOUBLE dAlnAngle);
  184. LONG SetBondAlnOffset(int index, X_Y_ANGLE_STRUCT offset); //流程数据
  185. LONG SetLookupOffset(int index, X_Y_ANGLE_STRUCT offset); //流程数据
  186. LONG ResetAlnStatus(UINT nPtIndex); //清除对点状态,固晶点编号所对应的PCB一起清除
  187. LONG SetDieStatus(UINT nPtIndex, DIE_STATUS eStatus); //设置固晶状态
  188. LONG SetPickStatus(UINT nPtIndex, PICK_STATUS eStatus); //设置取晶状态
  189. LONG ClearWaferPickStatus();
  190. LONG ClearWafflePickStatus();
  191. LONG ClearAllBondInfo(); //清除所有固晶点的状态及信息
  192. };
  193. }