LAPTOP-SNT8I5JK\Boounion
2025-06-16 fd1333fbf52e00ff8f0b0d51ec0d707a66cc9141
SourceCode/Bond/Servo/CEFEM.cpp
@@ -331,6 +331,11 @@
      return robotCmds(cmds, 2, onWritedBlock);
   }
   RMDATA& CEFEM::getRobotMonitoringData()
   {
      return m_robotData;
   }
   void CEFEM::init()
   {
      CEquipment::init();
@@ -409,7 +414,7 @@
         // eq cim mode change
         CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
         pStep->setName(STEP_CIM_MODE_CHANGE);
         pStep->setWriteSignalDev(0x70);
         pStep->setWriteSignalDev(0x60);
         pStep->setCimModeDev(0x15);
         if (addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
            delete pStep;
@@ -420,7 +425,7 @@
         // eq cim message
         CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
         pStep->setName(STEP_CIM_MESSAGE_CMD);
         pStep->setWriteSignalDev(0x71);
         pStep->setWriteSignalDev(0x61);
         pStep->setCimMessageDev(0x0);
         if (addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
            delete pStep;
@@ -432,7 +437,7 @@
         // CIM Message Confirm
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5f80);
         pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
         pStep->setWriteSignalDev(0x59);
         pStep->setWriteSignalDev(0x49);
         if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
            delete pStep;
         }
@@ -460,7 +465,7 @@
         // eq cim message clear
         CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
         pStep->setName(STEP_CIM_MESSAGE_CLEAR);
         pStep->setWriteSignalDev(0x72);
         pStep->setWriteSignalDev(0x62);
         pStep->setClearCimMessageDev(0x13);
         if (addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
            delete pStep;
@@ -471,7 +476,7 @@
         // datetime set cmd
         CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
         pStep->setName(STEP_DATETIME_SET_CMD);
         pStep->setWriteSignalDev(0x73);
         pStep->setWriteSignalDev(0x63);
         pStep->setDateTimeDev(0x16);
         if (addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
            delete pStep;
@@ -482,7 +487,7 @@
         // vcr enable
         CEqVCREnableStep* pStep = new CEqVCREnableStep();
         pStep->setName(STEP_EQ_VCR_ENABLE);
         pStep->setWriteSignalDev(0x74);
         pStep->setWriteSignalDev(0x64);
         pStep->setEqVCRModeDev(0x1F);
         if (addStep(STEP_ID_VCR_ENABLE_CMD_REPLY, pStep) != 0) {
            delete pStep;
@@ -493,7 +498,7 @@
         // eq mode change
         CEqModeChangeStep* pStep = new CEqModeChangeStep();
         pStep->setName(STEP_EQ_MODE_CHANGE);
         pStep->setWriteSignalDev(0x75);
         pStep->setWriteSignalDev(0x65);
         pStep->setEqModeDev(0x1E);
         if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
            delete pStep;
@@ -626,6 +631,46 @@
            delete pStep;
         }
      }
      {
         // Panel Data Report
         CEqReadStep* pStep = new CEqReadStep(0x617f, 386 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               if (code == ROK && pszData != nullptr && size > 0) {
                  decodePanelDataReport((CStep*)pFrom, pszData, size);
               }
               return -1;
            });
         pStep->setName(STEP_EQ_PANEL_DATA_REPORT);
         pStep->setProp("Port", (void*)1);
         pStep->setWriteSignalDev(0x15e);
         if (addStep(STEP_ID_PANEL_DATA_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // FAC Data Report
         CEqReadStep* pStep = new CEqReadStep(0x6301, 108 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               if (code == ROK && pszData != nullptr && size > 0) {
                  decodePanelDataReport((CStep*)pFrom, pszData, size);
               }
               return -1;
            });
         pStep->setName(STEP_EQ_FAC_DATA_REPORT);
         pStep->setProp("Port", (void*)1);
         pStep->setWriteSignalDev(0x04d);
         if (addStep(STEP_ID_FAC_DATA_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
   }
   // 必须要实现的虚函数,在此初始化Slot信息
   void CEFEM::initSlots()
   {
   }
   void CEFEM::onTimer(UINT nTimerid)
@@ -648,25 +693,47 @@
      return __super::recvIntent(pPin, pIntent);
   }
   BOOL CEFEM::glassWillArrive(CGlass* pGlass)
   {
      BOOL bRet = __super::glassWillArrive(pGlass);
      if (!bRet) {
         return FALSE;
      }
      return m_glassList.empty();
   }
   void CEFEM::onReceiveLBData(const char* pszData, size_t size)
   {
      __super::onReceiveLBData(pszData, size);
      // 解释得到Robot状态
      // 地址从(0x3500 - 0x3000)开始
      int index = 0x500;
      for (int i = 0; i < 6; i++) {
         if (isBitOn(pszData, size, index + i)) {
            m_robotData.status = (ROBOT_STATUS)i;
            break;
         }
      }
      index += 8;
      for (int i = 0; i < 11; i++) {
         if (isBitOn(pszData, size, index + i)) {
            m_robotData.position = (ROBOT_POSITION)i;
            break;
         }
      }
      index += 16;
      m_robotData.armState[0] = isBitOn(pszData, size, index);
      m_robotData.armState[1] = isBitOn(pszData, size, index + 1);
      for (unsigned int i = 0; i < 4; i++) {
         if (m_pPort[i] != nullptr) {
            m_pPort[i]->onReceiveLBData(pszData, size);
         }
      }
      // 更新信号到LoadPort, Robot, Aligner, Fliper
      m_pPort[0]->setLinkSignalBlock(0, &m_bLinkSignal[0][0]);
      m_pPort[1]->setLinkSignalBlock(0, &m_bLinkSignal[1][0]);
      m_pPort[2]->setLinkSignalBlock(0, &m_bLinkSignal[2][0]);
      m_pPort[3]->setLinkSignalBlock(0, &m_bLinkSignal[3][0]);
      m_pArmTray[0]->setLinkSignalBlock(0, &m_bLinkSignal[4][0]);
      m_pArmTray[1]->setLinkSignalBlock(0, &m_bLinkSignal[5][0]);
      m_pAligner->setLinkSignalBlock(0, &m_bLinkSignal[6][0]);
      m_pFliper->setLinkSignalBlock(0, &m_bLinkSignal[7][0]);
   }
   int CEFEM::onReceivedJob(int port, CJobDataS* pJobDataS)