LAPTOP-SNT8I5JK\Boounion
2025-08-15 697fa6b857fe202fe2e5f50d4ecf2c7268e527cc
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -108,6 +108,8 @@
   ASSERT(pParent);
   ASSERT(pVariable);
   ISECS2Item* pItemList;
   SERVO::SVFromat format = pVariable->getFormat();
   switch (format)
   {
@@ -123,6 +125,16 @@
   case SERVO::SVFromat::A20:
   case SERVO::SVFromat::A50:
      pParent->addItem(pVariable->getValue().c_str(), "SV");
      break;
   case SERVO::SVFromat::L:
      pItemList = pParent->addItem();
      {
         auto vars = pVariable->getVarsValue();
         for (auto v : vars) {
            addVariableValueToItem(pItemList, &v);
         }
      }
      break;
   default:
      break;
   }
@@ -313,6 +325,14 @@
   auto v = getVariable(pszName);
   if (v != nullptr) {
      v->setValue(value);
   }
}
void CHsmsPassive::setVariableValue(const char* pszName, std::vector<SERVO::CVariable>& vars)
{
   auto v = getVariable(pszName);
   if (v != nullptr) {
      v->setValue(vars);
   }
}
@@ -611,6 +631,9 @@
      }
      else if (nStream == 10 && pHeader->function == 3) {
         replyTerminalDisplay(pMessage);
      }
      else if (nStream == 16 && pHeader->function == 15) {
         replyPRJobMultiCreate(pMessage);
      }
   };
@@ -930,6 +953,7 @@
   return 0;
}
// S1F3
int CHsmsPassive::replySelectedEquipmentStatusData(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1514,6 +1538,111 @@
   return 0;
}
// S16F15
int CHsmsPassive::replyPRJobMultiCreate(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   ISECS2Item* pBody = pRecv->getBody();
   if (pBody == nullptr || pBody->getType() != SITYPE::L) ER_PARAM_ERROR;
   // 解释数据,得到CProcessJob
   ISECS2Item* pItemPjs, * pItemPj,* pItemCarriers, * pItemCarrier, *pItemSlots, *pItemRecipes;
   unsigned int DATAID;
   const char* pszPrjobid, *pszMF, *pszCarrierId, *pszRecipeName;
   std::string strCarrierId;
   unsigned int len;
   unsigned char slot, PRRECIPEMETHOD;
   std::vector<unsigned char> slots;
   std::vector<SERVO::CProcessJob*> pjs;
   if (!pBody->getSubItemU4(0, DATAID)) return ER_PARAM_ERROR;
   pItemPjs = pBody->getSubItem(1);
   if (pItemPjs == nullptr) return ER_PARAM_ERROR;
   for (int i = 0; i < pItemPjs->getSubItemSize(); i++) {
      pItemPj = pItemPjs->getSubItem(i);
      if (pItemPj == nullptr) continue;
      if (!pItemPj->getSubItemString(0, pszPrjobid)) continue;
      if (!pItemPj->getSubItemBinary(1, pszMF, len)) continue;
      pItemCarriers = pItemPj->getSubItem(2);
      if (pItemCarriers == nullptr) continue;
      pItemRecipes = pItemPj->getSubItem(3);
      if (pItemRecipes == nullptr) continue;
      SERVO::CProcessJob* pj = new SERVO::CProcessJob(pszPrjobid);
      int size = pItemCarriers->getSubItemSize();
      for (int j = 0; j < size; j++) {
         pItemCarrier = pItemCarriers->getSubItem(j);
         strCarrierId.clear();
         if (pItemCarrier->getSubItemString(0, pszCarrierId)) {
            strCarrierId = pszCarrierId;
         }
         slots.clear();
         pItemSlots = pItemCarrier->getSubItem(1);
         if (pItemSlots != nullptr) {
            int size2 = pItemSlots->getSubItemSize();
            for (int k = 0; k < size2; k++) {
               if (pItemSlots->getSubItemU1(k, slot)) {
                  slots.push_back(slot);
               }
            }
         }
         pj->addCarrier(strCarrierId, slots);
      }
      if (pItemRecipes->getSubItemU1(0, PRRECIPEMETHOD)
         && pItemRecipes->getSubItemString(1, pszRecipeName)) {
         pj->setRecipe(SERVO::RecipeMethod(PRRECIPEMETHOD), std::string(pszRecipeName));
      }
      pjs.push_back(pj);
   }
   ASSERT(m_listener.onPRJobMultiCreate != nullptr);
   int nRet = m_listener.onPRJobMultiCreate(this, pjs);
   // 回复报文
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 16, 16, ++m_nSystemByte);
   ASSERT(pMessage);
   ISECS2Item* pItemPrjobIds = pMessage->getBody()->addItem();
   ISECS2Item* pItemErrors = pMessage->getBody()->addItem();
   bool bHasError = false;
   for (auto p : pjs) {
      if (p->issue().empty()) {
         pItemPrjobIds->addItem(p->id().c_str(), "PRJOBID");
      }
      else {
         bHasError = true;
      }
   }
   if (bHasError) {
      pItemErrors->addBoolItem(false, "ACKA");
      ISECS2Item* pItemErrors2 = pItemErrors->addItem();
      for (auto p : pjs) {
         if (!p->issue().empty()) {
            ISECS2Item* pItemErr = pItemErrors2->addItem();
            pItemErr->addU4Item(p->issue()[0].code, "ERRCODE");
            pItemErr->addItem(("<" + p->id() + ">" + p->issue()[0].text).c_str(), "ERRTEXT");
         }
      }
   }
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S16F16 (SysByte=%u)", pMessage->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
   // 释放有问题(未添加到master)的内存
   for (auto p : pjs) {
      if(!p->issue().empty()) delete p;
   }
   pjs.clear();
   return 0;
}
// S5F1
int CHsmsPassive::requestAlarmReport(int ALCD, int ALID, const char* ALTX)
{
@@ -1571,9 +1700,9 @@
   pItemList2->addU4Item(pReport->getReportId(), "RPTID");
   ISECS2Item* pItemList3 = pItemList2->addItem();
   auto values = pReport->getVariables();
   for (auto item : values) {
      pItemList3->addItem(item->getValue().c_str(), "V");
   auto vars = pReport->getVariables();
   for (auto var : vars) {
      addVariableValueToItem(pItemList3, var);
   }
   pAction->setSendMessage(pMessage);
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1608,6 +1737,11 @@
   return requestEventReportSend("CarrierID_Readed");
}
int CHsmsPassive::requestEventReportSend_PJ_Queued()
{
   return requestEventReportSend("PJ_Queued");
}