📄 dp_user.c
字号:
/************************** Filename: dp_user.c ****************************/
/* ========================================================================= */
/* */
/* 0000 000 000 00000 0 000 0 0 0 0000 */
/* 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */
/* 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Einsteinstra遝 6 */
/* 0000 000 0 0 000 0 0 00000 0 0000 91074 Herzogenaurach */
/* 0 00 0 0 0 0 0 0 0 0 0 */
/* 0 0 0 0 0 0 0 0 0 0 0 0 0 Tel: ++49-9132-744-200 */
/* 0 0 0 000 0 0 000 0 0 0 0 GmbH Fax: ++49-9132-744-204 */
/* */
/* ========================================================================= */
/* */
/* Function: Demo for PROFICHIP Extension Board AT89C5132 */
/* This example simulates a modular profibus device */
/* with max 6 Modules. */
/* */
/* Module 1: dip-switch PORT1 */
/* Module 2: dip-switch PORT2 */
/* Module 3: led PORT1 */
/* Module 4: led PORT2 */
/* Module 5: dio32 */
/* Module 6: counter */
/* */
/* ------------------------------------------------------------------------- */
/* */
/* Hardware requirements: ProfiChip Evaluation Board AT89C5132 (PA006101) */
/* ProfiChip Evaluation Board VPC3+/C (PA006103) */
/* */
/* ------------------------------------------------------------------------- */
/* memory: 0000H ... 7FFFH: RAM */
/* 8000H ... 8FFFH: VPC3+ */
/* 9000H ... 9FFFH: Reserved */
/* A000H ... AFFFH: FPGA */
/* B000H ... BFFFH: RTC */
/* C000H ... CFFFH: LCD */
/* D000H ... DFFFH: I/O Port 0 */
/* E000H ... EFFFH: I/O Port 1 */
/* F000H ... FFFFH: I/O Port 2 */
/* */
/* ------------------------------------------------------------------------- */
/* */
/* Technical support: P. Fredehorst */
/* Tel. : ++49-9132/744-214 */
/* Fax. : -204 */
/* eMail: pfredehorst@profichip.com */
/* */
/*****************************************************************************/
/*****************************************************************************/
/* contents:
- function prototypes
- data structures
- internal functions
*/
/*****************************************************************************/
/* include hierarchy */
#include "..\..\dp_inc\platform.h"
#include "..\..\dp_inc\dp_inc.h"
/*---------------------------------------------------------------------------*/
/* defines, structures */
/*---------------------------------------------------------------------------*/
// -- defines for user alarm state
#define USER_AL_STATE_CLOSED ((UBYTE)0x00)
#define USER_AL_STATE_OPEN ((UBYTE)0x01)
// -- defines for user state
#define USER_STATE_CLEAR ((UBYTE)0x00)
#define USER_STATE_RUN ((UBYTE)0x01)
// -- defines for diagnostics
#define USER_TYPE_DPV0 ((UBYTE)0xFA)
#define USER_TYPE_PRM_OK ((UBYTE)0xFB)
#define USER_TYPE_PRM_NOK ((UBYTE)0xFC)
#define USER_TYPE_CFG_OK ((UBYTE)0xFD)
#define USER_TYPE_CFG_NOK ((UBYTE)0xFE)
#define USER_TYPE_APPL_RDY ((UBYTE)0xFF)
// -- status message data (coded as device diagnosis) -------------------------
// -- Modulstatus -------------------------------------------------------------
typedef struct
{
UBYTE sign_len; // fix to 0x07
UBYTE status_type; // fix to 0x82
UBYTE slot_number; // fix to 0x00
UBYTE specifier; // fix to 0x00
UBYTE user_data[2];
} tStatusDiag;
#define sizeof_StatusDiag 6
tStatusDiag status_diag;
ROMCONST__ UBYTE DefStatusDiag[] = { 0x06, 0x82, 0x00, 0x00, 0xAA, 0x0A };
#define szUsrDiagnosticAlarmData ((UBYTE)0x05)
#define szDiagnosticAlarm (szAlarmHeader + szUsrDiagnosticAlarmData)
#define MaxAlarmLength ((UBYTE)szUsrDiagnosticAlarmData)
typedef struct
{
UBYTE state;
UBYTE user_diag_active;
UWORD old_diag;
UBYTE user_diag[DIAG_BUFSIZE];
UWORD event;
UBYTE application_ready;
CFG_STRUCT real_cfg; //real cfg data
struct //alarm state machine data
{
UBYTE state;
UBYTE buffer_used[ALARM_MAX_FIFO];
UBYTE user_alarm_data[ALARM_MAX_FIFO][MaxAlarmLength];
ALARM_STATUS_PDU alarm_buffers[ALARM_MAX_FIFO];
}al;
}USER_STRUC;
/*---------------------------------------------------------------------------*/
/* global user data definitions */
/*---------------------------------------------------------------------------*/
VPC3_STRUC_ERRCB vpc3_errcb; // error structure
USER_STRUC user; // user system structure
/*---------------------------------------------------------------------------*/
/* defines, structures and variables for our demo application */
/*---------------------------------------------------------------------------*/
#define MaxModule ((UBYTE)0x06)
ROMCONST__ UBYTE NAME[8] = { 0x44, 0x50, 0x56, 0x30, 0x41, 0x46, 0x46, 0x45 }; //DPV0AFFE
//default configuration data for startup
ROMCONST__ UBYTE DefCfg[24] = { 0x42,0x00,0x00,0x01, //DI8 (PORT 1)
0x42,0x00,0x00,0x02, //DI8 (PORT 2)
0x82,0x00,0x00,0x03, //DO8 (PORT 1)
0x82,0x00,0x00,0x04, //DO8 (PORT 2)
0xC1,0x03,0x03,0x05, //DIO32
0xC1,0x01,0x01,0x06, //Counter 16bit
};
//counter module
static UWORD counter_value;
static UBYTE counter_timebase;
static UBYTE counter_upper_limit;
static UBYTE counter_lower_limit;
typedef struct
{
UBYTE alarm;
UBYTE mode;
UBYTE time_base;
UWORD upper_limit;
UWORD lower_limit;
} STRUC_PRM_COUNTER;
typedef struct
{
UBYTE do8[2];
UBYTE dio32[4];
UBYTE counter[2];
} STRUC_OUTPUT;
typedef struct
{
UBYTE di8[2];
UBYTE dio32[4];
UBYTE counter[2];
} STRUC_INPUT;
typedef struct
{
UBYTE NrOfModules;
STRUC_INPUT input;
STRUC_OUTPUT output;
STRUC_PRM_COUNTER prm;
} STRUC_SYSTEM;
STRUC_SYSTEM sSystem;
/*---------------------------------------------------------------------------*/
/* function prototypes */
/*---------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* function: user_alarm_init */
/*--------------------------------------------------------------------------*/
void user_alarm_init(void)
{
memset( &user.al.buffer_used[0], 0, ALARM_MAX_FIFO );
}//void user_alarm_init(void)
/*--------------------------------------------------------------------------*/
/* function: user_alarm_alloc */
/*--------------------------------------------------------------------------*/
ALARM_STATUS_PDU_PTR user_alarm_alloc( void )
{
ALARM_STATUS_PDU_PTR ptr;
UBYTE i;
ptr = NULL;
for( i = 0; i < ALARM_MAX_FIFO; i++ )
{
if(user.al.buffer_used[i] == FALSE)
{
ptr = &(user.al.alarm_buffers[i]);
user.al.buffer_used[i] = TRUE;
ptr->header = 0;
ptr->type = 0;
ptr->slot = 0;
ptr->spec = 0;
ptr->user_data_len = 0;
ptr->user_data_ptr = &(user.al.user_alarm_data[i][0]);
break;
}
}//for( i = 0; i < ALARM_MAX_FIFO; i++ )
return ptr;
}//ALARM_STATUS_PDU_PTR user_alarm_alloc( void )
/*--------------------------------------------------------------------------*/
/* function: user_free_alarm_buffer */
/*--------------------------------------------------------------------------*/
void user_free_alarm_buffer(ALARM_STATUS_PDU_PTR alarm_ptr)
{
ALARM_STATUS_PDU_PTR ptr;
UBYTE i;
//V504
for( i = 0; i < ALARM_MAX_FIFO; i++ )
{
if( user.al.buffer_used[i] == TRUE )
{
ptr = &(user.al.alarm_buffers[i]);
if( ptr == alarm_ptr )
{
user.al.buffer_used[i] = FALSE;
break;
}//if( ptr == alarm_ptr )
}//if( user.al.buffer_used[i] == FALSE )
}//for( i = 0; i < ALARM_MAX_FIFO; i++ )
}//void user_free_alarm_buffer(ALARM_STATUS_PDU_PTR ptr)
/*---------------------------------------------------------------------------*/
/* function: user_alarm ( is also called from alarm state machine !!!! ) */
/*---------------------------------------------------------------------------*/
UBYTE user_alarm( UBYTE alarm_type, UBYTE seq_nr, ALARM_STATUS_PDU_PTR alarm_ptr, UBYTE check_diag_flag )
{
ROMCONST__ UBYTE chn_diag_5[3] = { 0x84, 0xC1, 0x82 }; //module 5
ROMCONST__ UBYTE chn_diag_6[3] = { 0x85, 0xC1, 0x82 }; //module 6
VPC3_UNION_DIAG_PTR tmp_diag;
UBYTE ret_value;
UBYTE ext_diag;
UBYTE len_diag;
UBYTE error;
UWORD diag;
ret_value = 0x00;
diag = ( (UWORD)(alarm_type << 8) | ((UWORD)seq_nr) );
//don't send diagnostic twice!
if( ( diag != user.old_diag )
&& ( FALSE == user.user_diag_active )
)
{
memset( &user.user_diag[0], 0x00, sizeof( user.user_diag ) );
tmp_diag.byte_ptr = user.user_diag;
ext_diag = 0x00;
len_diag = 0x00;
switch( alarm_type )
{
case USER_TYPE_CFG_OK:
{
ext_diag = STAT_DIAG_SET;
break;
}//case USER_TYPE_CFG_OK:
case USER_TYPE_CFG_NOK:
{
//modul_status diagnose
memcpy( tmp_diag.byte_ptr, &status_diag.sign_len, sizeof_StatusDiag );
ext_diag = EXT_DIAG_SET;
len_diag = sizeof_StatusDiag;
break;
}//case USER_TYPE_APPL_RDY:
case USER_TYPE_DPV0:
{
if( alarm_ptr->type == STATUS_MESSAGE )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -