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

📄 clrr.cpp

📁 频谱仪锂电池电量表,非常适合学习和使用单片机开发的人用
💻 CPP
字号:
#include "stdafx.h"
#include "CLRR.h"
#include "math.h"
#include "stdio.h"
#include "shellapi.h" 
extern "C" IACTIVEMODEL __declspec(dllexport) * createactivemodel (CHAR *device, ILICENCESERVER *ils)
{ 
	ils->authorize (0x00000401,0x69);
	return new LIBAT;
}
extern "C" VOID  __declspec(dllexport) deleteactivemodel (IACTIVEMODEL *model)
{ 
	delete (LIBAT *)model;
}
extern "C" ISPICEMODEL __declspec(dllexport) * createspicemodel (CHAR *device, ILICENCESERVER *ils)
{ 
	ils->authorize(0x00000401,0x69);
	return new LIBAT;
}
extern "C" VOID __declspec(dllexport) deletespicemodel (ISPICEMODEL *model)
{
	delete (LIBAT *)model;
}
LIBAT::LIBAT()
{
	TotalPower=291.9221638;	CurrentPower=TotalPower;ConsumePower=0.0;
	MaxVoltage=4.2;MinVoltage=2.4;RegulationVoltage=3.6;CurrentVoltage=4.2;OutputVoltage=4.2;
	ChargeCurrent=0.0;DischargeCurrent=0.0;
	InitTemperature=25.0;MaxTemperature=50.0;CurrentTemperature=InitTemperature;
	InternalResistor=0.05;NTCInitResistor=10000;NTCCurrentResistor=NTCInitResistor;
	DeltaTemperature=0.0;
	IsCharge=FALSE;
	IsBurnOut=FALSE;
	///////////////////////////
	FILE* pFile=fopen("C:\\WINDOWS\\system32\\ProteusLiBat.txt","r");
	if(pFile==NULL)
		MessageBox(NULL,"您所使用的\"LIBAT\"器件是由\"宋培林\"开发的。\n由于您所使用的\"LIBAT\"器件是Demo版本,所以每次仿真都会弹出这个报告。","监测报告",MB_OK);
	else
		fclose(pFile);
	///////////////////////////
}
LIBAT::~LIBAT()
{
}
INT  LIBAT::isanalog (CHAR *pinname)
{
	return 1;
}
VOID LIBAT::setup (IINSTANCE *instance, ISPICECKT *spiceckt) 
{
	ins=instance;
	ckt=spiceckt;
	char *authorstr=ins->getstrval("AUTHOR","?");
	int res=strcmp(authorstr,"宋培林(不可改动,否则...)");
	if(res!=0)
	{
		ins->fatal("\"LIBAT\"器件是由\"宋培林\"开发的,您改动了版权信息!崩溃!");
	}
	Pos = instance->getspicenode("+", TRUE);
    Neg = instance->getspicenode("-", TRUE); 
	NC = instance->getspicenode("NC", TRUE); 
	NTC= instance->getspicenode("NTC", TRUE); 
	RF= instance->getspicenode("RF", TRUE); 
	Branch = spiceckt->newcurnode(instance->id(), "Branch");
    NodePB = spiceckt->allocsmp(NC, Branch);
    NodeNB = spiceckt->allocsmp(Neg, Branch);
    NodeBP = spiceckt->allocsmp(Branch, NC);
    NodeBN = spiceckt->allocsmp(Branch, Neg);
	NodePP = spiceckt->allocsmp(Pos, Pos);
	NodeNCNC = spiceckt->allocsmp(NC, NC);
	NodePNC = spiceckt->allocsmp(Pos, NC);
    NodeNCP = spiceckt->allocsmp(NC, Pos);
	NodeNTCNTC = spiceckt->allocsmp(NTC, NTC);
	NodeNN = spiceckt->allocsmp(Neg, Neg);
	NodeNTCN = spiceckt->allocsmp(NTC, Neg);
    NodeNNTC = spiceckt->allocsmp(Neg, NTC);
	OldTime=(REALTIME)0.0;
}
VOID LIBAT::runctrl (RUNMODES mode) 
{
}
VOID LIBAT::actuate (REALTIME time, ACTIVESTATE newstate) 
{
}
BOOL LIBAT::indicate (REALTIME time, ACTIVEDATA *newstate) 
{
	return TRUE;
}
VOID LIBAT::dcload (REALTIME time, SPICEMODES mode, DOUBLE *oldrhs, DOUBLE *newrhs) 
{
	if(IsBurnOut==TRUE)
	{
		/*CurrentTemperature=MaxTemperature;
		CurrentVoltage=0.0;
		CurrentPower=0.0;
		*NodePB += 1.0;
		*NodeNB -= 1.0;
		*NodeBP += 1.0;
		*NodeBN -= 1.0;
		newrhs[Branch] += CurrentVoltage;
		double temp=1.0/InternalResistor;
		*NodePP += temp;
		*NodeNCNC += temp;
		*NodePNC -= temp;
		*NodeNCP -= temp;
		temp=1.0/NTCInitResistor;
		*NodeNTCNTC += temp;
		*NodeNN += temp;
		*NodeNTCN -= temp;
		*NodeNNTC -= temp;*/
		return;
	}
	OutputVoltage=oldrhs[Pos];
	if(OutputVoltage>CurrentVoltage)
	{
		//充电
		IsCharge=TRUE;
		ChargeCurrent=(OutputVoltage-CurrentVoltage)/InternalResistor;
		if((ChargeCurrent>1.5))
		{
			IsBurnOut=TRUE;
			return;
		}
		if( (CurrentVoltage<=3.0)&&(ChargeCurrent>0.2) )
		{
			IsBurnOut=TRUE;
			return;
		}
		CurrentPower=CurrentPower+CurrentVoltage*ChargeCurrent*(time-OldTime);
		if(CurrentPower>=TotalPower)
			CurrentPower=TotalPower;
		ConsumePower=TotalPower-CurrentPower;
		if(ConsumePower<=(0.8*TotalPower))
			CurrentVoltage=MaxVoltage*(1.0-5.0*ConsumePower/TotalPower/28.0);
		else
			CurrentVoltage=MaxVoltage*(6.0/7.0-10.0*(ConsumePower-0.8*TotalPower)/TotalPower/7.0);
		/*if(CurrentVoltage>MaxVoltage+0.005)
		{
			IsBurnOut=TRUE;
			return;
		}*/
		CurrentTemperature=CurrentTemperature+(ChargeCurrent-0.44375)*(time-OldTime);
		if(CurrentTemperature<=InitTemperature)
			CurrentTemperature=InitTemperature;
		else if(CurrentTemperature>=MaxTemperature)
		{
			IsBurnOut=TRUE;
			return;
		}
	}
	else
	{
		//放电
		IsCharge=FALSE;
		DischargeCurrent=(CurrentVoltage-OutputVoltage)/InternalResistor;
		ConsumePower=ConsumePower+CurrentVoltage*DischargeCurrent*(time-OldTime);
		if(ConsumePower>=TotalPower)
			ConsumePower=TotalPower;
		CurrentPower=TotalPower-ConsumePower;
		if(ConsumePower<=(0.8*TotalPower))
			CurrentVoltage=MaxVoltage*(1.0-5.0*ConsumePower/TotalPower/28.0);
		else
			CurrentVoltage=MaxVoltage*(6.0/7.0-10.0*(ConsumePower-0.8*TotalPower)/TotalPower/7.0);
		if(CurrentVoltage<MinVoltage+0.001)
			CurrentVoltage=0.0;
		CurrentTemperature=CurrentTemperature+(DischargeCurrent-0.44375)*(time-OldTime);
		if(CurrentTemperature<=InitTemperature)
			CurrentTemperature=InitTemperature;
		else if(CurrentTemperature>=MaxTemperature)
		{
			IsBurnOut=TRUE;
			return;
		}
	}
	DeltaTemperature=1.0/(CurrentTemperature+273)-1.0/(InitTemperature+273);
	NTCCurrentResistor=NTCInitResistor*pow(2.718281828,4000.0*DeltaTemperature);
	OldTime=time;
	double temp=1.0/InternalResistor;
	*NodePP += temp;
    *NodeNCNC += temp;
    *NodePNC -= temp;
    *NodeNCP -= temp;
	temp=1.0/NTCCurrentResistor;
	*NodeNTCNTC += temp;
    *NodeNN += temp;
    *NodeNTCN -= temp;
    *NodeNNTC -= temp;
	*NodePB += 1.0;
    *NodeNB -= 1.0;
    *NodeBP += 1.0;
    *NodeBN -= 1.0;
	newrhs[Branch] += CurrentVoltage;
}
VOID LIBAT::acload (SPICEFREQ omega, DOUBLE *rhs, DOUBLE *irhs) 
{
}
VOID LIBAT::trunc  (REALTIME time,  REALTIME *newtimestep) 
{
}
VOID LIBAT::accept (REALTIME time, DOUBLE *rhs) 
{
}
VOID LIBAT::initialize (ICOMPONENT *cpt)
{ 
	component = cpt;
} 
ISPICEMODEL *LIBAT::getspicemodel (CHAR *) 
{ 
	return this; 
}
IDSIMMODEL  *LIBAT::getdsimmodel (CHAR *) 
{	
	return NULL; 
}
VOID LIBAT::plot (ACTIVESTATE state)
{
	component->drawsymbol(-1);
	if(IsBurnOut==TRUE)
	{
		component->drawsymbol(1);
		return;
	}
	if(IsCharge==TRUE)
	{
		component->setpencolour(RGB(0,0,0));
		component->setpenwidth(20);
		component->setbrushcolour(RGB(255,0,0));
		component->drawcircle(1850,-1150,50);
	}
	else
	{
		component->setpencolour(RGB(0,0,0));
		component->setpenwidth(20);
		component->setbrushcolour(RGB(0,255,0));
		component->drawcircle(1850,-1150,50);
	}
	component->setpencolour(RGB(0,255,0));
	component->setpenwidth(8);
	component->setbrushcolour(RGB(0,64,0));
	component->drawbox(1460,-1200,1740,-1100);
	component->settextcolour(RGB(0,255,0));
	component->settextsize(100);
	sprintf(str,"+%2.1f",CurrentTemperature);
	component->drawtext(1500,-1150,0,TXJ_LEFT|TXJ_MIDDLE,str);
	component->setpenwidth(0);
	XAxis=int(400+CurrentPower*1000/TotalPower);
	Color=int(255-CurrentPower*255/TotalPower);
	component->setpencolour(RGB(255,Color,Color));
	component->setbrushcolour(RGB(255,Color,Color));
	component->drawbox(400,-1200,XAxis,-1100);
	component->setpencolour(RGB(255,255,255));
	component->setbrushcolour(RGB(255,255,255));
	component->drawbox(XAxis,-1200,1400,-1100);

}
VOID LIBAT::animate (INT element, ACTIVEDATA *data)
{ 
	if(IsBurnOut==TRUE)
	{
		component->drawsymbol(1);
		return;
	}
	if(IsCharge==TRUE)
	{
		component->setpencolour(RGB(0,0,0));
		component->setpenwidth(20);
		component->setbrushcolour(RGB(255,0,0));
		component->drawcircle(1850,-1150,50);
	}
	else
	{
		component->setpencolour(RGB(0,0,0));
		component->setpenwidth(20);
		component->setbrushcolour(RGB(0,255,0));
		component->drawcircle(1850,-1150,50);
	}
	component->setpencolour(RGB(0,255,0));
	component->setpenwidth(8);
	component->setbrushcolour(RGB(0,64,0));
	component->drawbox(1460,-1200,1740,-1100);
	component->settextcolour(RGB(0,255,0));
	sprintf(str,"+%2.1f",CurrentTemperature);
	component->settextsize(100);
	component->drawtext(1500,-1150,0,TXJ_LEFT|TXJ_MIDDLE,str);
	component->setpenwidth(0);
	XAxis=int(400+CurrentPower*1000/TotalPower);
	Color=int(255-CurrentPower*255/TotalPower);
	component->setpencolour(RGB(255,Color,Color));
	component->setbrushcolour(RGB(255,Color,Color));
	component->drawbox(400,-1200,XAxis,-1100);
	component->setpencolour(RGB(255,255,255));
	component->setbrushcolour(RGB(255,255,255));
	component->drawbox(XAxis,-1200,1400,-1100);

}
BOOL LIBAT::actuate (WORD key, INT x, INT y, DWORD flags)  
{ 
	if(flags==1)
	{
		if( ((x-1700)*(x-1700)+(y+760)*(y+760))<=14400 )
		{
			ShellExecute(NULL,"open","AcroRd32.exe","LiBat.pdf",NULL,SW_SHOW);
		}
	}
	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -