?? fmaserve.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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -