CBondMatrix.h 8.9 KB

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