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

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

?? profibus.c

?? profibus-dp主站源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
//-----------------------------------------------------------------------------
// $Id: profibus.c,v 1.0.0                                          2004/01/13
//-----------------------------------------------------------------------------
//
//      ProfiM - PROFIBUS MASTER DRIVER FOR WINDOWS NT/2000
//
// Author:  
//      Pavel Trnka, CTU FEE
//      trnkap@seznam.cz
// With help and advices from:
//      Ing. Petr Smolik, CTU FEE
//      Ing. Pavel Pisa, CTU FEE
//      Ing. Pavel Burget, CTU FEE
//
//-----------------------------------------------------------------------------
//
// Popis:
// ------
//   Hlavni cast ProfiMu. Zajistuje beh stavoveho automatu Profibus mastera,
// zpracovavani pozadavku od aplikacni vrstvy, reakce na prichozi ramce ze
// sbernice. Dale zajistuje detekci chybovych stavu na sbernici a v samotnem
// Masteru s jejich naslednym zotavenim.
//
// Funkce volane z vnejsku:
// ---------------------------
//
//   PB_Init    - Inicializace Profibus mastera
//   PB_Close   - Ukonceni cinnosti
//   PB_RxByte    - Predani prijateho znaku ze sbernice nizsi vrstvou
//            masterovi
//   PB_TimeTick  - Vyvolan po vyprseni time-outu nebo vyprseni maximalne
//            mozneho intervalu, ktery casovani umoznuje. Casovani
//            je zajisteno z nizsi vrsty.
//   PB_FrameOut  - Nizsi vrstva oznamuje masterovi, ze na sbernici byl
//            vyslan cely ramec.
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------


#include "Profibus.h"


//*****************************************************************************
//**  Inicializace objektu TProfibus
//**  vytvoreni LASu, GAPu a pristupovych bodu SAP
//**  nacteni konfigurace z registru nebo pouziti default parametru
//**
//**  Parametry:
//**  DeviceExtension - ukazatel na Device Extension ovladace obsahujici
//**            objekt TProfibus
//**  RegistryPath  - cesta k parametrum v registrech
//**
//*****************************************************************************

void PB_Init( PTProfibus PB,
              void *DeviceExtension,
              PUNICODE_STRING RegistryPath )
{
  LARGE_INTEGER f;

  if ( !DeviceExtension )
  {
    DbgPrint( "PB: PB_Init Error - DeviceExtension is NULL!" );
    return;
  }        
  /*      if (DeviceExtension->magic!=PROFIM_MAGIC) {   
          DbgPrint("PB: PB_Init Error - Device Extension MAGIC is invalid!");
        return;
      }*/

  //
  // Ulozeni ukazatele na DeviceExtension ovladace k umozneni pristupu k datum
  // ovladace z ostatnich rutin Profibus Mastera
  //
  PB->DeviceExtension = DeviceExtension;


  //
  // Nacteni konfigurace Profibus Mastera z registru
  //
  #ifdef PnP
    PB_GetConfigurationPnP( PB );
  #endif
  #ifndef PnP
    PB_GetConfiguration( PB, RegistryPath );
  #endif  

  //
  // Inicializace pouzivanych datovych struktur
  //
  LAS_Init( &PB->LAS, PB->HSA + 1 );      // lepe 128
  GAPL_Init( &PB->GAPL, PB->HSA + 1, PB->TS );
  SAP_Init( &PB->SAP, 64 );
  ReqB_Init( &PB->ReqB, PB->DeviceExtension );
  ResB_Init( &PB->ResB, PB->DeviceExtension );


  //
  // Zjisteni konstant pro presne odecty casovych intervalu. Je vyuzivan Performance Counter.
  // Pozor uplne jinak nez v user space - vraci frekvenci v parametru a hodnotu casovace jako vysledek
  //
  KeQueryPerformanceCounter( &f );
  //
  // Vypocet kolik ticku Performance counteru odpovida intervalu Tbit (doba vysilani jednoho bitu)
  //          
  PB->Tbit = ( int ) /*124;*/f.QuadPart /
             PB->BaudRateNum/*Baud_rate_num_default*/;  // pocet tiku Performance Counteru na jeden bit = Tbit 
  PB->Tbit3x = 3 * PB->Tbit;
  PB_DbgPrintL3( "PB:   Tbit=        %d Performance Counter ticks\n", PB->Tbit );
  PB->LastTicks = GetCurrentTicks();
  PB->LastUseTokenEntryTicks = GetCurrentTicks();        // melo by byt jinde - takhle pri prvnim vstupu do Use_Token nemame cas na nic

  PB->TimeOutState = TO_Stopped;
  
  PB->ActualRequest = &(PB->ReqB.LowBuffer[0]); // inicializace pro pripad chybneho predcasneho pouziti ActualRequestu (jinak nema vyznam)

  //
  // Inicializace identifikacni datove struktury
  //
  PB->Ident[0] = strlen( Vendor_name );
  PB->Ident[1] = strlen( Controller_type );
  PB->Ident[2] = strlen( HW_release );
  PB->Ident[3] = strlen( SW_release );
  PB->Ident[4] = '\x00';
  strcat( PB->Ident, Vendor_name );
  strcat( PB->Ident, Controller_type );
  strcat( PB->Ident, HW_release );
  strcat( PB->Ident, SW_release );    
  
  
  #ifdef USE_WATCHDOG
    //
    // Inicializace WatchDog timeru
    //  
    ProfiM_StartWatchDogTimer( PB->DeviceExtension );                      
  #endif

  //
  //  Spusteni Profibus Mastera
  //
  PB_InitMaster( PB );
}



//*****************************************************************************
//** Nacteni parametru Mastera z registru. Pokud se nezadari jsou pouzity
//** default parametry.
//**
//**  Parametry:
//**  RegistryPath  - cesta k parametrum v registrech
//**
//*****************************************************************************

void PB_GetConfiguration( PTProfibus PB, PUNICODE_STRING RegistryPath )
{
  /*
        PB->TS=       TS_default;
        PB->HSA=      HSA_default;
        PB->G=        G_default;
        PB->BaudRate=   Baud_rate_default;
        PB->retry_ctr=    retry_ctr_default;
        PB->default_sap=  default_sap_default;
        PB->tsl=      TSL_default;
        PB->tqui=     TQUI_default;
        PB->tset=     TSET_default;
        PB->min_tsdr=   min_TSDR_default;
        PB->max_tsdr=   max_TSDR_default;        
        PB->ttr=      TTR_default;
  */

  PRTL_QUERY_REGISTRY_TABLE parameters      = NULL;
  UNICODE_STRING            parametersPath;

  ULONG                     notThereDefault = 1234567;
  ULONG                     TSDefault;
  ULONG                     HSADefault;
  ULONG                     GDefault;
  ULONG                     Baud_rateDefault;
  ULONG                     retry_ctrDefault;
  ULONG                     default_sapDefault;
  ULONG                     TSLDefault;
  ULONG                     TQUIDefault;
  ULONG                     TSETDefault;
  ULONG                     min_TSDRDefault;
  ULONG                     max_TSDRDefault;    
  ULONG                     TTRDefault; 

  NTSTATUS                  status          = STATUS_SUCCESS;
  PWSTR                     path            = NULL;
  USHORT                    queriesPlusOne  = 13;   // Pocet polozek ctenych z registru plus jedna

  int                       i;
  int                       BR;

  //
  // Nastaveni parametru nectenych z registru na default hodnoty
  //
  PB->medium_red = medium_red_default;
  PB->in_ring_desired = in_ring_desired_default;
  PB->physical_layer = physical_layer_default;


  //
  // Naplneni datovych struktur parametersPath a parameters pro
  // dotaz do registru pomoci fce RtlQueryRegistryValues    
  //

  parametersPath.Buffer = NULL;

  //
  // Registry path is already null-terminated, so just use it.
  //
  path = RegistryPath->Buffer;

  //
  // Allocate the Rtl query table.
  //
  parameters = ExAllocatePool( PagedPool,
                               sizeof( RTL_QUERY_REGISTRY_TABLE ) * queriesPlusOne );

  if ( !parameters )
  {
    PB_DbgPrintL3( "PB: ExAllocatePool failed for Rtl in GetConfiguration\n" );
    status = STATUS_UNSUCCESSFUL;
  }
  else
  {
    RtlZeroMemory( parameters,
                   sizeof( RTL_QUERY_REGISTRY_TABLE ) * queriesPlusOne );

    //
    // Form a path to this driver's Parameters subkey.
    //

    RtlInitUnicodeString( &parametersPath, NULL );

    parametersPath.MaximumLength = RegistryPath->Length +
                                   sizeof( L"\\Parameters" );

    parametersPath.Buffer = ExAllocatePool( PagedPool,
                                            parametersPath.MaximumLength );

    if ( !parametersPath.Buffer )
    {
      PB_DbgPrintL3( "PB: ExAllocatePool failed for Path in GetConfiguration\n" );
      status = STATUS_UNSUCCESSFUL;
    }
  }

  if ( NT_SUCCESS( status ) )
  {
    //
    // Form the parameters path.
    //

    RtlZeroMemory( parametersPath.Buffer, parametersPath.MaximumLength );
    RtlAppendUnicodeToString( &parametersPath, path );
    RtlAppendUnicodeToString( &parametersPath, L"\\Parameters" );

    //
    // Gather all of the "user specified" information from
    // the registry.
    //

    for ( i = 0; i < queriesPlusOne - 1; i++ )
    {
      parameters[i].Flags = RTL_QUERY_REGISTRY_DIRECT;
      parameters[i].DefaultType = REG_DWORD;
      parameters[i].DefaultData = &notThereDefault;
      parameters[i].DefaultLength = sizeof( ULONG );
    }


    parameters[0].Name = L"TS";
    parameters[0].EntryContext = &TSDefault;
    parameters[1].Name = L"HSA";
    parameters[1].EntryContext = &HSADefault;
    parameters[2].Name = L"G";
    parameters[2].EntryContext = &GDefault;
    parameters[3].Name = L"Baud Rate";
    parameters[3].EntryContext = &Baud_rateDefault;        
    parameters[4].Name = L"retry_ctr";
    parameters[4].EntryContext = &retry_ctrDefault;                
    parameters[5].Name = L"default_sap";
    parameters[5].EntryContext = &default_sapDefault;                
    parameters[6].Name = L"TSL";
    parameters[6].EntryContext = &TSLDefault;                
    parameters[7].Name = L"TQUI";
    parameters[7].EntryContext = &TQUIDefault;                
    parameters[8].Name = L"TSET";
    parameters[8].EntryContext = &TSETDefault;                
    parameters[9].Name = L"min_TSDR";
    parameters[9].EntryContext = &min_TSDRDefault;              
    parameters[10].Name = L"max_TSDR";
    parameters[10].EntryContext = &max_TSDRDefault;                
    parameters[11].Name = L"TTR";
    parameters[11].EntryContext = &TTRDefault;                


    status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE |
                                     RTL_REGISTRY_OPTIONAL,
                                     parametersPath.Buffer,
                                     parameters,
                                     NULL,
                                     NULL );

    if ( !NT_SUCCESS( status ) )
    {
      PB_DbgPrintL3( "PB: Chyba pri cteni parametru z registru!\n" );
    }
    else
    {
      PB_DbgPrintL3( "PB: Parametry uspesne precteny z registru.\n" );
    }


    status = STATUS_SUCCESS;
  }

  //
  // Pokud parametr nebyl z registru precten priradi default hodnotu
  //

  if ( TSDefault == notThereDefault )
    PB->TS = TS_default;
  else
    PB->TS = TSDefault;
  if ( HSADefault == notThereDefault )
    PB->HSA = HSA_default;
  else
    PB->HSA = HSADefault;
  if ( GDefault == notThereDefault )
    PB->G = G_default;
  else
    PB->G = GDefault;
  if ( retry_ctrDefault == notThereDefault )
    PB->retry_ctr = retry_ctr_default;
  else
    PB->retry_ctr = retry_ctrDefault;
  if ( default_sapDefault == notThereDefault )
    PB->default_sap = default_sap_default;
  else
    PB->default_sap = default_sapDefault;
  if ( TSLDefault == notThereDefault )
    PB->tsl = TSL_default;
  else
    PB->tsl = TSLDefault;
  if ( TQUIDefault == notThereDefault )
    PB->tqui = TQUI_default;
  else
    PB->tqui = TQUIDefault;
  if ( TSETDefault == notThereDefault )
    PB->tset = TSET_default;
  else
    PB->tset = TSETDefault;
  if ( min_TSDRDefault == notThereDefault )
    PB->min_tsdr = min_TSDR_default;
  else
    PB->min_tsdr = min_TSDRDefault;
  if ( max_TSDRDefault == notThereDefault )
    PB->max_tsdr = max_TSDR_default;
  else
    PB->max_tsdr = max_TSDRDefault;
  if ( TTRDefault == notThereDefault )
    PB->ttr = TTR_default;
  else
    PB->ttr = TTRDefault;


  if ( Baud_rateDefault == notThereDefault )
    BR = Baud_rate_num_default;
  else
    BR = Baud_rateDefault;

  PB->BaudRateNum = BR;

  switch ( BR )
  {
    case 9600:
      PB->BaudRate = kbaud_9_6;   break;
    case 19200:
      PB->BaudRate = kbaud_19_2;  break;        
    case 45450:
      PB->BaudRate = kbaud_45_45; break;                
    case 93750:
      PB->BaudRate = kbaud_93_75; break;                
    case 187500:
      PB->BaudRate = kbaud_187_5; break;                
    case 375000:
      PB->BaudRate = kbaud_375;   break;                        
    case 500000:
      PB->BaudRate = kbaud_500;   break;                
    case 750000:
      PB->BaudRate = kbaud_750;   break;                        
    case 1500000:
      PB->BaudRate = mbaud_1_5;   break;                        
    case 3000000:
      PB->BaudRate = mbaud_3;   break;
    case 6000000:
      PB->BaudRate = mbaud_6;   break;        
    case 12000000:
      PB->BaudRate = mbaud_12;    break;        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费高清在线视频一区·| 亚洲综合色婷婷| 欧美一二三四区在线| 色一情一乱一乱一91av| 成人免费看黄yyy456| 国产毛片一区二区| 国产寡妇亲子伦一区二区| 国产在线观看一区二区| 国产精品自产自拍| 国产麻豆成人精品| 风间由美中文字幕在线看视频国产欧美 | 亚洲免费视频成人| 亚洲精品免费看| 亚洲夂夂婷婷色拍ww47| 一区二区激情小说| 天天综合色天天综合| 日韩高清国产一区在线| 久久国产精品72免费观看| 狠狠色狠狠色综合| 成人手机在线视频| 色婷婷av一区二区三区软件| 欧美日韩一区国产| 精品日韩欧美在线| 欧美激情自拍偷拍| 一区二区三区av电影| 日本aⅴ免费视频一区二区三区| 日韩黄色一级片| 国产高清精品久久久久| 99久久婷婷国产综合精品| 欧美色图在线观看| 久久亚洲欧美国产精品乐播| 亚洲欧洲99久久| 天天操天天色综合| 成人三级伦理片| 欧美欧美欧美欧美| 欧美国产日本韩| 日韩一区精品字幕| eeuss鲁片一区二区三区在线看| 欧美性感一类影片在线播放| 26uuu国产电影一区二区| 亚洲视频免费看| 蜜桃av一区二区三区电影| 国产91在线观看| 欧美一区二区三区的| 国产欧美日韩在线观看| 香蕉乱码成人久久天堂爱免费| 久久97超碰国产精品超碰| 色婷婷国产精品| 国产日韩三级在线| 日韩国产欧美一区二区三区| 99re成人在线| 欧美mv日韩mv国产网站| 亚洲一区二区三区爽爽爽爽爽| 国产一二精品视频| 欧美日韩精品二区第二页| 国产精品无码永久免费888| 蜜臀久久99精品久久久久久9 | 亚洲色图欧洲色图婷婷| 日本不卡中文字幕| 欧美中文字幕不卡| 中文字幕国产一区二区| 老司机精品视频一区二区三区| 色香蕉久久蜜桃| 亚洲视频每日更新| caoporn国产精品| 国产亚洲一区字幕| 国内一区二区在线| 欧美顶级少妇做爰| 亚欧色一区w666天堂| 色综合天天天天做夜夜夜夜做| 久久精品视频免费| 黄页网站大全一区二区| 日韩欧美不卡在线观看视频| 亚洲一二三四区| 欧美亚洲动漫精品| 亚洲高清一区二区三区| 色94色欧美sute亚洲线路一ni| 国产精品私人自拍| 成人午夜激情在线| 欧美国产一区在线| av中文字幕不卡| 亚洲色图19p| 色欲综合视频天天天| 亚洲欧美日韩国产手机在线 | 精品国产一区二区三区忘忧草 | 91污在线观看| 亚洲色图欧洲色图| 欧美午夜免费电影| 天堂va蜜桃一区二区三区 | 成人动漫视频在线| 中文字幕一区二区视频| youjizz久久| 亚洲综合在线免费观看| 欧美精品日韩精品| 国精品**一区二区三区在线蜜桃| 欧美大度的电影原声| 国产精品一区二区在线观看网站| 国产视频一区在线观看| av在线不卡免费看| 亚洲福利视频一区| 日韩精品一区二区三区三区免费| 国产一区二区三区免费看 | 精品国产露脸精彩对白| 国产精品性做久久久久久| 亚洲视频香蕉人妖| 欧美亚洲一区二区在线| 丝瓜av网站精品一区二区| 日韩欧美国产一区二区三区| 高清成人在线观看| 亚洲成人动漫在线免费观看| 精品久久一区二区| 91亚洲精华国产精华精华液| 性做久久久久久| 久久蜜桃香蕉精品一区二区三区| 国产91精品在线观看| 亚洲国产成人av网| 国产女主播在线一区二区| 在线观看视频欧美| 国产老妇另类xxxxx| 亚洲一区免费观看| 国产亚洲欧美日韩俺去了| 欧美性猛片aaaaaaa做受| 国产一区二区精品在线观看| 一区二区三区在线观看网站| 精品成人私密视频| 精品婷婷伊人一区三区三| 国产精品996| 日韩国产精品久久| 中文字幕在线不卡一区二区三区| 337p亚洲精品色噜噜狠狠| 91在线观看下载| 奇米影视在线99精品| 亚洲综合av网| 欧美国产一区二区| 精品入口麻豆88视频| 制服丝袜在线91| 欧美日韩精品欧美日韩精品 | 欧美日韩你懂的| 91亚洲午夜精品久久久久久| 国产91露脸合集magnet| 国产在线视频精品一区| 日本亚洲一区二区| 亚洲成av人片在线观看| 亚洲精品ww久久久久久p站| 国产欧美日韩综合精品一区二区| 欧美一级夜夜爽| 7777精品伊人久久久大香线蕉超级流畅 | 欧美亚洲尤物久久| 91蝌蚪porny成人天涯| 波多野结衣中文一区| 国产盗摄一区二区三区| 国产一区二区精品久久91| 加勒比av一区二区| 日韩av一区二区在线影视| 亚洲6080在线| 性做久久久久久久免费看| 亚洲成人资源在线| 日韩高清不卡一区二区| 日韩一区精品字幕| 日韩精品福利网| 美腿丝袜在线亚洲一区| 日本亚洲视频在线| 精品制服美女丁香| 精品一区二区在线播放| 国产一区二区看久久| 国产成人av电影免费在线观看| 国产精品亚洲专一区二区三区 | 亚洲乱码国产乱码精品精小说 | 国产揄拍国内精品对白| 国产又黄又大久久| 91丨九色丨蝌蚪丨老版| 色先锋久久av资源部| 91精品国产手机| 精品电影一区二区三区| 国产精品久久久久久久久图文区| 国产精品国产三级国产a| 亚洲美女在线一区| 视频在线观看91| 国内精品在线播放| av一区二区三区四区| 欧美综合欧美视频| 日韩精品一区国产麻豆| 国产精品久久久久久久久晋中| 亚洲免费观看高清完整版在线观看 | 成人h动漫精品一区二| 色香蕉久久蜜桃| 精品欧美一区二区在线观看 | 99热这里都是精品| 欧美日韩一级片网站| 久久久三级国产网站| 1区2区3区精品视频| 日韩成人午夜电影| 成人深夜福利app| 欧美一区二区人人喊爽| 亚洲婷婷综合久久一本伊一区 | 成人免费毛片app| 欧美一区二区三区色| 亚洲视频香蕉人妖| 韩国av一区二区| 91麻豆精品久久久久蜜臀|