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

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

?? profibus.c

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

        PB->StationStatus = Master_in_logical_ring;

        /*if (PB->PS == -1) { */
        PB->PS = _SA; 
        LAS_VymazStanice( &PB->LAS, PB->TS, _SA ); /*}*/

        if ( PB->NS == -1 )
        {
          PB->NS = LAS_NextStation( &PB->LAS, PB->TS ); 
          GAPL_UpdateNS( &PB->GAPL, PB->NS );
                                                                     
        }        /*prace s GAPL muze zacit*/


        PB_StopTimeOut( PB );
        PB_ChangeMasterState( PB, Use_Token );
        break;
      }
      break;

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

    case Await_Data_Resp:
      //
      // V tomto stavu by Token nemel prijit
      //
      PB_ChangeMasterState( PB, Active_Idle );
      break;
  }
}


//*****************************************************************************
//**  Master prijal z vnejsku pozadavek na FDL Status - odeslani odpovedi.
//**  Prechod na stav Active_Idle pokud je master ve stavu Listen_Token a ma
//**  jiz vytvoren LAS.
//**
//*****************************************************************************

void PB_ReceivedRequestFDLStatuswithReply( PTProfibus PB, int _SA )
{
  switch ( PB->MasterState )
  {
    case Listen_Token:
      PB_SendFrameNoData( PB, _SA, PB->TS, ( PB->StationStatus << 4 ) + 0, FALSE );
      if ( PB->StationStatus == Master_ready )
      {
        //PB->StationStatus=Master_in_logical_ring; // pozor - puvodne zde - bylo presunuto az do prijmuti prvniho tokenu pro nas
        PB_ChangeMasterState( PB, Active_Idle );
      }
      break;

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

    case Active_Idle:
      PB_SendFrameNoData( PB, _SA, PB->TS, ( PB->StationStatus << 4 ) + 0, FALSE );
      break;
  }
}



//*****************************************************************************
//**  Vyslani retezce datovych bytu (ramce) na sbernici. Na zacatek ramce
//**  jsou pripojeny tri synchronizacni znaky, ktere pozdeji v nizsi vrstve
//**  zpusobi zarazeni casove mezery (SYN) pred vyslanim tohoto ramce.
//**
//**  Parametry:
//**  ----------
//**  frame  - ukazatel na buffer s daty
//**  length - delka dat k vyslani
//**  UseSYN - urcuje zda bude pred ramcem 33Tbitova synchronizacni pauza
//*****************************************************************************

void PB_Send( PTProfibus PB, PUCHAR frame, int length, BOOLEAN UseSYN )
{
  
  int   i;
  int   pos;
  UCHAR TypeBuffer[DEF_BUFFER_SIZE]; 
  UCHAR Buffer[DEF_BUFFER_SIZE];   

  pos = 0;
  
  if ( length <= DEF_BUFFER_SIZE )
  {
    if ( UseSYN )
      for ( i = 0; i < 3; i++ )
      {
        Buffer[pos] = SYN_BYTE;
        TypeBuffer[pos] = SYN_CHAR;
        pos++;
      }

    for ( i = 0; i < length; i++ )
    {
      Buffer[pos] = frame[i];
      TypeBuffer[pos] = DATA_CHAR;
      pos++;
    }

    ProfiM_SendOut( PB->DeviceExtension, Buffer, TypeBuffer, pos );
  }
  
}



//*****************************************************************************
//**  Vyslani ramce bez dat.
//**
//**  Parametry:
//**  ----------
//**  _DA    - Destination Address
//**  _SA    - Source Address
//**  _FC    - Frame Control
//**  UseSYN - urcuje zda bude pred ramcem 33Tbitova synchronizacni pauza
//*****************************************************************************

