⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profibus.h

📁 SPC3 SETUP PROGRAMS SP C3 SETUP PROGRAMS
💻 H
字号:
//-----------------------------------------------------------------------------
// $Id: profibus.h,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
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------


#ifndef _PROFIBUS_H
#define _PROFIBUS_H

#include "NTDDK.H"

#include "vardef.h"
#include "lists.h"
#include "frame.h"
#include "SAP.h"

#include "buff.h" 
#include "fmaserver.h"
//#include "ReqBuff.h"


BOOLEAN QueryPerformanceFrequency( LARGE_INTEGER *lpFrequency );


typedef struct
{
    //stav stanice - Slave,Master_not_ready,Master_ready,Master_in_logical_ring
    TStationStatus            StationStatus;          

    int                       TS;
    int                       HSA;
    int                       G;
    baud_rate                 BaudRate;
    int                       BaudRateNum;

    // adresa stanice, ze ktere byl naposledy obdrzen Token
    int                       PS;                     
    
    // adresa stanice, ktere se naposledy predaval Token
    int                       NS;                     

    // odpocitavani pro dalsi aktualizaci GAPu (dekrementuje se pri prichodu do Pass_Token)
    int                       G_CountDown;            

    // indikuje studeny start okruhu
    BOOLEAN                   ColdStart;              

    TPBFrame                  RxFrame;

    //Vstupni buffer pro neuplne framy
    UCHAR                     InBuf[INBUF_SIZE];                  
    int                       InBufLen;

    TLAS                      LAS;
    TGAPL                     GAPL;
    TSAP                      SAP;

    TRequestBuffer            ReqB;
    TResultBuffer             ResB;
    
    // ukazatel do RequestBufferu na aktualni pozadavek
    fdl_rb                   *ActualRequest;          

    // Indication Request Block
    fdl_rb                    ind_rb;         

    //Jeden z deseti stavu mastera
    TMasterState              MasterState;            
    
    //Predchozi stav mastera
    TMasterState              LastState;              

    //vse inicializovano muzeme zacit zpracovavat preruseni
    BOOLEAN                   AllInitialized;     

  // <Casovani>
    __int64                   UseTokenEntryTicks;     // stav Performance Counteru pri vstupu do stavu Use Token
    __int64                   LastUseTokenEntryTicks;

    int                       Tbit;                   // pocet tiku Performance Counteru za periodu potrebnou pro vyslani jendoho bitu
    int                       Tbit3x;                 // 3*Tbit - pouziva se jako hranice pro prijem preruseni od modemu u PISA_IO
    TTimeOutState             TimeOutState;           // urcuje v jakem stavu se nachazi odpocitavani timeoutu
    __int64                   LastTicks;              // ulozi se pocet ticku pri odstartovani timeoutu (zavedenim TimeOutTicks snad ani neni potreba)
    __int64                   TimeOutTicks;           // hranice, pri ktere timeout vyprsi (je vypocitana, pri odstartovani timeoutu)
    int                       TO_Interval;            // timeout intetval v Tbit! Uklada se pri nastavovani timeoutu
  // </Casovani>        

    void            *         DeviceExtension;  // struktura pro propojeni s ovladacem - je to netypovy ukazatel kvuli vzajemnemu krizeni referenci
    PDEVICE_OBJECT            PhysicalDeviceObject;

    TServiceType              Service;      // typ aktualni sluzby - Remote / Local / No

    struct event_indication   fdl_ev;
    BOOLEAN                   FdlEventEnabled;

    UCHAR                     Ident[202];     // Struktura pro identifikacni udaje sluzby FDL_IDENT

    struct statistic_ctr_list ctr_list;

    int                       DuplicitAddressCounter; //citac vyskytu stanic s duplicitni adresou
    int                       IgnoreTokenCounter;   //citac poctu tokenu pro TS od jine stanice nez PS
    int                       FrameRepeatCounter;   //citac poctu opakovani pri vysilani aktualniho requestu

    // <Dalsi parametry FDL>
    enum redundancy           medium_red;
    int                       retry_ctr;
    int                       default_sap;
    int                       tsl;        // SLOT time
    int                       tqui;       // Transmitter fall time/repeater changeover time
    int                       tset;       // Setup time
    int                       min_tsdr;     // Minimum Station Delay Time (Response)
    int                       max_tsdr;     // Maximum Station Delay Time (Response)
    int                       ttr;        // Time To Reach (Target Rotation Time)
    flc_boolean               in_ring_desired;  // Request to enter ring
    enum physical_layer       physical_layer;     // RS485 or modem                                                         
    // </Dalsi parametry FDL>

    // <Promenne pro vytvareni Remote Life Listu>
    T_RLL_Status              RLL_Status;
    int                       RLL_Station;
    int                       RLL_Priority;
    UBYTE                     RLL_LAS[127];   
    // </Promenne pro vytvareni Remote Life Listu>

    // <Promenne k ulozeni odpovedi pro pripad opak. vysilani>
    UBYTE                     SAM;
    UBYTE                     FCBM;
    UBYTE                     DSAPM;
    UBYTE                     SSAPM;
    UBYTE                     statM;
    PUCHAR                    data_unitM;
    int                       DatlngM;
    // </Promenne k ulozeni odpovedi pro pripad opak. vysilani> 


    int                       ActualHID;      // Actual Handle Identification
    //PIRP                      ActualIRP;      // Pointer to actual I/O Request Packet (ceka-li nejaka aplikace na vysledek)    
    
} TProfibus, *PTProfibus;



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


void                      PB_Init( PTProfibus PB,
                                   void *DeviceExtension,
                                   PUNICODE_STRING RegistryPath );
void                      PB_Close( PTProfibus PB );

void                      PB_GetConfiguration( PTProfibus PB,
                                               PUNICODE_STRING RegistryPath );
void                      PB_GetConfigurationPnP( PTProfibus PB  );
void                      PB_InitMaster( PTProfibus PB );
BOOLEAN                   PB_SelfTest( PTProfibus PB );              //Selftest stanice v offline stavu
void                      PB_ChangeMasterState( PTProfibus PB, TMasterState to );

BOOLEAN                   PB_IsTimeForSending( PTProfibus PB );

void                      PB_RxByte( PTProfibus PB, UCHAR ch );

void                      PB_Send( PTProfibus PB, PUCHAR frame, int length, BOOLEAN UseSYN ); // vyslani retezce datovych bytu na sbernici
void                      PB_SendFrameNoData( PTProfibus PB,
                                              int _DA,
                                              int _SA,
                                              int _FC,
                                              BOOLEAN UseSYN ); 
void                      PB_SendFrameVariableData( PTProfibus PB,
                                                    int _DA,
                                                    int _SA,
                                                    int _DSAP,
                                                    int _SSAP,
                                                    int _FC,
                                                    PUCHAR _Data,
                                                    int length,
                                                    BOOLEAN UseFC,
                                                    BOOLEAN UseSYN );


// Send
void                      PB_SendToken( PTProfibus PB, int _DA, int _SA );
void                      PB_SendRequestFDLStatuswithReply( PTProfibus PB,
                                                            int _DA );

// Received
void                      PB_ReceivedToken( PTProfibus PB, int _DA, int _SA );
void                      PB_ReceivedRequestFDLStatuswithReply( PTProfibus PB,
                                                                int _SA );



// <Casovani>
__int64                   GetCurrentTicks();      // vrati pocet ticku performance counteru
void                      PB_StartTimeOut( PTProfibus PB );
void                      PB_StopTimeOut( PTProfibus PB );        
void                      PB_SetTimeOut( PTProfibus PB,
                                         int _interval,
                                         TTimeOutStartCondition StartCondition );
void                      PB_TimeTick( PTProfibus PB );   // pri prazdnem vystupnim bufferu volana priblizne s periodou Tbit        
void                      PB_FrameOut( PTProfibus PB );   /// vola se po odeslani celeho ramce ven z ovladace!
void                      PB_SendNextTimingChars( PTProfibus PB, int pocet );
void                      PB_ContinueTimeOut( PTProfibus PB );  
// </Casovani>        


// Zpracovani pozadavku
void                      PB_ProcessRequest( PTProfibus PB, fdl_rb *Request ); // zpracovani pozadavku z aplikacni vrstvy
void                      PB_ReceivedReply( PTProfibus PB );
void                      PB_ReceivedRequest( PTProfibus PB );  // zpracovani pozadavku prijateho z vnejsku



BOOLEAN                   GetRegistryDWord ( IN HANDLE Handle,
                                             IN PWCHAR KeyNameString,
                                             IN PULONG Data );
                                           


// deklarace funkci z ProfiM (trochu mimo...)
BOOLEAN                   ProfiM_SendOut( void *DeviceExtension,
                                          PUCHAR Buffer,
                                          PUCHAR TypeBuffer,
                                          int length );  // pozor na typ prvniho ukazatele
void                      ProfiM_ClearTimingChars( void *DeviceExtension );
int                       ReadHIDfromRB( fdl_rb *rb );
PIRP                      ReadIRPfromRB( fdl_rb *rb );

void                      ProfiM_StartWatchDogTimer( void *DeviceExtension );
void                      ProfiM_StopWatchDogTimer( void *DeviceExtension );

BOOLEAN                   ProfiM_RxFIFOEmpty( void *DeviceExtension );





#endif /*_PROFIBUS_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -