⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpibdll.cpp

📁 VISA 控制仪表的DLL
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -