亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲三级在线免费| 亚洲欧美怡红院| 94色蜜桃网一区二区三区| 亚洲一区二区美女| 欧美精品一区二区三区在线播放 | 视频一区欧美日韩| 中文字幕一区在线观看| 日韩美女在线视频| 欧美性xxxxxx少妇| www.日本不卡| 国产成人午夜视频| 麻豆国产91在线播放| 亚洲成人综合网站| 中文字幕在线不卡一区| 欧美一区二区三区在线观看 | 中文字幕一区视频| 精品精品国产高清a毛片牛牛 | 色综合天天综合狠狠| 国产高清在线精品| 麻豆国产精品视频| 亚洲图片有声小说| 亚洲日本在线a| 中文字幕在线不卡一区二区三区 | 久久噜噜亚洲综合| 欧美一区二区人人喊爽| 欧美探花视频资源| 日本精品免费观看高清观看| 99久久伊人久久99| 麻豆91精品视频| 视频一区二区国产| 日韩成人dvd| 天天综合色天天综合| 午夜久久久影院| 性做久久久久久久免费看| 亚洲一卡二卡三卡四卡无卡久久 | 国产成人免费9x9x人网站视频| 日本欧美一区二区三区乱码| 日本一道高清亚洲日美韩| 亚洲v日本v欧美v久久精品| 亚洲国产一区二区在线播放| 一区二区三区在线免费观看| 亚洲精品视频自拍| 亚洲一区二区影院| 天堂成人免费av电影一区| 日日摸夜夜添夜夜添国产精品 | 成人avav影音| 国产成人精品综合在线观看| 国产91精品一区二区麻豆亚洲| 韩国v欧美v日本v亚洲v| 国产美女精品一区二区三区| 久久99久久精品| 国产另类ts人妖一区二区| 久久 天天综合| 国产福利电影一区二区三区| 成+人+亚洲+综合天堂| 91玉足脚交白嫩脚丫在线播放| av一本久道久久综合久久鬼色| 91丨九色丨黑人外教| 在线观看一区日韩| 91精品国产入口| 久久一留热品黄| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产精品久久99| 亚洲成在人线在线播放| 久久国产精品99久久人人澡| 国产aⅴ综合色| 色综合久久久久综合体| 欧美日韩电影在线| 久久一区二区视频| 亚洲黄色小视频| 麻豆91在线看| 99精品在线免费| 欧美精品1区2区3区| 久久久一区二区| 一区二区三区成人在线视频| 久久爱www久久做| 99精品国产热久久91蜜凸| 欧美精品自拍偷拍| 欧美经典一区二区三区| 亚洲午夜国产一区99re久久| 国产一区二区三区免费观看| 日本韩国欧美在线| 久久久噜噜噜久久人人看 | 91精品国产全国免费观看| 久久久久久夜精品精品免费| 亚洲精品菠萝久久久久久久| 午夜亚洲福利老司机| 国产福利一区在线| 欧美精品自拍偷拍| 中文字幕一区二区三| 男女男精品视频网| 99国产一区二区三精品乱码| 欧美成人vps| 亚洲一区二区三区四区在线免费观看 | 日韩国产欧美三级| av毛片久久久久**hd| 日韩免费高清视频| 亚洲成人你懂的| 99久久精品免费看国产免费软件| 日韩美女一区二区三区四区| 亚洲午夜久久久久中文字幕久| 国产成人在线观看免费网站| 777亚洲妇女| 亚洲精品久久久蜜桃| 成人丝袜18视频在线观看| 日韩美女天天操| 香蕉影视欧美成人| 91精品福利在线| 中文字幕亚洲区| 国产福利一区二区| 久久这里只有精品视频网| 日韩精品欧美精品| 欧美天堂亚洲电影院在线播放| 亚洲人成网站在线| 99久久国产综合精品麻豆| 国产欧美一区二区三区沐欲| 韩国欧美一区二区| 日韩精品一区二区三区三区免费| 肉色丝袜一区二区| 欧美色欧美亚洲另类二区| 亚洲人成小说网站色在线| 国产99久久久国产精品潘金网站| 欧美va亚洲va| 美女视频黄频大全不卡视频在线播放| 欧美日韩一本到| 亚洲一区二区三区不卡国产欧美| 一本大道久久a久久综合婷婷 | 精品亚洲国内自在自线福利| 日韩欧美国产不卡| 日韩福利视频导航| 日韩区在线观看| 久久9热精品视频| 亚洲精品一线二线三线无人区| 精品亚洲免费视频| 久久综合网色—综合色88| 久久99精品久久久久久国产越南| 日韩午夜在线播放| 激情久久五月天| 国产欧美一区二区精品性色| 国产成人av一区二区三区在线观看| 国产亚洲精品免费| aaa亚洲精品| 亚洲欧美一区二区三区孕妇| 欧美在线你懂得| 天堂久久一区二区三区| 日韩欧美一级片| 国产成人一区在线| 中文字幕一区三区| 欧美日韩一区三区| 另类小说色综合网站| 26uuu精品一区二区在线观看| 国产盗摄女厕一区二区三区| 国产精品久久久久四虎| 972aa.com艺术欧美| 亚洲国产精品一区二区尤物区| 91精品欧美综合在线观看最新| 久久超碰97人人做人人爱| 亚洲国产成人午夜在线一区| 91麻豆福利精品推荐| 亚洲午夜国产一区99re久久| 日韩女同互慰一区二区| 高清在线观看日韩| 亚洲va天堂va国产va久| 精品捆绑美女sm三区| 成人免费福利片| 亚洲 欧美综合在线网络| 久久日韩粉嫩一区二区三区 | 亚洲精品一区二区三区影院| 国产99久久久国产精品免费看| 国产精品久久毛片av大全日韩| 欧美性受极品xxxx喷水| 久久av老司机精品网站导航| 中文字幕亚洲欧美在线不卡| 在线播放91灌醉迷j高跟美女 | 日韩中文字幕麻豆| 国产日产欧产精品推荐色| 欧美视频日韩视频| 国产精品亚洲一区二区三区妖精 | 亚洲不卡av一区二区三区| 久久先锋影音av| 色先锋资源久久综合| 精品在线观看免费| 亚洲男人天堂av| 2024国产精品视频| 欧美日韩高清一区二区| 成人黄色在线看| 日本aⅴ亚洲精品中文乱码| 综合电影一区二区三区| 日韩精品一区在线| 欧美中文字幕亚洲一区二区va在线 | 亚洲综合一区二区三区| 国产亚洲精品bt天堂精选| 精品视频资源站| 成人97人人超碰人人99| 免费在线成人网| 亚洲自拍另类综合| 中文字幕国产一区| 久久久久久久久久久99999| 91精品国产综合久久蜜臀| 91蜜桃传媒精品久久久一区二区|