Instrument Control (GPIB, Serial, VISA, IVI)

cancel
Showing results for 
Search instead for 
Did you mean: 

How to create the VXI11 interrupt channel while client is running on NI-Max Client.?

Hi All,

 

From below threads I just came to know that there is no port-maper service on NI-VISA client hence I have implemented the raw socket for the same.

http://forums.ni.com/t5/Instrument-Control-GPIB-Serial/NI-VISA-on-Windows-2000-PC-and-Port-Mapper-Se...

 

http://forums.ni.com/t5/Instrument-Control-GPIB-Serial/Does-VISA-have-VXI-11-Server-implement-to-ser...

 

I am able to establish interrupt channel with NI-Max client but still I am not getting VI_EVENT_SERVICE_REQ  event at client side  and viWaitonEvent() function giving timeout.

 

Might be there is some issue with new defined RPCHDR structure!!

I never done Network programing before. Please guide; how to resolve this issue.

 

client Socket Code:-

 

typedef struct rcphdr{
 unsigned int length;
 unsigned int xid;
 unsigned int msg_type;
 unsigned int rpcvers;
 unsigned int prog;
 unsigned int vers;
 unsigned int proc;
 unsigned int auth[4];
}RPCHDR;

 

typedef struct DeviceSrqParms {
 struct  {
  u_int handle_len;
  char handle_val[40];
 }handle;
}DeviceSrqParms;

 

typedef struct intr_srq_data
{
 RPCHDR    tdsRPC_Header;
 DeviceSrqParms  tdsDevSrqData;
}intrsrqData;

 

static SOCKET ConnectSocket;
struct sockaddr_in clientService;
WSADATA wsaData;
intrsrqData SrqMsgStruct;

unsigned int toBigEndian(unsigned int val)
{
 if(!isBigEndian())
 {
  return htonl(val);
 }
 return val;
}

 

create_intr_chan_1_svc(Device_RemoteFunc *argp, struct svc_req *rqstp)
{
 int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
 if (iResult != NO_ERROR)
  printf("Error at WSAStartup()\n");

 ConnectSocket = socket(PF_INET, SOCK_STREAM,0);
 clientService.sin_family = AF_INET;
 clientService.sin_addr.s_addr =  inet_addr( "127.0.0.1" );
 clientService.sin_port = htons(argp->hostPort);

 if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
  printf( "Failed to connect.\n" );
  printf("Error at socket(): %ld\n", WSAGetLastError());
  WSACleanup();
  return;
 }

#endif
}

 

device_enable_srq_1_svc(Device_EnableSrqParms *argp, struct svc_req *rqstp)
{

 static unsigned int ui32XId = 1;    
 std::string handle = std::string(argp->handle.handle_val, argp->handle.handle_len);
 unsigned int     ui32Length = (sizeof( RPCHDR ) - 4) | 0x80000000;
 SrqMsgStruct.tdsRPC_Header.length = toBigEndian(ui32Length);
 SrqMsgStruct.tdsRPC_Header.xid = toBigEndian(1);
 SrqMsgStruct.tdsRPC_Header.msg_type = toBigEndian(0);
 SrqMsgStruct.tdsRPC_Header.rpcvers = toBigEndian(2);
 SrqMsgStruct.tdsRPC_Header.prog = toBigEndian(DEVICE_INTR);
 SrqMsgStruct.tdsRPC_Header.vers = toBigEndian(DEVICE_INTR_VERSION);
 SrqMsgStruct.tdsRPC_Header.proc = toBigEndian(device_intr_srq);
 memset(SrqMsgStruct.tdsRPC_Header.auth, 0, sizeof(SrqMsgStruct.tdsRPC_Header.auth));

 //Append stored SRQ data
 strcpy(SrqMsgStruct.tdsDevSrqData.handle.handle_val,handle.c_str());
 SrqMsgStruct.tdsDevSrqData.handle.handle_len = toBigEndian(VxiIOConst::Handle.mHandleLen);

 //TCP Socket accept data as std::string, so convert data structure to std::string       
 char *pcData = (char *) &SrqMsgStruct;       
 int iResult = send( ConnectSocket, pcData, sizeof(INTR_SRQ_DATA), 0 );
}

 

System Info:-

Operating System(OS)                Microsoft Windows XP Professional
OS Version                          5.01.2600
OS Info                             Service Pack 3
Processor                           Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz / x86 Family 6 Model 23 Stepping 10 / GenuineIntel / 2992 MHz
Number of Processors                2
Physical Memory                     1.85 GB of RAM
Drive C:\                           72.4 GB of 97.6 GB free
Drive E:\                           115 GB of 135 GB free
                                   
National Instruments Software:      Version:
                                   
CVI Run-Time                        9.0.0.353
LabVIEW Run-Time                    8.2.1
Measurement & Automation Explorer   4.5.0.49152
NI-PAL Software                     2.4.0
NI Spy                              2.6.0.49152
NI-VISA                             4.5
     NiVisaServer.exe               4.5.0.49152
     NIvisaic.exe                   4.5.0.49152
NI-VISA Runtime                     4.5

 

Thanks

 

0 Kudos
Message 1 of 2
(3,447 Views)

Hi C++Coder,

You don't have to send back the package in function device_enable_srq_1_svc, you only store the package in memory and also detect it is send by the system with what Endian (Big or Little).  When the STB bit RQS (bit-6) raised (for testing you could simulate it), you send back the stored package in function as described in my thread with Endian handling, so it'll work for any system.

http://forums.ni.com/t5/Instrument-Control-GPIB-Serial/Does-VISA-have-VXI-11-Server-implement-to-ser...

 

0 Kudos
Message 2 of 2
(3,440 Views)