void PB_SendFrameNoData( PTProfibus PB, int _DA, int _SA, int _FC, BOOLEAN UseSYN )
{
  UCHAR _frame[6], *frame;    // dedictvi Stringu
  frame = _frame - 1;

  frame[1] = DelimiterSD1;
  frame[2] = (UBYTE) _DA;
  frame[3] = (UBYTE) _SA;
  frame[4] = (UBYTE) _FC;
  frame[5] = ( UCHAR ) ( ( _DA + _SA + _FC ) % 0x100 );
  frame[6] = DelimiterED;

  PB_Send( PB, _frame, 6, UseSYN );
}



//*****************************************************************************
//**  Sestaveni a vyslani ramce s promennou delkou dat.
//**
//**  Parametry:
//**  ----------
//**  _DA    - Destination Address
//**  _SA    - Source Address
//**  _DSAP  - Destination Service Access Point
//**  _SSAP  - Source Service Access Point
//**  _FC    - Frame Control
//**  _Data  - ukazatel na buffer s daty k vyslani
//**  length - delka vysilanych dat
//**  UseFC  - urcuje zda bude u ramce nastaven FCB (Frame Control Bit)
//**  UseSYN - urcuje zda bude pred ramcem 33Tbitova synchronizacni pauza
//*****************************************************************************

void PB_SendFrameVariableData( PTProfibus PB,
                               int _DA,
                               int _SA,
                               int _DSAP,
                               int _SSAP,
                               int _FC,
                               PUCHAR _Data,
                               int length,
                               BOOLEAN UseFC,
                               BOOLEAN UseSYN )
{
  UCHAR frame[300]; // will be enough
  int   end, i;
  int   L;
  UCHAR FCS;

  end = 7; // ukazatel na posledni nezpsany byte

  L = length + 3;
  if ( _DSAP != DEFAULT_SAP/*SAPNIL*/ )
  {
    L++; _DA += 128; frame[end++] = (UBYTE) _DSAP;
  }        
  if ( _SSAP != DEFAULT_SAP/*SAPNIL*/ )
  {
    L++; _SA += 128; frame[end++] = (UBYTE) _SSAP;
  }        

  if ( _FC & 0x40 )
  {
    _FC = _FC & 0xCF;
    if ( UseFC )  // Use Frame Control
    {
      if ( PB->GAPL.GAPL[0x7F & _DA].FCV )
        _FC = _FC | 0x10;     // pozor - k DA uz muze byt pridano DAE
      if ( PB->GAPL.GAPL[0x7F & _DA].FCB )
        _FC = _FC | 0x20;
      if ( PB->FrameRepeatCounter == 0 )
        GAPL_FCBToggle( &PB->GAPL, 0x7F & _DA ); // pokud >0 tak se jedna o opakovany dotaz
    }
  }
  else
  {
    // pokud se jedna o odpoved tak nastavi priznak stavu mastera
    _FC = _FC | ( 0x30 & ( PB->StationStatus << 4 ) );
  }

  frame[0] = DelimiterSD2;
  frame[1] = (UBYTE) L;
  frame[2] = (UBYTE) L;
  frame[3] = DelimiterSD2;
  frame[4] = (UBYTE) _DA;
  frame[5] = (UBYTE) _SA;
  frame[6] = (UBYTE) _FC;

  if ( length > 0 )
    for ( i = 0; i < length; i++ )
      frame[end++] = _Data[i];

  FCS = 0;
  for ( i = 4; i < 4 + L; i++ )
    FCS += frame[i];        

  frame[end++] = FCS % 0x100;
  frame[end++] = DelimiterED;

  //for (i=0; i<end; i++)  DbgPrint("Ramec: %d :  %x",i,frame[i]);        
  PB_Send( PB, frame, end, UseSYN );
}


//*****************************************************************************
//**  Vyslani zadosti o FDL Status stanici s adresou _DA
//**
//*****************************************************************************

void PB_SendRequestFDLStatuswithReply( PTProfibus PB, int _DA )
{
  //DbgPrint("PB: Stanice TS=%d vysila FDL_Status pozadavek stanici s adresou: %d",PB->TS, _DA);
  PB_SendFrameNoData( PB, _DA, PB->TS, 0x49, TRUE );
  PB_SetTimeOut( PB, PB->tsl, TO_StartTxEmpty );  
}




//*****************************************************************************
//**  Vyslani tokenu
//**
//**  Parametry:
//**  ----------
//**  _DA - Destination Address
//**  _SA - Source Address
//*****************************************************************************

void PB_SendToken( PTProfibus PB, int _DA, int _SA )
{
  UCHAR frame[3];

  frame[0] = DelimiterSD4;
  frame[1] = (UBYTE) _DA;
  frame[2] = (UBYTE) _SA;

  //if ( _DA != PB->TS )
  //  DbgPrint("PB: Vysilame token SA=%d DA=%d\n", _SA, _DA);
  PB_Send( PB, frame, 3, TRUE );
}








//*****************************************************************************
//**  Vraci aktualni pocet ticku v Performance Counteru.
//**
//*****************************************************************************

__int64 GetCurrentTicks()
{
  LARGE_INTEGER t, f;
  t = KeQueryPerformanceCounter( &f );    // funkce jadra
  //DbgPrint ("Cas : %d\n", t.QuadPart);          
  return t.QuadPart;
}


//*****************************************************************************
//**  Spusti odpocet time-outu.
//**
//*****************************************************************************

void PB_StartTimeOut( PTProfibus PB )
{
  if ( PB->TimeOutState != TO_Running )
  {
    PB->TimeOutState = TO_Running;
    PB_SendNextTimingChars( PB, PB->TO_Interval / 11 ); // posilame hned velky pocet znaku
  }
}


//*****************************************************************************
//**  Zastavi odpocet time-outu a vymaze z vysilaciho bufferu vsechny casovaci
//**  znaky.
//**
//*****************************************************************************

void PB_StopTimeOut( PTProfibus PB )
{
  if ( PB->TimeOutState == TO_Running )
  {
    PB->TimeOutState = TO_Stopped;    
    ProfiM_ClearTimingChars( PB->DeviceExtension ); 
  }    
  PB->TimeOutState = TO_Stopped;      
}



//*****************************************************************************
//**  Nastavi odpocitavani time-outu a pokud je podminka StartCondition
//**  TO_StartNow tak jej i okamzite spusti. Je-li podminka rovna TO_StartTxEmpty
//**  dojde ke spusteni odpoctu time-outu az po vyslani celeho datoveho ramce
//**  z vysilaciho bufferu.
//**
//**  Parametry:
//**  ----------
//**  _interval    - pozadovany interval v Tbit(ech)
//**  StartCondition - viz. vyse  
//**
//*****************************************************************************

void PB_SetTimeOut( PTProfibus PB,
                    int _interval,
                    TTimeOutStartCondition StartCondition )
{
  PB->LastTicks = GetCurrentTicks();
  PB->TO_Interval = _interval;

  switch ( StartCondition )
  {
    case TO_StartNow:
      PB->TimeOutTicks = PB->LastTicks + PB->TO_Interval * PB->Tbit;
      PB_StartTimeOut( PB );
      break;
    case TO_StartTxEmpty:
      PB->TimeOutState = TO_WaittingTxEmpty;
      break;
  }
}


//*****************************************************************************
//**  Umoznuje pokracovani v odpoctu time-outu i po jeho zastaveni. Vyuzivano
//**  pokud je potreba odpocet zastavit vyslanim odpovedi na sbernici (nemohou
//**  byt vysilany casovaci znaky)
//**
//*****************************************************************************

void PB_ContinueTimeOut( PTProfibus PB )
{
  PB->TO_Interval = ( int ) ( PB->TimeOutTicks - GetCurrentTicks() ) /
                    PB->Tbit;    // zbyly interval
  if ( PB->TO_Interval > 0 )
    PB_StartTimeOut( PB );
  else
    PB_TimeTick( PB );
}


//*****************************************************************************
//**  Vysle na sbernici "pocet" casovacich znaku - po vyslani vsech je zavola-
//**  na funkce PB_TimeTick
//**
//*****************************************************************************

void PB_SendNextTimingChars( PTProfibus PB, int pocet )
{
  
  int   i;
  UCHAR Buffer[DEF_BUFFER_SIZE];
  UCHAR TypeBuffer[DEF_BUFFER_SIZE]; 

  //DbgPrint("PB: Pocet pozadovanych casovacich znaku: %d\n",pocet);  
  if ( pocet == 0 )
    pocet = 1;  // alespon jeden casovaci znak;

  //
  // Pokud je pocet casovacich znaku vetsi nez se vejde do bufferu, je tento
  // pocet zkracen. Dodrzeni pozadovaneho intervalu je zajisteno pripadnym
  // opetovnym naplnenim bufferu casovacimi znaky na zacatku PB_TimeTick
  //
  if ( pocet > DEF_BUFFER_SIZE )
    pocet = DEF_BUFFER_SIZE - 10;


  for ( i = 0; i < pocet; i++ )
  {
    Buffer[i] = TIMING_BYTE;
    TypeBuffer[i] = TIMING_CHAR;
  }

  ProfiM_SendOut( PB->DeviceExtension, Buffer, TypeBuffer, pocet );
  
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品免费99久久| 日韩成人精品视频| 美女视频网站久久| 国产成人免费视频一区| 欧美日韩国产bt| 日本一区二区三级电影在线观看 | 欧美性大战久久久久久久| 精品国产一区a| 亚洲综合男人的天堂| 国产91精品入口| 精品日韩欧美一区二区| 中文字幕综合网| 国产精品一区二区无线| 日韩美一区二区三区| 亚洲综合一区二区精品导航| 丁香另类激情小说| 精品国产乱码久久久久久图片| 亚洲福利视频一区二区| 91视视频在线观看入口直接观看www | 成人av动漫在线| 精品美女一区二区三区| 天堂一区二区在线免费观看| 91同城在线观看| 国产精品毛片久久久久久久| 久久99精品国产.久久久久久| 欧美久久久一区| 亚洲午夜激情网页| 日本精品一区二区三区高清| 中文字幕一区二区三区av| 成人夜色视频网站在线观看| 久久久久综合网| 国产在线不卡一区| 久久午夜国产精品| 国产主播一区二区| 久久婷婷一区二区三区| 韩国av一区二区三区四区| 日韩午夜中文字幕| 久久国产精品色婷婷| 精品捆绑美女sm三区| 久99久精品视频免费观看| 精品欧美一区二区在线观看| 国产米奇在线777精品观看| 久久综合九色综合97婷婷女人 | 成人av中文字幕| 国产精品伦理在线| 色吧成人激情小说| 亚洲福利视频一区二区| 日韩欧美在线1卡| 精品一区二区三区久久久| 久久久久久99精品| 色综合久久中文字幕| 亚洲成人av中文| 日韩精品最新网址| 国产精品一区二区黑丝| 国产精品理伦片| 色综合激情五月| 视频一区免费在线观看| 精品国产sm最大网站| 99久久国产综合精品色伊| 亚洲国产一区在线观看| 欧美一级片在线| 丁香桃色午夜亚洲一区二区三区| 国产精品卡一卡二卡三| 欧美日韩国产首页在线观看| 精品一区免费av| 国产精品传媒入口麻豆| 欧美人xxxx| 国产1区2区3区精品美女| 伊人一区二区三区| 日韩欧美另类在线| 99久久精品国产一区二区三区 | 日韩一级高清毛片| 国产999精品久久久久久绿帽| 亚洲九九爱视频| 精品国产一区二区三区久久影院| 99久久精品一区二区| 美女一区二区三区在线观看| 中文字幕在线不卡视频| 日韩欧美一区二区视频| 成人av网址在线观看| 免费精品视频在线| 亚洲男人都懂的| 国产午夜亚洲精品午夜鲁丝片 | 日本sm残虐另类| 国产精品第四页| 欧美大度的电影原声| 在线一区二区三区四区五区| 国产精品99久久久久久宅男| 无码av免费一区二区三区试看 | 日韩av一区二区三区四区| 中文字幕va一区二区三区| 欧美一区日韩一区| 91黄色激情网站| 粉嫩av一区二区三区| 久久精品国产77777蜜臀| 亚洲午夜久久久| 亚洲三级视频在线观看| 久久噜噜亚洲综合| 日韩欧美国产精品一区| 欧美在线啊v一区| 99精品久久久久久| 国产福利一区在线观看| 麻豆精品蜜桃视频网站| 秋霞午夜av一区二区三区| 亚洲一卡二卡三卡四卡无卡久久 | 久久无码av三级| 日韩三级在线免费观看| 欧美精品在线视频| 欧美午夜精品久久久久久孕妇| 成人免费高清在线观看| 国产成人亚洲精品青草天美| 久久精品国产77777蜜臀| 美腿丝袜一区二区三区| 日本在线观看不卡视频| 视频一区中文字幕| 日韩精品视频网站| 蜜桃精品在线观看| 美女被吸乳得到大胸91| 久久99精品久久久| 国产乱一区二区| 国产成人精品一区二| 国产91精品入口| av午夜一区麻豆| 91看片淫黄大片一级在线观看| 91丝袜美腿高跟国产极品老师| 97久久人人超碰| 欧洲一区二区三区在线| 在线观看网站黄不卡| 欧美日韩精品三区| 欧美情侣在线播放| 91麻豆精品国产91久久久| 欧美一级精品大片| 久久一二三国产| 国产精品美女视频| 一区二区三区电影在线播| 亚洲国产精品嫩草影院| 麻豆精品视频在线观看视频| 国产精品99久久久久久久vr| 波多野洁衣一区| 欧美综合久久久| 欧美一二三区在线| 中文字幕精品综合| 亚洲一区二区三区自拍| 天涯成人国产亚洲精品一区av| 麻豆一区二区99久久久久| 成人免费av在线| 精品视频1区2区| 久久久精品日韩欧美| 亚洲欧洲综合另类| 精品一区二区三区视频| 99国产一区二区三精品乱码| 欧美乱妇20p| 国产日韩精品一区| 亚洲自拍偷拍av| 国产九色精品成人porny| 91免费精品国自产拍在线不卡| 91精品国产综合久久小美女| 国产欧美一区二区三区在线老狼| 亚洲一区二区三区中文字幕| 狠狠狠色丁香婷婷综合激情| 91黄色在线观看| 久久蜜臀精品av| 日韩在线一二三区| www.日本不卡| 日韩午夜小视频| 亚洲免费观看在线观看| 久草这里只有精品视频| 欧洲视频一区二区| 国产日韩欧美精品综合| 蜜臀久久99精品久久久画质超高清 | 欧美性欧美巨大黑白大战| 久久只精品国产| 亚洲成人动漫精品| 99久久精品情趣| 欧美极品另类videosde| 久久精品av麻豆的观看方式| 欧美性猛交一区二区三区精品| 欧美国产精品久久| 韩日精品视频一区| 在线成人午夜影院| 亚洲免费视频成人| 99久久伊人久久99| 欧美激情综合在线| 国产九九视频一区二区三区| 欧美一区二区三区免费在线看 | 国产精品国产三级国产aⅴ原创| 免费成人在线网站| 欧美肥大bbwbbw高潮| 亚洲色图欧美偷拍| 99视频有精品| 欧美韩日一区二区三区| 国内精品久久久久影院薰衣草| 这里只有精品免费| 日韩在线观看一区二区| 在线不卡a资源高清| 亚洲午夜激情网站| 欧美精品在线观看一区二区| 亚洲成人资源在线| 欧美日韩一区在线| 日日夜夜精品视频天天综合网|