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

📄 ioview.c

📁 PROFIBUS-dp PROGRAMS 主从站源程序
💻 C
字号:
/* <St> ***********************************************************************

  FILENAME      :  IOVIEW.C

  -----------------------------------------------------------------------------
  DEVELOPER     :  Armin Beck
  PROJEKT       :  Test program for I/O buffer handling
  =============================================================================

  DISCRIPTION
    This program shows the process data image transfer

  =============================================================================

  CHANGES

  Version   Name    Date      Discription
  -----------------------------------------------------------------------------

  V 2.000   Mayer   11.11.97  - Adjusted to new DUALPORT.H header file
  
  V 1.000   Beck    28.03.96  - created

  ************************************************************************ <En> */

/* ------------------------------------------------------------------------ */
/*  Common includes                                                         */
/* ------------------------------------------------------------------------ */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

/* ------------------------------------------------------------------------ */
/*  Hardware specific includes                                              */
/* ------------------------------------------------------------------------ */

#include "dualport.h"   /* DPM layout */

/* ------------------------------------------------------------------------ */
/* Macro definitions                                                        */
/* ------------------------------------------------------------------------ */

#ifdef _MSC_VER

#include <graph.h>
#define position(a,b)   _settextposition(a,b)
#define color(a)        _settextcolor(a)
#define output(a)       _outtext(a)
#define clear(a)        _clearscreen(a)

#else

  #ifdef __BORLANDC__

  #include <graphics.h>
  #define position(a,b)  gotoxy((b+1),(a+1))
  #define color(a)       textcolor(a)
  #define output(a)      cprintf(a)
  #define clear(a)       clrscr(a)

  #endif

#endif
                     
/* ------------------------------------------------------------------------ */
/* Local definitions                                                        */
/* ------------------------------------------------------------------------ */

/* Colormasks for screen                                                    */
#define COLOR_BLACK         0
#define COLOR_GREEN         2
#define COLOR_RED           4
#define COLOR_LIGHT_RED     12
#define COLOR_YELLOW        14
#define COLOR_BLINKING      16
                     
                     
/* ------------------------------------------------------------------------ */
/* Function prototypes                                                      */
/* ------------------------------------------------------------------------ */

void TriggerWatchdog ( void );
void PrintDevState   ( void );
void DoIO            ( void );
void GetKey          ( void );

/* ------------------------------------------------------------------------ */
/* Global variables                                                         */
/* ------------------------------------------------------------------------ */

DPM_MEMORY     far  *ptDpm         = NULL;
unsigned char  far  *pabSendPData  = NULL;
unsigned char  far  *pabRecvPData  = NULL;
unsigned short      usPDataSize    = 0;

unsigned short      SendWordAddress     = 0;
unsigned short      ReceiveWordAddress  = 0;

unsigned char       FirmwareName[17];
unsigned char       FirmwareVersion[17];


/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
/* MAIN PROGRAM                                                             */
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */

/* <ST> =================================================================================

  Function: main


  ---------------------------------------------------------------------------------------

  Input   : -

  Output  : -

  Return  : -

  ================================================================================= <En> */

void main(int argc, char *argv[] )
{
  unsigned short usStartSegment;
  unsigned short usDpmSize, usIdx;
  long           lStartAddress;
  unsigned long  TimeCounter   = 0;
  unsigned char  PointPosition = 25;

  /* Load delivered parameter */
  if(  --argc != 2) {
    printf("\nError : wrong parameter count");
    exit(0);
  }                       
  
  usStartSegment = 0xCA00;
  usDpmSize      = 2;
  
  for ( usIdx = 1; usIdx <= (unsigned short)argc; usIdx++)
  {
    strupr( argv[usIdx]);
                           
    /* Load pointer to DPM */
    if ( strncmp( argv[usIdx], "/A:", 3) == 0 )
    {
      /* Load pointer to DPM */
      if ( sscanf( argv[usIdx], "/A:%04X", &usStartSegment) == 0 )
      {
        printf("\nError : wrong DPM address parameter");
        exit(0);
      }
    } else if ( strncmp( argv[usIdx], "/DPM:", 5) == 0 )
    {
      /* Load DPM size */
      if ( sscanf( argv[usIdx], "/DPM:%X", &usDpmSize) == 0 )
      {
        printf("\nError : wrong DPM size parameter");
        exit(0);
      }
    }    
  }

  /* Create DPM SEGMENT:OFFSET address */
  lStartAddress = ((long)(usStartSegment) << 16);
  
  /* Calculate DPM size in bytes */
  usPDataSize = (usDpmSize * 1024) - 1024;
  
  /* Load DPM pointer */
  ptDpm        = (DPM_MEMORY far*)(lStartAddress + usPDataSize);
  pabSendPData = (unsigned char far*)(lStartAddress);
  pabRecvPData = (unsigned char far*)(lStartAddress + (usPDataSize / 2));

  /* Initialize screen */
  clear(0);
  position(0,0);
  
  /* Test hardware */

  if( ptDpm->tDeviceInfo.abDevIdentifier[0] != 'C' )
  {
    printf("no valid hardware found\n");
    printf("please check adress");
    exit(0);
  }

  if( ptDpm->tDeviceInfo.abDevIdentifier[1] != 'O' &&
      ptDpm->tDeviceInfo.abDevIdentifier[1] != 'I'
    )
  {
    printf("no valid hardware found\n");
    printf("please check adress");
    exit(0);
  }

  if( ptDpm->tDeviceInfo.abDevIdentifier[2] != 'M' &&
      ptDpm->tDeviceInfo.abDevIdentifier[2] != 'F'
    )
  {
    printf("no valid hardware found\n");
    printf("please check adress");
    exit(0);
  }

  /* First, set host flags to zero */
  ptDpm->bHostFlags = 0;

  /* Run COLDSTART */
  printf("initialising the device\n");
  ptDpm->bDevFlags = RESET_FLAG;

  /* Wait until hardware is ready */
  printf("\nwaiting for ready-signal");

  for(;;)
  {
    if( !(TimeCounter & 0x01ffff) )
    {
      if(PointPosition == 40 )
      {
        position(3,25);
        printf("                                        ");
        PointPosition = 25;
      }
      position(3,PointPosition++);
      printf(".");
    }

    if( ++TimeCounter == 0x2fffff )
    {
      clear(0);
      position(0,0);
      printf("no success in coldstarting the device");
      exit(0);
    }

    /* test ready-bit */

    if( ptDpm->bHostFlags & READY_FLAG )
    {
      /* leave loop */
      break;
    }
  }
  printf("\n\nConnection to device established.\n");
  
  _fmemcpy(&FirmwareName[0],&ptDpm->tFirmwareInfo.abFirmwareName[0],16);
  FirmwareName[16] = 0;
  _fmemcpy(&FirmwareVersion[0],&ptDpm->tFirmwareInfo.abFirmwareVersion[0],16);
  FirmwareVersion[16] = 0;
  
  printf("Following firmware detected:  %s\n\n",&FirmwareName[0]);
  printf("Following version detected:   %s\n\n",&FirmwareVersion[0]);

  printf("Be sure that the device uses operation mode standard/uncontrolled \n\n");
  
  printf("Now press any key to continue.\n");
  
  while( !kbhit() );

  clear(0);
  position(0,0);
  color(COLOR_LIGHT_RED);

  output("I/O monitor V02.000 ('esc'-key to quit )");
  position(3,0);
  printf("RDY RUN COM");
  position(12,0);
  printf("receive address[dec]:         ('left' or 'right'-arrow changes address)"
         "\n"
         "\nreceive word   [hex]:"
         "\n"
         "\n"
         "\nsend address   [dec]:         ('up' or 'down'-arrow changes address)"
         "\n"
         "\nsend word      [hex]:         ('i' or 'd'-key increments/decrements outputword)"
         );

  position(24,0);

  /* Endless loop */

  for(;;)
  {
    /* Trigger watchdog of DPM */

    TriggerWatchdog();

    /* Print state of device */

    PrintDevState();

    /* Print input and output data */

    DoIO();

    /* Test if key pressed */

    GetKey();
  }
}

