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

📄 fmaclien.c

📁 profibus-dp主站源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
//-----------------------------------------------------------------------------
// $Id: fmaclient.c,v 0.0.0.1                                     2003/10/11
//-----------------------------------------------------------------------------
//
//      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:
// ------
//  Funkce FMA (Fieldbus Management) pro aplikacni vrstvu.
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------


#include "fdl_rb.h"




#define LEN_BUS_PARAMETER       sizeof(struct bus_parameter_block)
#define NETTO_DATA_OFFSET       12

#define FDL_ERROR              -1     /* return codes of functions        */

#define OK                      0
#define NOT_OPENED             -1     /* SCP not opened, invalid          */
#define SST_NOT_USED            0     /* SAP State: not activated         */
#define SST_ACTIVATED           1     /* SAP State: not activated         */



/**************************************************************************/
/*   fdl_write                                                            */
/*   sends request block to communication interface                       */
/**************************************************************************/
int fdl_write( int DriverHandle, fdl_rb *rb )
{
  return SCP_send( DriverHandle, sizeof( fdl_rb ), (char*) rb );
}



/**************************************************************************/
/*  build_head                                                            */
/*  fills header parameters                                               */
/**************************************************************************/

void build_head( fdl_rb *rb )
{
  rb -> rb2_header.length = 80;
  rb -> rb2_header.user = 0;  // use this for local block identifications - by application
  rb -> rb2_header.rb_type = 2;
  rb -> rb2_header.priority = low;
  rb -> rb2_header.subsystem = FLC_Subsys; /* for Layer2 */
  rb -> rb2_header.opcode = request;
  rb -> rb2_header.response = 0;


  rb -> rb2_header.fill_length_1 = 246;
  rb -> rb2_header.seg_length_1 = 255;
  rb -> rb2_header.offset_1 = 80;

  rb -> rb2_header.fill_length_2 = 0;
  rb -> rb2_header.seg_length_2 = 0;
  rb -> rb2_header.offset_2 = 0;

  rb -> application_block.opcode = request;
  rb -> application_block.subsystem = FLC_Subsys;
}



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

void FDL_set_val(fdl_rb *rb,BYTE pr)
{
  UBYTE *Vendor_name =	"CTU-FEE";
  UBYTE *Controller_type = "ProfiM - Windows Profibus DP Master Driver";
  UBYTE *HW_release = "1.0";
  UBYTE *SW_release = "0.015";


  UBYTE block[202];

  struct bus_parameter_block *temp_ptr;
  build_head(rb);
  temp_ptr = (struct bus_parameter_block *)rb->user_data_1;
  temp_ptr->hsa=HSA_default;
  temp_ptr->ts=TS_default;
  temp_ptr->station_type=Station_type_default;
  temp_ptr->baud_rate=Baud_rate_default;
  temp_ptr->medium_red=medium_red_default;
  temp_ptr->retry_ctr=retry_ctr_default;
  temp_ptr->default_sap=default_sap_default;
  temp_ptr->tqui=TQUI_default;
  temp_ptr->tset=TSET_default;
  temp_ptr->in_ring_desired= 1;
  temp_ptr->tsl=TSL_default;
  temp_ptr->ttr=TTR_default;
  temp_ptr->g=G_default;
  temp_ptr->min_tsdr=min_TSDR_default;
  temp_ptr->max_tsdr=max_TSDR_default;

    temp_ptr->physical_layer=rs485; 

    strcpy(block,"");
    block[0]=strlen(Vendor_name);
    block[1]=strlen(Controller_type);
    block[3]=strlen(HW_release);
    block[4]=strlen(SW_release);
    block[5]=0;

    strcat(block,Vendor_name);
    strcat(block,Controller_type);
   strcat(block,HW_release);
   strcat(block,SW_release);

    //temp_ptr->ident.ident[0] =strlen(Vendor_name);
    //temp_ptr->ident.ident[1] =strlen(Controller_type);
    //temp_ptr->ident.ident[2] =strlen(HW_release);
    //temp_ptr->ident.ident[3] =strlen(SW_release);
    //temp_ptr->ident.ident[4] =strlen(HW_release);

//temp_ptr->ident.ident=*block;
    strcpy(temp_ptr->ident.ident_info,"");

    strcat(temp_ptr->ident.ident_info, block);

    rb -> rb2_header.priority         = pr;
    rb -> rb2_header.opcode           = request;
    rb -> application_block.opcode    = request;
    rb -> application_block.service.code    = fdl_set_value;
    rb -> rb2_header.seg_length_1        = strlen(block);
}



void FDL_read_val(fdl_rb *rb,BYTE pr)
{
//    struct bus_parameter_block *temp_ptr;
  //  temp_ptr = (struct bus_parameter_block *)rb->user_data_1;

    build_head(rb);
    rb -> rb2_header.priority         = pr;
    rb -> rb2_header.opcode           = request;
    rb -> application_block.opcode    = request;
    rb -> application_block.service.code    = fdl_read_value;

}




