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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? profibus.c

?? profibus-dp主站源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
        //  otevreny handle je pozadavek zpracovavan.
        //
        PB->ActualHID = ReadHIDfromRB( Request );        

        PB_DbgPrintL2( "PB: Zpracovavani pozadavku pro HID=%d:\n",
                       PB->ActualHID );

        PB_ProcessRequest( PB, Request );
      }
      else
        PB_ChangeMasterState( PB, Check_Access_Time );

      break;

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

    case Check_Access_Time:
      PB->LastUseTokenEntryTicks = PB->UseTokenEntryTicks;
      if ( PB->RLL_Status == RLL_WaitNextCycle )
        PB->RLL_Status = RLL_TestNext;
      PB_ChangeMasterState( PB, Pass_Token );
      break;

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

    case Pass_Token:
      //
      // Pri prechodu ze stavu Check_Access_Time (tzn. master zapojen do log.
      // kruhu, probiha datova vymena) vyprsi-li odpocitavadlo G je aktualizovana
      // dalsi polozka v GAPu
      //
      
      if ( PB->LastState == Check_Access_Time )
      {
        NextToTest = GAPL_NextToTest( &PB->GAPL );        
        
        if ( NextToTest == -1 )
        {
          //
          // mezi TS a NS nelezi zadne stanice
          //
          PB_SendToken( PB, PB->NS, PB->TS );
          PB_ChangeMasterState( PB, Check_Token_Pass );
          break;
        }       
        
        if ( PB->G_CountDown <= 0 )
        {
          PB->G_CountDown = PB->G;
          PB_SendRequestFDLStatuswithReply( PB, NextToTest );
          PB_ChangeMasterState( PB, Await_Status_Resp );
          break;
        }
        else
        {
          PB->G_CountDown--;
          PB_SendToken( PB, PB->NS, PB->TS );
          PB_ChangeMasterState( PB, Check_Token_Pass );
          break;
        }
      }

      //
      // Navrat po otestovani dalsi stanice z GAPu. Je vyslan token dalsi stanici.
      // NS se muze rovnat TS.
      //
      if ( PB->LastState == Await_Status_Resp )
      {
        PB_SendToken( PB, PB->NS, PB->TS ); // dalsi master ovsem nemusi token prevzit - nutno testovat
        PB_ChangeMasterState( PB, Check_Token_Pass );
        break;
      }

      //
      // Studeny start logickeho kruhu. Prebirame iniciativu na sbernici a 
      // zaciname s vytvarenim GAPu.
      //
      if ( PB->LastState == Claim_Token )
      {
        GAPL_Clear( &PB->GAPL );
        GAPL_RestartTest( &PB->GAPL );
        PB_DbgPrintL3( "PB: Prebirame iniciativu na sbernici...\n" );                                
        PB->StationStatus = Master_in_logical_ring;
        PB_SendToken( PB, PB->TS, PB->TS );
        PB_SendToken( PB, PB->TS, PB->TS );
        PB_SendRequestFDLStatuswithReply( PB, GAPL_NextToTest( &PB->GAPL ) );                                
        // neprepiname do Await_Status_Resp, ale pri vytvareni GAPLu zustavame
        // v Pass_Token
        break;
      }
      break;  

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

    case Check_Token_Pass:
      if ( PB->NS == PB->TS )
        PB_ChangeMasterState( PB, Active_Idle );    // Na sbernici neni jiny master
      else
      {
        PB_SetTimeOut( PB, PB->tsl, TO_StartTxEmpty );  // Cekame na overeni spravneho predani tokenu
      }
      break;
  }
  // tady uz by nemelo nic byt...
  // vypadavaji tu ChangeMasterState(...) z rekurze...
}



//*****************************************************************************
//**  Vola se pokud je prijat znak - zajistuje vytvareni vstupniho bufferu,
//**  vyhledani validnich ramcu a jejich predani k dalsimu zpracovani.
//**  Fce je volana z nizsi vrstvy.
//**
//**  Parametry:
//**  ----------
//**  ch - prijaty znak
//*****************************************************************************

void PB_RxByte( PTProfibus PB, UCHAR ch )
{
  int     length;
  int     i;
  int     StartIndex;
  BOOLEAN TakeNextFrame;

 
  if ( !PB )   
  {
    DbgPrint( "PB: RxByte Error - PB pointer is NULL!" );
    return;
  }        
  
/*  
  if ( ( PB->MasterState == Await_Data_Resp || PB->MasterState == Await_Status_Resp ) 
       && PB->TimeOutState == TO_Running )
    PB_StopTimeOut( PB ); // casovac deaktivovan prijmem prvniho znaku 
        //jeste je potreba testovat spravnost ramce a pripadne generovat timeout
*/    
    
  if ( PB->InBufLen<0 || PB->InBufLen >= INBUF_SIZE )
  {
    DbgPrint("PB: InBuf Error - out of range!");
    return;
  }
  

  PB->InBuf[PB->InBufLen] = ch;
  PB->InBufLen++;
  
  
  if ( PB->InBufLen >= INBUF_SIZE )
  {
    DbgPrint("PB: InBuf Overflow!");
    PB->InBufLen = INBUF_SIZE - 1;
    return;
  }

  
  do
  {
    TakeNextFrame = FALSE;

    if ( PBFrame_FindFrame( PB->InBuf, PB->InBufLen, &length ) )  // hleda na zacatku prijatych dat ramec a v length vraci jeho delku
    {
      PBFrame_DecodeFrame( &PB->RxFrame,
                           PB->InBuf,
                           PB->InBufLen,
                           PB->TS,
                           PB->default_sap );
      //InBuf.Delete(1,length);
      if ( length <= PB->InBufLen )
        for ( i = 0; i < PB->InBufLen - length; i++ )
          PB->InBuf[i] = PB->InBuf[i + length]; // odstraneni zpracovaneho framu
      PB->InBufLen -= length;                        
      TakeNextFrame = TRUE;

      //                              
      // vyplneni falesnych parametru pro ShortAcknowledge (muze nekde delat neplechu)
      //
      if ( PB->RxFrame.FrameType == FT_ShortAcknowledge )
      {
        if ( PB->MasterState == Await_Data_Resp )
        {
          PB->RxFrame.DA = (UBYTE) PB->TS;
          PB->RxFrame.SA = PB->ActualRequest->application_block.rem_add.station;
        }
        else
        {
          //
          // Nejsme-li ve stavu cekani na odpoved priradime ramci SA jinou nez
          // TS (ramec typu ShortAcknowldge neobsahuje zdrojovou a cilovou adresu
          // a tudiz nemusi byt jasne pro koho je - stanice vi, ze je ramec pro
          // ni pokud ma token a ceka na odpoved - problem muze byt pri propojeni
          // mastera na sbernici).
          // Hodnota TS+1 je falesna, ale hodnota mimo 0..HSA by mohla zpusobit
          // chybu nekde jinde.
          //
          PB->RxFrame.DA = (UBYTE) PB->TS + 1;          
          if ( PB->RxFrame.DA > PB->HSA )
            PB->RxFrame.DA = 0;
          PB->RxFrame.SA = (UBYTE) PB->TS + 1;          
          if ( PB->RxFrame.SA > PB->HSA )
            PB->RxFrame.SA = 0;
          //
          // Mozna by bylo jednodussi a stacilo by nastavi RxFrame.Valid na FALSE
          //             
        }
      }

      //
      // Format ramce je spravny - muzeme ho spracovat
      //
      if ( PB->RxFrame.Valid )
      {
        //
        // Na sbernici vysila duplicitni stanice ve stavu Listen_Token
        //
        if ( PB->RxFrame.SA == PB->TS && PB->MasterState == Listen_Token )
        {
          PB->DuplicitAddressCounter++;
          if ( PB->DuplicitAddressCounter >= 2 )
          {
            PB_DbgPrintL3( "PB: Na sbernici vysila stanice s duplicitni adresou %d!",
                           PB->TS );
            PB_DbgPrintL3( "PB: Prechod do stavu Offline..." );                                        
            PB->DuplicitAddressCounter = 0;
            PB_ChangeMasterState( PB, Offline );
            return;
          }
        }
        
        //
        // Znovuspusteni time-outu k detekci rozpadu logickeho kruhu 
        // ve stavu Active_Idle
        //
        if ( PB->MasterState == Active_Idle )
        {
          PB_StopTimeOut( PB );
          // Melo by nasledovat
          //PB_SetTimeOut( PB, Tto, TO_StartNow );  
        }

        //
        // Na sbernici vysila duplicitni stanice ve stavu Active_Idle          
        //
        if ( PB->RxFrame.SA == PB->TS && PB->MasterState == Active_Idle )
        {
          PB_DbgPrintL3( "PB: Na sbernici vysila stanice s duplicitni adresou!" );
          PB_DbgPrintL3( "PB: Prechod do stavu Listen_Token..." );                                        
          PB_ChangeMasterState( PB, Listen_Token );
          return;
        }
        
        //
        // Prijat token
        //
        if ( PB->RxFrame.FrameType == FT_Token )
        {
          PB_ReceivedToken( PB, PB->RxFrame.DA, PB->RxFrame.SA );
          return;
        }

        //
        // Overeni spravneho odeslani Tokenu - NS stanice vysila ramec
        // Pokud jako prvni ramec od NS byl Token pro nas, tak byl jiz
        // zpracovan vyse.
        //
        if ( PB->MasterState == Check_Token_Pass && PB->RxFrame.SA == PB->NS )
        {
          PB_StopTimeOut( PB );
          PB_ChangeMasterState( PB, Active_Idle );
          //
          // Zde nesmi byt return - prvni ramec, ktery NS stanice vysila
          // totiz muze take byt pro nas
          //
          //return;
        }                                

        //
        // Prijaty ramec je pro nas
        //
        if ( PB->RxFrame.DA == PB->TS ||
             PB->RxFrame.FrameType == FT_ShortAcknowledge )
        {
          if ( PB->RxFrame.FrameType == FT_Reply ||
               PB->RxFrame.FrameType == FT_ShortAcknowledge )
          {
            PB_ReceivedReply( PB );   // prisla odpoved na nas pozadavek
          }
          else
            PB_ReceivedRequest( PB );   // prisel pozadavek z vnejsku

        }
      }
    }
    else    // nenalezen zadny platny pocatek framu SDx nebo SC - odriznuti pocatku znaku v bufferu az dalsimu SDx nebo SC
    {
      StartIndex = PBFrame_FindStartDelimiter( PB->InBuf, PB->InBufLen );
      if ( StartIndex != -1 && StartIndex != 1 )
      {
        StartIndex--; // dedictvi Stringu
        for ( i = 0; i < PB->InBufLen - StartIndex; i++ )
          PB->InBuf[i] = PB->InBuf[i + StartIndex]; // odstraneni zpracovaneho framu
        PB->InBufLen -= StartIndex;
      }
    }
    
  // pro jistotu
  if ( PB->InBufLen >= INBUF_SIZE )
  {
    DbgPrint("PB: InBuf Overflow2!");
    PB->InBufLen = INBUF_SIZE - 1;
    return;
  }
    
  }   
  while ( TakeNextFrame && PB->InBufLen > 0 );
}



