📄 gpibdll.cpp
字号:
#define DLL1_API _declspec(dllexport)
#include "GpibDll.h"
LCGpibDll::GpibDll()
{
m_sesn = VI_NULL;
m_vi = VI_NULL;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
BOOL LCGpibDll::Close(VOID)
{
ViStatus status;
viDisableEvent(m_vi, VI_EVENT_IO_COMPLETION, VI_QUEUE);
if (NULL != m_vi)
{
status = viClose(m_vi);
if (VI_SUCCESS != status)
{
TraceErr(status);
return FALSE;
}
m_vi = NULL;
}
if (NULL != m_sesn)
{
status = viClose(m_sesn);
if (VI_SUCCESS != status)
{
TraceErr(status);
return FALSE;
}
m_sesn = NULL;
}
return TRUE;
}
BOOL LCGpibDll::OpenGpib(int iPort,int iAddr)
{
ViStatus status;
if (m_vi != NULL)
viClose(m_vi);
if (m_sesn != NULL)
viClose(m_sesn);
status = viOpenDefaultRM(&m_sesn);
if (status != VI_SUCCESS)
{
TraceErr(status);
return FALSE;
}
//打开GPIB
char szCmd[50];
sprintf(szCmd, "GPIB%d::%d::INSTR",iPort, iAddr);
status = viOpen(m_sesn, szCmd, VI_NULL, VI_NULL, &m_vi);
if (status != VI_SUCCESS)
{
TraceErr(status);
return FALSE;
}
viClear(m_vi);
viEnableEvent(m_vi, VI_EVENT_IO_COMPLETION, VI_QUEUE, VI_NULL);
char Tmp[8];
if (FALSE == Query("*RST;*CLS;*OPC?;", Tmp, sizeof(Tmp)))
{
return FALSE;
}
return TRUE;
}
BOOL LCGpibDll::OpenTcpip(int iPort,CString dwIP)
{
ViStatus status;
if (m_vi != NULL)
viClose(m_vi);
if (m_sesn != NULL)
viClose(m_sesn);
status = viOpenDefaultRM(&m_sesn);
if (status != VI_SUCCESS)
{
TraceErr(status);
return FALSE;
}
//打开GPIB
char szCmd[50];
sprintf(szCmd, "TCPIP%d::%s::inst0::INSTR",iPort,dwIP);
status = viOpen(m_sesn, szCmd, VI_NULL, VI_NULL, &m_vi);
if (status != VI_SUCCESS)
{
TraceErr(status);
return FALSE;
}
viClear(m_vi);
viEnableEvent(m_vi, VI_EVENT_IO_COMPLETION, VI_QUEUE, VI_NULL);
char Tmp[8];
if (FALSE == Query("*RST;*CLS;*OPC?;", Tmp, sizeof(Tmp)))
{
return FALSE;
}
return TRUE;
}
BOOL LCGpibDll::Query(const char *lpszCmd, char *lpszRxBuf, UINT nRxBufLength)
{
ViStatus status;
ViUInt32 retCount;
ViEventType eventType;
ViEvent event;
ViJobId JobId_Read;
ViJobId JobId_Wait;
status = viFlush(m_vi, VI_WRITE_BUF|VI_READ_BUF);
if (VI_SUCCESS != status)
{
TraceErr(status);
return FALSE;
}
status = viPrintf(m_vi, "%s\n",lpszCmd);
if (VI_SUCCESS != status)
{
TraceErr(status);
return FALSE;
}
status = viFlush(m_vi, VI_WRITE_BUF);
if (VI_SUCCESS != status)
{
TraceErr(status);
return FALSE;
}
viReadAsync(m_vi, (unsigned char *)lpszRxBuf, nRxBufLength, &JobId_Read);
viWaitOnEvent(m_vi, VI_EVENT_IO_COMPLETION, VI_TMO_INFINITE, &eventType, &event);
viGetAttribute(event, VI_ATTR_JOB_ID, &JobId_Wait);
viGetAttribute(event, VI_ATTR_RET_COUNT, &retCount);
if ((JobId_Wait != JobId_Read) || (retCount <= 0))
{
viClose(event);
return FALSE;
}
lpszRxBuf[retCount] = 0;
viClose(event);
return TRUE;
}
BOOL LCGpibDll::Write(LPCSTR szCmd)
{
ViStatus status;
status = viPrintf(m_vi, "%s\n", szCmd);
if (VI_SUCCESS != status)
{
TraceErr(status);
return FALSE;
}
return TRUE;
}
VOID LCGpibDll::TraceErr(ViStatus status)
{
char szErrMsg[1024];
CString strErrMsg;
viStatusDesc(m_vi, status, szErrMsg);
strErrMsg = szErrMsg;
strErrMsg += "\n";
}
//:MMEM:LOAD
BOOL LCGpibDll::LoadFile(LPCSTR lpNamePath)
{
char Tmp[4];
CString csCmd;
csCmd.Format(":MMEM:LOAD \"%s\";*OPC?;", lpNamePath);
if (!Query(csCmd, Tmp, sizeof(Tmp)))
return FALSE;
return TRUE;
}
VOID LCGpibDll::SetTraceSel(int itrace)
{
CString csCmd;
csCmd.Format(":CALC1:PAR%d:SEL;", itrace);
Write(csCmd);
WriteEx("*OPC?;");
}
//:CALC1:PAR1:DEF
VOID LCGpibDll::ChangeTrcSParam(int iTrc, int iParam)
{
CString csCmd;
csCmd.Format(":CALC1:PAR:COUN %d;", iTrc);
Write(csCmd);
switch (iParam)
{
case 1:
csCmd.Format(":CALC1:PAR%d:DEF S11;", iTrc);
break;
case 2:
csCmd.Format(":CALC1:PAR%d:DEF S21;", iTrc);
break;
case 3:
csCmd.Format(":CALC1:PAR%d:DEF S12;", iTrc);
break;
case 4:
csCmd.Format(":CALC1:PAR%d:DEF S22;", iTrc);
break;
default:
return;
break;
}
Write(csCmd);
WriteEx("*OPC?;");
}
VOID LCGpibDll::CloseTrcMark(int iTrc)
{
CString csCmd;
char ReBuff[4];
for (int i = 1; i < 11; i++)
{
csCmd.Format(":CALC%d:MARK%d?", iTrc, i);
if (FALSE == Query(csCmd, ReBuff, sizeof(ReBuff)))
{
return ;
}
if (::atoi(ReBuff) == 1)
{
//光标被打开了,需要关闭
csCmd.Format(":CALC%d:MARK%d OFF;", iTrc, i);
Write(csCmd);
}
}
WriteEx("*OPC?;");
// csCmd.Format(":CALC%d:MARK:AOFF;", iTrc);
// Write(csCmd);
}
//:CALC1:MARK1:Y?幅度
//:CALC1:MARK1:X?频率
//未完成
BOOL LCGpibDll::GetTrcMarkValue(int iTrc, int iMark, double &dFreq, double &dValue)
{
char ReBuff[255];
memset(ReBuff, 0, sizeof(ReBuff));
CString csCmd;
/* csCmd.Format(":CALC%d:MARK%d:ACT;", iTrc, iMark);
if (FALSE == Write(csCmd))
{
return FALSE;
}
WriteEx("*OPC?;");
csCmd.Format(":CALC%d:MARK%d:X?", iTrc, iMark);
// csCmd.Format(":CALC%d:MARK%d:ACT;:CALC%d:MARK%d:FUNC:RES?;", iTrc, iMark, iTrc, iMark);
if (FALSE == Query(csCmd, ReBuff, sizeof(ReBuff)))
{
return FALSE;
}
dFreq = (double)::atof(ReBuff);
dFreq /= 1000000;*/
/* char *p;
p = ReBuff;
p += SwitchData(p);*/
memset(ReBuff, 0, sizeof(ReBuff));
csCmd.Format(":CALC1:PAR%d:SEL;:CALC1:MARK%d:Y?", iTrc, iMark);
if (FALSE == Query(csCmd, ReBuff, sizeof(ReBuff)))
{
return FALSE;
}
dValue = (double)::atof(ReBuff);
return TRUE;
}
int LCGpibDll::SwitchData(char *tp)
{
int i = 0;
while ((tp[i++] != ',') && (i < 20))
;
return i;
}
//:CALC1:FORM
VOID LCGpibDll::SetDataFormat(int iTrc, int itype)
{
CString csCmd;
switch (itype)
{
case 5:
csCmd.Format(":CALC%d:FORM MLOG;", iTrc);
break;
case 6:
csCmd.Format(":CALC%d:FORM SWR;", iTrc);
break;
case 7:
csCmd.Format(":CALC%d:FORM GDEL;", iTrc);
break;
default:
return;
break;
}
Write(csCmd);
WriteEx("*OPC?;");
}
//:DISP:WIND1:TRAC1:Y:AUTO
//显示该轨迹所扫描的频谱形状,
VOID LCGpibDll::AutoScale()
{
// Write(":DISP:WIND1:TRAC1:Y:AUTO;");
WriteEx(":DISP:WIND1:TRAC1:Y:AUTO;*OPC?;"); //该命令只是让当前的轨迹显示频谱
}
//:SENS1:AVER ON
//:SENS1:AVER?
//:SENS{1-16}:AVER
//:SENS{1-16}:AVER:COUN
//:SENS{1-16}:AVER:CLE
BOOL LCGpibDll::SetAverage(int iAvg)
{
CString csCmd;
if (iAvg == 0)
{
csCmd.Format(":SENS1:AVER OFF;:SENS1:AVER:CLE;");
}
else
{
csCmd.Format(":SENS1:AVER:CLE;:SENS1:AVER ON;:SENS1:AVER:COUN %d;", iAvg);
}
if (!Write(csCmd))
return FALSE;
WriteEx("*OPC?;");
return TRUE;
}
//:SOUR1:POW
BOOL LCGpibDll::SetPow(double dPow)
{
CString csCmd;
csCmd.Format(":SOUR1:POW %f;", dPow);
if (!Write(csCmd))
return FALSE;
return TRUE;
}
//:OUTP?;
//:OUTP ON;
//:OUTP OFF;
BOOL LCGpibDll::SetRfStat(BOOL bStat)
{
CString csCmd;
if (bStat)
{
csCmd.Format(":OUTP ON;");
}
else
{
csCmd.Format(":OUTP OFF;");
}
if (!Write(csCmd))
return FALSE;
WriteEx("*OPC?;");
return TRUE;
}
//:SENS1:FREQ:CENT 1940E6
//SENS1:FREQ:SPAN 60E6
//:SENS1:FREQ:STAR 1940E6;
//:SENS1:FREQ:STOP 1940E6;
BOOL LCGpibDll::SetStartAndStopFreq(double dStartFreq, double dStopFreq)
{
CString csCmd;
//计算中心频率,带宽
// double dCentFreq, dSpan;
// dCentFreq = (dStartFreq + dStopFreq) / 2;
// dSpan = dStopFreq - dStartFreq;
csCmd.Format(":SENS1:FREQ:STAR %f;:SENS1:FREQ:STOP %f;", dStartFreq * 1000000, dStopFreq * 1000000);
if (!Write(csCmd))
return FALSE;
WriteEx("*OPC?;");
return TRUE;
}
//:CALC1:MARK1 ON
VOID LCGpibDll::OpenMark(int iTrc, int iMark)
{
CString csCmd;
csCmd.Format(":CALC%d:MARK%d ON;", iTrc, iMark);
Write(csCmd);
}
//设置等幅频率 CWFreq
BOOL LCGpibDll::SetCWFreq(double CWFreq)
{
CString csCmd;
csCmd.Format(":SENS1:FREQ %f;", CWFreq*1000000);
if (!Write(csCmd))
return FALSE;
return TRUE;
}
BOOL LCGpibDll::GetTrcMarkXValue(double &dFreq, double &dValue)
{
char ReBuff[255];
memset(ReBuff, 0, sizeof(ReBuff));
CString csCmd;
csCmd.Format(":CALC1:MARK1:X?");
if (FALSE == Query(csCmd, ReBuff, sizeof(ReBuff)))
{
return FALSE;
}
dFreq = (double)::atof(ReBuff);
return TRUE;
}
VOID LCGpibDll::SearchPOW(double Startfreq, double stopfreq)
{
CString cscmd;
Write(":CALC1:MARK:FUNC:DOM ON;");
cscmd.Format(":CALC1:MARK:FUNC:DOM:STAR %f;",Startfreq);
Write(cscmd);
cscmd.Format(":CALC1:MARK:FUNC:DOM:STOP %f;",stopfreq);
Write(cscmd);
}
VOID LCGpibDll::OnMark(int iTrc, int iMark,double dValue)
{
CString csCmd;
csCmd.Format(":CALC%d:MARK%d ON;", iTrc, iMark);
Write(csCmd);
csCmd.Format("CALC%d:MARK%d:X %f;", iTrc, iMark, dValue * 1000000);
Write(csCmd);
/* memset(ReBuff, 0, sizeof(ReBuff));
csCmd.Format(":CALC%d:MARK%d:X?", iTrc, iMark);
if (FALSE == Query(csCmd, ReBuff, sizeof(ReBuff)))
{
return FALSE;
}
dValue = (double)::atof(ReBuff);
return dValue;
*/
}
//CALC1:MARK1:X
//:CALC{1-16}:MARK{1-10}:FUNC:TYPE
//:CALC{1-16}:MARK{1-10}:ACT
VOID LCGpibDll::SetMarkMin(int iTrc, int iMark)
{
CString csCmd;
csCmd.Format(":CALC1:PAR%d:SEL;:CALC1:MARK%d:ACT;:CALC1:MARK%d:FUNC:TYPE MIN;:CALC1:MARK%d:FUNC:EXEC;"
, iTrc, iMark, iMark,iMark);
Write(csCmd);
WriteEx("*OPC?;");
}
//:CALC{1-16}:MARK{1-10}:FUNC:TYPE
//:CALC{1-16}:MARK{1-10}:ACT
VOID LCGpibDll::SetMarkMax(int iTrc, int iMark)
{
CString csCmd;
csCmd.Format(":CALC1:PAR%d:SEL;:CALC1:MARK%d:ACT;:CALC1:MARK%d:FUNC:TYPE MAX;:CALC1:MARK%d:FUNC:EXEC;"
, iTrc, iMark, iMark,iMark);
Write(csCmd);
WriteEx("*OPC?;");
}
VOID LCGpibDll::SetTimeout(unsigned long timeout)
{
viSetAttribute(m_vi,VI_ATTR_TMO_VALUE,timeout);
}
VOID LCGpibDll::WriteEx(LPCSTR szCmd)
{
char Tmp[128];
Query(szCmd, Tmp, sizeof(Tmp));
}
VOID LCGpibDll::SetMarkFreq(int iTrc, int iMark, double dFreq)
{
}
VOID LCGpibDll::SetMarkTarget(int iTrc, int iMark, double dValue)
{
CString csCmd;
csCmd.Format(":CALC%d:MARK%d:ACT;", iTrc, iMark);
Write(csCmd);
WriteEx("*OPC?;");
csCmd.Format(":CALC%d:MARK%d:FUNC:TYPE TARG;", iTrc, iMark);
Write(csCmd);
WriteEx("*OPC?;");
csCmd.Format(":CALC%d:MARK%d:FUNC:TARG %f;:CALC%d:MARK%d:FUNC:EXEC;", iTrc, iMark, dValue, iTrc, iMark);
// csCmd.Format(":DISP:WIND1:ACT;:CALC%d:MARK%d:FUNC:TARG %f;:CALC%d:MARK%d:FUNC:EXEC;", iTrc, iMark, dValue, iTrc, iMark);
Write(csCmd);
WriteEx("*OPC?;");
}
//设置中频带宽
BOOL LCGpibDll::SetBand(double dBand)
{
CString csCmd;
csCmd.Format(":SENS1:BAND %f;", dBand);
if (!Write(csCmd))
return FALSE;
return TRUE;
}
BOOL LCGpibDll::SetPoints(double dPoints)
{
CString csCmd;
csCmd.Format(":SENS1:SWE:POIN %f;", dPoints);
if (!Write(csCmd))
return FALSE;
return TRUE;
}
//设置多个轨迹
BOOL LCGpibDll::SetTrace(int itrace)
{
CString csCmd;
csCmd.Format(":CALC1:PAR:COUN %d;", itrace);
if (!Write(csCmd))
return FALSE;
//让3个轨迹的频谱分别显示在屏幕的上中下位置
Write(":DISP:WIND1:SPL D1_2_3;");
//WriteEx("*OPC?;");
return TRUE;
}
void LCGpibDll::SetTrcParam()
{
for(int i = 1;i < 4;i++)
{
CloseTrcMark(i);
}
//把轨迹1的s参数设为S11
Write(":CALC1:PAR1:DEF S11");
Write(":CALC1:PAR1:SEL;");
//WriteEx("*OPC?;");
// AutoScale();
//把轨迹2的s参数设为S21
Write(":CALC1:PAR2:DEF S21");
Write(":CALC1:PAR2:SEL;");
//WriteEx("*OPC?;");
// AutoScale();
//把轨迹3的s参数设为S22
Write(":CALC1:PAR3:DEF S22");
Write(":CALC1:PAR3:SEL;");
//WriteEx("*OPC?;");
//[Marker Fctn] - Couple 设为OFF,使三个轨迹可以同时测试
Write(":CALC1:MARK:COUP OFF;");
//WriteEx("*OPC?;");
//[Marker Fctn] - Annotation Options - Active Only 设为OFF,使三个轨迹可以同时显示,同时测试
Write(":DISP:WIND1:ANN:MARK:SING OFF;");
//WriteEx("*OPC?;");
}
BOOL LCGpibDll::StoreFile(LPCSTR lpNamePath)
{
char Tmp[4];
CString csCmd;
csCmd.Format(":MMEM:STOR \"%s\";*OPC?;", lpNamePath);
if (!Query(csCmd, Tmp, sizeof(Tmp)))
return FALSE;
return TRUE;
}
//[Trigger] - Continuous 设置成ON,让所有轨迹都能连续扫描
VOID LCGpibDll::SetTriggerState()
{
Write(":INIT1:CONT ON;");
//WriteEx("*OPC?;");
}
//归零
VOID LCGpibDll::SetZero()
{
Write(":CALC1:MATH:MEM;");
Write(":CALC1:MATH:FUNC DIV;");
}
/*VOID LCGpibDll::SetZero()
{
Write(":CALC1:MATH:MEM;");
Write(":CALC1:MATH:FUNC DIV;");
}*/
//用来读某个点的值
VOID LCGpibDll::SearchRange(double Startfreq,double stopfreq)
{
CString cscmd;
Write(":CALC1:MARK:FUNC:DOM ON;");
cscmd.Format(":CALC1:MARK:FUNC:DOM:STAR %f;",Startfreq * 1000000);
Write(cscmd);
cscmd.Format(":CALC1:MARK:FUNC:DOM:STOP %f;",stopfreq * 1000000);
Write(cscmd);
}
VOID LCGpibDll::SetMarkFreqValue(double Freq)
{
CString cscmd;
cscmd.Format(":CALC1:MARK1:X %f;",Freq);
Write(cscmd);
}
VOID LCGpibDll::SetSmoothing()
{
Write(":CALC1:SMO:STAT ON;");
WriteEx("*OPC?;");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -