mrDarker
2025-06-26 da96e6da0b677c6a4e96308aaecd3d619a8e4db2
SourceCode/Bond/Servo/CEquipment.cpp
@@ -35,7 +35,8 @@
      m_bLocalAlarm = FALSE;
      m_bAutoRecipeChange = FALSE;
      m_bVCREnable[0] = FALSE;
      memset(m_bLinkSignal, 0, sizeof(m_bLinkSignal));
      memset(m_bLinkSignalToUpstream, 0, sizeof(m_bLinkSignalToUpstream));
      memset(m_bLinkSignalToDownstream, 0, sizeof(m_bLinkSignalToDownstream));
      m_pCclink = nullptr;
      m_nBaseAlarmId = 0;
      m_pArm = nullptr;
@@ -399,14 +400,26 @@
      BOOL bFlag;
      int index = 0;
      for (int i = 0; i < 8; i++) {
         m_bLinkSignal[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0);
         m_bLinkSignal[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1);
         m_bLinkSignal[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2);
         m_bLinkSignal[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3);
         m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0);
         m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1);
         m_bLinkSignalToUpstream[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2);
         m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3);
         index += 0x40;
      }       
      if(m_bLinkSignal[0][SIGNAL_SEND_ABLE]) {
      if(m_bLinkSignalToUpstream[0][SIGNAL_SEND_ABLE]) {
         onSendAble();
      }
      index += 0x40 * 2;
      for (int i = 0; i < 8; i++) {
         m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0);
         m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1);
         m_bLinkSignalToDownstream[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2);
         m_bLinkSignalToDownstream[i][SIGNAL_RECEIVE_ABLE] = isBitOn(pszData, size, index + 3);
         index += 0x40;
      }
      if (m_bLinkSignalToDownstream[0][SIGNAL_RECEIVE_ABLE]) {
         onReceiveAble();
      }
      // 其它信号及响应
@@ -642,25 +655,47 @@
      return m_bVCREnable[index];
   }
   BOOL CEquipment::isLinkSignalOn(unsigned int path, unsigned int signal)
   BOOL CEquipment::isLinkSignalUpstreamOn(unsigned int path, unsigned int signal)
   {
      if (path >= PATH_MAX) return FALSE;
      if (signal >= SIGNAL_MAX) return FALSE;
      return m_bLinkSignal[path][signal];
      return m_bLinkSignalToUpstream[path][signal];
   }
   void CEquipment::setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn)
   BOOL CEquipment::isLinkSignalDownstreamOn(unsigned int path, unsigned int signal)
   {
      if (path >= PATH_MAX) return FALSE;
      if (signal >= SIGNAL_MAX) return FALSE;
      return m_bLinkSignalToDownstream[path][signal];
   }
   void CEquipment::setLinkSignalUpstream(unsigned int path, unsigned int signal, BOOL bOn)
   {
      if (path >= PATH_MAX) return;
      if (signal >= SIGNAL_MAX) return;
      m_bLinkSignal[path][signal] = bOn;
      m_bLinkSignalToUpstream[path][signal] = bOn;
   }
   void CEquipment::setLinkSignalBlock(unsigned int path, BOOL* pSignal)
   void CEquipment::setLinkSignalUpstreamBlock(unsigned int path, BOOL* pSignal)
   {
      if (path >= PATH_MAX) return;
      for (int i = 0; i < SIGNAL_MAX; i++) {
         m_bLinkSignal[path][i] = pSignal[i];
         m_bLinkSignalToUpstream[path][i] = pSignal[i];
      }
   }
   void CEquipment::setLinkSignalDownstream(unsigned int path, unsigned int signal, BOOL bOn)
   {
      if (path >= PATH_MAX) return;
      if (signal >= SIGNAL_MAX) return;
      m_bLinkSignalToDownstream[path][signal] = bOn;
   }
   void CEquipment::setLinkSignalDownstreamBlock(unsigned int path, BOOL* pSignal)
   {
      if (path >= PATH_MAX) return;
      for (int i = 0; i < SIGNAL_MAX; i++) {
         m_bLinkSignalToDownstream[path][i] = pSignal[i];
      }
   }
@@ -757,6 +792,11 @@
   std::vector<CPin*>& CEquipment::getOutputPins()
   {
      return m_outputPins;
   }
   CRecipeList* CEquipment::getRecipeList(int unitNo)
   {
      return m_recipesManager.getRecipeList(unitNo);
   }
   int CEquipment::recvIntent(CPin* pPin, CIntent* pIntent)
@@ -1111,7 +1151,7 @@
      return 0;
   }
   int CEquipment::masterRecipeListRequest(short unitNo)
   int CEquipment::masterRecipeListRequest(short unitNo, ONSYNCINGSTATECHANGED block)
   {
      SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
      if (pStep == nullptr) {
@@ -1119,6 +1159,7 @@
      }
      LOGI("<CEquipment-%s>正在请求单元<%d>主配方列表", m_strName.c_str(), unitNo);
      m_recipesManager.setOnSyncingStateChanged(block);
      if (m_recipesManager.syncing() != 0) {
         return -2;
      }
@@ -1175,6 +1216,28 @@
   }
   CSlot* CEquipment::getAvailableSlotForGlass(MaterialsType type)
   {
      for (int i = 0; i < SLOT_MAX; i++) {
         if (!m_slot[i].isEnable()) continue;
         if (m_slot[i].isLock()) continue;
         if (!m_slot[i].isEmpty()) continue;
         int lsPath = m_slot[i].getLinkSignalPath();
         if (!m_bLinkSignalToDownstream[lsPath][SIGNAL_UPSTREAM_INLINE]
            || m_bLinkSignalToDownstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
            || !m_bLinkSignalToDownstream[lsPath][SIGNAL_INTERLOCK]
            || !m_bLinkSignalToDownstream[lsPath][SIGNAL_RECEIVE_ABLE]) continue;
         MaterialsType slotType = m_slot[i].getType();
         if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
         if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
         return &m_slot[i];
      }
      return nullptr;
   }
   CSlot* CEquipment::getAvailableSlotForGlassExcludeSignal(MaterialsType type)
   {
      for (int i = 0; i < SLOT_MAX; i++) {
         if (!m_slot[i].isEnable()) continue;
@@ -1238,10 +1301,10 @@
         CGlass* pGlass = (CGlass*)m_slot[i].getContext();
         if (pGlass == nullptr) continue;
         int lsPath = m_slot[i].getLinkSignalPath();
         if(!m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_INLINE]
            || m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_TROUBLE]
            || !m_bLinkSignal[lsPath][SIGNAL_INTERLOCK]
            || !m_bLinkSignal[lsPath][SIGNAL_SEND_ABLE] ) continue;
         if(!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE]
            || m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
            || !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK]
            || !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE] ) continue;
         MaterialsType glassType = pGlass->getType();
         if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
@@ -1263,10 +1326,10 @@
               CGlass* pGlass = (CGlass*)m_slot[i].getContext();
               if (pGlass == nullptr) continue;
               int lsPath = m_slot[i].getLinkSignalPath();
               if (!m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_INLINE]
                  || m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_TROUBLE]
                  || !m_bLinkSignal[lsPath][SIGNAL_INTERLOCK]
                  || !m_bLinkSignal[lsPath][SIGNAL_SEND_ABLE]) continue;
               if (!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE]
                  || m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
                  || !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK]
                  || !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE]) continue;
               MaterialsType glassType = pGlass->getType();
               if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
@@ -1634,7 +1697,7 @@
      CJobDataS* pJobDataS = pGlass->getJobDataS();
      ASSERT(pJobDataS);
      if (!compareJobData(pJobDataB, pJobDataS)) {
         LOGE("<CFliper-%s>onPreFetchedOutJob,JobData数据不匹配(JobDataB(%d, %d),JobDataS(%d, %d)), 注意排查风险!", m_strName.c_str(),
         LOGE("<CEquipemnt-%s>onPreFetchedOutJob,JobData数据不匹配(JobDataB(%d, %d),JobDataS(%d, %d)), 注意排查风险!", m_strName.c_str(),
            pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo(),
            pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
         return FALSE;
@@ -1642,10 +1705,10 @@
      // 如果没有可用位置,报错
      Lock();
      CSlot* pSlot = getAvailableSlotForGlass((MaterialsType)pJobDataS->getMaterialsType());
      CSlot* pSlot = getAvailableSlotForGlassExcludeSignal((MaterialsType)pJobDataS->getMaterialsType());
      if (pSlot == nullptr) {
         Unlock();
         LOGE("<CFliper-%s>onPreFetchedOutJob,找不到匹配的Slot,不能进料,请注意风险!", m_strName.c_str());
         LOGE("<CEquipemnt-%s>onPreFetchedOutJob,找不到匹配的Slot,不能进料,请注意风险!", m_strName.c_str());
         return FALSE;
      }
      Unlock();
@@ -1703,6 +1766,13 @@
      return 0;
   }
   int CEquipment::onReceiveAble()
   {
      LOGI("<CEquipment-%s>onReceiveAble.", m_strName.c_str());
      return 0;
   }
   int CEquipment::onProcessStateChanged(PROCESS_STATE state)
   {
      return 0;
@@ -1725,4 +1795,26 @@
      return TRUE;
   }
   void CEquipment::printDebugString001()
   {
      for (int i = 0; i < 8; i++) {
         LOGI("<CEquipment-%s>Link Signal to UP stream Path#%d, Signal:%s, %s, %s, %s",
            m_strName.c_str(), i,
            m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF",
            m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF",
            m_bLinkSignalToUpstream[i][SIGNAL_INTERLOCK] ? "ON" : "OFF",
            m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF"
         );
      }
      for (int i = 0; i < 8; i++) {
         LOGI("<CEquipment-%s>Link Signal to Down stream Path#%d, Signal:%s, %s, %s, %s",
            m_strName.c_str(), i,
            m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF",
            m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF",
            m_bLinkSignalToDownstream[i][SIGNAL_INTERLOCK] ? "ON" : "OFF",
            m_bLinkSignalToDownstream[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF"
         );
      }
   }
}