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

📄 dp_user.c

📁 PROFIBUS SLAVE PROGRAMS PRO FIBUS SLAVE PROGRAMS
💻 C
📖 第 1 页 / 共 4 页
字号:
/**************************  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 + -