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

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

?? profibus.c

?? profibus-dp主站源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
        //
        //  Nejprve ulozime aktualni HID (Handle ID) - vime tak pro ktery
        //  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 
   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);        

        if ( PB->LastState == Listen_Token )
        {
          PB_DbgPrintL3( "PB: Master %d prijat do logickeho ringu!", PB->TS );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美老肥妇做.爰bbww视频| 精品免费视频.| 韩国视频一区二区| 综合在线观看色| 日韩精品影音先锋| 91久久香蕉国产日韩欧美9色| 天堂午夜影视日韩欧美一区二区| 久久久久久久久伊人| 欧美日韩1区2区| 不卡一区二区三区四区| 轻轻草成人在线| 亚洲老司机在线| 国产日产欧美一区| 日韩欧美国产三级电影视频| 色拍拍在线精品视频8848| 国产成人午夜精品影院观看视频 | 亚洲与欧洲av电影| 久久精品亚洲乱码伦伦中文| 欧美日韩一区久久| 91在线一区二区| 国产乱淫av一区二区三区| 婷婷久久综合九色综合伊人色| 中文在线一区二区| 久久久久久亚洲综合| 欧美一区中文字幕| 欧美日韩视频在线第一区| 91色在线porny| 成人国产精品免费观看| 国产精品一线二线三线精华| 美女一区二区三区在线观看| 性做久久久久久久免费看| 亚洲免费观看高清| 亚洲丝袜自拍清纯另类| 中文乱码免费一区二区| 国产日产亚洲精品系列| 久久亚洲精品国产精品紫薇| 日韩午夜av电影| 91精品国产综合久久精品图片| 欧美性极品少妇| 欧美日韩中文字幕一区| 欧美在线一区二区| 在线精品观看国产| 欧美这里有精品| 欧美日韩一区二区三区不卡 | 日韩欧美成人午夜| 欧美一级艳片视频免费观看| 欧美久久一区二区| 日韩一区二区高清| 精品少妇一区二区三区视频免付费 | 在线观看一区日韩| 色先锋资源久久综合| 91麻豆蜜桃一区二区三区| 色拍拍在线精品视频8848| 在线观看一区不卡| 欧美日韩一二三| 日韩亚洲欧美成人一区| 精品国精品国产| 国产日韩av一区二区| 1024国产精品| 一区二区三区日韩在线观看| 一区二区三区免费网站| 亚洲国产日韩精品| 日本一道高清亚洲日美韩| 久久国产综合精品| 国产91在线观看| 在线观看亚洲a| 日韩欧美aaaaaa| 日本一区二区视频在线观看| 亚洲免费看黄网站| 日本欧美一区二区| 国产精品一区二区久久不卡| av在线这里只有精品| 欧美视频日韩视频在线观看| 日韩精品中午字幕| 国产情人综合久久777777| 一区二区三区四区精品在线视频| 日韩**一区毛片| 国产91精品一区二区麻豆网站| 99久久99久久久精品齐齐| 欧美电影在哪看比较好| 国产亚洲综合av| 亚洲黄色免费电影| 精品在线视频一区| 99精品欧美一区| 日韩欧美黄色影院| 国产精品久久久一本精品| 亚洲成人黄色影院| 国产99一区视频免费| 欧美日韩1234| 国产精品免费免费| 全部av―极品视觉盛宴亚洲| 不卡大黄网站免费看| 欧美一区二区在线免费观看| 国产精品国产馆在线真实露脸 | 国产精品人人做人人爽人人添| 亚洲一区二区三区四区五区中文 | 亚洲综合在线电影| 韩国女主播成人在线观看| 色综合色综合色综合色综合色综合 | 亚洲欧美国产三级| 老汉av免费一区二区三区 | 精品福利一区二区三区免费视频| ...xxx性欧美| 激情综合色播激情啊| 91成人免费电影| 国产欧美日韩综合| 久久99久久久欧美国产| 在线亚洲一区二区| 国产精品美女视频| 韩国女主播一区| 制服丝袜激情欧洲亚洲| 亚洲欧洲制服丝袜| 国产成人综合视频| 日韩免费观看高清完整版| 亚洲一区二区三区四区在线观看 | 久久免费视频色| 日本网站在线观看一区二区三区| 91一区二区在线| 欧美高清一级片在线观看| 美腿丝袜亚洲一区| 5566中文字幕一区二区电影| 亚洲精选视频免费看| bt7086福利一区国产| 中文字幕免费不卡在线| 国产在线精品一区二区夜色| 制服丝袜日韩国产| 日韩成人精品视频| 7777精品伊人久久久大香线蕉的 | aaa亚洲精品一二三区| 国产亚洲午夜高清国产拍精品| 蜜臂av日日欢夜夜爽一区| 日韩一区国产二区欧美三区| 五月天中文字幕一区二区| 欧美在线观看禁18| 亚洲精品视频一区| 色综合久久六月婷婷中文字幕| 国产精品视频你懂的| www.色精品| 亚洲丝袜另类动漫二区| 91一区二区在线| 亚洲精品国产无天堂网2021| 色乱码一区二区三区88| 中文字幕一区二区在线观看| www.久久精品| 亚洲免费观看在线观看| 欧美午夜免费电影| 午夜影院久久久| 欧美精品 国产精品| 日欧美一区二区| 日韩欧美国产高清| 国产一区视频网站| 欧美激情中文字幕一区二区| 不卡av在线免费观看| 亚洲综合色网站| 91精品久久久久久久久99蜜臂| 免费亚洲电影在线| 国产日韩一级二级三级| 波波电影院一区二区三区| 亚洲免费在线观看| 在线成人午夜影院| 韩日av一区二区| 国产精品久久久久久户外露出| 91色九色蝌蚪| 三级欧美在线一区| 久久尤物电影视频在线观看| 粉嫩av一区二区三区在线播放| 亚洲免费视频中文字幕| 欧美夫妻性生活| 国产综合色产在线精品| 国产精品久久久久久久久搜平片| 欧美自拍丝袜亚洲| 久久99久久精品| 成人欧美一区二区三区黑人麻豆| 欧美午夜影院一区| 国产精品996| 一二三区精品视频| 精品久久久久久久久久久久包黑料| 丁香婷婷深情五月亚洲| 亚洲一区二区高清| 久久色.com| 欧美四级电影在线观看| 黑人巨大精品欧美一区| 久久国产精品免费| 亚洲人成网站色在线观看 | 国产精品初高中害羞小美女文| 欧美性猛片xxxx免费看久爱| 国内精品伊人久久久久av一坑| 亚洲女人小视频在线观看| 日韩一级成人av| 色婷婷av一区| 高清久久久久久| 性做久久久久久免费观看| 国产精品午夜春色av| 日韩一区二区在线播放| 97久久精品人人爽人人爽蜜臀| 人人超碰91尤物精品国产| 亚洲人快播电影网| 精品久久一区二区三区| 欧美色图第一页| 99久久精品久久久久久清纯|