//*****************************************************************************
//**  Vola se pokud na sbernici dochazi k predavani tokenu. Zajistuje vytvareni
//**  a udrzbu LASu ve stavu Listen_Token a prijmuti tokenu pokud je pro TS
//**  (This Station) - tj. pro nas.
//**  V LASu pracuje pouze se stanicemi typu master.
//**
//**  Parametry:
//**  ----------
//**  _DA - adresa stanice pro kterou je Token urcen (nemusi byt jenom pro nas,
//**    tato fce zpracovava vsechny Tokeny vyslane na sbernici
//**  _SA - adresa puvodce Tokenu
//*****************************************************************************

void PB_ReceivedToken( PTProfibus PB, int _DA, int _SA )
{
//  DbgPrint("PB: Stanice %d prijala token (DA=%d SA=%d).", PB->TS, _DA, _SA);
  
  switch ( PB->MasterState )
  {
    case Offline:
      break;

      //---------------------------------------                         

    case Listen_Token:
      //
      // deaktivace Timeoutu pro Claim_Token pokud prisel token (melo by se mozna deaktivovat i driv [jenom od prijmu znaku?? ] )
      // nekde by se ovsem mel rozebehnout dalsi time-out... 
      //
      PB_StopTimeOut( PB );  


      if ( !LAS_Complete( &PB->LAS ) )
      {
        //
        // Vytvareni LASu a detekce dvou shodnych obehu tokenu
        // 
        if ( LAS_CreatingAdd( &PB->LAS, _SA ) )
        {
          // LAS complete
          PB->StationStatus = Master_ready;
          PB_DbgPrintL2( "PB: Dva identicke obehy tokenu - LAS completed!" );
        }
      }
      else
      {
        //
        // LAS hotov - ted pouze updatovani a cekani na povereni od PS
        //
        LAS_Update( &PB->LAS, _SA );
      }


      break;

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

    case Check_Token_Pass:  
    case Active_Idle:
      if ( _SA == PB->PS && _DA == PB->NS )     // Stanice byla nasilne vyrazena z ringu
      {
        PB_DbgPrintL3( "PB: Master byl nasilne vyrazen z ringu!" );
        PB_ChangeMasterState( PB, Listen_Token );
        break;
      }

      LAS_Update( &PB->LAS, _SA );
      LAS_VymazStanice( &PB->LAS, _DA, _SA );  // Update LASu nejlepe vymazanim stanic mezi SA a DA - snad OK

      if ( _DA == PB->TS )  // Token je pro nas
      {
        //DbgPrint("PB: Stanice %d prijala token (DA=%d SA=%d - PS=%d).", PB->TS, _DA, _SA, PB->PS);        
        if ( PB->PS != -1 && PB->PS != _SA )
        {
          // jeste by tu mohlo byt overeni jestli opakovani je od te same stanice
          PB->IgnoreTokenCounter++;
          if ( PB->IgnoreTokenCounter >= 2 )
            PB->IgnoreTokenCounter = 0; // a pokracuje se dale
          else
            break;
        }
        //DbgPrint("PB: Stanice %d prijala token (DA=%d SA=%d) S3.", PB->TS, _DA, _SA);        

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲欧美激情| 波多野结衣一区二区三区 | 日韩欧美卡一卡二| 中文在线一区二区| 日韩电影一二三区| 日本久久电影网| 久久久久久久久久美女| 五月综合激情日本mⅴ| 99re热视频精品| 久久久久久99久久久精品网站| 五月天激情小说综合| 93久久精品日日躁夜夜躁欧美| 欧美mv日韩mv亚洲| 偷拍日韩校园综合在线| 日本伦理一区二区| 中文字幕在线播放不卡一区| 极品少妇xxxx偷拍精品少妇| 777午夜精品免费视频| 夜夜精品浪潮av一区二区三区| 高清不卡一区二区在线| 精品国产精品网麻豆系列 | 亚洲欧洲日韩一区二区三区| 国产丶欧美丶日本不卡视频| 欧美刺激午夜性久久久久久久 | 亚洲欧美综合另类在线卡通| 韩国成人在线视频| 日韩一级完整毛片| 久久99国产乱子伦精品免费| 欧美一区二区精美| 久久成人久久爱| 91精品在线免费观看| 舔着乳尖日韩一区| 欧美精品久久99| 奇米一区二区三区av| 日韩欧美中文一区二区| 免费不卡在线视频| 欧美tk丨vk视频| 国精产品一区一区三区mba桃花 | 91成人国产精品| 亚洲综合色区另类av| 欧美性猛片xxxx免费看久爱| 亚洲国产精品久久久男人的天堂 | 午夜在线电影亚洲一区| 欧美午夜精品电影| 日韩电影免费一区| 精品日韩在线一区| 大桥未久av一区二区三区中文| 久久精品视频免费观看| www.成人在线| 夜夜夜精品看看| 欧美一区二区三区四区五区| 精东粉嫩av免费一区二区三区| 久久久亚洲高清| 99久久精品国产毛片| 亚洲夂夂婷婷色拍ww47| 欧美丰满嫩嫩电影| 国产原创一区二区三区| 成人欧美一区二区三区白人| 欧美日韩在线电影| 精品伊人久久久久7777人| 欧美激情在线看| 欧美在线观看你懂的| 久久国产精品露脸对白| 日韩理论电影院| 91精品国产综合久久久久| 国产精品香蕉一区二区三区| 亚洲男人天堂av| 日韩一本二本av| 9久草视频在线视频精品| 亚洲国产日韩精品| 久久久久久久精| 欧美最猛黑人xxxxx猛交| 激情另类小说区图片区视频区| 亚洲欧洲av一区二区三区久久| 在线成人免费观看| 成人av资源在线| 麻豆精品久久精品色综合| 中文字幕在线观看一区| 在线电影院国产精品| 99久久er热在这里只有精品66| 日韩成人精品在线观看| 亚洲欧美综合色| 精品国产免费人成电影在线观看四季| 99这里都是精品| 狠狠色丁香久久婷婷综| 视频在线观看91| 亚洲日本一区二区| 久久久综合视频| 欧美一个色资源| 色婷婷av一区| 成人黄色在线网站| 国产一区二区视频在线| 免费不卡在线观看| 偷拍亚洲欧洲综合| 亚洲最新视频在线观看| 国产精品久久久久久久久免费桃花 | 国产精品国产三级国产三级人妇| 日韩视频一区二区| 欧美日韩国产综合久久| 成人综合日日夜夜| 国产精品中文字幕日韩精品| 日韩精品91亚洲二区在线观看| 日韩伦理电影网| 国产精品国产自产拍高清av王其| 26uuu色噜噜精品一区二区| 欧美剧情片在线观看| 欧美亚洲高清一区二区三区不卡| 色哟哟一区二区在线观看| 国产成人免费在线观看| 国产精品亚洲专一区二区三区| 青青草97国产精品免费观看| 日韩综合一区二区| 亚洲成人av福利| 日欧美一区二区| 日韩精品一级中文字幕精品视频免费观看 | 欧美国产亚洲另类动漫| 久久综合网色—综合色88| 精品欧美一区二区在线观看| 欧美一区二区三区在线看| 日韩精品一区二区三区视频| 日韩视频一区二区三区| 精品国产百合女同互慰| 久久久噜噜噜久噜久久综合| 欧美国产一区视频在线观看| 欧美国产亚洲另类动漫| 国产精品第一页第二页第三页| 国产精品久久久久久久久免费樱桃| 亚洲国产经典视频| 国产精品国产三级国产三级人妇| 国产精品国产三级国产普通话蜜臀| 国产精品网友自拍| 亚洲品质自拍视频网站| 香蕉久久夜色精品国产使用方法| 首页欧美精品中文字幕| 久久精品久久综合| 国产91精品露脸国语对白| 菠萝蜜视频在线观看一区| 91久久免费观看| 欧美一区二区三区思思人| 久久综合色婷婷| 亚洲精品综合在线| 日本欧美肥老太交大片| 国产一区不卡在线| 一本色道久久综合亚洲91| 欧美日本免费一区二区三区| 欧美不卡一区二区三区| 国产精品美女一区二区三区| 一卡二卡欧美日韩| 麻豆久久一区二区| 99视频有精品| 在线不卡一区二区| 国产午夜精品久久久久久久| 亚洲老司机在线| 精品写真视频在线观看 | 亚洲欧美怡红院| 日韩国产在线一| 国产福利一区在线| 欧美色综合影院| 久久婷婷色综合| 亚洲成在人线免费| 成人动漫精品一区二区| 91精品国模一区二区三区| 欧美高清在线一区二区| 亚洲bt欧美bt精品777| 国产91丝袜在线18| 欧美电影免费观看高清完整版在 | 免费观看一级特黄欧美大片| 成人性生交大片免费看视频在线 | 蜜桃av一区二区| 色综合婷婷久久| 国产性色一区二区| 日韩电影在线一区二区三区| 91在线小视频| 国产蜜臀97一区二区三区| 日韩国产精品久久久久久亚洲| www.成人在线| 国产日韩欧美精品一区| 亚洲成av人片| 91色.com| 国产精品美女久久久久久久久| 激情成人综合网| 日韩欧美在线123| 亚洲高清免费在线| 色综合天天综合网国产成人综合天| 26uuu欧美| 麻豆精品久久精品色综合| 3751色影院一区二区三区| 亚洲免费观看高清| 99久久久免费精品国产一区二区| 久久精品一区蜜桃臀影院| 久久99国产精品久久| 欧美精品丝袜久久久中文字幕| 亚洲欧洲制服丝袜| 99久久久国产精品| 中文字幕一区二区三区乱码在线 | 蜜臀国产一区二区三区在线播放| 欧美在线观看视频在线| 一区二区三区久久| 91成人国产精品| 亚洲高清不卡在线|