亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? profibus.c

?? profibus-dp主站源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:

//*****************************************************************************
//**  K dosazeni dobreho casovani by tato funkce mela byt vyvolavana s periodou
//**  priblizne rouvnou Tbit. S touto periodou se vola pouze pokud je vystupni
//**  buffer pro vysilani DAT prazdny. 
//**
//**  Vyuziti pro zjistovani time-outu.
//**
//**  Volani zajistuje nizsi vrstva s navaznosti na hardwarove moznosti.
//**
//** ZMENA:
//**  Tato funkce je volana az pote, co jsou odvysilany vsechny casovaci znaky
//**  viz. param "pocet" u funkce "PB_SendNextTimingChars"
//**
//*****************************************************************************

void PB_TimeTick( PTProfibus PB )
{
  __int64 now;  
  int     i;

  if ( PB->TimeOutState == TO_Running )
  {
    now = GetCurrentTicks();

    if ( now < PB->TimeOutTicks )
    {
      // pokud casovac jeste nevyprsel - vysleme dalsi casovaci znaky
      PB_SendNextTimingChars( PB,
                              ( int )
                              ( ( PB->TimeOutTicks - now ) / PB->Tbit ) /
                              11 );
    }
    else
    {
      ////RS_DbgPrint("PB: Time Out !!\n");
      // Time Out !!!
      PB->TimeOutState = TO_Stopped;
      //Message= "TimeOut \'prestrelen\' o "+IntToStr( (now-TimeOutTicks)/Tbit )+" Tbit.";
      
      if ( ! ProfiM_RxFIFOEmpty( PB->DeviceExtension ) )
      {
        //
        // Time-out cekani na prijeti odpovedi na pozadavek je normalne
        // zastaven prijmem prvniho znaku pres funkci PB_RxByte. Pouziva-li
        // vsak UART pri prijmu FIFO pamet dozvime se o prichozim ramci az
        // tehdy je-li prijat cely. Proto jeste pred vygenerovanim time-outu
        // zjistime, zda-li ve FIFO jiz nejsou nejaka data. Jsou-li je 
        // time-out zastaven. Tim ovsem nenastane time-out pokud data ve
        // FIFO netvori odpoved na kterou cekame.
        //
        return;
        //
        // Lepsi by zrejme bylo v tomto miste poslat vsechny zatim prijate
        // znaky z FIFO do PB_RxByte a pak zjistit koreknost zatim prijatych
        // dat.
        //
      }              
      
      switch ( PB->MasterState )
      {
        
        //*************************************************************
        
        case Listen_Token:
          //
          // Na sbernici nebyl zaznamenan zadny provoz -> claim token
          //
          PB_DbgPrintL2( "PB: Zadny provoz na sbernici - prechod do Claim_Token (TS=%d)\n", PB->TS );
          PB_ChangeMasterState( PB, Claim_Token );
          break;
          
        //*************************************************************          

        case Active_Idle:
               
          if ( PB->LastState == Claim_Token )
          {
            //
            // Stanice s nejnizsi adresou nerestartovala vymenu tokenu
            //
            int LAS_PS;            
            int i=0;
            
            while ( i<=PB->HSA && PB->LAS.LAS[i]==LAS_Passive )
            {
              i++;
            }
            
            if (PB->LAS.LAS[i]==LAS_Active)
            {
              DbgPrint("PB: Stanice %d nerestartovala okruh nebo vypadla.", i);
              PB->LAS.LAS[i]=LAS_Passive;
            }
              
            LAS_PS = LAS_PreviousStation( &PB->LAS, PB->TS );
            if (LAS_PS >= PB->TS)
              PB_ChangeMasterState( PB, Use_Token );
            else
            PB_SetTimeOut( PB, Tto, TO_StartNow );  // pro pripad dalsiho vypadku
            
            break;
          }
          
          //
          // Na sbernici nebyl zaznamenan zadny provoz -> claim token
          //                                
          PB_DbgPrintL2( "PB: Na sbernici ustal provoz - prechod do Claim_Token (TS=%d)\n", PB->TS );
          PB_ChangeMasterState( PB, Claim_Token );
          break;                                                     

        //*************************************************************          

        case Await_Data_Resp:
          //
          // Na pozadavek vyslany na sbernici neprisla odpoved
          //    
                                
          if ( PB->RLL_Status == RLL_TestNext )
          {
            //
            // Bezi pozadavek vytvareni Remote Life Listu
            //
            PB_DbgPrintL2( "PB: Stanice %d neodpovida (vytvareni Remote LASu)\n",
                           PB->RLL_Station );
            PB->RLL_LAS[PB->RLL_Station] = STATION_NON_EXISTENT;
            PB->RLL_Station++;
            if ( PB->RLL_Station == PB->TS )
            {
              PB->RLL_LAS[PB->RLL_Station] = PB->StationStatus << 4; PB->RLL_Station++;
            }
            if ( PB->RLL_Station > PB->HSA )
            {
              PB->RLL_Status = RLL_Stopped;
              build_conf( PB->ActualRequest, ok );
              for ( i = 0; i < 127; i++ )
                PB->ActualRequest->user_data_1[i] = PB->RLL_LAS[i];
              PB->ActualRequest->rb2_header.fill_length_1 = 127;
              PB->ActualRequest->application_block.receive_l_sdu.length = 127;
              ResB_Add( &PB->ResB, PB->ActualRequest );
            }
            else
              PB->RLL_Status = RLL_WaitNextCycle;

            PB_ChangeMasterState( PB, Use_Token );
          }
          else
          {
            //
            // Stanice neodpovida na vyslany pozadavek (SRD, SDN, Ident,...)
            //
            PB_DbgPrintL2( "PB: Stanice %d neodpovida na pozadavek!",
                           PB->ActualRequest->application_block.rem_add.station );
            PB->FrameRepeatCounter++;
            if ( PB->FrameRepeatCounter <= PB->retry_ctr )
            {
              //
              // Zkusime pozadavek zopakovat
              //
              PB_ProcessRequest( PB, PB->ActualRequest );
            }
            else
            {
              //
              // Pocet opakovani pozadavku vyprsel. Stanice je v GAPu oznacena za
              // neaktivni a aplikacni vrstve je vracen negativni vysledek.
              //
              PB_DbgPrintL2( "PB: Stanice %d oznacena v GAPu za neaktivni.",
                             PB->ActualRequest->application_block.rem_add.station );
              PB->GAPL.GAPL[PB->ActualRequest->application_block.rem_add.station].StationState = GAP_Unused;
              PB->FrameRepeatCounter = 0;                                       
              build_conf( PB->ActualRequest, na );
              ResB_Add( &PB->ResB, PB->ActualRequest );                                                       
              PB_ChangeMasterState( PB, Use_Token );
            }
          }

          break;

        //*************************************************************          

        case Pass_Token:
          //
          // Stanice neodpovida na FDL Status Request pri vytvareni GAPL po studenem
          // startu logickeho okruhu.
          //
          
          if ( PB->ColdStart )
          {
            /* 
               // Stanice neodpovida na zadost FDL Request
               #ifdef VYPISY
                 Form1->LB->Items->Add(Format("FDL Status Timeout. Station %d marked as Unused.", ARRAYOFCONST(( GAPL->NextToTest() )) ));
                 Form1->OutLB->Items->Add("");
               #endif
               */

            GAPL_Update( &PB->GAPL, GAPL_NextToTest( &PB->GAPL ), GAP_Unused );
            if ( GAPL_NextToTest( &PB->GAPL ) == PB->TS + 1 ||                  // +1, jelikoz NextToTest preskakuje TS
                 ( PB->TS == PB->HSA && GAPL_NextToTest( &PB->GAPL ) == 0 ) )
            {
              // Jsme jedinym masterem na sbernici
              PB->NS = PB->TS;
              GAPL_UpdateNS( &PB->GAPL, PB->NS );
              PB->PS = PB->TS;
              PB->ColdStart = FALSE;
              PB_DbgPrintL2( "PB: Vytvoren GAP list studenym startem a jedeme dal.\n" );
              PB_SendToken( PB, PB->TS, PB->TS );
              PB_ChangeMasterState( PB, Check_Token_Pass );
            }
            else
              PB_SendRequestFDLStatuswithReply( PB,
                                                GAPL_NextToTest( &PB->GAPL ) ); // hledani dalsi stanice

          }
          break;

        //*************************************************************          

        case Await_Status_Resp:
          //
          // Update GAPu - stanice neodpovida na pozadavek FDL Status
          //
                    
          GAPL_Update( &PB->GAPL, GAPL_NextToTest( &PB->GAPL ), GAP_Unused );
          PB_ChangeMasterState( PB, Pass_Token );
          break;

        //*************************************************************          

        case Check_Token_Pass:
          //
          // Stanice, ktere jsme predali Token nejevi zadnou aktivitu.
          // Je oznacena v LASu za neaktivni a zkousime predat Token dalsi
          // stanici v logickem kruhu. Pokud zadna stanice Token neprijme
          // predavame Token sami sobe.
          //
                   
          PB_DbgPrintL2( "PB: NS master s adresou %d neprijal token", PB->NS );
          PB->LAS.LAS[PB->NS] = LAS_Passive;
          PB->NS = LAS_NextStation( &PB->LAS, PB->TS );
          GAPL_UpdateNS( &PB->GAPL, PB->NS );
          PB_DbgPrintL2( "PB:   Nova NS je stanice %d.", PB->NS );          
          if ( PB->NS == PB->TS )
          {
            PB->PS = PB->TS;
            PB_SendToken( PB, PB->TS, PB->TS );
            PB_ChangeMasterState( PB, Active_Idle );
          }
          else
          {
            PB_SendToken( PB, PB->NS, PB->TS );
            PB_ChangeMasterState( PB, Check_Token_Pass );
          }
          break;
          
        //*************************************************************          
          
      }
    }
  }
}


//*****************************************************************************
//**  Vyvola se po odeslani celeho ramce - zajistuje spusteni timeoutu, pokud
//**  je o nej zadano.
//**
//**  POZOR - funguje pouze pokud je datovy ramec v bufferu jako posledni a 
//**          vyvola se az od posledniho datoveho ramce !!! (pokud by nestacilo
//**          tak lze vyresit zavednim dalsiho typu znaku napr. TIMEMARK_CHAR )
//**
//*****************************************************************************

void PB_FrameOut( PTProfibus PB )
{
  //RS_DbgPrint("PB: Frame out\n");

  // melo by byt vykonano az potom  co posledni znak odejde cely z vystupniho bufferu
  if ( PB->TimeOutState == TO_WaittingTxEmpty )
  {
    PB->LastTicks = GetCurrentTicks();
    PB->TimeOutTicks = PB->LastTicks + PB->TO_Interval * PB->Tbit;
    PB_StartTimeOut( PB );
  }
}


//*****************************************************************************
//**  Zjistuje, zdali jeste zbyva cas pro vysilani zprav, aby byl dodrezen
//**  interval Ttr (Time To Reach).
//**
//*****************************************************************************

BOOLEAN PB_IsTimeForSending( PTProfibus PB )
{
  return ( ( GetCurrentTicks() - PB->LastUseTokenEntryTicks ) < PB->ttr );
}






