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

📄 fmaserve.c

📁 SPC3 SETUP PROGRAMS SP C3 SETUP PROGRAMS
💻 C
字号:
//-----------------------------------------------------------------------------
// $Id: fmaserver.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:
// ------
//  Funkce FMA (Fieldbus Management) pro mastera.
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

#include "vardef.h"

#include "fmaserver.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         */



//*****************************************************************************
//**
//**    Funkce pro linkvou vrstvu
//**
//*****************************************************************************

/**************************************************************************/
/*  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 */
  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;
}


//*****************************************************************************
//*****************************************************************************
//**            CONFIRMATIONS
//*****************************************************************************
//*****************************************************************************


//*****************************************************************************
//**  fce pro pripravu confirmation bloku pro aplikacni vrstvu
//*****************************************************************************
void build_conf( fdl_rb *rb, int L_status )
{
//  build_head( rb );     // pridano - head nemusi byt vzdy inicializovan

  rb -> rb2_header.opcode = confirm;
  rb -> rb2_header.response = (UWORD) L_status;
  rb -> application_block.opcode = confirm;
  rb -> application_block.l_status = (short) L_status;
}



//*****************************************************************************
//**  fce pro tvorbu SRD confirmation bloku
//*****************************************************************************
void build_conf_srd( fdl_rb *rb, PUCHAR user_data, int Datlng, int Response )
{
  int i;
  build_conf( rb, Response );


  switch ( Response )
  {
      /*status odpovedi na SRD*/
    case ds:
      break;
    case iv:
      break;
    case rs:
      break;
    case ue:
      break;
    case ls:
      break;
    case nr:
      break;
    case na:
      break;
    case rr:
      break;

    case dl:
      {
        rb -> rb2_header.priority = low;
      } break;

    case dh:
      {
        rb -> rb2_header.priority = high;
      } break;

    case rdl:
      {
        rb -> rb2_header.priority = low;
      } break;

    case rdh:
      {
        rb -> rb2_header.priority = high;
      } break;
  }


  rb -> application_block.receive_l_sdu.length = (UCHAR) Datlng;
  rb -> rb2_header.fill_length_2 = NETTO_DATA_OFFSET + Datlng;  // puvodne pouze Datlng coz neodpovida specifikaci
  rb -> rb2_header.offset_2 = NETTO_DATA_OFFSET;

  if (NETTO_DATA_OFFSET + Datlng >= 250 /*should be 260*/)
  {
    DbgPrint("PB: build_conf_srd Error - data out of range!");
  }
  
  for ( i = 0;
        i < Datlng;
        i++ )              /*predani prijatych dat ze SRD odpovedi*/
    rb -> user_data_2[NETTO_DATA_OFFSET + i] = user_data[i];

  rb -> user_data_2[0] = NETTO_DATA_OFFSET;
  rb -> application_block.service.code = srd;
}


//*****************************************************************************
//**  fce pro tvorbu FDL Ident confirmation bloku
//*****************************************************************************
void build_fdl_id_conf( fdl_rb *rb, PUCHAR user_data, int Datlng, int Response )
{
  UBYTE i;
  rb -> rb2_header.fill_length_1 = Datlng + NETTO_DATA_OFFSET;
  rb -> rb2_header.opcode = confirm;
  rb -> rb2_header.response = (UWORD) Response;
  rb -> application_block.opcode = confirm;
  rb -> application_block.l_status = (short) Response;

  rb -> application_block.receive_l_sdu.length = (UCHAR) Datlng;

  for ( i = 0; i < Datlng; i++ )
    rb -> user_data_1[i] = user_data[i];
}




//*****************************************************************************
//*****************************************************************************
//**            INDICATIONS
//*****************************************************************************
//*****************************************************************************



void build_ind_sdn( fdl_rb *rb,
                    UBYTE remadd,
                    UBYTE remsap,
                    UBYTE ssap,
                    UBYTE user_data[260],
                    int Datlng,
                    UBYTE ServClass )
{
  UBYTE i;
  build_head( rb );
  rb -> rb2_header.opcode = indication;
  rb -> application_block.opcode = indication;
  rb -> rb2_header.fill_length_1 = Datlng + NETTO_DATA_OFFSET;
  rb -> rb2_header.offset_1 = 80;

  rb -> application_block.service.code = sdn;
  rb -> application_block.dsap = remsap;
  rb -> application_block.ssap = ssap;   // local SAP
  rb -> application_block.rem_add.station = remadd;
  rb -> application_block.rem_add.segment = NO_SEGMENT;
  rb -> application_block.serv_class = ServClass;
  rb -> application_block.send_l_sdu.length = (UCHAR) Datlng;
  rb -> user_data_1[0] = NETTO_DATA_OFFSET;
  for ( i = 0; i < Datlng; i++ )
    rb -> user_data_1[NETTO_DATA_OFFSET + i] = user_data[i];
}



void build_ind_srd( fdl_rb *rb,
                    UBYTE remadd,
                    UBYTE remsap,
                    UBYTE ssap,
                    UBYTE user_data[260],
                    int Datlng,
                    UBYTE ServClass,
                    UBYTE Update_status )
{
  UBYTE i;
  build_head( rb );
  rb -> rb2_header.opcode = indication;
  rb -> application_block.opcode = indication;
  rb -> application_block.service.code = srd;
  rb -> rb2_header.seg_length_1 = (UWORD) Datlng;
  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.service.code = srd;
  rb -> application_block.dsap = remsap;
  rb -> application_block.ssap = ssap;   // local SAP
  rb -> application_block.rem_add.station = remadd;
  rb -> application_block.rem_add.segment = NO_SEGMENT;
  rb -> application_block.serv_class = ServClass;
  rb -> user_data_1[0] = NETTO_DATA_OFFSET;
  rb -> rb2_header.priority = ServClass;

  if ( Datlng == 0 )
  {
    rb -> rb2_header.response = no_data;
    rb -> application_block.l_status = no_data;
  }
  else
  {
    rb -> rb2_header.response = Update_status;
    rb -> application_block.l_status = Update_status;
  }

  for ( i = 0; i < Datlng; i++ )
    rb -> user_data_1[NETTO_DATA_OFFSET + i] = user_data[i];

  rb -> rb2_header.fill_length_1 = Datlng + NETTO_DATA_OFFSET;
}

⌨️ 快捷键说明

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