.

     

MPI Application Template
template.c
 

ProbeSniffer.c -- Monitor the state of any Probe that has been configured.

/* Copyright(c) 1991-2007 by Motion Engineering, Inc.  All rights reserved.
 *
 * This software  contains proprietary and  confidential information  of
 * Motion Engineering Inc., and its suppliers.  Except as may be set forth
 * in the license agreement under which  this software is supplied, use,
 * disclosure, or  reproduction is prohibited without the prior express
 * written consent of Motion Engineering, Inc.
 */

/*

P R O B E   S N I F F E R
===================================
This program may be used to monitor the state of any Probe that has been
 configured.

Use to diagnose problems with Probe configuration and confirm captured
 time/position in the registers.


I N S T R U C T I O N S
=======================
1. Compile this code for your MPI
2. Run Program
3. Program will Prompt for a Motor # that the Probe is on, enter the desired
   Motor (with Probe on it) to watch 0-31
4. After selecting a Motor Number, enter the Probe Index(on that Motor) to watch,
   # of available Probes varies by node.
5. Use keyboard to select how to view the information: (Type a letter at any time)
   d = Double, f = Float, h = Hex
6. To monitor a different user limit, type "c", refer to Step 3
7. To clear the selected Probe's configuration, and disable the probe, press "L"
8. To Quit, type "q"


C O M P I L E   N O T E S
=========================
Originally built and compiled under MPI 03.04.08

Warning!  This is a sample program to assist in the integration of an
 MEI motion controller with your application.  It may not contain all
 of the logic and safety features that your application requires.
 
The msgCHECK(...) macros used in the following sample code are intended
 to convey our strong belief that ALL error return codes should be checked.
 Actual application code should use specific error handling techniques (other
 than msgCHECKs) best suited to your internal error recovery methods.
 
*/

#include <stdlib.h>
#include <stdio.h>
#include <windows.h> 

#include "stdmpi.h"
#include "stdmei.h"

#include "apputil.h"

typedef struct objProbe {
   long  ynEnabled;
   long  probeSource;
   long  probeDataType;
   long  ynInputFilter;

   long  intMaxRegisterCount;
   long  intProbeIndex;
   long  ioStatus;
   long  arrRegisters[MPIMaxProbeRegisters];

} objProbe;

//Function Declarations
void ProbeSourceToEnglish(int intProbeSource, char *strProbeSource);
void ProbeDataTypeToEnglish(int intProbeDataType, char *strProbeDataType);
void BooleanToEnglish(int ynBoolean, char *strBoolean);
void clearUserLimit(MPIControl control, MPIMotor *motor, int intUserLimit);

// Setup Global Variables
long  intProbeToSniff=-1;  // -1: Nothing Specified, anything greater watches the
                        //    specified probe on specified motor
                        //    # Available varies by node
long  intMotorNumToSniff=-1;  // -1: Nothing Specified, anything greater watches the
                        //    specified Motor 0-31 Available
char  DisplayMode = 'h';      // d = Double, f = Float, h = hex


/* Perform basic command line parsing. (-control -server -port -trace) */
void basicParsing(int                    argc,
                  char                  *argv[],
                  MPIControlType        *controlType,
                  MPIControlAddress     *controlAddress)
{
    long argIndex;

    /* Parse command line for Control type and address */
    argIndex = argControl(argc, argv, controlType, controlAddress);

    /* Check for unknown/invalid command line arguments */
    if (argIndex < argc) {
        fprintf(stderr,"usage: %s %s\n", argv[0], ArgUSAGE);
        exit(MPIMessageARG_INVALID);
    }
}

/* Create and initialize MPI objects */
void programInit(MPIControl         *control,
                 MPIControlType      controlType,
                 MPIControlAddress  *controlAddress,
             MPIMotor         motor[32])
{
    long            returnValue;
   long        i=0;  //Loop incrementor

    /* Create motion controller object */
    *control =
        mpiControlCreate(controlType, controlAddress);
    msgCHECK(mpiControlValidate(*control));

    /* Initialize motion controller */
    returnValue =
        mpiControlInit(*control);
    msgCHECK(returnValue);


   /* Create motor objects */
   for(i=0; i<32; i++){
      motor[i] = mpiMotorCreate(*control, i);
      msgCHECK(mpiMotorValidate(motor[i]));
   }
}

/* Perform certain cleanup actions and delete MPI objects */
void programCleanup(MPIControl *control, MPIMotor motor[32])
{
    long            returnValue;
   long        i;

   /* Delete Motor Objects */
   for(i=0; i<32; i++){
      returnValue = mpiMotorDelete(motor[i]);
      msgCHECK(returnValue);
   }

    /* Delete motion controller object */
    returnValue =
        mpiControlDelete(*control);
    msgCHECK(returnValue);
    *control = MPIHandleVOID;
}

/* Create Probe Object */
void createProbe(MPIControl control, MPIProbe *probe)
{
   MPIProbeParams    probeParams;

   probeParams.probeIndex = intProbeToSniff;
   probeParams.type = MPIProbeTypeMOTOR;
   probeParams.number.motor = intMotorNumToSniff;

   /* Create probe */
   *probe = mpiProbeCreate(control, &probeParams);
   msgCHECK(mpiProbeValidate(*probe));
}

/* Delete Probe object */
void destroyProbe(MPIProbe *probe)
{
   long returnValue;

   returnValue = mpiProbeDelete(*probe);
   msgCHECK(returnValue);
}

/* Clear Probe configuration and disable */
void clearProbe(MPIProbe *probe)
{
   MPIProbeStatus       probeStatus;
   MPIProbeParams       probeParams;
   MPIProbeConfig       probeConfig;
   long              returnValue;

   probeParams.type = MPIProbeTypeMOTOR;
   probeParams.number.motor = intMotorNumToSniff;
   probeParams.probeIndex = intProbeToSniff;

   msgCHECK(mpiProbeValidate(*probe));

   /* Get probe configuration handle */
   returnValue = mpiProbeConfigGet(*probe, &probeConfig, NULL);
   msgCHECK(returnValue);

   probeConfig.enable = FALSE;            // Disable Probe
   probeConfig.source = 0;
   probeConfig.data = MPIProbeDataTIME;   /* Time mode */
   probeConfig.inputFilter = FALSE;

   /* Set probe configuration */
   returnValue = mpiProbeConfigSet(*probe, &probeConfig, NULL);
   msgCHECK(returnValue);

   returnValue = mpiProbeStatus(*probe, &probeStatus, NULL);
   msgCHECK(returnValue);
}

