⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bf_util.c

📁 基于EthernetIP协议的应用程序,可以读取AB公司Controllogix系列Ethernetip协议PLC数据. 此软件代码可用于工业控制.
💻 C
📖 第 1 页 / 共 4 页
字号:

      psMappingEntry->eAppDataAreaId     = psLastEntry->eAppDataAreaId;
      psMappingEntry->iAppDataAreaOffset = psLastEntry->iAppDataAreaOffset;
      psMappingEntry->iMaxMappingSize    = psLastEntry->iMaxMappingSize;

      psMappingEntry->iStatusBit         = psLastEntry->iStatusBit;
      psMappingEntry->iStatusStyle       = psLastEntry->iStatusStyle;

      psMappingEntry->iConfiguredUsers   = psLastEntry->iConfiguredUsers;
      psMappingEntry->iActiveUsers       = psLastEntry->iActiveUsers;

      psMappingEntry->iTransportId       = psLastEntry->iTransportId;
      psMappingEntry->iActiveEntry       = psLastEntry->iActiveEntry;
      psMappingEntry->iActiveSubList     = psLastEntry->iActiveSubList;

      /*
      ** Note the movement of the main list entry in the list indexed
      ** by transport id.
      */

      if( psMappingEntry->iTransportId != 0 )
      {
      bf_s.aiMappingByTransport[ psMappingEntry->iTransportId ] = iMappingEntry;
      }
   }
   GS_ExitCritical();

   /*
   ** Debug aid. Clean out the end entry.
   */

Cleanup:
   psLastEntry = &bf_s.asMappingEntries[ bf_s.iMappingEntries ];
   psLastEntry->iClass             = 0;
   psLastEntry->iInstance          = 0;
   psLastEntry->fCon               = FALSE;
   psLastEntry->eAppDataAreaId     = AD_NO_APP_DATA_AREA;
   psLastEntry->iAppDataAreaOffset = 0;
   psLastEntry->iMaxMappingSize    = 0;
   psLastEntry->iStatusBit         = AB_NO_CONN_STATUS_BIT;
   psLastEntry->iStatusStyle       = 0;
   psLastEntry->iConfiguredUsers   = 0;
   psLastEntry->iActiveUsers       = 0;
   psLastEntry->iTransportId       = 0;
   psLastEntry->iActiveEntry       = BF_NO_MAPPING;
   psLastEntry->iActiveSubList     = 0;

} /* end of bf_DeleteMapping() */



/*---------------------------------------------------------------------------
** bf_FindMapping()
**---------------------------------------------------------------------------
*/

UINT16 bf_FindMapping( UINT16 iClass, UINT16 iInstance, BOOL fCon )
{
   UINT16                         iMappingEntry;
   volatile bf_MappingEntryType  *psMappingEntry;

   /*
   ** If the class # is 0, don't even bother looking.
   */

   if( iClass == 0 )
   {
      return( BF_NO_MAPPING );
   }

   /*
   ** Scan the unordered mapping entry array for a match on
   ** class, instance & direction.
   */

   psMappingEntry = &bf_s.asMappingEntries[ 0 ];
   iMappingEntry = 0;

   while( iMappingEntry < bf_s.iMappingEntries )
   {
      if( ( psMappingEntry->iClass    == iClass ) &&
          ( psMappingEntry->iInstance == iInstance ) &&
          ( psMappingEntry->fCon      == fCon ) )
      {
         return( iMappingEntry );
      }

      ++psMappingEntry;
      ++iMappingEntry;
   }

   return( BF_NO_MAPPING );

} /* end of bf_FindMapping() */



/*---------------------------------------------------------------------------
** bf_InquireMappings()
**---------------------------------------------------------------------------
*/

