CWaferTable.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #pragma once
  2. #include "CModule.h"
  3. #include "CCameraBase.h"
  4. #include "CRCalib.h"
  5. #include "CXYCalib.h"
  6. #include "HorizMeasure.h"
  7. enum SOFTLIMITTYPE { SL_NONE = 0, SL_CIRCLE, SL_RECT }; //SL_NONE: 不使用, SL_CIRCLE: 圆形范围限位, SL_RECT: 矩形范围限位
  8. enum SEARCH_DIRECTION { WAF_LEFT = 0, WAF_DOWN, WAF_RIGHT, WAF_UP, WAF_MAX };
  9. enum FIND_DIE { U_L = 0, U_C, U_R, C_L, C_C, C_R, D_L, D_C, D_R, MAX };
  10. typedef struct
  11. {
  12. X_Y_R_STRUCT stCurPickPosn; //晶片台当前取晶位置
  13. DOUBLE dDistanceX; //晶片台上晶片间距X
  14. DOUBLE dDistanceY; //晶片台上晶片间距Y
  15. SEARCH_DIRECTION enDirMain; //首选搜索方向
  16. SEARCH_DIRECTION enDirMinor; //次选搜索方向
  17. }WAFER_SEARCHDIE;
  18. typedef struct _SAVE_FIND_DIE
  19. {
  20. bool bUse;
  21. X_Y_R_STRUCT stPosition;
  22. _SAVE_FIND_DIE()
  23. {
  24. bUse = false;
  25. stPosition = { 0.0,0.0,0.0 };
  26. }
  27. }SAVE_FIND_DIE;
  28. class __declspec(dllexport) CWaferTable : public CModule
  29. {
  30. #define SAVE_DIE_POSITION_CONUT 3
  31. typedef struct
  32. {
  33. bool UseMatrix; //采用设置矩阵的取晶方式
  34. MATRIX_SEARCH_DIR SearchMatrixDir; //搜矩阵顺序
  35. UINT TemplateId; //搜晶拍照模板
  36. UINT DelayTakePicture; //拍图延时
  37. UINT LoseDieCount; //晶片台失晶数量,找寻下一颗晶片时,连续找不到LoseDieCount颗晶片则换行或报警
  38. UINT PickDieAgainNum; //重复取晶次数
  39. UINT ForecastCount; //提前告警数量
  40. UINT DieLong; //晶片长 um
  41. UINT DieWide; //晶片宽 um
  42. X_Y_Z_R_STRUCT SafePosition; //安全位置
  43. X_Y_Z_R_STRUCT DownRingPosition; //上、下晶环位置
  44. XY_DOUBLE_STRUCT stWorkRangeCenter; //晶环中心
  45. DOUBLE dSoftLimitRadius; //3点画圆软限位半径(圆心就是旋转中心)
  46. SOFTLIMITTYPE enSoftLimitType; //是否使用3点画圆的软限位,一般情况下只有使用蓝膜的晶片台使用
  47. } WAFERTABLE_CONFIG_STRUCT; //晶片台参数配置
  48. public:
  49. CWaferTable(MODULE_LIST eModuleType);
  50. ~CWaferTable(){}
  51. void SetCamera(CCameraBase* camera) { m_pCamera = camera; }
  52. virtual LONG AllocateAxis(vector<CAxis*> vecAxis) override;
  53. virtual LONG AllocateIo(vector<CIO*> vecIo) override;
  54. void SetCoord(CCoord* pCrd) { m_pCoord = pCrd; }
  55. CXYCalib* GetWaferXYCalib() { return m_pXYCalib; }
  56. CRCalib* GetWaferRCalib() { return m_pRCalib; }
  57. virtual LONG ToHome() override;
  58. virtual LONG Sync() override;
  59. virtual LONG ToSafePosition() override;
  60. virtual LONG InitResource() override;
  61. //到起始晶片位置
  62. LONG ToFirstDie();
  63. //去到上一颗晶片位置
  64. LONG ToPreDie();
  65. //去到下一颗晶片位置
  66. LONG ToNextDie();
  67. //去到指定序号的晶片位置
  68. LONG ToIndexDie(UINT nIndex);
  69. //移至当前晶片中心
  70. LONG ToDieCenter();
  71. //搜索芯片
  72. LONG SearchDie();
  73. //到上下晶环位置
  74. LONG ToChangeRingPosition();
  75. //更换晶环完成
  76. LONG ChangeRingDone();
  77. //设置3点画圆软限位的半径及圆心(圆心就是旋转中心)
  78. LONG SetSoftLimitRadius(SOFTLIMITTYPE nSoftLimitType, XY_LONG_STRUCT stPosn1, XY_LONG_STRUCT stPosn2, XY_LONG_STRUCT stPosn3);
  79. LONG GetSoftLimitRadius(double& dCenterX, double& dCenterY, double& iRadius);
  80. LONG GetDieSize(int& iLong, int& iWide);
  81. LONG CreateCameraCalibTemplate();
  82. LONG CreateRCalibTemplate();
  83. LONG CameraCalib();
  84. LONG CreateDieTemplate();//创建搜索晶片模板
  85. LONG CreateTemplate(SEARCH_OUT eResultSelect, UINT& iTemplateId);
  86. LONG CreatePrStrategy(vector<UINT> vecTemplateId);
  87. private:
  88. CAxis* m_pXAxis = nullptr;
  89. CAxis* m_pYAxis = nullptr;
  90. CAxis* m_pZAxis = nullptr;
  91. CAxis* m_pRAxis = nullptr;
  92. CIO* m_pRingDone = nullptr;
  93. CCameraBase* m_pCamera = nullptr;
  94. CCoord* m_pCoord = nullptr;
  95. CXYCalib* m_pXYCalib = nullptr;
  96. CRCalib* m_pRCalib = nullptr;
  97. CHorizMeasure* m_pHorizMeasure = nullptr;
  98. CPRStrategy* m_pPR = nullptr;
  99. CProduct* m_pCProduct = nullptr;
  100. CWaferMatrix* m_pWaferMatrix = nullptr;
  101. //晶片台参数
  102. WAFERTABLE_CONFIG_STRUCT m_stConfig;
  103. WAFER_SEARCHDIE m_stSearchDie;
  104. private:
  105. void DataChangNotice(string strDbName, string strTableName);
  106. virtual void SetDataChangFunction() override;
  107. virtual LONG SetParam() override;//保存配置参数
  108. virtual LONG GetParam() override;//加载配置参数
  109. //Z轴上
  110. LONG AxisZ_Up();
  111. //Z轴下
  112. LONG AxisZ_Down();
  113. //Z轴是下在下限位位置。如果不在,需禁止晶片台移动
  114. bool AxisZIsDown();
  115. LONG MoveTo(double x, double y, bool bSync = true);
  116. LONG MoveTo(double dX,double dY,double dR, bool bSync = true);
  117. LONG Move(double dX, double dY, double dR, bool bSync = true);
  118. bool bChangDirMain; //是否更换主搜索方向
  119. //记录已找到晶片的绝对位置
  120. SAVE_FIND_DIE m_SaveDiePosition[SAVE_DIE_POSITION_CONUT];//保存三颗反向方的晶片位置
  121. void ChangeCurrentPickPosition();
  122. void ChangeDirMain(); //修改主搜索方向
  123. //选择下颗晶片位置
  124. FIND_DIE SelectNextDiePos(FIND_OUTPUT_STRUCT arrayDie[]);
  125. void CalcSearchDiePosition(X_Y_R_STRUCT stCurrentPosition, FIND_OUTPUT_STRUCT DiePosition, SAVE_FIND_DIE& OutPosition);
  126. void SaveSearchDiePosition(X_Y_R_STRUCT stCurrentPosition, FIND_OUTPUT_STRUCT ArrayDie[FIND_DIE::MAX]);
  127. //判断目标位置是否在范围内 true:在范围内 false:在范围外
  128. bool CheckPurPosnInRange(XY_DOUBLE_STRUCT stPurPosn);
  129. };