📄 fmaclien.c
字号:
//-----------------------------------------------------------------------------
// $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 + -