亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚州成人在线电影| 亚洲午夜久久久久久久久久久| 色先锋aa成人| 国内外成人在线| 日精品一区二区| 午夜成人免费视频| 日韩高清中文字幕一区| 日本欧美一区二区| 在线观看成人免费视频| 色综合夜色一区| 91猫先生在线| 91老司机福利 在线| 国产午夜一区二区三区| 亚洲国产高清在线观看视频| 成人免费小视频| 亚洲天堂免费在线观看视频| 亚洲精品大片www| 亚洲电影一区二区三区| 成人一级视频在线观看| 91小视频免费观看| 国产午夜精品在线观看| 极品少妇xxxx精品少妇| 成人午夜视频网站| 精品国产乱码久久久久久夜甘婷婷| 日韩欧美一区在线观看| 精品国产sm最大网站| 日本欧美一区二区| 日韩一区二区三区免费看| 亚瑟在线精品视频| 91麻豆精品国产91久久久久久| 欧美久久久久久久久| 国产亚洲欧美中文| 国产传媒欧美日韩成人| 在线观看欧美日本| 亚洲国产精品一区二区www在线| 欧美午夜一区二区| 久久影视一区二区| 亚洲自拍偷拍av| 大桥未久av一区二区三区中文| 国产色产综合产在线视频| 成人av影视在线观看| 在线播放日韩导航| 免费观看一级欧美片| 91蜜桃在线观看| 亚洲电影你懂得| 日韩一区二区三区视频在线观看| 精彩视频一区二区| 国产精品色哟哟| 国产在线国偷精品产拍免费yy| 欧美日韩dvd在线观看| 国产精品盗摄一区二区三区| 韩国毛片一区二区三区| 中文字幕av在线一区二区三区| 99re这里只有精品6| 日本一区二区三区在线观看| 美女网站色91| 欧美老肥妇做.爰bbww视频| 免费在线看成人av| 欧美国产精品v| 欧美熟乱第一页| 国产美女一区二区三区| 亚洲美女在线一区| 97久久精品人人做人人爽| 亚洲大片一区二区三区| 久久精品一二三| 欧美午夜精品久久久久久孕妇| 捆绑调教一区二区三区| 8v天堂国产在线一区二区| 久久99国产精品成人| 日韩理论片一区二区| 欧美精品一二三四| 成人午夜免费视频| 无码av中文一区二区三区桃花岛| 久久久不卡网国产精品二区| 久久99精品国产.久久久久| 亚洲免费三区一区二区| 精品蜜桃在线看| 国产乱色国产精品免费视频| 久久影音资源网| 欧美日韩三级一区二区| 喷白浆一区二区| 亚洲精品视频一区| 国产调教视频一区| 日韩欧美国产一区在线观看| 琪琪久久久久日韩精品| 综合精品久久久| 久久久精品tv| 精品少妇一区二区三区在线播放| 欧美午夜精品一区| 99国产精品视频免费观看| 国v精品久久久网| 亚洲男人天堂av网| 久久免费国产精品| 日韩欧美一二三区| 欧美丰满嫩嫩电影| 色999日韩国产欧美一区二区| 婷婷综合在线观看| 亚洲与欧洲av电影| 亚洲激情图片小说视频| 欧美激情在线观看视频免费| 亚洲精品一区二区三区影院| 5858s免费视频成人| 欧美三级蜜桃2在线观看| 91免费看`日韩一区二区| 99v久久综合狠狠综合久久| 国产大陆亚洲精品国产| 国产成人av资源| 国产精品白丝av| 成人性生交大合| 国产精品1024| 懂色中文一区二区在线播放| 国产成人精品亚洲日本在线桃色| 久久精品国产亚洲高清剧情介绍 | 美国十次了思思久久精品导航| 夜夜嗨av一区二区三区网页| 日韩一区二区三区高清免费看看 | 精品黑人一区二区三区久久| 日韩女同互慰一区二区| 欧美成人video| 久久久久久久久97黄色工厂| 国产亚洲1区2区3区| 国产精品久久久久久户外露出 | 狂野欧美性猛交blacked| 狠狠色综合日日| 国产不卡视频一区二区三区| 丁香天五香天堂综合| 97久久精品人人做人人爽50路| 色伊人久久综合中文字幕| 欧洲精品中文字幕| 91精品欧美久久久久久动漫| 精品久久一区二区| 欧美激情一区二区三区四区| 亚洲靠逼com| 蜜臀av国产精品久久久久| 国产一区二区三区观看| 99精品视频一区| 欧美日韩成人综合| 久久久久久电影| 亚洲免费av高清| 麻豆一区二区99久久久久| 风流少妇一区二区| 在线免费亚洲电影| 精品动漫一区二区三区在线观看| 国产精品久久国产精麻豆99网站 | 国产中文一区二区三区| 97久久精品人人澡人人爽| 欧美日韩一区二区三区高清 | 亚洲成在线观看| 国产高清精品网站| 欧美三级电影在线观看| 丝袜美腿一区二区三区| 国内精品伊人久久久久影院对白| heyzo一本久久综合| 成人性生交大片免费看中文| 欧美系列一区二区| 欧美激情一区二区三区全黄| 亚洲小说春色综合另类电影| 国内精品视频一区二区三区八戒| 91蝌蚪porny| 亚洲精品一区二区三区蜜桃下载| 亚洲精品美国一| 国产精品99久久久久久有的能看| 精品视频一区 二区 三区| 国产日韩欧美在线一区| 日韩中文字幕麻豆| 91一区二区三区在线播放| 欧美videos大乳护士334| 亚洲另类一区二区| 丁香啪啪综合成人亚洲小说| 欧美一级爆毛片| 亚洲精品免费在线| 99视频精品在线| 国产欧美一区二区三区沐欲| 麻豆国产精品官网| 欧美狂野另类xxxxoooo| 亚洲精品高清视频在线观看| 成人免费三级在线| 国产欧美精品日韩区二区麻豆天美| 日韩二区在线观看| 欧美三级资源在线| 亚洲一区二区高清| 91久久久免费一区二区| 国产精品国产三级国产专播品爱网 | 在线免费观看日本一区| 日本一区二区三区在线观看| 国产又黄又大久久| 欧美成人免费网站| 免费成人结看片| 在线成人免费视频| 五月激情综合网| 91精品国产综合久久精品性色| 亚洲国产日韩一级| 欧美三级欧美一级| 午夜在线成人av| 制服.丝袜.亚洲.另类.中文| 日韩高清在线一区| 精品少妇一区二区三区免费观看| 九九精品视频在线看| 欧美变态凌虐bdsm| 国产精品一区二区你懂的|