/**********************************************************************/
/*  D e s c r i p t i o n :                                           */
/*                                                                    */
/*  build request_block for sap_activate for all services             */
/**********************************************************************/
void build_rqb_sap_activate( fdl_rb *rb,
                             UBYTE sap_nr,
                             UBYTE ACCSAP,
                             UBYTE ACCSTAT,
                             UBYTE SDA_R,
                             UBYTE SDN_R,
                             UBYTE SRD_R,
                             BYTE pr )
{
  struct fdl_sap *sptr;

  build_head( rb );

  // fill header params
  rb -> rb2_header.seg_length_1 = LEN_SAP_ACTIVATE;
  rb -> rb2_header.offset_1 = 80;
  rb -> rb2_header.fill_length_1 = LEN_SAP_ACTIVATE;

  rb -> rb2_header.seg_length_2 = 0;
  rb -> rb2_header.fill_length_2 = 0;
  rb -> rb2_header.offset_2 = 0;
  rb -> rb2_header.priority = pr;   

  rb -> application_block.service.code = sap_activate;  
  rb -> application_block.dsap = sap_nr;
  rb -> application_block.ssap = 0;

  sptr = ( struct fdl_sap * ) &( rb->user_data_1[0] );
  sptr->user_id = sap_nr;
  sptr->max_l_sdu_length = 246;
  sptr->access_sap = ACCSAP; //ALL;     // no reservations
  sptr->access_station = ACCSTAT; //ALL;     // no reservations
  sptr->sda = SDA_R; //BOTH_ROLES;
  sptr->sdn = SDN_R; //BOTH_ROLES;
  sptr->srd = SRD_R; //BOTH_ROLES;
}



/**********************************************************************/
/*  D e s c r i p t i o n :                                           */
/*                                                                    */
/*  build request_block for sap_activate for all services             */
/**********************************************************************/
void build_rqb_rsap_activate( fdl_rb *rb,
                              UBYTE sap_nr,
                              UBYTE ACCSAP,
                              UBYTE ACCSTAT,
                              BYTE pr )
{
  struct fdl_sap *sptr;

  build_head( rb );

  // fill header params
  rb -> rb2_header.seg_length_1 = LEN_SAP_ACTIVATE;
  rb -> rb2_header.offset_1 = 80;
  rb -> rb2_header.fill_length_1 = LEN_SAP_ACTIVATE;

  rb -> rb2_header.seg_length_2 = 0;
  rb -> rb2_header.fill_length_2 = 0;
  rb -> rb2_header.offset_2 = 0;
  rb -> rb2_header.priority = pr;

  rb -> application_block.service.code = rsap_activate;
  rb -> application_block.dsap = sap_nr;
  rb -> application_block.ssap = 0;

  sptr = ( struct fdl_sap * ) &rb->user_data_1;
  sptr->user_id = sap_nr;
  sptr->max_l_sdu_length = 246;
  sptr->access_sap = ACCSAP; //ALL;     // no reservations
  sptr->access_station = ACCSTAT; //ALL;     // no reservations
  sptr->srd = RESPONDER; // na pevno
}



/**********************************************************************/
/*  D e s c r i p t i o n :                                           */
/*                                                                    */
/*  build request_block for sap_deactivate for all services           */
/**********************************************************************/
void build_rqb_sap_deactivate( fdl_rb *rb, UBYTE sap_nr, BYTE pr )
{
  //   struct fdl_sap * sptr;

  build_head( rb );

  // fill header params
  rb -> rb2_header.priority = pr;
  rb -> rb2_header.seg_length_1 = LEN_SAP_ACTIVATE;
  rb -> rb2_header.offset_1 = 80;
  rb -> rb2_header.fill_length_1 = 0;
  rb -> application_block.service.code = sap_deactivate;
  rb -> application_block.dsap = sap_nr;
}



/**********************************************************************/
/*  D e s c r i p t i o n :                                           */
/*                                                                    */
/*  build request_block for lsap_status                               */
/**********************************************************************/
void build_rqb_lsap_status( fdl_rb *rb, UBYTE stat_num, UBYTE sap_nr, BYTE pr )
{
  build_head( rb );
  // fill header params

  rb -> rb2_header.priority = pr;
  rb -> rb2_header.fill_length_1 = 0;

  rb -> rb2_header.seg_length_2 = 0;
  rb -> rb2_header.fill_length_2 = 0;
  rb -> rb2_header.offset_2 = 0;

  rb -> application_block.service.code = lsap_status;
  rb -> application_block.dsap = sap_nr;
  rb -> application_block.receive_l_sdu.length = 255;
  rb -> application_block.rem_add.station = stat_num; // number of station
}



/**********************************************************************/
/*  D e s c r i p t i o n :                                           */
/*                                                                    */
/*                                                  */
/**********************************************************************/    
void build_rqb_event_sap( fdl_rb *rb, UBYTE pr )
{
  struct event_indication * temp_ptr;
  temp_ptr = ( struct event_indication * ) rb->user_data_1;

  build_head( rb );

  rb -> rb2_header.fill_length_1 = LEN_EVENT_INDICATION;
  rb -> rb2_header.seg_length_1 = 260;
  rb -> rb2_header.offset_1 = 80;
  rb -> rb2_header.priority = pr;

  rb -> rb2_header.fill_length_2 = 0;
  rb -> rb2_header.seg_length_2 = 0;

  rb -> application_block.service.code = await_indication;
  rb -> application_block.dsap = EVENT_SAP;
  rb -> application_block.send_l_sdu.length = 255;
  rb -> application_block.send_l_sdu.buffer_ptr = 0;
  rb -> application_block.send_l_sdu.length = 1;

  temp_ptr->time_out.threshold = time_out_threshold_default;
  temp_ptr->not_syn.threshold = not_syn_threshold_default;
  temp_ptr->uart_error.threshold = uart_error_threshold_default;
  temp_ptr->out_of_ring.threshold = out_of_ring_threshold_default;
  temp_ptr->sdn_not_indicated.threshold = sdn_not_indicated_threshold_default;

⌨️ 快捷键说明

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