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();
@@ -626,6 +631,40 @@
            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信息
@@ -658,11 +697,43 @@
   {
      __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)