HP Water System HP VXI Manuale Utente

Pagina di 34
Programming the Status System  
19
Example Program
/* status2.c * 
* The following program provides an interactive command line interface  
* to send SCPI commands to SCPI compatible instruments. 
* This utilizes the MAV bit of the Status Byte in order to determine if 
* the instrument is returning any output.  It also automatically 
* displays any error conditions that may result by querying the Standard 
* event status register. */
#include <sicl.h>
#include <stdio.h>
/* Theses are Masks for the Status Byte */
/* all bits start at bit 0 */
#define MAV_MASK 0x10      /* MAV - bit 4 */
#define ESR_MASK 0x20      /* ESR summary - bit 5 */
/* These are Masks for the Standard Event Status Register */
/* all bits start at bit 0 */
#define QRY_ERR_MASK 0x04  /* query error - bit 2 */
#define DEV_ERR_MASK 0x08  /* device dependent error - bit 3 */
#define EXE_ERR_MASK 0x10  /* execution error - bit 4 */
#define CMD_ERR_MASK 0x20  /* command error - bit 5 */
/* This is the SRQ handler to check for Message Available (MAV)  
* or any error conditions */
void srq_hdlr( INST id)
  unsigned char stb; 
  char buf[255]; 
  int esr; 
  int errnum; 
  char errmsg[100]; 
  /* read the status byte to determine what caused the SRQ. 
   * Note: use ireadstb instead of *STB? because we want to 
   * clear RQS instead of reading the MSS bit in the status byte. */
 ireadstb(id, &stb); 
 /* check if MAV caused the SRQ */ 
 if( MAV_MASK == (stb & MAV_MASK)) 
 { 
      /* message is available so read in the result */ 
      iscanf( id, "%t", buf); 
      printf("%s", buf); 
 } 
 else /* check if Standard Event Status */ 
 if( ESR_MASK == (stb & ESR_MASK)) 
 { 
      /* read the standard event register to determine 
       * what caused the ESR summary bit to be set.  This 
       * is necessary in order to get future SRQ’s from 
       * the Standard Event status group. */ 
       ipromptf(id, "*ESR?\n", "%d\n", &esr); 
       /* check if an error caused the summary bit to get set */ 
       if( (CMD_ERR_MASK == (esr & CMD_ERR_MASK )) || 
         (EXE_ERR_MASK == (esr & EXE_ERR_MASK )) ||
         (DEV_ERR_MASK == (esr & DEV_ERR_MASK )) ||