📄 clrr.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 + -