/* This Function Reads the current State and Registers of a specified probe */
void readProbe(MPIControl control, MPIProbe *probe, objProbe *sniffedProbe)
{
   MPIProbeConfig       probeConfig;
   MPIProbeStatus       probeStatus;

   char              strEnabled[MPIMapNameSizeMAX];
   char              strProbeSource[MPIMapNameSizeMAX];
   char              strProbeDataType[MPIMapNameSizeMAX];
   char              strInputFilter[MPIMapNameSizeMAX];
   long              returnValue;
   long              i;

   /* Get probe configuration handle */
   returnValue = mpiProbeConfigGet(*probe, &probeConfig, NULL);
   msgCHECK(returnValue);

   returnValue = mpiProbeStatus(*probe, &probeStatus, NULL);
   msgCHECK(returnValue);

   //Read Info from probeConfig
   sniffedProbe->ynEnabled = probeConfig.enable;
   sniffedProbe->probeSource = probeConfig.source;
   sniffedProbe->probeDataType = probeConfig.data;
   sniffedProbe->ynInputFilter = probeConfig.inputFilter;

   //Read Info from probeStatus
   sniffedProbe->intMaxRegisterCount = probeStatus.maxRegisters;
   sniffedProbe->intProbeIndex = probeStatus.index;
   sniffedProbe->ioStatus = probeStatus.io;
   //Populate Registers
   for(i = 0; i < sniffedProbe->intMaxRegisterCount; i++){
      sniffedProbe->arrRegisters[i] = probeStatus.regs[i];
   }

   // Convert Status values to English
   BooleanToEnglish(sniffedProbe->ynEnabled, strEnabled);
   ProbeSourceToEnglish(sniffedProbe->probeSource, strProbeSource);
   ProbeDataTypeToEnglish(sniffedProbe->probeDataType, strProbeDataType);
   BooleanToEnglish(sniffedProbe->ynInputFilter, strInputFilter);

   // Start Printing to Screen
   printf("PROPERTIES FOR PROBE:\tMotor #:\t%d", intMotorNumToSniff);
   printf("\tEnabled:\t%s\n", strEnabled);
   printf("\t\t\tProbe #:\t%d", intProbeToSniff);
   printf("\tInput Filter:\t%s\n", strInputFilter);
   printf("\t\t\tProbe Source:\t%s\n", strProbeSource);
   printf("\t\t\tProbe DataType:\t%s\n", strProbeDataType);
   printf("\t\t\tMax Registers:\t%d\n", sniffedProbe->intMaxRegisterCount);
   printf("\t\t\tProbe Index:\t%d\n", sniffedProbe->intProbeIndex);

   switch(DisplayMode)
   {
      case 'f':{  //Case Float
               printf("\t\t\tIO State:\t%2.2f\n\n", (float)*((float *)&sniffedProbe->ioStatus));
               for(i = 0; i < sniffedProbe->intMaxRegisterCount; i++){
                  printf("\t\t\tRegister %d:\t%2.2f\n", i, (float)*((float *)&sniffedProbe->arrRegisters[i]));//Separated or else String displays Funky
               }
               break;
            }
      case 'h':{  //Default: Case Hex
               printf("\t\t\tIO State:\t0x%8.8X\n\n", sniffedProbe->ioStatus);
               for(i = 0; i < sniffedProbe->intMaxRegisterCount; i++){
                  printf("\t\t\tRegister %d:\t0x%4.4X\n", i, sniffedProbe->arrRegisters[i]);//Separated or else String displays Funky
               }
               break;
            }

      default:{   //Default => d
               printf("\t\t\tIO State:\t%d\n\n", sniffedProbe->ioStatus);
               for(i = 0; i < sniffedProbe->intMaxRegisterCount; i++){
                  printf("\t\t\tRegister %d:\t%d\n", i, sniffedProbe->arrRegisters[i]);//Separated or else String displays Funky
               }
               break;
            }
   }//end Switch
}

void displayHeaders(){
   // Clear Screen
   system ("cls");

   // Informational Printout
   printf("|     P R O B E    S N I F F E R     |  Change Data Type:  D - Double  |\n|------------------------------------|                     F - Float   |\n");
   printf("|Key Commands:  Q - Quit             |                     H - Hex     |\n|               C - Change Probe #   |                                 |\n");
   printf("|               L - Clear Probe      |                                 |\n");
   printf("|----------------------------------------------------------------------|\n");
}

/* Convert mpiProbeSource value to English */
void ProbeSourceToEnglish(int intProbeSource, char *strProbeSource){
   switch(intProbeSource)
   {
      case (MPIProbeSourceHOME):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceHOME");
               break;
            }
      case (MPIProbeSourceINDEX):{
               sprintf(strProbeSource,"Triggers on Condition[0]=True");
               break;
            }
      case (MPIProbeSourceLIMIT_HW_NEG):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceLIMIT_HW_NEG");
               break;
            }
      case (MPIProbeSourceLIMIT_HW_POS):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceLIMIT_HW_POS");
               break;
            }
      case (MPIProbeSourceINDEX_SECONDARY):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceINDEX_SECONDARY");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_0):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_0");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_1):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_1");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_2):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_2");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_3):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_3");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_4):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_4");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_5):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_5");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_6):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_6");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_7):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_7");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_8):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_8");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_9):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_9");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_10):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_10");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_11):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_11");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_12):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_12");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_13):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_13");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_14):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_14");
               break;
            }
      case (MPIProbeSourceMOTOR_IO_15):{
               sprintf(strProbeSource,"Triggers on MPIProbeSourceMOTOR_IO_15");
               break;

            }

      default:{
               sprintf(strProbeSource,"** Not Set **");
               break;
            }
   }//End Switch
}

/* Convert mpiProbeData value to English */
void ProbeDataTypeToEnglish(int intProbeDataType, char *strProbeDataType){
   switch(intProbeDataType)
   {
      case MPIProbeDataPOSITION_PRIMARY:{
               sprintf(strProbeDataType,"MPIProbeDataPOSITION_PRIMARY");
               break;
            }
      case MPIProbeDataPOSITION_SECONDARY:{
               sprintf(strProbeDataType,"MPIProbeDataPOSITION_SECONDARY");
               break;
            }
      case MPIProbeDataTIME:{
               sprintf(strProbeDataType,"MPIProbeDataTIME");
               break;
            }
      default:{
               sprintf(strProbeDataType,"** Not Set **");
               break;
            }
   }//End Switch
}

/* Convert Boolean value to English */
void BooleanToEnglish(int ynBoolean, char *strBoolean){
   switch(ynBoolean)
   {
      case 0:{
               sprintf(strBoolean,"FALSE");
               break;
            }
      case 1:{
               sprintf(strBoolean,"TRUE");
               break;
            }
      default:{   //Default => d
               sprintf(strBoolean,"** Not Set **");
               break;
            }
   }//End Switch
}


int main(int     argc,
         char   *argv[])
{
    MPIControl          control;
    MPIControlType      controlType;
    MPIControlAddress   controlAddress;
   MPIMotor       motor[32];      /* motor object */
   MPIProbe       probe;
   MPI_BOOL            done = FALSE;
   char                key;
   objProbe       sniffedProbe;

    /* Perform basic command line parsing. (-control -server -port -trace) */
    basicParsing(argc,
                 argv,
                 &controlType,
                 &controlAddress);

    /* Create and initialize MPI objects */
    programInit(&control,
                controlType,
                &controlAddress,
            motor);

   displayHeaders();

    /* Display in use status and shutdown recorders if requested */
   while (!done)
   {
      key = (char) mpiPlatformKey(MPIWaitMSEC*100);

      switch(key)
      {
         case 'q':{
                  done = TRUE;
                  printf("\n\n\n\nExit Sequence Completed\n");
                  break;
               }
         case 'c':{
                  intProbeToSniff = -1;
                  destroyProbe(&probe);
                  displayHeaders();
                  break;
               }
         case 'd':{
                  DisplayMode = 'd';
                  break;
                }
         case 'f':{
                  DisplayMode = 'f';
                  break;
                }
         case 'h':{
                  DisplayMode = 'h';
                  break;
                }
         case 'l':{
                  //Clear Probe Function
                  clearProbe(&probe);
                  break;
                }
         default:{
                  break;
               }
      }


      // Check Value of Probe #
      if(intProbeToSniff > -1)
      {
         //If Probe# is Specified, SNIFF IT!
         displayHeaders();
         readProbe(control, &probe, &sniffedProbe);
         mpiPlatformSleep(150);

      }else{
         // Prompt User for new User Limit #, as well as Limit # to sniff;
         printf("\f\rEnter Motor Number With Probe (0-31): ");
         scanf("%d", &intMotorNumToSniff);
         printf("Enter Probe on Motor to Monitor: ");
         scanf("%d", &intProbeToSniff);

         // Create Probe based on motor/probe numbers entered
         createProbe(control, &probe);
      }

   }

    /* Perform certain cleanup actions and delete MPI objects */
    programCleanup(&control, motor);

    return MPIMessageOK;
}

       Legal Notice  |  Tech Email  |  Feedback
      
Copyright ©
2001-2009 Motion Engineering