/* <ST> =================================================================================

  Function: TriggerWatchdog


  ---------------------------------------------------------------------------------------

  Input   : -

  Output  : -

  Return  : -

  ================================================================================= <En> */
  
void TriggerWatchdog( void )
{
  static unsigned short WDogCnt;

  /* Trigger watchdog */
  if( ptDpm->tRcsInfo.bDevWatchDog == ptDpm->tRcsInfo.bHostWatchDog)
  {
    if( (++WDogCnt) == 200 )
    {
      position(23,0);
      color(COLOR_RED+COLOR_BLINKING);
      output("the watchdog of the harware turned out");
      exit(0);
    }
  }
  else
  {
    WDogCnt = 0;
    ptDpm->tRcsInfo.bDevWatchDog = ptDpm->tRcsInfo.bHostWatchDog;
  }
}

/* <ST> =================================================================================

  Function: DoIO


  ---------------------------------------------------------------------------------------

  Input   : -

  Output  : -

  Return  : -

  ================================================================================= <En> */
  
void DoIO( void )
{
  position(12,23);
  printf("%03d",ReceiveWordAddress>>1);
  position(14,22);
  printf("%02X%02X",
         pabRecvPData[ReceiveWordAddress],
         pabRecvPData[ReceiveWordAddress+1]
        );

  position(17,23);
  printf("%03d",SendWordAddress>>1);
  position(19,22);
  printf("%02X%02X",
         pabSendPData[SendWordAddress],
         pabSendPData[SendWordAddress+1]
        );
}

/* <ST> =================================================================================

  Function: GetKey


  ---------------------------------------------------------------------------------------

  Input   : -

  Output  : -

  Return  : -

  ================================================================================= <En> */

void GetKey( void )
{
  if( kbhit() )
  {
    switch( getch() )
    {
      case 72:
      {
        /* key 'up' was pressed */
        SendWordAddress+=2;
        if( SendWordAddress == 512 )
        {
          SendWordAddress = 0;
        }
        break;

      }
      case 80:
      {
        /* key 'down' was pressed */
        SendWordAddress-=2;
        if( SendWordAddress == 0xfffe )
        {
          SendWordAddress = 510;
        }
        break;
      }

      case 75:
      {
        /* key 'left' was pressed */
        ReceiveWordAddress-=2;
        if( ReceiveWordAddress == 0xfffe )
        {
          ReceiveWordAddress = 510;
        }
        break;
      }

      case 77:
      {
        /* key 'right' was pressed */
        ReceiveWordAddress+=2;
        if( ReceiveWordAddress == 512 )
        {
          ReceiveWordAddress = 0;
        }
        break;
      }

      case 27:
      {
        /* key 'esc' was pressed */
        /* stop Watchdog of device */
        ptDpm->tRcsInfo.bDevWatchDog = 0;
        exit(0);
      }
      case 'i':
      {
        /* key 'i' was pressed */
        (* (unsigned short*) &pabSendPData[SendWordAddress])++;
        break;
      }
      case 'd':
      {
        /* key 'd' was pressed */
        (* (unsigned short*) &pabSendPData[SendWordAddress])--;
        break;
      }
    }
  }
}

/* <ST> =================================================================================

  Function: GetKey


  ---------------------------------------------------------------------------------------

  Input   : -

  Output  : -

  Return  : -

  ================================================================================= <En> */

void PrintDevState(void)
{
  register rMulti = ptDpm->bHostFlags;

  position(4,0);

  /* test 'ready' of device */
  if( rMulti & READY_FLAG )
  {
    color(COLOR_YELLOW);
    output(" 

⌨️ 快捷键说明

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