CWaferTable.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. X_Y_Z_R_STRUCT SafePosition; //安全位置
  41. X_Y_Z_R_STRUCT DownRingPosition; //上、下晶环位置
  42. XY_DOUBLE_STRUCT stWorkRangeCenter; //晶环中心
  43. DOUBLE dSoftLimitRadius; //3点画圆软限位半径(圆心就是旋转中心)
  44. SOFTLIMITTYPE enSoftLimitType; //是否使用3点画圆的软限位,一般情况下只有使用蓝膜的晶片台使用
  45. } WAFERTABLE_CONFIG_STRUCT; //晶片台参数配置
  46. public:
  47. CWaferTable(MODULE_LIST eModuleType);
  48. ~CWaferTable(){}
  49. void SetCamera(CCameraBase* camera) { m_pCamera = camera; }
  50. virtual LONG AllocateAxis(vector<CAxis*> vecAxis) override;
  51. virtual LONG AllocateIo(vector<CIO*> vecIo) override;
  52. void SetCoord(CCoord* pCrd) { m_pCoord = pCrd; }
  53. CXYCalib* GetWaferXYCalib() { return m_pXYCalib; }
  54. CRCalib* GetWaferRCalib() { return m_pRCalib; }
  55. virtual LONG ToHome() override;
  56. virtual LONG Sync() override;
  57. virtual LONG ToSafePosition() override;
  58. virtual LONG InitResource() override;
  59. //到起始晶片位置
  60. LONG ToFirstDie();
  61. //去到上一颗晶片位置
  62. LONG ToPreDie();
  63. //去到下一颗晶片位置
  64. LONG ToNextDie();
  65. //去到指定序号的晶片位置
  66. LONG ToIndexDie(UINT nIndex);
  67. //移至当前晶片中心
  68. LONG ToDieCenter();
  69. //搜索芯片
  70. LONG SearchDie();
  71. //到上下晶环位置
  72. LONG ToChangeRingPosition();
  73. //更换晶环完成
  74. LONG ChangeRingDone();
  75. //设置3点画圆软限位的半径及圆心(圆心就是旋转中心)
  76. LONG SetSoftLimitRadius(SOFTLIMITTYPE nSoftLimitType, XY_LONG_STRUCT stPosn1, XY_LONG_STRUCT stPosn2, XY_LONG_STRUCT stPosn3);
  77. LONG CreateTemplate(SEARCH_OUT eResultSelect, UINT& iTemplateId);
  78. LONG CreatePrStrategy(vector<UINT> vecTemplateId);
  79. private:
  80. CAxis* m_pXAxis = nullptr;
  81. CAxis* m_pYAxis = nullptr;
  82. CAxis* m_pZAxis = nullptr;
  83. CAxis* m_pRAxis = nullptr;
  84. CIO* m_pRingDone = nullptr;
  85. CCameraBase* m_pCamera = nullptr;
  86. CCoord* m_pCoord = nullptr;
  87. CXYCalib* m_pXYCalib = nullptr;
  88. CRCalib* m_pRCalib = nullptr;
  89. CHorizMeasure* m_pHorizMeasure = nullptr;
  90. CPRStrategy* m_pPR = nullptr;
  91. CProduct* m_pCProduct = nullptr;
  92. CWaferMatrix* m_pWaferMatrix = nullptr;
  93. //晶片台参数
  94. WAFERTABLE_CONFIG_STRUCT m_stConfig;
  95. WAFER_SEARCHDIE m_stSearchDie;
  96. private:
  97. void DataChangNotice(string strDbName, string strTableName);
  98. virtual void SetDataChangFunction() override;
  99. virtual LONG SetParam() override;//保存配置参数
  100. virtual LONG GetParam() override;//加载配置参数
  101. //Z轴上
  102. LONG AxisZ_Up();
  103. //Z轴下
  104. LONG AxisZ_Down();
  105. //Z轴是下在下限位位置。如果不在,需禁止晶片台移动
  106. bool AxisZIsDown();
  107. LONG MoveTo(double x, double y, bool bSync = true);
  108. LONG MoveTo(double dX,double dY,double dR, bool bSync = true);
  109. LONG Move(double dX, double dY, double dR, bool bSync = true);
  110. bool bChangDirMain; //是否更换主搜索方向
  111. //记录已找到晶片的绝对位置
  112. SAVE_FIND_DIE m_SaveDiePosition[SAVE_DIE_POSITION_CONUT];//保存三颗反向方的晶片位置
  113. void ChangeCurrentPickPosition();
  114. void ChangeDirMain(); //修改主搜索方向
  115. //选择下颗晶片位置
  116. FIND_DIE SelectNextDiePos(FIND_OUTPUT_STRUCT arrayDie[]);
  117. void CalcSearchDiePosition(X_Y_R_STRUCT stCurrentPosition, FIND_OUTPUT_STRUCT DiePosition, SAVE_FIND_DIE& OutPosition);
  118. void SaveSearchDiePosition(X_Y_R_STRUCT stCurrentPosition, FIND_OUTPUT_STRUCT ArrayDie[FIND_DIE::MAX]);
  119. //判断目标位置是否在范围内 true:在范围内 false:在范围外
  120. bool CheckPurPosnInRange(XY_DOUBLE_STRUCT stPurPosn);
  121. };