void bf_InquireMappings( BF_InquireTrrblType *psTrrbl )
{
   UINT16                         iEntry;
   volatile bf_MappingEntryType  *psEntry;


   /*
   ** Fill in enough to say there are no mappings in case we don't find one.
   */

   psTrrbl->sPro.eAppDataAreaId = AD_NO_APP_DATA_AREA;
   psTrrbl->sCon.eAppDataAreaId = AD_NO_APP_DATA_AREA;

   /*
   ** Find the producer mapping entry if it exists.
   */

   iEntry = bf_FindMapping( psTrrbl->sPro.iClass, psTrrbl->sPro.iInstance, FALSE );

   if( iEntry != BF_NO_MAPPING )
   {
      /*
      ** Pull out the details.
      */
      psEntry = &bf_s.asMappingEntries[ iEntry ];

      if( psEntry->iActiveEntry != BF_NO_MAPPING )
      {
         psTrrbl->sPro.iResyncSize = bf_s.asActiveEntries[ psEntry->iActiveEntry ].iResyncSize;
         psTrrbl->sPro.iResyncRate = 1;
      }
      else
      {
         psTrrbl->sPro.iResyncSize = 0;
         psTrrbl->sPro.iResyncRate = 0;
      }

      psTrrbl->sPro.iStatusBit         = psEntry->iStatusBit;
      psTrrbl->sPro.iStatusStyle       = psEntry->iStatusStyle;
      psTrrbl->sPro.eAppDataAreaId     = psEntry->eAppDataAreaId;
      psTrrbl->sPro.iAppDataAreaOffset = psEntry->iAppDataAreaOffset;
      psTrrbl->sPro.iMaxMappingSize    = psEntry->iMaxMappingSize;
      psTrrbl->sPro.iTransportId       = psEntry->iTransportId;

      /*
      ** Reserve or unreserve a copy if this is a reservation request.
      */

      if( psTrrbl->eRequest == TREQ_RESERVE_MAPPINGS )
      {
         psEntry->iActiveUsers++;
      }
   }

   /*
   ** Find the consumer mapping entry if it exists.
   */

   iEntry = bf_FindMapping( psTrrbl->sCon.iClass, psTrrbl->sCon.iInstance, TRUE );

   if( iEntry != BF_NO_MAPPING )
   {
      /*
      ** Pull out the details.
      */
      psEntry = &bf_s.asMappingEntries[ iEntry ];

      if( psEntry->iActiveEntry != BF_NO_MAPPING )
      {
         psTrrbl->sCon.iResyncSize = bf_s.asActiveEntries[ psEntry->iActiveEntry ].iResyncSize;
         psTrrbl->sCon.iResyncRate = 1;
      }
      else
      {
         psTrrbl->sCon.iResyncSize = 0;
         psTrrbl->sCon.iResyncRate = 0;
      }

      psTrrbl->sCon.iStatusBit         = psEntry->iStatusBit;
      psTrrbl->sCon.iStatusStyle       = psEntry->iStatusStyle;
      psTrrbl->sCon.eAppDataAreaId     = psEntry->eAppDataAreaId;
      psTrrbl->sCon.iAppDataAreaOffset = psEntry->iAppDataAreaOffset;
      psTrrbl->sCon.iMaxMappingSize    = psEntry->iMaxMappingSize;
      psTrrbl->sCon.iTransportId       = psEntry->iTransportId;

      /*
      ** Reserve a copy if this is a reservation request.
      */

      if( psTrrbl->eRequest == TREQ_RESERVE_MAPPINGS )
      {
         psEntry->iActiveUsers++;
      }
   }

} /* end of bf_InquireMappings() */



/*---------------------------------------------------------------------------
** bf_MoveActiveEntry()
**---------------------------------------------------------------------------
*/

void bf_MoveActiveEntry( UINT16 iDest, UINT16 iSrc )
{
   volatile BF_ActiveEntryType *psDest;
   volatile BF_ActiveEntryType *psSrc;


   /*
   ** Copy the data.
   */

   psSrc  = &bf_s.asActiveEntries[ iSrc ];
   psDest = &bf_s.asActiveEntries[ iDest ];

   psDest->pSource        = psSrc->pSource;
   psDest->pDestination   = psSrc->pDestination;
   psDest->iResyncSize    = psSrc->iResyncSize;
   psDest->iTranBufOffset = psSrc->iTranBufOffset;
   psDest->pAddStatus     = psSrc->pAddStatus;
   psDest->iTransportId   = psSrc->iTransportId;
   psDest->iPort          = psSrc->iPort;

   /*
   ** Make the pointer in the main entry point to the new active list entry.
   */

   bf_s.asMappingEntries[ bf_s.aiMappingByTransport[ psSrc->iTransportId ] ].iActiveEntry = iDest;

   /*
   ** Mark the original as dead. (For debug use only.)
   */

   psSrc->iTransportId = 0;

} /* end of bf_MoveActiveEntry() */