//*****************************************************************************
//**  Zacne zpracovavat vybrany pozadavek. Pokud jeho vyrizeni nevyzaduje komu-
//**  nikaci z vnejskem, je oznacen jako Local a po odeslani odpovedi aplikacni
//**  vrstve (Confirmation) nasleduje prechod zpet do stavu Use_Token pro vyber
//**  dalsiho pozadavku (pokud zbyvajici cas dovoli).
//**  Vyzaduje-li vyrizeni pozadavku kominikaci z vnejskem je oznacen jako Re-
//**  mote a po vyslani zadosti na sbernici je ocekavana odpoved prechodem do
//**  stavu Await_Data_Resp.
//**
//**  Parametry:
//**  ----------
//**  Request - ukazatel na Request Block pozadavku ke zpracovani. Ten je vyb-
//**            ran ve stavu Use_Token
//*****************************************************************************

void PB_ProcessRequest( PTProfibus PB, fdl_rb *Request )
{
  int                         i;
  //  UBYTE data_unit[260];
  int                         h_offset;
  UBYTE                       Class;
  UBYTE                       SSAP, DSAP;
  UBYTE                       Tx_FC = 0x40;
  UBYTE                       Tx_DA;
  struct fdl_sap *            ptr;              
  struct bus_parameter_block *bus_prm_ptr;
  struct fdl_l_stat *         sptr;
  struct event_indication *   Event_ptr;
  struct statistic_ctr_list * c_list; 
  
  BYTE  *data;  


  PB->ActualRequest = Request;    // lepe prekopirovat data

  
  PB_DbgPrintL2("PB: Pozadavek CODE=%x", Request->application_block.service.code);
    
  switch ( Request->application_block.service.code )
  {
      
      
      //***************************************************************************      
      
    case srd:
      /* SRD request z aplikacni vrstvy */
      PB_DbgPrintL2( "PB:    pozadavek SRD\n" );
      PB->Service = Remote;                 /*remote sluzba*/                                           
      
      if ( PB->StationStatus != Master_in_logical_ring )
      {
        build_conf_srd( Request, 0, 0, ds );          /*L_status ds*/
        ResB_Add( &PB->ResB, Request );
        PB->Service = Local;
        break;
      }         

      DSAP = Request -> application_block.dsap ;    /*priprava SAPu*/
      if ( DSAP == DEFAULT_SAP )
        DSAP = (unsigned char) PB->default_sap;       
      
      SSAP = Request -> application_block.ssap ;
      if ( SSAP == DEFAULT_SAP )
        SSAP = (unsigned char) PB->default_sap;       
        
      

      if ( ( SSAP<0 || SSAP>63 ) && SSAP != DEFAULT_SAP/*SAPNIL*/ )
      {
        build_conf_srd( Request, 0, 0, ls );          /*L_status ds*/           
        ResB_Add( &PB->ResB, Request );
        PB->Service = Local;
        break;
      }
      //je local SAP vubec aktivovany

      
      if ( PB->SAP.SAPItem[SSAP].SRD == SERVICE_NOT_ACTIVATED )  
          {
                build_conf_srd(Request,0,0,ls);          // L_status ls
            ResB_Add(&PB->ResB, Request);
            PB->Service=Local;
            break;            
          }


      Class = Request -> rb2_header.priority;
      Tx_DA = Request -> application_block.rem_add.station;
      h_offset = Request -> user_data_1[0];
      if ( Class == low )
        Tx_FC = Tx_FC | 0x0c;   /*SRD Lo*/
      else
        Tx_FC = Tx_FC | 0x0d;                  /*Hi */

      if ( ( ( Class != low ) && ( Class != high ) ) ||
           ( Tx_DA > 126 ) ||
           ( ( DSAP > 62 ) &&
             ( DSAP < 255 ) &&
      

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀av一区二区在线免费观看| 午夜视频一区二区| 日韩精品综合一本久道在线视频| 欧美日韩免费一区二区三区| 91视频免费看| 色乱码一区二区三区88| 色综合久久综合网| 欧美美女直播网站| 欧美一级片在线| 欧美tickle裸体挠脚心vk| 欧美成人三级在线| 久久精品夜夜夜夜久久| 国产精品久久久久精k8| 中文字幕亚洲综合久久菠萝蜜| 亚洲免费观看高清完整版在线观看熊| 中文字幕中文字幕在线一区| 夜夜嗨av一区二区三区中文字幕| 一区二区三区四区激情| 无吗不卡中文字幕| 久久精工是国产品牌吗| 成人午夜av电影| 色综合一区二区| 91麻豆精品国产91久久久更新时间| 日韩欧美黄色影院| 中文字幕av不卡| 亚洲一二三四在线观看| 久久精品二区亚洲w码| 丁香婷婷深情五月亚洲| 欧美色成人综合| 欧美精品一区二区不卡| 日韩一区日韩二区| 美女国产一区二区三区| 不卡一二三区首页| 欧美一区二区三区系列电影| 国产精品丝袜在线| 久久精品国产99国产| 91社区在线播放| 精品人在线二区三区| 亚洲理论在线观看| 国产一区二区精品久久91| 日本福利一区二区| 久久免费视频一区| 日韩精品亚洲一区二区三区免费| 国产99久久久国产精品潘金网站| 欧美欧美欧美欧美| 亚洲欧美偷拍三级| 国产精品99久久久久久有的能看| 精品视频1区2区| 综合av第一页| 国内外成人在线| 欧美精品久久久久久久多人混战| 欧美韩日一区二区三区| 日本不卡一二三| 色系网站成人免费| 中文字幕一区二区5566日韩| 国产一区二区在线免费观看| 欧美午夜影院一区| 亚洲女女做受ⅹxx高潮| 成人性色生活片| 国产日韩欧美综合在线| 美女网站一区二区| 欧美一区二区三区人| 一卡二卡三卡日韩欧美| 99热国产精品| 国产欧美综合在线| 国产精品自拍三区| www欧美成人18+| 久久91精品国产91久久小草| 日韩一区二区三区四区| 奇米色一区二区| 欧美一区二视频| 日本伊人色综合网| 欧美一级欧美一级在线播放| 婷婷丁香激情综合| 69p69国产精品| 裸体在线国模精品偷拍| 日韩一区二区三区四区 | 国产成+人+日韩+欧美+亚洲| 精品久久久久久久人人人人传媒| 日本视频在线一区| 91精品国产综合久久久蜜臀粉嫩| 午夜a成v人精品| 91精品国产综合久久久久久漫画| 青青草国产成人av片免费| 91精品国产综合久久婷婷香蕉| 奇米影视一区二区三区| 精品成人免费观看| 成人一区二区三区视频在线观看 | 欧美精品一区二| 成人中文字幕在线| 中文字幕中文字幕在线一区| 色综合久久久久| 亚洲成人av电影| 欧美一级高清片| 懂色一区二区三区免费观看| 亚洲情趣在线观看| 91精品久久久久久久91蜜桃| 精品一区二区综合| 国产精品久久久久久久久动漫 | 精品国产91九色蝌蚪| 国产精品888| 一区二区三区在线视频播放| 欧美老肥妇做.爰bbww| 国产一区二区三区四区五区美女| 国产精品护士白丝一区av| 欧美艳星brazzers| 久久99精品久久久| 亚洲美女视频在线观看| 欧美电影免费观看高清完整版在| 国产成a人无v码亚洲福利| 亚洲午夜久久久久中文字幕久| 日韩欧美一区二区久久婷婷| 97超碰欧美中文字幕| 日韩va欧美va亚洲va久久| 国产精品久久久久三级| 欧美一区二区三区白人| fc2成人免费人成在线观看播放| 午夜视频一区在线观看| 国产精品美日韩| 欧美一区二区三区免费观看视频| 97国产精品videossex| 久久精品国产精品亚洲综合| 一区二区三区免费观看| 欧美经典一区二区| 欧美电影免费观看高清完整版在 | 国产精品久久99| 26uuu久久综合| 欧美日韩1234| 一本色道久久综合狠狠躁的推荐| 激情伊人五月天久久综合| 五月天视频一区| 一区二区三区欧美久久| 中文字幕av一区二区三区高| 精品免费视频一区二区| 欧美色图在线观看| 91麻豆视频网站| 成人精品免费网站| 国产精品资源在线| 久久电影国产免费久久电影| 亚洲va欧美va天堂v国产综合| 亚洲欧美日韩中文播放| 中国色在线观看另类| 国产亚洲一区二区三区在线观看| 日韩三级视频中文字幕| 正在播放一区二区| 在线播放中文一区| 欧美日韩视频专区在线播放| 欧美亚洲高清一区二区三区不卡| 91视频.com| 日本韩国一区二区三区| 91久久精品国产91性色tv | 日本不卡123| 五月天亚洲精品| 丝袜亚洲另类欧美| 婷婷一区二区三区| 免费成人你懂的| 六月丁香综合在线视频| 麻豆91在线观看| 国产真实乱对白精彩久久| 国产一区在线观看视频| 国产精品自在欧美一区| 成人黄色av电影| 色综合中文综合网| 欧美日本免费一区二区三区| 欧美午夜理伦三级在线观看| 欧美三级乱人伦电影| 欧美色图激情小说| 欧美一级黄色录像| 久久久99精品久久| 国产精品久久免费看| 亚洲青青青在线视频| 午夜影视日本亚洲欧洲精品| 天天综合色天天综合色h| 男人操女人的视频在线观看欧美| 久草中文综合在线| 不卡的av在线| 精品视频123区在线观看| 日韩精品一区二区三区视频播放| 日本一区二区三区在线观看| 亚洲九九爱视频| 日韩激情一二三区| 韩国欧美国产1区| 一本大道av一区二区在线播放| 欧美剧情片在线观看| 国产亚洲成av人在线观看导航| 中文字幕在线观看不卡视频| 午夜精品免费在线观看| 国产一区二区三区综合| 色国产综合视频| 精品国产乱码久久久久久1区2区 | 欧美精品一区二区三区很污很色的 | 欧美日韩国产综合一区二区三区| 精品国产乱码久久久久久闺蜜 | 国产精品久久久久久福利一牛影视| 亚洲一区二区精品视频| 国产高清久久久| 在线不卡一区二区| 亚洲精品ww久久久久久p站| 精品亚洲国产成人av制服丝袜 | 免费高清视频精品|