//
// Copyright Tektronix
//
// > sample [ points ]
//
#include <stdio.h>
#include "visa.h"
#include <string.h>
#include <windows.h>
// 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);
}
댓글