/*---------------------------------------------------------------------------
** bf_RegisterAppDataArea()
**---------------------------------------------------------------------------
*/
void bf_RegisterAppDataArea( BF_RegisterTrrblType *pTrrbl )
{
   UINT16                         i;
   volatile bf_AppDataAreaType    *psAppDataArea;
   volatile bf_ActiveSubListType *psActiveSubList;


   /*
   ** Initialize the app mem area entry.
   */

   psAppDataArea = &bf_s.asAppDataAreas[ pTrrbl->eAppDataAreaId ];

   psAppDataArea->pBaseAddress          = pTrrbl->pBaseAddress;
   psAppDataArea->iSize                 = pTrrbl->iSize;
   psAppDataArea->xMNotifyQueue         = pTrrbl->xMNotifyQueue;
   psAppDataArea->iMNotifyBitMsg        = pTrrbl->iMNotifyBitMsg;
   psAppDataArea->xMNotifySemaphore     = pTrrbl->xMNotifySemaphore;
   psAppDataArea->xSNotifyQueue         = pTrrbl->xSNotifyQueue;
   psAppDataArea->iSNotifyBitMsg        = pTrrbl->iSNotifyBitMsg;
   psAppDataArea->xSNotifySemaphore     = pTrrbl->xSNotifySemaphore;
   psAppDataArea->lCpuTimePerMessage    = pTrrbl->lCpuTimePerMessage;
   psAppDataArea->lCpuTimePerEntry      = pTrrbl->lCpuTimePerEntry;
   psAppDataArea->lCpuTimePerByte       = pTrrbl->lCpuTimePerByte;
   psAppDataArea->lCpuTimeMaxPerSecArea = pTrrbl->lCpuTimeMaxPerSecArea;
   bf_s.lCpuTimeMaxPerSecSystem         = pTrrbl->lCpuTimeMaxPerSecSystem;

   /*
   ** Initialize the active entry sub-lists.
   */

   psAppDataArea->iNextSubList = 0;
   psActiveSubList = &psAppDataArea->asActiveSubList[ 0 ];

   for( i = 0; i < BF_NUM_SUB_LISTS; i++ )
   {
      psActiveSubList->lCpuTimeAreaSubList = 0;
      psActiveSubList->iActiveEntry1   = 0;
      psActiveSubList->iActiveEntries  = 0;

      ++psActiveSubList;
   }

} /* end of bf_RegisterAppDataArea() */



/*---------------------------------------------------------------------------
** bf_Task()
**---------------------------------------------------------------------------
*/

TASKRETURN bf_Task( TASKPARAM )
{
   bf_upsTrrblType  upsTrrbl;


   /*
   ** Process buffer fragment manager tribbles for eternity...
   ** Note that cases that end in "break" get their tribbles returned,
   ** while cases that end in "continue" do not.
   */

   while( 1 )
   {
      upsTrrbl.Generic = GS_TakeTrrbl( BF_xQid );

      switch( upsTrrbl.Generic->eRequest )
      {
      case TREQ_ADD_MAPPING:

         bf_AddMapping( upsTrrbl.Add );
         break;


      case TREQ_DELETE_MAPPING:

         bf_DeleteMapping( upsTrrbl.Delete );
         break;


      case TREQ_INQUIRE_MAPPINGS:
      case TREQ_RESERVE_MAPPINGS:

         bf_InquireMappings( upsTrrbl.Inquire );
         break;


      case TREQ_ACTIVATE_MAPPING:

         bf_ActivateMapping( upsTrrbl.Activate );
         break;


      case TREQ_DEACTIVATE_MAPPING:

         bf_DeactivateMapping( upsTrrbl.Deactivate );
         break;


      case TREQ_ACCESS_MAPPED_DATA:

         bf_AccessMapping( upsTrrbl.Access );
         continue;


      case TREQ_REGISTER:

         bf_RegisterAppDataArea( upsTrrbl.Register );
         break;


      default:

         GS_LogEvent( GS_UNSUPPORTED_TRIBBLE_REQUEST, upsTrrbl.Generic->eRequest, NULL, FATAL );
         break;
      }

      /*
      ** Return the request tribble back to the sender.
      */

      GS_ReturnTrrbl( upsTrrbl.Generic );

   } /* end of while( 1 ) */

} /* end of bf_Task() */



#endif /* #ifdef BUFFER_FRAGMENT_MAPPER */

/****************************************************************************
*****************************************************************************
**
** End of BF_UTIL.C
**
*****************************************************************************
****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -