ni.com is currently undergoing scheduled maintenance.

Some services may be unavailable at this time. Please contact us for help or try again later.

Instrument Control (GPIB, Serial, VISA, IVI)

cancel
Showing results for 
Search instead for 
Did you mean: 

Interruption with PXI

Hi, 

 

I have been looking for some information about PXI and interruptions but there is not too much information online, so I am a little bit lost. I have to develop a program to detect an interruption from a PXI and then retrieve the data from third part 3 part device that some colleagues have developed. To start, I modified a little bit the example that the VISA driver includes in its help (I just changed the event from the original file)

 

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

#include "visa.h"

static ViUInt16 StatusID;
static ViSession instr;
static ViSession defaultRM;
static ViStatus status;
static int tempchar;

ViStatus _VI_FUNCH IntrHandler(ViSession instr, ViEventType etype, ViEvent event, ViAddr userhandle);

/*
 * Here we define the function that is called whenever an interrupt event is received. */
ViStatus _VI_FUNCH IntrHandler(ViSession instr, ViEventType etype, ViEvent event, ViAddr userhandle)
{
   /* etype is a number which identifies the event type that has been received. */
   viGetAttribute (event, VI_ATTR_SIGP_STATUS_ID, &StatusID);
   printf("An event was received.  The Status/ID value is 0x%x\n",StatusID);

   /* System calls are allowed to be used inside the event handler on all VISA supported platforms other than Macintosh. */
   return VI_SUCCESS;
}

int main (void)
{
   /*First we must call viOpenDefaultRM to get the manager handle.  We will store this handle in defaultRM.    */
   status=viOpenDefaultRM (&defaultRM);
   if (status < VI_SUCCESS)  
   {
      printf("Could not open a session to the VISA Resource Manager!\n");
      exit (EXIT_FAILURE);
   } 

   status = viOpen (defaultRM, "visa://137.138.179.180/PXI16::12::INSTR", VI_NULL, VI_NULL, &instr);
   if (status < VI_SUCCESS)
   {
      printf("Can not open a VISA session to visa://137.138.179.180/PXI16::12::INSTR\n");
      viClose (defaultRM);
      exit (EXIT_SUCCESS);
   }

   /*Now we will install the event handler that will monitor interrupt events.  The handler is named IntrHandler.  uhandle is a handle
    * allowing data to be passed to the handler from the application. */
   status = viInstallHandler (instr, VI_EVENT_PXI_INTR, IntrHandler, VI_NULL);   
//   status = viInstallHandler (instr, VI_EVENT_EXCEPTION, IntrHandler, VI_NULL);

   if (status < VI_SUCCESS)
   {
      printf("Could not install the interrupt handler.\n");
      viClose (defaultRM);
      exit (EXIT_SUCCESS);
   }

   /*
    * Now we will enable signal processing events so the program can receive them into its event handler.  It will only receive events for
    * interrupts or signals.  See the other interrupt example to see how things would differ if events were queued.    */
   status = viEnableEvent (instr, VI_EVENT_PXI_INTR, VI_HNDLR, VI_NULL);
//   status = viEnableEvent (instr, VI_EVENT_EXCEPTION, VI_HNDLR, VI_NULL);
   if (status < VI_SUCCESS)
   {
      printf("Could not enable the interrupt event.\n");
      viClose (defaultRM);
      exit (EXIT_SUCCESS);
   }

   /*
    *  Under Windows 3.x or the Macintosh, Yield() or PeekMessage() functions may need to be called to give up processor time so that VISA events
    *  will be invoked.  Under WIN32 or UNIX, this is not necessary because VISA event handlers are spawned in a separate thread.  */      
   printf("Press any key to stop waiting for events.\n");
   fflush(stdin);
   tempchar=getchar();

   /* Now we will uninstall the handler we installed to handle interrupts Calling this function will implicitly call viDisableEvent(). 
* Note that unlike viWaitonEvent, the event is closed for us when we exit the handler. Compare this with the other interrupt example. */ status = viUninstallHandler (instr, VI_EVENT_VXI_SIGP, IntrHandler, VI_NULL); /* Now we will close the session to the instrument using viClose. We will tell VISA what to close using the handle, "instr". */ viClose (instr); viClose (defaultRM); printf("\nHit Enter to continue."); fflush(stdin); getchar(); return 0; }

 
When the program executes the line 

   status = viEnableEvent (instr, VI_EVENT_PXI_INTR, VI_HNDLR, VI_NULL);

 an error appears:

 

Function viEnableEvent: (return value == -1073807302 [0xbfff003a]). Unable to start operation because setup is invalid (due to attributes being set to an inconsistent state).

 

If I run the program configuring the other event in the code (and also changing the properties in the handler)

//   status = viInstallHandler (instr, VI_EVENT_EXCEPTION, IntrHandler, VI_NULL);

 the program works fine...Has someone an idea why i have this error when I use the event VI_EVENT_PXI_INTR?

 

Also I have another question about interruptions with PXI. Thefinalgoal is to develop a program that calls dll´s made withLabWindows anddetectthepossibleinterruptions in the PXI. I have been looking for some examples but I haven´t seen anything similar...Has someone a practical examples of how to handle interruptions with LabVIEW?

 

Thanks,

Jaime

 

 

 

 

 

 

 

 

 

 

 

0 Kudos
Message 1 of 4
(3,868 Views)

Hey Jaime,

 

 The error you mentioned is discussed in following KnowledgeBase.

 

http://digital.ni.com/public.nsf/websearch/DDE6A6A773A4B1DC86256BC0005C8A8F?OpenDocument

 



Please let me know if this solution works for your you.

 

Thomas

0 Kudos
Message 2 of 4
(3,821 Views)

Hi Thomas, 

 

First of all, thanks for your reply. I solved my problem with the next link.

 

Error BFFF003A When Enabling Interrupts in MAX with 3rd Party Device
http://digital.ni.com/public.nsf/allkb/DFF952E483E212658625712B007B72FB?OpenDocument

 

Thanks!

Jaime

0 Kudos
Message 3 of 4
(3,816 Views)

Hi,

 

thanks for your reply. I´m pleased to hear, that you solved your problem.

 

Thomas

0 Kudos
Message 4 of 4
(3,814 Views)