#include <userint.h>
#include "K2231A-ctrl.h"
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <visa.h>
static int debug = 0;
static ViStatus istat;
static ViSession DeviceHandle,RMHandle;
char response[0xFF]= {0};
int K2231A_SetDebug(int x){ debug = x;return 0;};
int K2231A_Write(const char *format, ... )
{
char cmd[0xFF];
va_list aptr;
char str[0xFF];
int istat = viPrintf (DeviceHandle, str);
if (debug
) printf("K2231A_Write %s\n", cmd
);
return istat;
}
const char * K2231A_Read(const char *format, ... )
{
char cmd[0xFF];
va_list aptr;
char str[0xFF];
int istat=0;
istat = viPrintf (DeviceHandle, str);
int nb=0;
istat = viRead (DeviceHandle, response, 0xFF, &nb);
if (nb>0) response[nb-1]=0;
if (debug
) printf("K2231A_Read %s : %s\n", cmd
, response
);
if (istat) return NULL;
return response;
}
int K2231A_QueryInt(const char *format, ... )
{
char cmd[0xFF];
va_list aptr;
return atoi(K2231A_Read
(cmd
));
}
double K2231A_QueryDouble(const char *format, ...) {
char cmd[0xFF];
va_list aptr;
return atof(K2231A_Read
(cmd
));
}
static int K2231A_Port=5;
int K2231A_SetPort(int x){K2231A_Port=x; return x;};
int K2231A_Initialize()
{
istat = viOpenDefaultRM (&RMHandle);
char cport[0xFF];
sprintf(cport
,"ASRL%d::INSTR", K2231A_Port
);
if (RMHandle) istat = viOpen (RMHandle, cport , VI_NULL, VI_NULL, &DeviceHandle);
if (DeviceHandle)
{
istat = viSetAttribute (DeviceHandle, VI_ATTR_TERMCHAR, '\n');
istat = viSetAttribute (DeviceHandle, VI_ATTR_TERMCHAR_EN, VI_TRUE);
istat = viSetAttribute (DeviceHandle, VI_ATTR_TMO_VALUE, 5000);
}
else
{
MessagePopup("Error","Cannot open handle");
}
return 0;
}
int K2231A_Test()
{
char response[0xFF]= {0};
int i;
for ( i=0; i<255; i++) response[i]=0;
K2231A_Read("*IDN?");
K2231A_Read("SYSTem:VERSion?");
K2231A_Read("VOLT?");
K2231A_Read("CURR?");
K2231A_Read("MEAS:VOLT?");
K2231A_Read("MEAS:CURR?");
K2231A_Read("FETC:VOLT?");
K2231A_Read("FETC:CURR?");
K2231A_Write("SYSTem:BEEPer");
return TRUE;
}
int K2231A_Close()
{
K2231A_Write("syst:loc");
return 0;
}
int K2231A_Open()
{
K2231A_Initialize();
K2231A_Write("syst:rem");
return TRUE;
}
int K2231A_RecallFromMemory(int preset){
return K2231A_Write("*rcl %d",preset);
}
double K2231A_GetSetCurrent(){
return K2231A_QueryDouble("CURR?");
}
double K2231A_GetSetVoltage(){
return K2231A_QueryDouble("VOLT?");
}
double K2231A_SetCurrent(double x){
return K2231A_Write("CURR %f", x);
}
double K2231A_SetVoltage(double x){
return K2231A_Write("VOLT %f", x);
}
double K2231A_GetCurrentMonitor(){
return K2231A_QueryDouble("MEAS:CURR?");
}
double K2231A_GetVoltageMonitor(){
return K2231A_QueryDouble("MEAS:VOLT?");
}
int K2231A_SelectChannel(int ch){
return K2231A_Write( "INST CH%d",ch);
}
int K2231A_GetOperationMode(){
/*
//cv_cc = K2231A_QueryInt("Stat:ques:inst?");
sprintf(cmd, "Stat:ques:inst:isum%d?",ch+1);
*/
return K2231A_QueryInt("Stat:ques:inst?");
}
int K2231A_SetSwitch(int state){
K2231A_Write("Outp:enab %d",state);
K2231A_Write("Outp %d",state);
return 0;
}
int K2231A_GetSwitch(){
return K2231A_QueryInt("CHAN:OUTP?");
}
void K2231A_ReadMonitorValues(double * I , double * V, unsigned char * mode, unsigned char *onoff)
{
int iRet;
char ch=0;
double Voltage;
double Current;
char cv_cc;
for (ch=0; ch<3; ch++)
{
K2231A_SelectChannel(ch+1);
cv_cc = K2231A_GetOperationMode();
I[ch]= K2231A_GetCurrentMonitor();
V[ch]= K2231A_GetVoltageMonitor();
int onoff=K2231A_QueryInt("OUTP?");
if (debug
) printf("[%d] %g V %g A CVCC %d ONOFF %d\t",ch
, V
[ch
], I
[ch
], cv_cc
, onoff
);
}
return;
}
void K2231A_ReadSetValues(double * I , double * V, unsigned char *onoff)
{
int iRet;
char ch=0;
double Voltage;
double Current;
char cv_cc;
for (ch=0; ch<3; ch++)
{
K2231A_SelectChannel(ch+1);
cv_cc = K2231A_GetOperationMode();
I[ch]= K2231A_GetSetCurrent();
V[ch]= K2231A_GetSetVoltage();
int onoff=K2231A_GetSwitch();
if (debug
) printf("[%d] %g V %g A CVCC %d ONOFF %d\t",ch
, V
[ch
], I
[ch
], cv_cc
, onoff
);
}
return;
}
#ifdef MAIN
#include <ansi_c.h>
#include <utility.h>
#define RSTREG(a,x) (a&=(~(x)))
#define SETREG(a,x) (a|=x)
int gLogToFile;
int vmon[3]= {P1_VMON_1,P1_VMON_2,P1_VMON_3 };
int imon[3]= {P1_IMON_1,P1_IMON_2,P1_IMON_3 };
int vset[3]= {P1_U_1,P1_U_2,P1_U_3 };
int iset[3]= {P1_I_1,P1_I_2,P1_I_3 };
int radiob[3]= {P1_BOX_1,P1_BOX_2,P1_BOX_3 };
int cvcc[3]= {P1_CVCC_1,P1_CVCC_2,P1_CVCC_3 };
int gMask=0xF;
int pnl;
FILE *gFp;
int main (int argc, char *argv[])
{
int DeviceId=0;
unsigned char MainOutput=0, preset=0;
double Voltage=0, Current=0, tinterval=1;
char str[0xFF];
int i=0;
char response[0xFF];
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
SetStdioPort (CVI_STDIO_WINDOW);
SetStdioWindowOptions (1000, 1, 0);
SetStdioWindowSize (150, 600);
SetStdioWindowPosition (825, 20);
if ((pnl = LoadPanel (0, "K2231A-ctrl.uir", P1)) < 0) return -1;
if (K2231A_Open()== 0) MessagePopup("Error","Cannot open USB device");
if (K2231A_Test() == 0 )MessagePopup("DLL error","Dll Error");
SetCtrlVal(pnl, P1_ONOFF, MainOutput);
GetCtrlVal(pnl, P1_TINTERVAL, &tinterval);
SetCtrlAttribute (pnl, P1_TIMER, ATTR_INTERVAL, tinterval);
SetCtrlVal(pnl, P1_PRESET, preset);
SetTraceAttributeEx (pnl, P1_GRAPH_IMON, 1, ATTR_TRACE_LG_TEXT, "CH 30V");
SetTraceAttributeEx (pnl, P1_GRAPH_IMON, 2, ATTR_TRACE_LG_TEXT, "CH 30V");
SetTraceAttributeEx (pnl, P1_GRAPH_IMON, 3, ATTR_TRACE_LG_TEXT, "CH 5V");
SetTraceAttributeEx (pnl, P1_GRAPH_VMON, 1, ATTR_TRACE_LG_TEXT, "CH 30V");
SetTraceAttributeEx (pnl, P1_GRAPH_VMON, 2, ATTR_TRACE_LG_TEXT, "CH 30V");
SetTraceAttributeEx (pnl, P1_GRAPH_VMON, 3, ATTR_TRACE_LG_TEXT, "CH 5V");
int ison;
for (unsigned char ch=0; ch<3; ch++)
{
K2231A_SelectChannel(ch+1);
Voltage =K2231A_GetSetVoltage();
Current =K2231A_GetSetCurrent();
ison =K2231A_GetSwitch();
SetCtrlVal(pnl, vset[ch], Voltage);
SetCtrlVal(pnl, iset[ch], Current);
SetCtrlVal(pnl, radiob[ch], ison);
if (ison) SETREG(gMask,(1<<ch));
else RSTREG(gMask,(1<<ch));
}
DisplayPanel (pnl);
RunUserInterface ();
DiscardPanel (pnl);
K2231A_Close();
return 0;
}
int CVICALLBACK SwitchOnOffCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
unsigned char state;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel, control, &state);
K2231A_SetSwitch(state);
break;
}
return 0;
}
int CVICALLBACK SetCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
{
unsigned char preset=0;
SetCtrlVal(pnl, P1_PRESET, preset);
for (unsigned char ch = 0; ch<3; ch++)
{
//printf("ch %d %x\n", ch, gMask);
if (gMask & (1<<ch))
{
double Voltage;
double Current;
GetCtrlVal(panel, vset[ch], &Voltage);
GetCtrlVal(panel, iset[ch], &Current);
char cmd[0xFF];
K2231A_SelectChannel(ch+1);
Voltage =K2231A_GetVoltageMonitor();
Current =K2231A_GetCurrentMonitor();
printf("<-ch %d VSet %g Iset %g\n", ch
, Voltage
, Current
);
}
}
}
break;
}
return 0;
}
int CVICALLBACK ReadCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int iRet;
char ch=0;
double Voltage=0;
double Current=0;
char cv_cc=0;
switch (event)
{
case EVENT_COMMIT:
for (ch = 0; ch<3; ch++)
{
if (gMask & (1<<ch))
{
K2231A_SelectChannel(ch+1);
Voltage =K2231A_GetVoltageMonitor();
Current =K2231A_GetCurrentMonitor();
cv_cc = K2231A_GetOperationMode();
printf("ch %d VSet %g Iset %g\n", ch
, Voltage
, Current
);
SetCtrlVal(panel, vmon[ch], Voltage);
SetCtrlVal(panel, imon[ch], Current);
SetCtrlVal(panel, cvcc[ch], cv_cc);
}
}
break;
}
return 0;
}
int CVICALLBACK SetIntervalCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double tinterval;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel, control, &tinterval);
SetCtrlAttribute (panel, P1_TIMER, ATTR_INTERVAL, tinterval);
break;
}
return 0;
}
int CVICALLBACK TimerOnOffCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int state;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel, control, &state);
if (state)
{
SetCtrlAttribute (panel, P1_TIMER, ATTR_ENABLED, 1);
ResumeTimerCallbacks();
}
else
{
SuspendTimerCallbacks ();
printf ("Disabling timer....\n");
}
break;
}
return 0;
}
int CVICALLBACK ExitCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface(0);
break;
}
return 0;
}
int CVICALLBACK SetMaskCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int ison;
switch (event)
{
int i=0;
case EVENT_COMMIT:
GetCtrlVal(panel, control, &ison);
for (i=0; i<3; i++) if (control == radiob[i]) break;
if (ison) SETREG(gMask,(1<<i));
else RSTREG(gMask,(1<<i));
break;
}
return 0;
}
int CVICALLBACK LogToFileCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel, control, &gLogToFile);
break;
}
return 0;
}
int CVICALLBACK TimerCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
unsigned char ch;
double current[3]= {0,0,0};
double voltage[3]= {0,0,0};
char cv_cc=0;
case EVENT_TIMER_TICK:
for (ch = 0; ch<3; ch++)
{
if (gMask & (1<<ch))
{
K2231A_SelectChannel(ch+1);
voltage[ch] =K2231A_GetVoltageMonitor();
current[ch] =K2231A_GetCurrentMonitor();
cv_cc = K2231A_GetOperationMode();
int onoff=K2231A_GetSwitch();
SetCtrlVal(panel, vmon[ch], voltage[ch]);
SetCtrlVal(panel, imon[ch], current[ch]);
SetCtrlVal(panel, cvcc[ch], cv_cc);
SetCtrlVal(panel, P1_ONOFFLED, onoff);
if (gLogToFile)
{
if (!gFp)
{
gFp
= fopen("pw18-1.8aq.log","w");
fprintf(gFp
,"#time\tch\tU\tI\tCV_CC\n");
}
fprintf(gFp
,"%ul\t%d\t%g\t%g\t%d\n", time(NULL
), ch
+1, voltage
[ch
], current
[ch
], cv_cc
);
}
}
}
PlotStripChart (panel, P1_GRAPH_IMON, current, 3, 0, 0, VAL_DOUBLE);
PlotStripChart (panel, P1_GRAPH_VMON, voltage, 3, 0, 0, VAL_DOUBLE);
break;
}
return 0;
}
int CVICALLBACK SetPresetCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char cmd[0xFF];
switch (event)
{
case EVENT_COMMIT:
{
unsigned char preset;
double Voltage, Current;
GetCtrlVal(panel, control, &preset);
K2231A_RecallFromMemory(preset);
for (unsigned char ch=0; ch<3; ch++)
{
int ison;
K2231A_SelectChannel(ch+1);
Voltage =K2231A_GetSetVoltage();
Current =K2231A_GetSetCurrent();
ison =K2231A_GetSwitch();
SetCtrlVal(pnl, vset[ch], Voltage);
SetCtrlVal(pnl, iset[ch], Current);
GetCtrlVal(pnl, radiob[ch], &ison);
if (ison) SETREG(gMask,(1<<ch));
else RSTREG(gMask,(1<<ch));
}
break;
}
}
return 0;
}
int CVICALLBACK DebugCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel, control, &debug);
break;
}
return 0;
}
#endif MAIN