// // Copyright Tektronix // // > sample [ points ] // #include #include "visa.h" #include #include // I/O Resource String definitions #define GPIB_RESOURCE_STRING "GPIB0::1::INSTR" #define VXI11_RESOURCE_STRING "TCPIP::192.168.0.5::INSTR" #define SOCKET_RESOURCE_STRING "TCPIP::192.168.0.7::4000::SOCKET" #define VIRTUAL_GPIB_RESOURCE_STRING "GPIB8::1::INSTR" // I/O Resource String // Select one of these resources #define RESOURCE_STRING GPIB_RESOURCE_STRING //#define RESOURCE_STRING VXI11_RESOURCE_STRING //#define RESOURCE_STRING SOCKET_RESOURCE_STRING //#define RESOURCE_STRING VIRTUAL_GPIB_RESOURCE_STRING #define LINEFEED_CHAR 0x0a #define TIMEOUT_VALUE (10 * 1000) // in miliseconds #pragma pack(1) typedef struct { float analog; unsigned char marker; } WaveformDataReal; typedef struct { unsigned short value; } WaveformDataInteger; #pragma pack() #define HIGH_DATA (1.0) #define LOW_DATA (-1.0) #define MARKER1_BIT 0x40 #define MARKER2_BIT 0x80 #define NUM_OF_POINTS 1024 #define WAVEFORM_NAME "sample_waveform" #define OUTPUT_FREQUENCY 1.0e6 int main(int argc, char* argv[]) { ViSession rm, vi; ViStatus status; char buf[BUFSIZ]; ViUInt32 retCount; int points = NUM_OF_POINTS; if (1 < argc && isdigit(*argv[1])) { points = atoi(argv[1]); } // Create a session to the Default Resource Manager status = viOpenDefaultRM(&rm); if (status < VI_SUCCESS) { printf("viOpenDefaultRM() error: 0x%x\n", status); exit(EXIT_FAILURE); } // Open a session to the specified resource status = viOpen(rm, RESOURCE_STRING, VI_NULL, VI_NULL, &vi); if (status < VI_SUCCESS) { printf("viOpen() error: 0x%x\n", status); viClose(rm); exit(EXIT_FAILURE); } // Set Interface Attributes buf[0] = VI_NULL; status = viGetAttribute(vi, VI_ATTR_RSRC_NAME, &buf); if (0 == strcmp(&buf[strlen(buf) - strlen("SOCKET")], "SOCKET")) { status = viSetAttribute(vi, VI_ATTR_TERMCHAR, LINEFEED_CHAR); status = viSetAttribute(vi, VI_ATTR_TERMCHAR_EN, VI_TRUE); } status = viSetAttribute(vi, VI_ATTR_TMO_VALUE, TIMEOUT_VALUE); if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viSetAttribute() error: %s\n", buf); viClose(vi); viClose(rm); exit(EXIT_FAILURE); } status = viSetAttribute(vi, VI_ATTR_WR_BUF_OPER_MODE, VI_FLUSH_ON_ACCESS); if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viSetAttribute() error: %s\n", buf); viClose(vi); viClose(rm); exit(EXIT_FAILURE); } // Initialize device settings status = viWrite(vi, (ViBuf) "*CLS;*RST\n", 10, VI_NULL); if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viWrite() error: %s\n", buf); viClose(vi); viClose(rm); exit(EXIT_FAILURE); } // Get instrument ID status = viWrite(vi, (ViBuf) "*IDN?\n", 6, VI_NULL); if (VI_SUCCESS <= status) { Sleep(5); status = viRead(vi, (ViBuf) buf, sizeof(buf) - 1, &retCount); } if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viWrite()/viRead() error: %s\n", buf); viClose(vi); viClose(rm); exit(EXIT_FAILURE); } if (0 < retCount && LINEFEED_CHAR == buf[retCount - 1]) retCount--; buf[retCount] = VI_NULL; printf("id: %s\n", buf); status = viWrite(vi, (ViBuf) "*OPT?\n", 6, VI_NULL); if (VI_SUCCESS <= status) { Sleep(5); status = viRead(vi, (ViBuf) buf, sizeof(buf) - 1, &retCount); } if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viWrite()/viRead() error: %s\n", buf); viClose(vi); viClose(rm); exit(EXIT_FAILURE); } if (0 < retCount && LINEFEED_CHAR == buf[retCount - 1]) retCount--; buf[retCount] = VI_NULL; printf("options: %s\n", buf); // make waveform data - square WaveformDataReal *waveformData = new WaveformDataReal[points]; WaveformDataReal *p; int bytes; char length[16]; double sampleRate = OUTPUT_FREQUENCY * points; int i; if (NULL == waveformData) { printf("new(): error\n"); viClose(vi); viClose(rm); exit(EXIT_FAILURE); } p = &waveformData[0]; for (i = 0; i < points / 2; i++, p++) { p->analog = HIGH_DATA; p->marker = MARKER1_BIT; if (0 == i) p->marker |= MARKER2_BIT; } for (; i < points; i++, p++) { p->analog = LOW_DATA; p->marker = 0x00; } // send waveform data bytes = points * sizeof(WaveformDataReal); sprintf(length, "%d", bytes); status = viPrintf(vi, "WLIS:WAV:NEW \"%s\",%d,REAL\n", WAVEFORM_NAME, points); if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viPrintf() error: %s\n", buf); viClose(vi); viClose(rm); delete [] waveformData; exit(EXIT_FAILURE); } sprintf(buf, "WLIS:WAV:DATA \"%s\",#%d%s", WAVEFORM_NAME, strlen(length), length); status = viSetAttribute(vi, VI_ATTR_SEND_END_EN, VI_FALSE); if (VI_SUCCESS <= status) { status = viWrite(vi, (ViBuf) buf, strlen(buf), VI_NULL); } if (VI_SUCCESS <= status) { status = viWrite(vi, (ViBuf) &waveformData[0], bytes, VI_NULL); } if (VI_SUCCESS <= status) { status = viSetAttribute(vi, VI_ATTR_SEND_END_EN, VI_TRUE); } if (VI_SUCCESS <= status) { status = viWrite(vi, (ViBuf) "\n", 1, VI_NULL); } if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viWrite() error: %s\n", buf); viClose(vi); viClose(rm); delete [] waveformData; exit(EXIT_FAILURE); } Sleep(10 * 1000); // output settings status = viPrintf(vi, "SOUR1:WAV \"%s\"\n", WAVEFORM_NAME); if (VI_SUCCESS <= status) { status = viPrintf(vi, "SOUR:FREQ %f\n", sampleRate); } if (VI_SUCCESS <= status) { status = viPrintf(vi, "SOUR1:VOLT:HIGH 1.5;LOW -0.5\n"); } if (VI_SUCCESS <= status) { status = viPrintf(vi, "OUTP1 1;:AWGC:RUN\n"); } if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viPrintf() error: %s\n", buf); viClose(vi); viClose(rm); delete [] waveformData; exit(EXIT_FAILURE); } status = viPrintf(vi, "SYST:ERR?\n"); if (VI_SUCCESS <= status) { Sleep(5); status = viRead(vi, (ViBuf) buf, sizeof(buf) - 1, &retCount); } if (status < VI_SUCCESS) { viStatusDesc(vi, status, buf); printf("viPrintf()/viRead() error: %s\n", buf); viClose(vi); viClose(rm); delete [] waveformData; exit(EXIT_FAILURE); } if (0 < retCount && LINEFEED_CHAR == buf[retCount - 1]) retCount--; buf[retCount] = VI_NULL; printf("status: %s\n", buf); viClose(vi); viClose(rm); delete [] waveformData; exit(EXIT_SUCCESS); }