#include <sys/vfs.h>
|
#include "work_thread.h"
|
#include "classxml.h"
|
#include "Drivers/buzzerdrv.h"
|
|
const QString usbDetectedFile = "/sys/bus/usb/devices/1-1.2/bConfigurationValue";
|
static bool IF_CloseFan = true;
|
//----------------------------------------------------------------------------------------------
|
Work_Thread::Work_Thread()
|
{
|
WORK_RUN_EN = false;
|
Check_Mashine_Type = false;
|
IF_SET905ok = false;
|
DCDC_count = 0;
|
QDir dir;
|
if(ENCNTURN){
|
if(false==dir.exists("/app/china"))
|
if_cn = false;
|
else
|
if_cn = true;
|
}
|
else {
|
if(false==dir.exists("/app/china"))
|
system("touch /app/china");
|
if_cn = true;
|
}
|
IF_J9Close = true;
|
check_count = 0;
|
if_need_init = false;
|
|
nullChargingState = 0;
|
|
memset(&fboData,0x00,sizeof(fboData));
|
memset(&localData,0x00,sizeof(localData));
|
memset(sumVOL,0x00,sizeof(sumVOL));
|
memset(&testStartTime,0x00,sizeof(testStartTime));
|
|
PowerCtrl = POWER_CTRL_INIT;
|
|
iconState.monomerState = false;
|
iconState.usbState = false;
|
iconState.wifiState = false;
|
localData.WPAlarmState = WPMANUALPSTOP;
|
localData.SysWorkState = WorkStopped;
|
|
sysState.SaveDataEN = false;
|
fboData.BattSum =24;
|
|
monomerLowCount = 0;
|
|
Adj_TestState = 0;
|
initparam();
|
timer_1s = new QTimer(this);
|
connect(timer_1s,SIGNAL(timeout()),this,SLOT(Timer1s_timeout()));
|
timer_1s->setInterval(1000);
|
|
ClassXML::CreateAdjParamXml();
|
ClassXML::ReadAdjParamXml(adjParam);
|
|
openWorkPage = false;
|
|
MaxCur = MaxPOWER = 0;
|
delayupdate = 0;
|
work_preset_cur = 0;
|
|
rs485 = new RS485Driver(RS485CommPort);
|
qRegisterMetaType<COMM_DATA>("COMM_DATA");
|
connect(rs485,SIGNAL(SendCommData(COMM_DATA)),this,SLOT(RecvCommData(COMM_DATA)));
|
rs485->start();
|
|
nrf905module = new ModuleDrv(Module905Com);
|
qRegisterMetaType<COMM_DATA>("N905_MODULE_DATA");
|
connect(nrf905module,SIGNAL(sendN905ModuleData(N905_MODULE_DATA)),this,SLOT(RecvNRF905Data(N905_MODULE_DATA)));
|
|
lora = new LORACELL(LORACOM,sysParam.monomer_fre,sysParam.monomer_order);
|
lora->setWorkNum(testParam.group_number,testParam.mon_number);
|
|
if(mon_use_type == 1){
|
nrf905module->start();
|
}
|
else if(mon_use_type == 2){
|
lora->start();
|
}
|
//有线单体
|
rs485wired = new RS485_WIRED(WiredMonCommPort,sysParam.monomer_order);
|
rs485wired->setWorkNum(testParam.group_number,testParam.mon_number);
|
rs485wired->start();
|
//单体来源自动识别标志 初始为0——IO板单体,读到有线单体后置为1,重新上电后复位
|
mon_source = 0;
|
}
|
//----------------------------------------------------------------------------------------------
|
Work_Thread::~Work_Thread()
|
{
|
delete rs485;
|
delete timer_1s;
|
WORK_RUN_EN = false;
|
quit();
|
wait();
|
}
|
|
void Work_Thread::initparam()
|
{
|
ClassXML::ReadNewestPNameXml(battName);
|
|
if(false == ClassXML::ReadTestParamXml(battName, testParam))
|
{
|
battName = Default_Battery;
|
ClassXML::ModifyNewestPNameXml(battName);
|
ClassXML::ReadTestParamXml(battName, testParam);
|
}
|
if(PageType == FBI48CT)
|
testParam.test_mode = ONline_working;
|
else
|
testParam.test_mode = OFFline_working;
|
|
testParam.acstop_op = ACOFF_CONTINUE;
|
|
if(false == ClassXML::ReadSysParamXml(sysParam))
|
{
|
sysParam.save_interval = 1;
|
sysParam.monomerlow_act = MONOMER_LOW_STOP;
|
sysParam.monomer_order = MONOMER_ORDER_POS;
|
sysParam.monomer_fre = 0;
|
sysParam.tcp_ip[0] = 192;
|
sysParam.tcp_ip[1] = 168;
|
sysParam.tcp_ip[2] = 1;
|
sysParam.tcp_ip[3] = 110;
|
sysParam.tcp_port = 8888;
|
|
sysParam.GroupOffVol = 0;
|
sysParam.OnlineOffVol = 0;
|
sysParam.loader_plusEn = LOADER_PLUS_DISEN;
|
ClassXML::ModifySysParamXml(sysParam);
|
}
|
sysParam.monomer_addrset = 1;
|
}
|
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::AnalyseRecvData()
|
{
|
double tmpdata = 0.0;
|
|
if(localData.Temp>=20)
|
localData.Temp -= 20;
|
else
|
localData.Temp = 0;
|
//adj
|
tmpdata = localData.Temp;
|
tmpdata *= adjParam.temp_slope;
|
localData.Temp = (quint16)tmpdata;
|
|
//max min sum
|
for(quint8 i=0;i<fboData.BattGroup;i++)
|
{
|
localData.SMaxIndex[i] = 0;
|
localData.SMaxVol[i] = 0;
|
localData.SMinIndex[i] = 0;
|
localData.SMinVol[i] = 40000;
|
}
|
|
quint16 tmpvol = 0;
|
quint32 tmpsumvol = 0;
|
quint16 ModuleDrop = 0;
|
|
for(quint8 g=0;g<fboData.BattGroup;g++)
|
{
|
tmpsumvol = 0;
|
for(quint16 j=0;j<testParam.mon_number;j++)
|
{
|
tmpvol = fboData.SingleVol[g*testParam.mon_number+j];
|
|
if(mon_source == MONO_TYPE_WIRED)
|
{
|
if(tmpvol == 0)
|
{
|
if(ModuleDrop == 0)
|
ModuleDrop = g*testParam.mon_number+j+1;
|
continue;
|
}
|
else if(tmpvol == 20000)
|
{
|
if(ModuleDrop == 0)
|
ModuleDrop = g*testParam.mon_number+j+1;
|
}
|
}
|
|
if(localData.SMinVol[g] > tmpvol)
|
{
|
localData.SMinVol[g] = tmpvol;
|
localData.SMinIndex[g] = j;
|
}
|
if(localData.SMaxVol[g] < tmpvol)
|
{
|
localData.SMaxVol[g] = tmpvol;
|
localData.SMaxIndex[g] = j;
|
}
|
|
tmpsumvol += tmpvol;
|
}
|
|
sumVOL[g] = (quint16)(tmpsumvol/100);
|
}
|
|
if(mon_source == MONO_TYPE_WIRED)
|
{
|
localData.ModuleDropIndex = ModuleDrop;
|
}
|
else
|
{
|
for(quint8 g=0;g<fboData.BattGroup;g++)
|
{
|
if(localData.SMinVol[g] == 0)
|
{
|
localData.ModuleDropIndex = (localData.SMinIndex[g]+1)
|
+(g*testParam.mon_number);
|
break;
|
}
|
if(g == fboData.BattGroup - 1)
|
localData.ModuleDropIndex = 0;
|
}
|
}
|
}
|
|
double Work_Thread::N_TO_10H(int n_H)
|
{
|
switch(n_H)
|
{
|
case 1 : return(1/0.55);
|
case 2 : return(1/0.61);
|
case 3 : return(1/0.75);
|
case 4 : return(1/0.79);
|
case 5 : return(1/0.833);
|
case 6 : return(1/0.876);
|
case 7 : return(1/0.917);
|
case 8 : return(1/0.944);
|
case 9 : return(1/0.974);
|
case 10: return(1/1);
|
case 20: return(1/1.1);
|
}
|
|
return 1;
|
}
|
|
double Work_Thread::GetMonomerCap(double STDAH, int HourRate, double SumAH, double MaxMonomerVol,
|
double MonomerVol, double MonomerVolType, int CapType)
|
{
|
if(MaxMonomerVol - MonomerVolType*0.9 == 0)
|
return 0;
|
|
if(SumAH < 0)
|
SumAH *= (-1);
|
|
double tmp_cap;
|
tmp_cap = MonomerVol - MonomerVolType * 0.9;
|
tmp_cap *= (STDAH - SumAH * N_TO_10H(HourRate));
|
tmp_cap = tmp_cap/(MaxMonomerVol - MonomerVolType*0.9);
|
if(tmp_cap < 0)
|
tmp_cap = 0;
|
|
if(CapType == CapType_Rest)
|
return tmp_cap;
|
else if(CapType == CapType_Sum)
|
return (tmp_cap + SumAH * N_TO_10H(HourRate));
|
else
|
return ((tmp_cap + SumAH * N_TO_10H(HourRate))*100 / STDAH);
|
}
|
|
void Work_Thread::CalRemainData(void)
|
{
|
double tmpcap = 0;
|
|
for(int g=0;g<testParam.group_number;g++)
|
{
|
tmpcap = GetMonomerCap(testParam.nominal_cap, testParam.hourly_rate,
|
fboData.SubCap[g], ((double)(localData.SMaxVol[g]))/1000,
|
((double)(localData.SMinVol[g]))/1000, (double)testParam.mon_vol/10, CapType_Rest );
|
|
localData.GroupRemainCap[g] = (quint16)tmpcap;
|
|
for(int n=0;n<testParam.mon_number;n++)
|
{
|
quint16 battindex = testParam.mon_number*g + n;
|
|
tmpcap = GetMonomerCap(testParam.nominal_cap, testParam.hourly_rate,
|
fboData.SubCap[g], ((double)(localData.SMaxVol[g]))/1000,
|
((double)(fboData.SingleVol[battindex]))/1000, (double)testParam.mon_vol/10, CapType_Rest );
|
|
localData.SingleRemainCap[battindex] = (quint16)tmpcap;
|
}
|
}
|
}
|
|
void Work_Thread::CalResData(void)
|
{
|
double tmpres = 0;
|
quint16 battindex = 0;
|
|
for(int g=0;g<testParam.group_number;g++)
|
{
|
for(int n=0;n<testParam.mon_number;n++)
|
{
|
battindex = testParam.mon_number*g + n;
|
|
if(SingleVolBuff[battindex]>100)
|
{
|
if(fboData.SubCurrent[g]>5)
|
{
|
if(fboData.SingleVol[battindex]<SingleVolBuff[battindex])
|
{
|
tmpres = (SingleVolBuff[battindex]-fboData.SingleVol[battindex]);
|
tmpres *= 10; //电流1位小数
|
tmpres /= fboData.SubCurrent[g];
|
|
if(tmpres > 60000.0)
|
tmpres = 60000.0;
|
|
localData.SingleRes[battindex] = (quint16)tmpres;
|
}
|
}
|
}
|
|
SingleVolBuff[battindex] = fboData.SingleVol[battindex];
|
}
|
}
|
}
|
|
void Work_Thread::ClearRemainData(void)
|
{
|
memset(localData.GroupRemainCap,0x00,sizeof(localData.GroupRemainCap));
|
memset(localData.SingleRemainCap,0x00,sizeof(localData.SingleRemainCap));
|
memset(localData.SingleRes,0x00,sizeof(localData.SingleRes));
|
}
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::RecvNRF905Data(N905_MODULE_DATA dt)
|
{
|
if(mon_use_type == 1)
|
{
|
if(mon_source == MONO_TYPE_WIRED)//单体来源:有线单体
|
{
|
quint16 battVolData[MONOMER_NUM_MAX];
|
rs485wired->GetBattVolData(battVolData);
|
int monall = testParam.group_number*testParam.mon_number;
|
memcpy(fboData.SingleVol,battVolData, monall*sizeof(quint16));
|
AnalyseRecvData();
|
}
|
else
|
memcpy(fboData.SingleVol, dt.monomerVol, fboData.BattSum*sizeof(quint16));
|
}
|
}
|
|
void Work_Thread::RecvCommData(COMM_DATA dt)
|
{
|
if(delayupdate != 0){
|
delayupdate--;
|
if(fboData.SumCurrent < work_preset_cur &&
|
dt.InnerCurrVal < localData.InnerCurrVal)
|
dt.InnerCurrVal = localData.InnerCurrVal;
|
else if(fboData.SumCurrent > work_preset_cur){//电流下调
|
if(dt.InnerCurrVal > localData.InnerCurrVal)//电流反升
|
dt.InnerCurrVal = localData.InnerCurrVal;
|
// else if((localData.InnerCurrVal-dt.InnerCurrVal)>=(localData.InnerCurrVal-work_preset_cur)/2){//电流突变幅度过大
|
// dt.InnerCurrVal = localData.InnerCurrVal-(localData.InnerCurrVal-work_preset_cur)/2;
|
// }
|
}
|
}
|
if(fboData.SumCurrent < work_preset_cur){//电流上调
|
if((dt.InnerCurrVal-localData.InnerCurrVal)>=100){//电流突变幅度过大
|
dt.InnerCurrVal = localData.InnerCurrVal+100;
|
}
|
}
|
else if(fboData.SumCurrent > work_preset_cur){//电流下调
|
if((localData.InnerCurrVal-dt.InnerCurrVal)>=100){//电流突变幅度过大
|
dt.InnerCurrVal = localData.InnerCurrVal-100;
|
}
|
}
|
if(mon_use_type == 0)
|
{
|
memcpy(&(localData.SoftVersion), &(dt.SoftVersion), 21*sizeof(quint16));
|
localData.RLY_OK = localData.RLY_OK&(~ROK_2)&(~ROK_3);
|
if(mon_source == MONO_TYPE_WIRED)//单体来源:有线单体
|
{
|
quint16 battVolData[MONOMER_NUM_MAX];
|
rs485wired->GetBattVolData(battVolData);
|
int monall = testParam.group_number*testParam.mon_number;
|
memcpy(fboData.SingleVol,battVolData, monall*sizeof(quint16));
|
}
|
else
|
{
|
memcpy(fboData.SingleVol, dt.MonomerVol, fboData.BattSum*sizeof(quint16));
|
}
|
AnalyseRecvData();
|
}
|
else
|
{
|
memcpy(&(localData.SoftVersion), &(dt.SoftVersion), 13*sizeof(quint16));
|
}
|
|
memcpy(&(localData.dcdc_data), &(dt.DCDCdata), 20*sizeof(quint16));
|
|
localData.Work_State = dt.Work_State;
|
if(localData.ExterCurrVal<30){
|
localData.ExterCurrVal = 0;
|
}
|
if((sysParam.GroupOffVol > 30)||(sysParam.GroupOffVol < -30))
|
{
|
sysParam.GroupOffVol = 0;
|
}
|
else if(sysParam.GroupOffVol > 0)
|
{
|
localData.GroupVol = localData.GroupVol + (quint16)sysParam.GroupOffVol;
|
}
|
else if(sysParam.GroupOffVol < 0)
|
{
|
quint16 tmp = (quint16)(~sysParam.GroupOffVol + 1) ;
|
if(localData.GroupVol > tmp)
|
{
|
localData.GroupVol = localData.GroupVol - tmp;
|
}
|
}
|
|
if((sysParam.OnlineOffVol > 30)||(sysParam.OnlineOffVol < -30))
|
{
|
sysParam.OnlineOffVol = 0;
|
}
|
else if(sysParam.OnlineOffVol > 0)
|
{
|
localData.OnlineVol = localData.OnlineVol + (quint16)sysParam.OnlineOffVol;
|
}
|
else if(sysParam.OnlineOffVol < 0)
|
{
|
quint16 tmp = (quint16)(~sysParam.OnlineOffVol + 1) ;
|
if(localData.OnlineVol > tmp)
|
{
|
localData.OnlineVol = localData.OnlineVol - tmp;
|
}
|
}
|
|
|
fboData.OnlineVol = localData.OnlineVol;
|
fboData.SumVoltage = localData.GroupVol;
|
|
quint16 temvol = sumVOL[0];
|
for(quint8 i=1;i<fboData.BattGroup;i++)
|
{
|
if(temvol < sumVOL[i])
|
temvol = sumVOL[i];
|
}
|
//去掉限制
|
// if(localData.SysWorkState == Discharging || localData.SysWorkState == Charging){
|
if(localData.SysWorkState != WorkStopped){
|
if( (temvol < localData.GroupVol)&& ((localData.GroupVol-temvol)>5))
|
{
|
fboData.SumVoltage = localData.GroupVol;
|
}
|
else
|
{
|
fboData.SumVoltage = temvol;
|
}
|
}
|
fboData.SumCurrent = localData.InnerCurrVal+localData.ExterCurrVal;
|
|
for(quint8 g=0;g<fboData.BattGroup;g++)
|
{
|
fboData.SubCurrent[g] = fboData.SumCurrent/fboData.BattGroup;
|
}
|
|
//采集到的组端电压小于5V时,置0
|
if(fboData.SumVoltage < IGNORE_LOW_VOL)
|
fboData.SumVoltage = 0;
|
//采集到的在线电压小于5V时,置0
|
if(fboData.OnlineVol < IGNORE_LOW_VOL)
|
fboData.OnlineVol = 0;
|
|
getMonomerLowCount();
|
localData.monomerLowCount = monomerLowCount;
|
|
// if(localData.SysWorkState != WorkStopped && localData.SysWorkState != Discharging){
|
// fboData.SumVoltage = 0;
|
// fboData.SumCurrent = 0;
|
// }
|
}
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::RecvTestParam(TEST_PARAM_XML param)
|
{
|
testParam = param;
|
if_steady = 5;
|
fboData.BattGroup = testParam.group_number;
|
fboData.BattSum = testParam.group_number*testParam.mon_number;
|
work_preset_cur = testParam.preset_cur;
|
if(localData.SoftVersion<30)
|
{
|
if(fboData.SumCurrent > work_preset_cur)
|
{
|
if(work_preset_cur>3)
|
work_preset_cur = work_preset_cur-3;
|
else
|
work_preset_cur = 3;
|
}
|
else
|
{
|
work_preset_cur = work_preset_cur+3;
|
}
|
}
|
//与IO接口板进行参数共享
|
quint32 tmp = (quint32)(testParam.preset_power*1000*10);
|
// localData.GroupVol = 500;
|
//恒功率模式
|
if(testParam.discharge_mode != DISCHARGE_CURRENT)
|
{
|
if(localData.GroupVol == 0)
|
{
|
work_preset_cur = 0;
|
}
|
else
|
{
|
work_preset_cur = (quint16)(tmp/localData.GroupVol);
|
}
|
}
|
if(work_preset_cur<MinCur)
|
work_preset_cur = 0;
|
quint16 tmpdata[6];
|
tmpdata[0] = work_preset_cur;
|
tmpdata[1] = testParam.group_number;
|
tmpdata[2] = testParam.mon_number;
|
tmpdata[3] = sysParam.monomer_order;
|
tmpdata[4] = testParam.charge_limit; //充电限流无小数点
|
tmpdata[5] = testParam.booster_ceiling;
|
|
if(mon_use_type == 2){
|
lora->setWorkNum(testParam.group_number,testParam.mon_number);
|
}
|
else if(mon_use_type == 1){
|
nrf905module->SetMonomerNum(fboData.BattSum);
|
nrf905module->SingleWriteModuleEx(NRegAddr_SetGroupNum,tmpdata[1],tmpdata[2],tmpdata[3],300);
|
}
|
else
|
{
|
rs485->SetMonomerNum(fboData.BattSum);
|
}
|
if(PageType == FBI48CT)
|
rs485->MultiWriteIOModule(rs485->DeviceAddr,RegAddr_SetCurrent, tmpdata, 6);
|
else
|
rs485->MultiWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, tmpdata, 4);
|
}
|
|
void Work_Thread::RecvAdjParam(ADJ_PARAM_XML adjparam)
|
{
|
adjParam = adjparam;
|
}
|
|
void Work_Thread::RecvCurrAdjCMD(int cmd,int param)
|
{
|
if(CMD_SetIntCurrZero == cmd)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_IntCurrZero,0,300);
|
}
|
else if(CMD_SetIntCurrSlope == cmd)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_IntCurrParam,(quint16)param,300);
|
}
|
else if(CMD_SetExtCurrZero == cmd)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_ExtCurrZero,0,300);
|
}
|
else if(CMD_SetExtCurrSlope == cmd)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_ExtCurrParam,(quint16)param,300);
|
}
|
else if(CMD_SetOnlineVolSlope == cmd)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_OnlVolParam,(quint16)param,300);
|
}
|
else if(CMD_SetGroupVolSlope == cmd)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_GrpVolParam,(quint16)param,300);
|
}
|
else if(CMD_SetMadjIndex == cmd)
|
{
|
if(mon_source == MONO_TYPE_WIRED)
|
rs485wired->setAdjIndex(param);
|
else
|
{
|
if(mon_use_type == 1)
|
{
|
nrf905module->SingleWriteModule(NRegAddr_SetAdjIndex,(quint16)param,300);
|
}
|
else if(mon_use_type == 2)
|
{
|
lora->setadjindex(param);
|
}
|
else
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetAdjIndex,(quint16)param,200);
|
}
|
}
|
}
|
else if(CMD_SetMonomerAdj == cmd)
|
{
|
int res = -1;
|
if(mon_source == MONO_TYPE_WIRED)
|
{
|
rs485wired->setAdjVol(param);
|
const quint8 &adjstatue = rs485wired->getAdjStart();
|
for(int i=0;i<10;i++)
|
{
|
msleep(100);
|
if(adjstatue == 0)
|
{
|
res = rs485wired->getAdjStatue();
|
}
|
}
|
}
|
else
|
{
|
if(mon_use_type == 1)
|
{
|
res = nrf905module->SingleWriteModule(NRegAddr_SetMonomerAdj,(quint16)param,300);
|
}
|
else if(mon_use_type == 2)
|
{
|
res = lora->AdjMonoVol(0,param,1);
|
}
|
else
|
{
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonomerAdj,(quint16)param,300);
|
}
|
}
|
msleep(100);
|
if(res == 0)
|
{
|
BuzzerDrv BD;
|
BD.BuzzerBeep(50);
|
msleep(100);
|
BD.BuzzerBeep(50);
|
}
|
}
|
}
|
|
void Work_Thread::RecvSysConfCMD(int cmd, SYS_CONFIG conf)
|
{
|
QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
|
QString str = time.toString("yyyy-MM-dd hh.mm.ss"); //设置显示格式
|
|
if(CMD_ReadSysConfInfo == cmd)
|
{
|
quint16 tmpdata[7] = {0};
|
SYS_CONFIG tmpconf;
|
memset(&tmpconf,0x00,sizeof(tmpconf));
|
int res = rs485->ReadFromIOModule(rs485->DeviceAddr,RegAddr_SetInnerCurrRange, 6, tmpdata);
|
if (0 == res)
|
{
|
tmpconf.InnerCurrRange = Swap16(tmpdata[0]);
|
tmpconf.ExterCurrRange = Swap16(tmpdata[1]);
|
MaxCur = tmpconf.MashineCurr = Swap16(tmpdata[2]);
|
tmpconf.DCDC_Count = Swap16(tmpdata[3]);
|
tmpconf.Mashine_Type = Swap16(tmpdata[4]);
|
MaxPOWER = tmpconf.MashinePower = Swap16(tmpdata[5]);
|
}
|
if(res == 0){
|
res = rs485->ReadFromIOModule(rs485->DeviceAddr,RegAddr_SetMashineTKQ, 1, &tmpdata[6]);
|
if (0 == res)
|
{
|
tmpconf.TKQenable = Swap16(tmpdata[6]);
|
}
|
}
|
|
str += " read config ";
|
if(res == 0)
|
str+="success";
|
else
|
str+="false";
|
emit SendSysconfInfo(tmpconf);
|
}
|
else if(CMD_SetSysConfInfo == cmd)
|
{
|
quint16 tmpdata[5];
|
tmpdata[0] = conf.InnerCurrRange;
|
tmpdata[1] = conf.ExterCurrRange;
|
tmpdata[2] = conf.MashineCurr;
|
tmpdata[3] = conf.DCDC_Count;
|
tmpdata[4] = conf.Mashine_Type;
|
int res = rs485->MultiWriteIOModule( rs485->DeviceAddr,RegAddr_SetInnerCurrRange, tmpdata, 5);
|
if(0 == res)
|
{
|
BuzzerDrv BD;
|
BD.BuzzerBeep(50);
|
msleep(100);
|
BD.BuzzerBeep(50);
|
MaxCur = conf.MashineCurr;
|
}
|
else
|
{
|
BuzzerDrv BD;
|
BD.BuzzerBeep(500);
|
}
|
tmpdata[0] = conf.MashinePower;
|
if(res==0){
|
res = rs485->MultiWriteIOModule( rs485->DeviceAddr,RegAddr_SetMashinePower, tmpdata, 1);
|
if(0 == res)
|
{
|
BuzzerDrv BD;
|
BD.BuzzerBeep(50);
|
msleep(100);
|
BD.BuzzerBeep(50);
|
MaxPOWER = conf.MashinePower;
|
}
|
else
|
{
|
BuzzerDrv BD;
|
BD.BuzzerBeep(500);
|
}
|
}
|
|
str += " set config ";
|
if(res == 0)
|
str+="success";
|
else
|
str+="false";
|
}
|
ClassXML::write_config(str,conf);
|
}
|
|
void Work_Thread::RecvSysParam(SYS_PARAM param)
|
{
|
sysParam = param;
|
ClassXML::ModifySysParamXml(sysParam);
|
if(mon_use_type == 1)
|
nrf905module->SingleWriteModuleEx(NRegAddr_SetGroupNum,testParam.group_number,testParam.mon_number,sysParam.monomer_order,300);
|
else if(mon_use_type == 2)
|
lora->setWorkParam(sysParam.monomer_order,sysParam.monomer_fre);
|
if(mon_source == MONO_TYPE_WIRED)
|
rs485wired->setWorkParam(sysParam.monomer_order);
|
}
|
|
void Work_Thread::RecvSysAddrFre(int cmd,int param)
|
{
|
//monomer addr
|
if(CMD_SetMonomerAddr == cmd)
|
{
|
if(mon_source == MONO_TYPE_WIRED)
|
{
|
rs485wired->setAddr(param);
|
const quint8 &adjstatue = rs485wired->getAdjStart();
|
for(int i=0;i<10;i++)
|
{
|
msleep(100);
|
if(adjstatue == 0)
|
{
|
break;
|
}
|
}
|
emit SendThreadState(CMD_SetMonomerAddr,rs485wired->getAdjStatue());
|
}
|
else
|
{
|
if(mon_use_type == 1)
|
{
|
int res = nrf905module->SingleWriteModule(NRegAddr_SetMonomerAddr,param,300);
|
emit SendThreadState(CMD_SetMonomerAddr,res);
|
}
|
else if(mon_use_type == 2)
|
{
|
int res = lora->setmoduleaddr(0,param);
|
emit SendThreadState(CMD_SetMonomerAddr,res);
|
}
|
else
|
{
|
int res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonomerAddr,param,1000);
|
emit SendThreadState(CMD_SetMonomerAddr,res);
|
}
|
}
|
}
|
else if(CMD_SetMonomerFre == cmd)
|
{
|
if(mon_use_type == 1)
|
{
|
int res = nrf905module->SingleWriteModule(NRegAddr_SetWorkFreq,param,300);
|
emit SendThreadState(CMD_SetMonomerFre,res);
|
nrf905module->IF_MONCLEAR = 1;
|
}
|
else if(mon_use_type == 2)
|
{
|
int res = lora->setWorkFre(param);
|
emit SendThreadState(CMD_SetMonomerFre,res);
|
}
|
else
|
{
|
int res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonomerFre,param,1000);
|
emit SendThreadState(CMD_SetMonomerFre,res);
|
rs485->IF_MONCLEAR = 1;
|
}
|
}
|
}
|
|
void Work_Thread::RecvAdjCmd(int cmd, quint16 param)
|
{
|
if(cmd == CMD_SetOnlVolZero)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_OnlVolZero,param,300);
|
}
|
else if(cmd == CMD_SetOnlVolSlope)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_OnlVolSlope,param,300);
|
}
|
else if(cmd == CMD_SetGrpVolZero)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_GrpVolZero,param,300);
|
}
|
else if(cmd == CMD_SetGrpVolSlope)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_GrpVolSlope,param,300);
|
}
|
else if(cmd == CMD_SetDisCur)
|
{
|
work_preset_cur = param;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetCurrent,param,300);
|
}
|
else if(cmd == CMD_SetDisCurrZero)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_DisCurrZero,param,300);
|
}
|
else if(cmd == CMD_SetDisCurrSlope)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_DisCurrSlope,param,300);
|
}
|
else if(cmd == CMD_SetChrCur)
|
{
|
work_preset_cur = param;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetCurlimit,param,300);
|
}
|
else if(cmd == CMD_SetChrCurrZero)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_ChrCurrZero,param,300);
|
}
|
else if(cmd == CMD_SetChrCurrSlope)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_ChrCurrSlope,param,300);
|
}
|
else if(cmd == CMD_SetECurrZero)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_ECurrZero,param,300);
|
}
|
else if(cmd == CMD_SetECurrSlope)
|
{
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_ECurrSlope,param,300);
|
}
|
}
|
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::initWorkPageShow()
|
{
|
fboData.m_TestTime.hour = 0;
|
fboData.m_TestTime.minute = 0;
|
fboData.m_TestTime.second = 0;
|
//fboData.SumVoltage = 0;
|
testFileName = "";
|
fboData.AllCap = 0;
|
for(quint8 i = 0;i<4;i++)
|
{
|
fboData.SubCap[i] = 0;
|
}
|
|
localData.SysWorkState = WorkStopped;
|
localData.WPAlarmState = WPMANUALPSTOP;
|
localData.monomerLowCount = 0;
|
monomerLowCount = 0;
|
}
|
|
void Work_Thread::enterpage_init(){
|
if(if_need_init==false)
|
return;
|
if(GDFZ_1|GDFZ_2|GDFZ_3|GDFZ_4|GDFZ_5){
|
PowerCtrl |= (GDFZ_1|GDFZ_2|GDFZ_3|GDFZ_4|GDFZ_5);
|
}
|
if(CONTROL_DIS){
|
PowerCtrl |= CONTROL_DIS;
|
}
|
if(CONTROL_CHREN){
|
PowerCtrl |= CONTROL_CHREN;
|
}
|
if(CONTROL_CHR){
|
PowerCtrl |= CONTROL_CHR;
|
}
|
if(CONTROL_TKQ){
|
PowerCtrl |= CONTROL_TKQ;
|
}
|
if(CONTROL_BJ){
|
PowerCtrl |= CONTROL_BJ;
|
}
|
if(CONTROL_ZC){
|
PowerCtrl |= CONTROL_ZC;
|
}
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
timer_1s->stop();
|
}
|
|
void Work_Thread::initTest(const quint8 type)
|
{
|
fboData.m_TestTime.hour = 0;
|
fboData.m_TestTime.minute = 0;
|
fboData.m_TestTime.second = 0;
|
|
monomerLowCount = 0;
|
|
fboData.AllCap = 0;
|
sysState.CapPS = 0;
|
for(quint8 i = 0;i<4;i++)
|
{
|
fboData.SubCap[i] = 0;
|
sysState.SubCapPS[i] = 0;
|
}
|
|
fboData.m_DataType.TypeTag0 = type;
|
fboData.m_DataType.TypeTag1 = type;
|
fboData.m_DataType.TypeTag2 = type;
|
fboData.m_DataType.TypeTag3 = type;
|
|
localData.SysWorkState = WorkStopped;
|
sysState.TestType = type;
|
localData.TestType = type;
|
sysState.OnlineVollow = 0;
|
|
ClearRemainData();
|
|
FBO_DATA_HEAD_START fbo_data_head_start;
|
|
fbo_data_head_start.TestStartTime.year = QDate::currentDate().year()-2000;
|
fbo_data_head_start.TestStartTime.month = QDate::currentDate().month();
|
fbo_data_head_start.TestStartTime.day = QDate::currentDate().day();
|
fbo_data_head_start.TestStartTime.hour = QTime::currentTime().hour();
|
fbo_data_head_start.TestStartTime.minute = QTime::currentTime().minute();
|
fbo_data_head_start.TestStartTime.second = QTime::currentTime().second();
|
fbo_data_head_start.Device = MashineType;
|
fbo_data_head_start.DataVersion = DATAVERSION;
|
fbo_data_head_start.DataType = type;
|
fbo_data_head_start.HourRate = testParam.hourly_rate;
|
fbo_data_head_start.SaveInterval = sysParam.save_interval;
|
fbo_data_head_start.STDCap = testParam.nominal_cap;
|
fbo_data_head_start.TestCur = testParam.preset_cur;
|
fbo_data_head_start.MVLLimit = testParam.mon_lower;
|
fbo_data_head_start.SumVLLimit = testParam.group_lower;
|
fbo_data_head_start.BattSum = testParam.mon_number;
|
fbo_data_head_start.BattGroup = testParam.group_number;
|
fbo_data_head_start.MVLLimitCount = testParam.lower_number;
|
fbo_data_head_start.MonomerVol = testParam.mon_vol; //单体电压
|
|
ClassXML::CreateFBO_Data(testFileName,fbo_data_head_start);
|
|
ClassXML::SaveFBO_Data(testFileName,fboData);
|
}
|
|
SYS_State Work_Thread::GetSysState(void)
|
{
|
return sysState;
|
}
|
int Work_Thread::ctrlJDQ(){
|
int res = -1;
|
#if TYPE_IDCE_940
|
res = ctrlJDQ_940();
|
#else
|
res = ctrlJDQ_other();
|
#endif
|
return res;
|
}
|
|
int Work_Thread::ctrlJDQ_other(){
|
int res = 0;
|
#if PRO
|
if(fboData.SumVoltage>PROVOL)//电压大于300V时断开PRO CTRL_COND置零 CTRL_CONP置一
|
{
|
PowerCtrl &= ~(CTRL_COND);
|
PowerCtrl |= (CTRL_CONP);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else{
|
PowerCtrl &= ~(CTRL_CONP);
|
PowerCtrl |= (CTRL_COND);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
#endif
|
return res;
|
}
|
|
int Work_Thread::ctrlJDQ_940(){
|
int res = 0;
|
#if PRO
|
if(fboData.SumVoltage<PROVOL)
|
{
|
PowerCtrl &= ~(CTRL_PRLY6);
|
PowerCtrl |= (CTRL_PRLY7);
|
qDebug("1PowerCtrl=%x",PowerCtrl);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else{
|
PowerCtrl &= ~(CTRL_PRLY7);
|
PowerCtrl |= (CTRL_PRLY6);
|
qDebug("2PowerCtrl=%x",PowerCtrl);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
if(fboData.SumVoltage>PROVOL)
|
{
|
if(fboData.SumVoltage<2420)
|
{
|
PowerCtrl &= ~(CTRL_PRLY2);
|
PowerCtrl |= (CTRL_PRLY1);
|
qDebug("3PowerCtrl=%x",PowerCtrl);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else{
|
PowerCtrl &= ~(CTRL_PRLY1);
|
PowerCtrl |= (CTRL_PRLY2);
|
qDebug("4PowerCtrl=%x",PowerCtrl);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
}
|
#endif
|
return res;
|
}
|
|
//----------------------------------------------------------------------------------------------
|
int Work_Thread::OpenDischargePower()
|
{
|
int res = 0;
|
if(res==0 && CONTROL_DISEN){
|
PowerCtrl &= ~(CONTROL_DISEN);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(1500);
|
}
|
if(res==0 && CONTROL_DIS)
|
{
|
PowerCtrl &= ~(CONTROL_DIS);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(1000);
|
}
|
if(res==0 && PWM_ABLE && PageType != FBI48CT)
|
{
|
//--------- 开PWM -------------
|
PWM_Ctrl = PWM_INIT;
|
if(PWM_ABLE){
|
PWM_Ctrl |= (PWM_ABLE);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM,PWM_Ctrl,300);
|
}
|
}
|
if(res == 0 && PageType == FBI48CT){
|
//--------- 开DC-DC -------------
|
quint16 dcdcstate = 1;
|
//rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetDCDC_State,dcdcstate,300);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetDCDC_State,dcdcstate,500);
|
}
|
|
return res;
|
}
|
|
int Work_Thread::CloseDischargePower(const quint8 workstate)
|
{
|
int res = 0;
|
if(((!(localData.RLY_OK&(JT_VALUE))) || (!IF_J9Close))&&JT_VALUE)//紧急停止按钮按下
|
{
|
//紧急停止不下发指令;
|
}
|
else {
|
PWM_Ctrl = PWM_INIT;
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM,PWM_Ctrl,300);
|
msleep(1000);
|
if(PageType == FBI48CT){
|
quint16 dcdcstate = 0;
|
//rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetDCDC_State,dcdcstate,500);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetDCDC_State,dcdcstate,500);
|
}
|
if(GDFZ_1|GDFZ_2|GDFZ_3|GDFZ_4|GDFZ_5){
|
PowerCtrl |= (GDFZ_1|GDFZ_2|GDFZ_3|GDFZ_4|GDFZ_5);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
if(workstate == Paused_Dischg){
|
;
|
}
|
else if(workstate == WaitForCharging){
|
if(CONTROL_DIS){
|
PowerCtrl |= (CONTROL_DIS);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
}
|
else {//Stop
|
PowerCtrl = (POWER_CTRL_INIT&(~CTRL_WIND));
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
}
|
return res;
|
}
|
//打开充电
|
int Work_Thread::OpenChargePower(quint8 workstate)
|
{
|
// qDebug()<<"OpenChargePower:workstate:"<<workstate;
|
int res = 0;
|
if(workstate == CPNullCharging)//充电监测,X只开风扇X 啥都不开,还要关风扇
|
{
|
nullChargingState = 1;
|
PowerCtrl |= CTRL_WIND;//单位置一
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
else if(workstate == CPSmallCharging)//充电限流 有直冲开关要先断开,有限流电阻则至少闭合一路
|
{
|
PowerCtrl &= ~(CTRL_WIND);//单位置零 防止忘开风扇
|
if(CONTROL_ZC){//有直冲开关要先断开
|
PowerCtrl |= CONTROL_ZC;
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
}
|
//在线电压低,不闭合继电器
|
if(localData.OnlineVol < testParam.onlinevol_lowlimit &&
|
testParam.test_mode == ONline_working &&
|
(PageType == FBO48CT || TYPE_FBI_10480 || TYPE_FBI_4548 || TYPE_FBI_20240)) {
|
;
|
}
|
else {
|
if(CONTROL_CHREN){
|
PowerCtrl &= ~(CONTROL_CHREN);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
// qDebug()<<"OpenChargePower:CONTROL_CHREN--PowerCtrl:"<<PowerCtrl;
|
}
|
if(res == 0 && CONTROL_CHR)
|
{
|
PowerCtrl &= ~(CONTROL_CHR);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
// qDebug()<<"OpenChargePower:CONTROL_CHR--PowerCtrl:"<<PowerCtrl;
|
}
|
if(res == 0 && CDRY1){
|
PowerCtrl &= ~(CDRY1);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
if(res==0 && PWM_ABLE && PageType == FBI48CT)
|
{
|
//--------- 开PWM -------------
|
PWM_Ctrl = PWM_INIT;
|
if(PWM_ABLE){
|
PWM_Ctrl |= (PWM_ABLE);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM,PWM_Ctrl,300);
|
}
|
}
|
}
|
}
|
else if(workstate == CPLargeCharging)//疑问:有限流电阻时需要先断开再闭合直冲开关吗?
|
{
|
PowerCtrl &= ~(CTRL_WIND);//单位置零 防止忘开风扇
|
PowerCtrl &= ~(CONTROL_ZC);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
return res;
|
}
|
|
int Work_Thread::CloseChargePower(const quint8 workstate)
|
{
|
int res = 0;
|
if(((!(localData.RLY_OK&(JT_VALUE))) || (!IF_J9Close))&&JT_VALUE)//紧急停止按钮按下
|
{
|
//紧急停止不下发指令
|
}
|
else {
|
PWM_Ctrl = PWM_INIT;
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM,PWM_Ctrl,300);
|
if(CONTROL_ZC){
|
PowerCtrl |= (CONTROL_ZC);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
}
|
if(CDRY1|CDRY2|CDRY3|CDRY4|CDRY5|CDRY6){
|
PowerCtrl |= (CDRY1|CDRY2|CDRY3|CDRY4|CDRY5|CDRY6);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
}
|
if(CONTROL_CHR){
|
PowerCtrl |= (CONTROL_CHR);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
}
|
if(CONTROL_CHREN)
|
{
|
PowerCtrl |= (CONTROL_CHREN);
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
}
|
if(workstate == WorkStopped)
|
{
|
if(localData.WPAlarmState == CPNullCharging || nullChargingState==2)//充电监测全关!!!
|
PowerCtrl = POWER_CTRL_INIT;
|
else
|
PowerCtrl = (POWER_CTRL_INIT&(~CTRL_WIND));
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
}
|
return res;
|
//#endif
|
}
|
|
void Work_Thread::StartTestingFrom()
|
{
|
initTest(TestTypeDischarge);
|
|
ResumeTestingFrom();
|
}
|
void Work_Thread::ResumeTestingFrom()
|
{
|
if_steady = 0;
|
sysState.OnlineVollow = 0;
|
if(OpenDischargePower() == 0)
|
{
|
timer_1s->start();
|
localData.SysWorkState = Discharging;
|
localData.WPAlarmState = WPDISCHARGING;
|
}
|
setIOboardState();
|
SaveContinueFile();
|
}
|
//暂停测试
|
void Work_Thread::SuspendTesting(const quint8 pausetype)
|
{
|
timer_1s->stop();
|
delayupdate = 0;
|
CloseDischargePower(Paused_Dischg);
|
|
localData.SysWorkState = Paused_Dischg;
|
localData.WPAlarmState = pausetype;
|
//简单粗暴,断开并机
|
if(sysParam.loader_plusEn && CONTROL_BJ)
|
IF_USEloader(false);
|
ClassXML::SaveFBO_Data(testFileName,fboData);
|
SaveContinueFile();
|
}
|
|
void Work_Thread::StartChargeTest(const quint8 workstate)
|
{
|
initTest(TestTypeCharge);
|
|
ResumeChargeFrom(workstate);
|
}
|
|
void Work_Thread::ResumeChargeFrom(const quint8 workstate)
|
{
|
sysState.OverChargeTime = 0;
|
sysState.OnlineVollow = 0;
|
sysState.addmark = false;
|
if(OpenChargePower(workstate) == 0)
|
{
|
timer_1s->start();
|
localData.SysWorkState = Charging;
|
localData.WPAlarmState = workstate;
|
}
|
setIOboardState();
|
SaveContinueFile();
|
}
|
|
void Work_Thread::SuspendChargeTest(const quint8 pausetype)
|
{
|
timer_1s->stop();
|
//充电
|
if(localData.WPAlarmState != CPNullCharging)
|
{
|
CloseChargePower(Paused_charge);
|
localData.WPAlarmState = pausetype;
|
}else{//充电监测
|
localData.WPAlarmState = CPPauseNullCharging;
|
nullChargingState = 2;
|
}
|
localData.SysWorkState = Paused_charge;
|
ClassXML::SaveFBO_Data(testFileName,fboData);
|
SaveContinueFile();
|
}
|
|
void Work_Thread::StopTesting(const quint8 stoptype)
|
{
|
if_steady = 0;
|
delayupdate = 0;
|
IF_CloseFan = true;
|
|
int res = 0;
|
if(sysState.TestType == TestTypeDischarge)
|
{
|
if(testParam.test_mode == ONline_working)
|
{
|
if(stoptype == WPTIMESTOP || stoptype == WPCAPSTOP ||
|
stoptype == WPSVLLSTOP || stoptype == WPMVLLSTOP)
|
{
|
res = CloseDischargePower(WaitForCharging);
|
localData.SysWorkState = WaitForCharging;
|
}
|
else
|
{
|
res = CloseDischargePower(WorkStopped);
|
localData.SysWorkState = WorkStopped;
|
}
|
//if(res == 0)
|
{
|
localData.WPAlarmState = stoptype;
|
}
|
}
|
else
|
{
|
res = CloseDischargePower(WorkStopped);
|
//if(res == 0)
|
{
|
localData.SysWorkState = WorkStopped;
|
localData.WPAlarmState = stoptype;
|
}
|
}
|
}
|
else if(sysState.TestType == TestTypeCharge)
|
{
|
|
res = CloseChargePower(WorkStopped);
|
//if(res == 0)
|
{
|
localData.SysWorkState = WorkStopped;
|
localData.WPAlarmState = stoptype;
|
}
|
}
|
|
// if(res != 0)
|
// return;
|
timer_1s->stop();
|
//简单粗暴,断开并机
|
if(sysParam.loader_plusEn && CONTROL_BJ)
|
IF_USEloader(false);
|
|
ClassXML::SaveFBO_Data(testFileName,fboData);
|
|
FBO_DATA_HEAD_STOP fbo_data_head_stop;
|
fbo_data_head_stop.TestTimeLong = fboData.m_TestTime;
|
fbo_data_head_stop.StopType = stoptype;
|
fbo_data_head_stop.BlockSum = 1;
|
fbo_data_head_stop.StandBy = 0;
|
fbo_data_head_stop.TestCap = fboData.AllCap;
|
for(quint8 g=0;g<4;g++)
|
{
|
fbo_data_head_stop.SMaxIndex[g] = localData.SMaxIndex[g];
|
fbo_data_head_stop.SMinIndex[g] = localData.SMinIndex[g];
|
fbo_data_head_stop.SMaxVol[g] = localData.SMaxVol[g];
|
fbo_data_head_stop.SMinVol[g] = localData.SMinVol[g];
|
}
|
|
ClassXML::CloseFBO_Data(testFileName,fbo_data_head_stop);
|
sysState.SaveDataEN = true;
|
SaveContinueFile();
|
}
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::RecvSysCtrlCMD(int cmd,QString filepath)
|
{
|
if(CMD_StartFanWork == cmd)
|
{
|
IF_CloseFan = false;
|
if(localData.SysWorkState != Paused_Dischg && localData.SysWorkState != Paused_charge)
|
{
|
PowerCtrl = POWER_CTRL_INIT;
|
PowerCtrl &= ~CTRL_WIND;//单位置零
|
}
|
else
|
{
|
PowerCtrl &= ~CTRL_WIND;//单位置零
|
}
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(CMD_StopFanWork == cmd){
|
IF_CloseFan = true;
|
}
|
else if(CMD_PowerSwithOn == cmd)
|
{
|
PowerCtrl &= ~CONTROL_TKQ;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(CMD_PowerSwithOff == cmd)
|
{
|
IF_CloseFan = true;
|
PowerCtrl |= CONTROL_TKQ;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(CMD_StartDischarge == cmd)
|
{
|
if(Paused_Dischg == localData.SysWorkState)
|
{
|
ResumeTestingFrom();
|
}
|
else
|
{
|
battName = filepath;
|
testFileName = DATA_ROOT_DIR+filepath+"/"+format_data_name();
|
StartTestingFrom();
|
}
|
}
|
else if(CMD_PauseDischarge == cmd)
|
{
|
SuspendTesting(WPMANUALPAUSE);
|
}
|
else if(CMD_StopDischarge == cmd)
|
{
|
StopTesting(WPMANUALPSTOP);
|
}
|
else if(CMD_StartCharge == cmd)
|
{
|
#if CONTROL_ZC //FBO-4830有特殊的直充
|
if(WorkStopped == localData.SysWorkState)
|
{
|
battName = filepath;
|
testFileName = DATA_ROOT_DIR+filepath+"/"+format_data_name();
|
StartChargeTest(CPSmallCharging);
|
}
|
else if(localData.SysWorkState >= Paused_charge)
|
{
|
ResumeChargeFrom(CPSmallCharging);
|
}
|
#else
|
if(Paused_charge == localData.SysWorkState)
|
{
|
ResumeChargeFrom(CPSmallCharging);
|
}
|
else
|
{
|
battName = filepath;
|
testFileName = DATA_ROOT_DIR+filepath+"/"+format_data_name();
|
StartChargeTest(CPSmallCharging);
|
}
|
#endif
|
}
|
else if(CMD_StartZCharge == cmd)
|
{
|
if(WorkStopped == localData.SysWorkState)
|
{
|
battName = filepath;
|
testFileName = DATA_ROOT_DIR+filepath+"/"+format_data_name();
|
StartChargeTest(CPLargeCharging);
|
}
|
else if(localData.SysWorkState >= Paused_charge)
|
{
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
else if(CMD_ChargeNull == cmd)
|
{
|
#if CONTROL_ZC
|
if(WorkStopped == localData.SysWorkState)
|
{
|
battName = filepath;
|
testFileName = DATA_ROOT_DIR+filepath+format_data_name();
|
StartChargeTest(CPNullCharging);
|
}
|
else if(localData.SysWorkState >= Paused_charge)
|
{
|
ResumeChargeFrom(CPNullCharging);
|
}
|
#else
|
if(Paused_charge == localData.SysWorkState)
|
{
|
ResumeChargeFrom(CPNullCharging);
|
}
|
else
|
{
|
battName = filepath;
|
testFileName = DATA_ROOT_DIR+filepath+format_data_name();
|
StartChargeTest(CPNullCharging);
|
}
|
#endif
|
}
|
else if(CMD_PauseCharge == cmd)
|
{
|
SuspendChargeTest(CPPauseCharging);
|
}
|
else if(CMD_StopCharge == cmd)
|
{
|
StopTesting(CPStopCharging);
|
}
|
else if(CMD_Adj_StartDis == cmd)
|
{
|
OpenDischargePower();
|
Adj_TestState = 1;
|
}
|
else if(CMD_Adj_StopDis == cmd)
|
{
|
if(1 == Adj_TestState)
|
{
|
CloseDischargePower(WorkStopped);
|
Adj_TestState = 0;
|
}
|
}
|
else if(CMD_Adj_StartChr == cmd)
|
{
|
OpenChargePower(CPSmallCharging);
|
Adj_TestState = 2;
|
}
|
else if(CMD_Adj_StopChr == cmd)
|
{
|
if(2 == Adj_TestState)
|
{
|
CloseChargePower(WorkStopped);
|
Adj_TestState = 0;
|
}
|
}
|
|
}
|
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
QString Work_Thread::format_data_name(void)
|
{
|
QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
|
QString str = "F"+time.toString("yyyy-MM-dd hh.mm.ss")+".FBO"; //设置显示格式
|
|
testStartTime.year = QDate::currentDate().year()-2000;
|
testStartTime.month = QDate::currentDate().month();
|
testStartTime.day = QDate::currentDate().day();
|
testStartTime.hour = QTime::currentTime().hour();
|
testStartTime.minute = QTime::currentTime().minute();
|
testStartTime.second = QTime::currentTime().second();
|
|
return str;
|
}
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::Timer1s_timeout(void)
|
{
|
quint32 secondsum = 0;
|
//qDebug("PowerCtrl = %x",PowerCtrl);
|
if(fboData.m_TestTime.second<59)
|
{
|
fboData.m_TestTime.second++;
|
}
|
else
|
{
|
fboData.m_TestTime.second = 0;
|
if(fboData.m_TestTime.minute<59)
|
{
|
fboData.m_TestTime.minute++;
|
}
|
else
|
{
|
fboData.m_TestTime.minute = 0;
|
if(fboData.m_TestTime.hour < 99)
|
{
|
fboData.m_TestTime.hour++;
|
}
|
else
|
{
|
fboData.m_TestTime.hour = 0;
|
}
|
}
|
}
|
if(Charging == localData.SysWorkState)//过流充时间
|
{
|
if(sysState.OverChargeTime < 35)
|
sysState.OverChargeTime++;
|
}
|
if(sysState.addmark && sysState.addcount<35)
|
sysState.addcount++;
|
//-------------- 安时数累加 ----------------
|
sysState.CapPS += fboData.SumCurrent;
|
for(quint8 n=0; n<4; n++)
|
{
|
sysState.SubCapPS[n] += fboData.SubCurrent[n];
|
}
|
|
if(sysState.CapPS >= 36000)//电流扩大了10倍
|
{
|
sysState.CapPS -= 36000;
|
fboData.AllCap++; //--"安时数"加1
|
}
|
for(quint8 n=0; n<4; n++)
|
{
|
if(sysState.SubCapPS[n] >= 36000)//电流扩大了10倍
|
{
|
sysState.SubCapPS[n] -= 36000;
|
fboData.SubCap[n]++; //--"安时数"加1
|
}
|
}
|
|
secondsum =3600*fboData.m_TestTime.hour
|
+ 60*fboData.m_TestTime.minute
|
+ fboData.m_TestTime.second;
|
if(if_steady<50)
|
if_steady++;
|
|
if((secondsum<180) && (secondsum%6 == 0))
|
{
|
sysState.SaveDataEN = true;
|
}
|
else if((secondsum>=180) && (fboData.m_TestTime.second==0)
|
&& (((secondsum-180)/60)%sysParam.save_interval==0))
|
{
|
sysState.SaveDataEN = true;
|
}
|
}
|
//----------------------------------------------------------------------------------------------
|
quint16 Work_Thread::getMonomerLowCount(void)
|
{
|
quint16 temp1 = 0;
|
qint16 vol = 0;
|
|
for(int i=0;i<fboData.BattSum;i++)
|
{
|
vol = ClassXML::getMonomerVol(mon_source,fboData.SingleVol[i]);
|
|
if(abs(vol)<100)
|
continue;
|
|
if(/*(vol>100) && */(vol<(testParam.mon_lower*10)))
|
{
|
temp1++;
|
}
|
}
|
monomerLowCount = temp1;
|
return monomerLowCount;
|
}
|
//一路固定负载投切
|
void Work_Thread::ControlDisCurGDTQ_ONE(quint16 setcurrent)
|
{
|
quint16 settedcurrent = setcurrent;
|
quint16 current = fboData.SumCurrent;
|
|
if((current<settedcurrent) && (settedcurrent-current>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value >= PWMValueMax)
|
{
|
if(PowerCtrl & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
}
|
}
|
}
|
else if((current>settedcurrent) && (current-settedcurrent>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value <= PWMValueMin)
|
{
|
if((~PowerCtrl) & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_1;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
}
|
}
|
}
|
}
|
//两路固定负载投切
|
void Work_Thread::ControlDisCurGDTQ_TWO(quint16 setcurrent)
|
{
|
quint16 settedcurrent = setcurrent;
|
quint16 current = fboData.SumCurrent;
|
|
if((current<settedcurrent) && (settedcurrent-current>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value >= PWMValueMax)
|
{
|
if(PowerCtrl & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, 50, 300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,200);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(300);
|
rs485->SingleWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, settedcurrent, 300);
|
}
|
else if(PowerCtrl & GDFZ_2)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, 50, 300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, settedcurrent, 300);
|
}
|
}
|
}
|
}
|
else if((current>settedcurrent) && (current-settedcurrent>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value <= PWMValueMin)
|
{
|
if((~PowerCtrl) & GDFZ_2)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_1;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
}
|
}
|
}
|
}
|
//三路固定负载投切
|
void Work_Thread::ControlDisCurGDTQ_THREE(quint16 setcurrent)
|
{
|
quint16 settedcurrent = setcurrent;
|
quint16 current = fboData.SumCurrent;
|
|
if((current<settedcurrent) && (settedcurrent-current>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value >= PWMValueMax)
|
{
|
if(PowerCtrl & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(PowerCtrl & GDFZ_2)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(PowerCtrl & GDFZ_3)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl |= (GDFZ_1|GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
}
|
}
|
}
|
else if((current>settedcurrent) && (current-settedcurrent>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value <= PWMValueMin)
|
{
|
if((~PowerCtrl) & GDFZ_2)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_1;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_3)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
}
|
}
|
}
|
}
|
|
//五路固定负载投切
|
void Work_Thread::ControlDisCurGDTQ_FIVE(quint16 setcurrent)
|
{
|
/*
|
*电流小于设定值
|
闭合1
|
闭合2
|
断开1、2 闭合3
|
闭合1
|
闭合2
|
断开1、2 闭合4(此时3还是闭合)
|
闭合1
|
闭合2
|
断开1、2 闭合5(此时3、还是闭合)
|
闭合1
|
闭合2
|
|
电流大于设定值
|
断开2
|
断开1
|
断开5 闭合1、2
|
断开2
|
断开1
|
断开4 闭合1、2
|
断开2
|
断开1
|
断开3 闭合1、2
|
断开2
|
断开1
|
*/
|
quint16 settedcurrent = setcurrent;
|
quint16 current = fboData.SumCurrent;
|
|
if((current<settedcurrent) && (settedcurrent-current>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
if(localData.PWM1_Value >= PWMValueMax)
|
{
|
if(PowerCtrl & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(PowerCtrl & GDFZ_2)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(PowerCtrl & GDFZ_3)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl |= (GDFZ_1|GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(PowerCtrl & GDFZ_4)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl |= (GDFZ_1|GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_4);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else if(PowerCtrl & GDFZ_5)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMin,300);
|
msleep(300);
|
PowerCtrl |= (GDFZ_1|GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_5);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
}
|
}
|
}
|
else if((current>settedcurrent) && (current-settedcurrent>5))
|
{
|
if(PWM_Ctrl & PWM_1_ENABLE)
|
{
|
// qDebug("localData.PWM1_Value=%d PWMValueMin=%d",localData.PWM1_Value, PWMValueMin);
|
if(localData.PWM1_Value <= PWMValueMin)
|
{
|
if((~PowerCtrl) & GDFZ_2)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_1)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_1;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_5)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_5;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_4)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_4;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
else if((~PowerCtrl) & GDFZ_3)
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= GDFZ_3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
PowerCtrl &= (~GDFZ_1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
msleep(300);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetPWM1_Value,PWMValueMax,300);
|
}
|
// qDebug("1 if_steady = %d",if_steady);
|
}
|
// qDebug("2 if_steady = %d",if_steady);
|
}
|
}
|
}
|
|
void Work_Thread::ControlDisCur()
|
{
|
int tmpmaxcur = 0;
|
int nowpower = fboData.SumCurrent*fboData.SumVoltage;
|
int maxpower = MaxPOWER*1000*10;
|
#if TYPE_IDCE_2415
|
if(fboData.SumVoltage<3000)
|
tmpmaxcur = MAXCUR300V;
|
else
|
tmpmaxcur = MAXCUR300Vup;
|
#else
|
tmpmaxcur = MaxCur*10;
|
#endif
|
|
//有负载投切的机子在投切时有PWM值达到240
|
if((fboData.SumCurrent >= tmpmaxcur) ||
|
((tmpmaxcur-fboData.SumCurrent)<=5) ||
|
(localData.PWM1_Value >= PWMValueMax) ||
|
(nowpower >= maxpower) ||
|
(maxpower - nowpower)<5000){
|
if(PowerCtrl & CONTROL_BJ && if_steady>15)//简易版并机模块控制
|
{
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl &= (~CONTROL_BJ);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
}
|
if((fboData.SumCurrent < tmpmaxcur && (tmpmaxcur-fboData.SumCurrent)>5) &&
|
(localData.PWM1_Value < PWMValueMax) &&(maxpower - nowpower)>8000 && if_steady>15){
|
if(!(PowerCtrl & CONTROL_BJ)){
|
if_steady = 5;
|
delayupdate = delaytime;
|
PowerCtrl |= (CONTROL_BJ);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
}
|
}
|
|
void Work_Thread::CheckChargeAlarm(void)
|
{
|
// qDebug()<<"CheckChargeAlarm:RLY_OK:"<<localData.RLY_OK;
|
// qDebug()<<"CheckChargeAlarm:SysWorkState:"<<localData.SysWorkState;
|
// qDebug()<<"CheckChargeAlarm:WPAlarmState:"<<localData.WPAlarmState;
|
//comm error
|
if(localData.SoftVersion==0 && localData.WPAlarmState != CPNullCharging)
|
{
|
StopTesting(CPCONNECTERROR);
|
sendMgBox(CPCONNECTERROR);
|
return;
|
}
|
//风扇
|
else if((localData.RLY_OK&FAN_VALUE)&&FAN_VALUE && localData.WPAlarmState != CPNullCharging)
|
{
|
StopTesting(CPFANERROR);
|
sendMgBox(CPFANERROR);
|
return;
|
}
|
else if(((!(localData.RLY_OK&(JT_VALUE))) || (!IF_J9Close))&&JT_VALUE)//紧急停止按钮按下
|
{
|
StopTesting(CPERRORSTOP);
|
sendMgBox(CPERRORSTOP);
|
return;
|
}
|
//temp too high
|
else if(localData.AlarmState > 0 && localData.WPAlarmState != CPNullCharging)
|
{
|
StopTesting(CPTEMPHIGHSTOP);
|
sendMgBox(CPTEMPHIGHSTOP);
|
return;
|
}
|
else if((localData.RLY_OK & TKQ_VALUE) && (testParam.test_mode == ONline_working)&&localData.WPAlarmState != CPNullCharging)
|
{
|
StopTesting(CPCURRENTERROR);
|
sendMgBox(CPCURRENTERROR);
|
qDebug()<<"CPCURRENTERRORCPCURRENTERRORCPCURRENTERROR";
|
return;
|
}
|
if(localData.WPAlarmState != CPNullCharging){
|
if(PageType == FBO48CT || TYPE_FBI_10480 || TYPE_FBI_4548 || TYPE_FBI_20240){
|
if(localData.OnlineVol < testParam.onlinevol_lowlimit
|
&& testParam.test_mode == ONline_working
|
&& sysState.OnlineVollow == 0)
|
{
|
sysState.OnlineVollow = 1;
|
localData.WPAlarmState = CPPOWERBREAKSTOP;
|
//提示在线电压低,并断开继电器
|
CloseChargePower(Paused_charge);
|
}
|
else if(localData.OnlineVol > testParam.onlinevol_lowlimit
|
&& testParam.test_mode == ONline_working
|
&& sysState.OnlineVollow == 1)
|
{
|
sysState.OnlineVollow = 0;
|
if((~PowerCtrl) & CONTROL_ZC) //直冲接触器已闭合
|
localData.WPAlarmState = CPLargeCharging;
|
else {
|
localData.WPAlarmState = CPSmallCharging;
|
//恢复充电,并闭合继电器
|
OpenChargePower(CPSmallCharging);
|
}
|
}
|
}
|
}
|
|
}
|
|
void Work_Thread::CheckChargeAlarm_Pause(void)
|
{
|
// qDebug()<<"CheckChargeAlarm_Pause:RLY_OK:"<<localData.RLY_OK;
|
// qDebug()<<"CheckChargeAlarm_Pause:SysWorkState:"<<localData.SysWorkState;
|
// qDebug()<<"CheckChargeAlarm_Pause:WPAlarmState:"<<localData.WPAlarmState;
|
//comm error
|
if(localData.SoftVersion==0 && localData.WPAlarmState != CPNullCharging)
|
{
|
StopTesting(CPCONNECTERROR);
|
sendMgBox(CPCONNECTERROR);
|
return;
|
}
|
else if(((!(localData.RLY_OK&(JT_VALUE))) || (!IF_J9Close))&&JT_VALUE)//紧急停止按钮按下
|
{
|
StopTesting(CPERRORSTOP);
|
sendMgBox(CPERRORSTOP);
|
return;
|
}
|
//temp too high
|
else if(localData.AlarmState > 0 && localData.WPAlarmState != CPNullCharging)
|
{
|
StopTesting(CPTEMPHIGHSTOP);
|
sendMgBox(CPTEMPHIGHSTOP);
|
return;
|
}
|
else if((localData.RLY_OK & TKQ_VALUE) &&
|
(testParam.test_mode == ONline_working) &&
|
(localData.WPAlarmState != CPNullCharging &&localData.WPAlarmState != CPPauseNullCharging))
|
{
|
StopTesting(CPCURRENTERROR);
|
sendMgBox(CPCURRENTERROR);
|
return;
|
}
|
}
|
|
//直冲限流计算
|
double Work_Thread::GetChargeLimitCurrent(void)
|
{
|
double LimitCurrent = 0;
|
if(PageType == FBI48CT)
|
LimitCurrent = testParam.charge_limit/10;
|
else
|
LimitCurrent = testParam.nominal_cap/10;
|
return LimitCurrent;
|
}
|
//FBO-2415直充
|
void Work_Thread::CPControlChargeCurrent2415()
|
{
|
#if TYPE_FBO_2415
|
if(testParam.test_mode != ONline_working)
|
return;
|
if((localData.WPAlarmState == CPSmallCharging)&&(localData.OnlineVol < testParam.onlinevol_lowlimit))
|
return;
|
|
unsigned int CurrentI = ClassXML::GetFDCurrent(testParam.nominal_cap , 10);//参数10,电流等于容量*0.1;
|
if(localData.GroupVol<PROVOL){
|
if(CurrentI > MAXCUR300V)
|
{
|
CurrentI = MAXCUR300V;
|
}
|
}
|
else {
|
if(CurrentI > MAXCUR300Vup)
|
{
|
CurrentI = MAXCUR300Vup;
|
}
|
}
|
|
if((localData.WPAlarmState == CPSmallCharging) && (localData.OnlineVol >= testParam.onlinevol_lowlimit))
|
{
|
if((localData.InnerCurrVal < GetChargeLimitCurrent()*9)&&(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= GetChargeLimitCurrent()*7)&&(abs(localData.OnlineVol-localData.GroupVol)<15)) //陈经理要求
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY3))
|
{
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
}
|
}
|
else if((localData.WPAlarmState == CPLargeCharging)&&(localData.InnerCurrVal > CurrentI*12/10)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
#endif
|
}
|
//FBO-4815直充
|
void Work_Thread::CPControlChargeCurrent4815()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if((localData.WPAlarmState == CPSmallCharging)&&(localData.OnlineVol < testParam.onlinevol_lowlimit))
|
return;
|
|
unsigned int CurrentI = ClassXML::GetFDCurrent(testParam.nominal_cap , 10);//参数10,电流等于容量*0.1;
|
if(CurrentI > 1500)
|
{
|
CurrentI = 1500; //不超过150A
|
}
|
if((localData.WPAlarmState == CPSmallCharging) && (localData.OnlineVol >= testParam.onlinevol_lowlimit))
|
{
|
if((localData.InnerCurrVal < GetChargeLimitCurrent()*9)&&(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= GetChargeLimitCurrent()*7)&&(abs(localData.OnlineVol-localData.GroupVol)<15)) //陈经理要求
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY3))
|
{
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
}
|
}
|
else if((localData.WPAlarmState == CPLargeCharging)&&(localData.InnerCurrVal > CurrentI*12/10)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
}
|
//FBO-4830直充
|
void Work_Thread::CPControlChargeCurrent4830()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if((localData.WPAlarmState == CPSmallCharging)&&(localData.OnlineVol < testParam.onlinevol_lowlimit))
|
return;
|
|
unsigned int CurrentI = ClassXML::GetFDCurrent(testParam.nominal_cap , 10);//参数10,电流等于容量*0.1;
|
if(CurrentI > 3000)
|
{
|
CurrentI = 3000; //不超过300A
|
}
|
|
if((localData.WPAlarmState == CPSmallCharging) && (localData.OnlineVol >= testParam.onlinevol_lowlimit))
|
{
|
if((localData.InnerCurrVal < GetChargeLimitCurrent()*9)&&(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= GetChargeLimitCurrent()*7)&&(abs(localData.OnlineVol-localData.GroupVol)<15)) //陈经理要求
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY3))
|
{
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
}
|
}
|
else if((localData.WPAlarmState == CPLargeCharging)&&(localData.InnerCurrVal > CurrentI*12/10)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
}
|
|
//FBO-60010充电
|
void Work_Thread::ControlChargeCurrent60010()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if((localData.WPAlarmState == CPSmallCharging)&&(localData.OnlineVol < testParam.onlinevol_lowlimit))
|
return;
|
|
unsigned int CurrentI = ClassXML::GetFDCurrent(testParam.nominal_cap , 10);//参数10,电流等于容量*0.1;
|
if(CurrentI > 1000)
|
{
|
CurrentI = 1000; //不超过100A
|
}
|
|
if((localData.WPAlarmState == CPSmallCharging) && (localData.OnlineVol >= testParam.onlinevol_lowlimit))
|
{
|
if((localData.InnerCurrVal < GetChargeLimitCurrent()*9)&&(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
}
|
else if((localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY3))
|
{
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
}
|
}
|
}
|
|
//FBI-10480直充
|
void Work_Thread::CPControlChargeCurrent10480()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if((localData.WPAlarmState == CPSmallCharging)&&(localData.OnlineVol < testParam.onlinevol_lowlimit))
|
return;
|
|
if((localData.WPAlarmState == CPSmallCharging) && (localData.OnlineVol >= testParam.onlinevol_lowlimit))
|
{
|
if((localData.InnerCurrVal < GetChargeLimitCurrent()*9)&&
|
(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY4)
|
{
|
PowerCtrl &= (~CDRY4);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY5)
|
{
|
PowerCtrl &= (~CDRY5);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY6)
|
{
|
PowerCtrl &= (~CDRY6);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= GetChargeLimitCurrent()*7)&&
|
(abs(localData.OnlineVol-localData.GroupVol)<15)) //陈经理要求
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY6))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY6;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY5))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY5;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY4))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY4;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY3))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
}
|
}
|
else if((localData.WPAlarmState == CPLargeCharging)&&(localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
}
|
|
//FBI-10480直充
|
void Work_Thread::CPControlAdj10480()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if(localData.OnlineVol < testParam.onlinevol_lowlimit)
|
return;
|
double LimitCurrent = 0;
|
LimitCurrent = work_preset_cur/10;
|
if(localData.OnlineVol >= testParam.onlinevol_lowlimit)
|
{
|
if((localData.InnerCurrVal < LimitCurrent*9)&&
|
(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY4)
|
{
|
PowerCtrl &= (~CDRY4);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY5)
|
{
|
PowerCtrl &= (~CDRY5);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY6)
|
{
|
PowerCtrl &= (~CDRY6);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= LimitCurrent*7)&&
|
(abs(localData.OnlineVol-localData.GroupVol)<15)) //陈经理要求
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > LimitCurrent*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY6))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY6;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY5))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY5;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY4))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY4;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY3))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > LimitCurrent*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
}
|
|
//FBI-10480_240V直充
|
void Work_Thread::CPControlChargeCurrent10480_240V()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if((localData.WPAlarmState == CPSmallCharging)&&(localData.OnlineVol < testParam.onlinevol_lowlimit))
|
return;
|
|
if((localData.WPAlarmState == CPSmallCharging) && (localData.OnlineVol >= testParam.onlinevol_lowlimit))
|
{
|
if((localData.InnerCurrVal < GetChargeLimitCurrent()*9)&&
|
(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY4)
|
{
|
PowerCtrl &= (~CDRY4);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY5)
|
{
|
PowerCtrl &= (~CDRY5);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY6)
|
{
|
PowerCtrl &= (~CDRY6);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= GetChargeLimitCurrent()*7)&&
|
(abs(localData.OnlineVol-localData.GroupVol)<80)) //陈经理要求 在线电压-组端电压<8V
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY6))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY6;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY5))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY5;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY4))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY4;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY3))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
}
|
}
|
else if((localData.WPAlarmState == CPLargeCharging)&&(localData.InnerCurrVal > GetChargeLimitCurrent()*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
}
|
|
//FBI-10480_240V直充
|
void Work_Thread::CPControlAdj10480_240V()
|
{
|
if(testParam.test_mode != ONline_working)
|
return;
|
if(localData.OnlineVol < testParam.onlinevol_lowlimit)
|
return;
|
double LimitCurrent = 0;
|
LimitCurrent = work_preset_cur/10;
|
if(localData.OnlineVol >= testParam.onlinevol_lowlimit)
|
{
|
if((localData.InnerCurrVal < LimitCurrent*9)&&
|
(sysState.OverChargeTime > 30))
|
{
|
if(PowerCtrl & CDRY1)
|
{
|
PowerCtrl &= (~CDRY1);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY2)
|
{
|
PowerCtrl &= (~CDRY2);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY3)
|
{
|
PowerCtrl &= (~CDRY3);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY4)
|
{
|
PowerCtrl &= (~CDRY4);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY5)
|
{
|
PowerCtrl &= (~CDRY5);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else if(PowerCtrl & CDRY6)
|
{
|
PowerCtrl &= (~CDRY6);
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
sysState.OverChargeTime = 0;
|
}
|
else
|
{
|
if((localData.InnerCurrVal <= LimitCurrent*7)&&
|
(abs(localData.OnlineVol-localData.GroupVol)<80)) //陈经理要求
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPLargeCharging);
|
}
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > LimitCurrent*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(!(PowerCtrl & CDRY6))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY6;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY5))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY5;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY4))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY4;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY3))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY3;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
else if(!(PowerCtrl & CDRY2))
|
{
|
sysState.OverChargeTime = 0;
|
PowerCtrl |= CDRY2;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
msleep(200);
|
}
|
}
|
}
|
else if((localData.InnerCurrVal > LimitCurrent*12)&&(sysState.OverChargeTime > 30))
|
{
|
if(sysState.addmark == false){
|
sysState.addmark = true;
|
sysState.addcount = 0;
|
}
|
if(sysState.addcount>30){
|
sysState.OverChargeTime = 0;
|
ResumeChargeFrom(CPSmallCharging);//限流值怎么计算?
|
}
|
}
|
}
|
|
void Work_Thread::CheckIfStop(void)
|
{
|
//time up
|
// qDebug("if_steady = %d",if_steady);
|
quint32 m_sum =60*fboData.m_TestTime.hour
|
+ fboData.m_TestTime.minute;
|
if(((!(localData.RLY_OK&(JT_VALUE))) || (!IF_J9Close))&&JT_VALUE)//紧急停止按钮按下
|
{
|
StopTesting(ERRORSTOP);
|
sendMgBox(ERRORSTOP);
|
return;
|
}
|
else if((localData.RLY_OK & TKQ_VALUE)//脱扣器F1检测
|
||((localData.RLY_OK & IGBT_VALUE)&& (fboData.SumVoltage>F0VOL)))//F0检测
|
{
|
StopTesting(WPCURRENTERROR);
|
sendMgBox(WPCURRENTERROR);
|
return;
|
}
|
//comm error
|
else if(localData.SoftVersion==0)
|
{
|
StopTesting(WPCONNECTERROR);
|
sendMgBox(WPCONNECTERROR);
|
return;
|
}
|
//风扇
|
else if((localData.RLY_OK&FAN_VALUE)&&FAN_VALUE)
|
{
|
StopTesting(WPFANERROR);
|
sendMgBox(WPFANERROR);
|
return;
|
}
|
else if(m_sum >= testParam.preset_time)
|
{
|
StopTesting(WPTIMESTOP);
|
sendMgBox(WPTIMESTOP);
|
return;
|
}
|
//cap
|
else if(fboData.AllCap >= testParam.preset_cap)
|
{
|
StopTesting(WPCAPSTOP);
|
sendMgBox(WPCAPSTOP);
|
return;
|
}
|
//groupvol low
|
else if(fboData.SumVoltage <= testParam.group_lower)
|
{
|
if((!IF_J9Close || !(localData.RLY_OK&(JT_VALUE)))&&JT_VALUE){
|
StopTesting(ERRORSTOP);
|
sendMgBox(ERRORSTOP);
|
}
|
else{
|
StopTesting(WPSVLLSTOP);
|
sendMgBox(WPSVLLSTOP);
|
}
|
return;
|
}
|
//monomer low
|
else if(getMonomerLowCount() >= testParam.lower_number && testParam.mon_number!=0)
|
{
|
if(MONOMER_LOW_PAUSE == sysParam.monomerlow_act)
|
{
|
SuspendTesting(WPMVLLSTOP);
|
}
|
else
|
{
|
StopTesting(WPMVLLSTOP);
|
sendMgBox(WPMVLLSTOP);
|
}
|
return;
|
}
|
//temp too high
|
else if(localData.AlarmState > 0)
|
{
|
StopTesting(WPTEMPHIGHSTOP);
|
sendMgBox(WPTEMPHIGHSTOP);
|
return;
|
}
|
//current error
|
else if(localData.PWM1_Value>100 && localData.InnerCurrVal<30 && if_steady>15)//没电流
|
{
|
StopTesting(WPCURRENTERROR);
|
sendMgBox(WPCURRENTERROR);
|
return;
|
}
|
else if(localData.PWM1_Value<=PWMValueMin && localData.InnerCurrVal>=work_preset_cur+100 && if_steady>30 && !TYPE_FBI_20240)//电流失控且大于设定电流10A
|
{
|
//qDebug("PWM1_Value =%d InnerCurrVal=%d work_preset_cur=%d if_steady=%d",localData.PWM1_Value,localData.InnerCurrVal,work_preset_cur,if_steady);
|
bool res = true;//无固定负载
|
// qDebug("PowerCtrl = %x %d %d %d %d %d",PowerCtrl,PowerCtrl & GDFZ_1,PowerCtrl & GDFZ_2,PowerCtrl & GDFZ_3,PowerCtrl & GDFZ_4,PowerCtrl & GDFZ_5);
|
if(GDFZ_1){
|
if(!(PowerCtrl & GDFZ_1))
|
res = false;
|
}
|
if(GDFZ_2 && res){
|
if(!(PowerCtrl & GDFZ_2))
|
res = false;
|
}
|
if(GDFZ_3 && res){
|
if(!(PowerCtrl & GDFZ_3))
|
res = false;
|
}
|
if(GDFZ_4 && res){
|
if(!(PowerCtrl & GDFZ_4))
|
res = false;
|
}
|
if(GDFZ_5 && res){
|
if(!(PowerCtrl & GDFZ_5))
|
res = false;
|
}
|
if(res){
|
StopTesting(WPCURRENTERROR);
|
sendMgBox(WPCURRENTERROR);
|
}
|
return;
|
}
|
else if(localData.PWM1_Value<=PWMValueMin && localData.InnerCurrVal>=work_preset_cur+300 && if_steady>30 && TYPE_FBI_20240)//电流失控且大于设定电流10A 230222调整为30A
|
{
|
//qDebug("PWM1_Value =%d InnerCurrVal=%d work_preset_cur=%d if_steady=%d",localData.PWM1_Value,localData.InnerCurrVal,work_preset_cur,if_steady);
|
bool res = true;//无固定负载
|
// qDebug("PowerCtrl = %x %d %d %d %d %d",PowerCtrl,PowerCtrl & GDFZ_1,PowerCtrl & GDFZ_2,PowerCtrl & GDFZ_3,PowerCtrl & GDFZ_4,PowerCtrl & GDFZ_5);
|
if(GDFZ_1){
|
if(!(PowerCtrl & GDFZ_1))
|
res = false;
|
}
|
if(GDFZ_2 && res){
|
if(!(PowerCtrl & GDFZ_2))
|
res = false;
|
}
|
if(GDFZ_3 && res){
|
if(!(PowerCtrl & GDFZ_3))
|
res = false;
|
}
|
if(GDFZ_4 && res){
|
if(!(PowerCtrl & GDFZ_4))
|
res = false;
|
}
|
if(GDFZ_5 && res){
|
if(!(PowerCtrl & GDFZ_5))
|
res = false;
|
}
|
if(res){
|
StopTesting(WPCURRENTERROR);
|
sendMgBox(WPCURRENTERROR);
|
}
|
return;
|
}
|
//---------------------------------------------------------
|
//---------------------------------------------------------
|
if(localData.OnlineVol < testParam.onlinevol_lowlimit
|
&& testParam.test_mode == ONline_working
|
&& sysState.OnlineVollow == 0)
|
{
|
sysState.OnlineVollow = 1;
|
localData.WPAlarmState = WPPOWERBREAKSTOP;//
|
if(testParam.acstop_op == ACOFF_STOP)//暂停功率
|
{
|
CloseDischargePower(Paused_Dischg);
|
}
|
}
|
else if(localData.OnlineVol > testParam.onlinevol_lowlimit
|
&& testParam.test_mode == ONline_working
|
&& sysState.OnlineVollow == 1)
|
{
|
sysState.OnlineVollow = 0;
|
localData.WPAlarmState = WPDISCHARGING;
|
if(testParam.acstop_op == ACOFF_STOP)//暂停功率
|
{
|
OpenDischargePower();//重启功率
|
}
|
}
|
//----------------------------------------------------------
|
//----------------------------------------------------------
|
}
|
|
void Work_Thread::CheckIfStop_Dispause(void)
|
{
|
//time up
|
// qDebug("if_steady = %d",if_steady);
|
if(((!(localData.RLY_OK&(JT_VALUE))) || (!IF_J9Close))&&JT_VALUE)//紧急停止按钮按下
|
{
|
StopTesting(ERRORSTOP);
|
sendMgBox(ERRORSTOP);
|
return;
|
}
|
else if((localData.RLY_OK & TKQ_VALUE)//脱扣器F1检测
|
||((localData.RLY_OK & IGBT_VALUE)&& (fboData.SumVoltage>F0VOL)))//F0检测
|
{
|
StopTesting(WPCURRENTERROR);
|
sendMgBox(WPCURRENTERROR);
|
return;
|
}
|
//comm error
|
else if(localData.SoftVersion==0)
|
{
|
StopTesting(WPCONNECTERROR);
|
sendMgBox(WPCONNECTERROR);
|
return;
|
}
|
//temp too high
|
else if(localData.AlarmState > 0)
|
{
|
StopTesting(WPTEMPHIGHSTOP);
|
sendMgBox(WPTEMPHIGHSTOP);
|
return;
|
}
|
}
|
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::CheckIconState(void)
|
{
|
iconState.monomerState = CheckMonomerExist();
|
iconState.usbState = CheckDiskState(usbDir);
|
iconState.wifiState = localData.tcp_ctrl.Enter_ctrl;
|
//iconState.sdState = CheckDiskState(dataDir);
|
|
}
|
|
bool Work_Thread::CheckMonomerExist(void)
|
{
|
for(int i=0;i<fboData.BattSum;i++)
|
{
|
qint16 mon_vol = ClassXML::getMonomerVol(mon_source,fboData.SingleVol[i]);
|
if(mon_vol != 0)
|
return true;
|
}
|
return false;
|
}
|
|
bool Work_Thread::CheckDiskState(const QString &disk)
|
{
|
static quint16 usbDetectTime = 0;
|
struct statfs st;
|
statfs(disk.toLocal8Bit().data(), &st);
|
if(19780 == st.f_type)
|
{
|
usbDetectTime = 0;
|
return true;
|
}
|
else
|
{
|
//*******************************************
|
QFile file(usbDetectedFile);
|
|
if(file.exists())
|
{
|
if(usbDetectTime < 200)
|
usbDetectTime++;
|
|
if(usbDetectTime==10) //5S
|
system("echo 1 > /sys/bus/usb/devices/1-1.2/bConfigurationValue");
|
else if(usbDetectTime==50) //25S
|
system("echo 1 > /sys/bus/usb/devices/1-1.2/bConfigurationValue");
|
}
|
else
|
{
|
usbDetectTime = 0;
|
}
|
//********************************************
|
return false;
|
}
|
}
|
|
void Work_Thread::RecvMonAddrandFre(int type,quint16 index,quint16 value)
|
{
|
int res = 0;
|
quint16 tmpdata[2] = {0};
|
if(mon_use_type == 1)
|
{
|
if(type == 0)//修改地址
|
{
|
res = nrf905module->SingleWriteModuleEx(NRegAddr_SetMonAddrNew,index,value,0,300);
|
}
|
else if(type == 1)//修改频率
|
{
|
res = nrf905module->SingleWriteModuleEx(NRegAddr_SetMonomerFreq,index,value,0,300);
|
qDebug("res = %d",res);
|
}
|
else//修改工作频率
|
{
|
msleep(500);
|
res = nrf905module->SingleWriteModule(NRegAddr_SetWorkFreq,value,300);
|
|
// if(res == 0)
|
{
|
nrf905module->IF_MONCLEAR = 1;
|
sysParam.monomer_fre = value;
|
qDebug("sysParam.monomer_fre111 = %d",sysParam.monomer_fre);
|
ClassXML::ModifySysParamXml(sysParam);
|
}
|
}
|
}
|
else if(mon_use_type == 2)
|
{
|
if(type == 0)//修改地址
|
{
|
res = lora->setmoduleaddr(index,value);
|
}
|
else if(type == 1)//修改频率
|
{
|
res = lora->setmodulefre(index,value);
|
}
|
else//修改工作频率
|
{
|
msleep(500);
|
res = lora->setWorkFre(value);
|
|
// if(res == 0)
|
{
|
sysParam.monomer_fre = value;
|
ClassXML::ModifySysParamXml(sysParam);
|
}
|
}
|
}
|
else
|
{
|
if(type == 0)//修改地址
|
{
|
// rs485_base->SetIOCmdAdj(RegAddr_SetMonNowAddr,index,value);
|
// res = rs485_base->WaitForCmdState();
|
tmpdata[0] = index;
|
tmpdata[1] = value;
|
res = rs485->MultiWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonNowAddr,tmpdata,2);
|
}
|
else if(type == 1)//修改频率
|
{
|
// rs485_base->SetIOCmdAdj(RegAddr_SetMonNowFre,index,value);
|
// res = rs485_base->WaitForCmdState();
|
|
tmpdata[0] = index;
|
tmpdata[1] = value;
|
res = rs485->MultiWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonNowFre,tmpdata,2);
|
}
|
else//修改工作频率
|
{
|
res = rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonomerFre,value,1000);
|
if(res == 0)
|
{
|
sysParam.monomer_fre = value;
|
//qDebug("sysParam.monomer_fre = %d",sysParam.monomer_fre);
|
ClassXML::ModifySysParamXml(sysParam);
|
rs485->IF_MONCLEAR = 1;
|
}
|
}
|
//qDebug("type=%d,res=%d,index=%d,value=%d",type,res,index,value);
|
}
|
|
emit sendAddrFreResult(type,res);
|
}
|
|
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::PauseWorkThread(void)
|
{
|
WORK_RUN_EN = false;
|
}
|
|
void Work_Thread::StartWorkThread(void)
|
{
|
WORK_RUN_EN = true;
|
}
|
|
CT_DATE_TIME Work_Thread::getTestFileTime()
|
{
|
return testStartTime;
|
}
|
|
void Work_Thread::RecvInterface(int inter)
|
{
|
emit SentInterface(inter);
|
}
|
|
void Work_Thread::IF_USEloader(bool en)
|
{
|
if(en)
|
{
|
PowerCtrl &= (~CONTROL_BJ);//闭合
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
else
|
{
|
PowerCtrl |= CONTROL_BJ;//断开
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
}
|
|
void Work_Thread::ReadIOParam(void)
|
{
|
if(localData.SoftVersion == 0)
|
return;
|
if(MaxCur == 0 || MaxPOWER == 0){
|
quint16 tmpdata[6] = {0};
|
if (0 == rs485->ReadFromIOModule(rs485->DeviceAddr,RegAddr_SetInnerCurrRange, 5, tmpdata))
|
{
|
MaxCur = Swap16(tmpdata[2]);
|
if(PageType == FBI48CT){
|
if(Swap16(tmpdata[4])!=2){
|
Check_Mashine_Type = true;
|
}
|
}
|
}
|
if (0 == rs485->ReadFromIOModule(rs485->DeviceAddr,RegAddr_SetMashinePower, 1, &tmpdata[5]))
|
{
|
MaxPOWER = Swap16(tmpdata[5]);
|
}
|
if(TKQ_VALUE)
|
tmpdata[0] = 1;
|
else
|
tmpdata[0] = 0;
|
rs485->MultiWriteIOModule( rs485->DeviceAddr,RegAddr_SetMashineTKQ, tmpdata, 1);
|
|
quint16 tmpdata1[6];
|
tmpdata1[0] = work_preset_cur;
|
tmpdata1[1] = testParam.group_number;
|
tmpdata1[2] = testParam.mon_number;
|
tmpdata1[3] = sysParam.monomer_order;
|
tmpdata1[4] = testParam.charge_limit; //充电限流无小数点
|
tmpdata1[5] = testParam.booster_ceiling;
|
if(mon_use_type == 0){
|
rs485->SetMonomerNum(fboData.BattSum);
|
rs485->MultiWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, tmpdata1, 4);
|
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetMonomerFre,sysParam.monomer_fre,1000);
|
rs485->IF_MONCLEAR = 1;
|
}
|
}
|
#if PageType == FBI48CT
|
quint16 tmpdata[7] = {0};
|
if (0 == rs485->ReadFromIOModule(rs485->DeviceAddr,RegAddr_SetInnerCurrRange, 6, tmpdata))
|
{
|
DCDC_count = Swap16(tmpdata[3]);
|
}
|
else
|
DCDC_count = 0;
|
#endif
|
}
|
|
void Work_Thread::Set905Param(void)
|
{
|
if(mon_use_type == 1 && !IF_SET905ok){
|
if(nrf905module->SingleWriteModule(NRegAddr_SetWorkFreq,sysParam.monomer_fre,300)==0){
|
nrf905module->IF_MONCLEAR = 1;
|
IF_SET905ok = true;
|
}
|
}
|
}
|
|
bool Work_Thread::CheckFain(void)
|
{
|
if(PowerCtrl & CTRL_WIND)
|
{
|
return false;
|
}
|
|
return true;
|
}
|
|
void Work_Thread::run()
|
{
|
WORK_RUN_EN = true;
|
int ratectrl = 0;
|
int timecount = 0;
|
int jtcount = 0;
|
|
while(true == WORK_RUN_EN)
|
{
|
if(mon_use_type==2)
|
{
|
if(mon_source == MONO_TYPE_WIRED)//单体来源:有线单体
|
{
|
quint16 battVolData[MONOMER_NUM_MAX];
|
rs485wired->GetBattVolData(battVolData);
|
int monall = testParam.group_number*testParam.mon_number;
|
memcpy(fboData.SingleVol,battVolData, monall*sizeof(quint16));
|
AnalyseRecvData();
|
}
|
else
|
{
|
quint16 battVolData[MONOMER_NUM_MAX];
|
lora->GetBattVolData(battVolData);
|
int monall = testParam.group_number*testParam.mon_number;
|
memcpy(fboData.SingleVol,battVolData, monall*sizeof(quint16));
|
AnalyseRecvData();
|
}
|
}
|
|
if(sysState.SaveDataEN)
|
{
|
sysState.SaveDataEN = false;
|
ClassXML::SaveFBO_Data(testFileName,fboData);
|
}
|
if(localData.SysWorkState == Discharging)
|
{
|
if(if_steady>5)
|
CheckIfStop();
|
|
timecount = 0;
|
|
if(/*(testParam.test_mode == OFFline_working)&&*/(testParam.discharge_mode != DISCHARGE_CURRENT)&&(ratectrl%3 == 0))
|
{
|
quint16 tmp = testParam.preset_power*1000*10/localData.GroupVol;
|
if(qAbs(work_preset_cur-tmp)>10){
|
work_preset_cur = tmp;
|
//qDebug("preset_power = %d GroupVol = %d work_preset_cur = %d",testParam.preset_power,localData.GroupVol,work_preset_cur);
|
rs485->SingleWriteIOModule( rs485->DeviceAddr,RegAddr_SetCurrent, work_preset_cur, 300);
|
}
|
}
|
|
if(ratectrl >=6)
|
{
|
ratectrl = 0;
|
#if TYPE_IDCE_1230 || TYPE_IDCE_2210 || TYPE_IDCE_2220
|
ControlDisCurGDTQ_ONE(work_preset_cur);
|
#elif TYPE_IDCE_4815MINI || TYPE_IDCE_4815 || TYPE_FBO_4815 || TYPE_IDCE_2230
|
ControlDisCurGDTQ_TWO(work_preset_cur);
|
#elif TYPE_IDCE_4830 || TYPE_FBO_4830
|
ControlDisCurGDTQ_THREE(work_preset_cur);
|
#elif TYPE_FBO_4850 || TYPE_IDCE_4850
|
ControlDisCurGDTQ_FIVE(work_preset_cur);
|
#endif
|
if(sysParam.loader_plusEn && CONTROL_BJ)//并机功能启用
|
{
|
ControlDisCur();
|
}
|
}
|
else
|
ratectrl++;
|
}
|
else if(localData.SysWorkState == Paused_Dischg){
|
CheckIfStop_Dispause();
|
}
|
else if(localData.SysWorkState == Charging)
|
{
|
CheckChargeAlarm();
|
if(localData.WPAlarmState != CPNullCharging){
|
if(CONTROL_ZC){
|
if(TYPE_FBO_4815)
|
CPControlChargeCurrent4815();
|
else if(TYPE_FBO_4830||TYPE_FBO_4850)
|
CPControlChargeCurrent4830();
|
else if(TYPE_FBI_10480)
|
CPControlChargeCurrent10480();
|
else if(TYPE_FBO_2415)
|
CPControlChargeCurrent2415();
|
else if(TYPE_FBI_20240)
|
CPControlChargeCurrent10480_240V();
|
}
|
if(TYPE_FBO_60010)
|
ControlChargeCurrent60010();
|
timecount = 0;
|
}
|
else {//充电监测关风扇
|
if((~PowerCtrl) & CTRL_WIND)
|
{
|
PowerCtrl |= CTRL_WIND;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,300);
|
}
|
}
|
}
|
else if(localData.SysWorkState == Paused_charge){
|
CheckChargeAlarm_Pause();
|
}
|
else if(Adj_TestState == 1)
|
{
|
// qDebug("work_preset_cur = %d",AdjCurParam);
|
// qDebug("PowerCtrl = %x",PowerCtrl);
|
// qDebug("localData.PWM1_Value = %d",localData.PWM1_Value);
|
if(ratectrl >=6)
|
{
|
ratectrl = 0;
|
#if TYPE_IDCE_1230 || TYPE_IDCE_2210 || TYPE_IDCE_2220
|
ControlDisCurGDTQ_ONE(work_preset_cur);
|
#elif TYPE_IDCE_4815MINI || TYPE_IDCE_4815 || TYPE_FBO_4815 || TYPE_IDCE_2230
|
ControlDisCurGDTQ_TWO(work_preset_cur);
|
#elif TYPE_IDCE_4830 || TYPE_FBO_4830
|
ControlDisCurGDTQ_THREE(work_preset_cur);
|
#elif TYPE_FBO_4850 || TYPE_IDCE_4850
|
ControlDisCurGDTQ_FIVE(work_preset_cur);
|
#endif
|
}
|
else
|
ratectrl++;
|
|
|
timecount = 0;
|
}
|
else if(Adj_TestState == 2)
|
{
|
if(sysState.OverChargeTime < 35)
|
sysState.OverChargeTime++;
|
//if(localData.WPAlarmState != CPNullCharging){
|
CheckChargeAlarm();
|
if(CONTROL_ZC){
|
if(TYPE_FBO_4815)
|
CPControlChargeCurrent4815();
|
else if(TYPE_FBO_4830 || TYPE_FBO_4850)
|
CPControlChargeCurrent4830();
|
else if(TYPE_FBI_10480)
|
CPControlAdj10480();
|
else if(TYPE_FBO_2415)
|
CPControlChargeCurrent2415();
|
else if(TYPE_FBI_20240)
|
CPControlAdj10480_240V();
|
}
|
if(TYPE_FBO_60010)
|
ControlChargeCurrent60010();
|
timecount = 0;
|
//}
|
}
|
else if(localData.SysWorkState == WorkStopped && IF_CloseFan)
|
{
|
if((~PowerCtrl) & CTRL_WIND)
|
{
|
if(timecount < 5000)
|
timecount++;
|
|
if(timecount>=180 && localData.InnerCurrVal<30)//180 90s 600 5min
|
{
|
timecount = 0;
|
PowerCtrl |= CTRL_WIND;
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200);
|
}
|
}
|
}
|
|
CheckIconState();
|
ReadIOParam();
|
Set905Param();
|
|
APP_check();
|
|
mon_source_distinguish();
|
|
if(JT_VALUE){
|
if(jtcount > 10)
|
{
|
if((!(localData.RLY_OK&(JT_VALUE)))&&IF_J9Close)//紧急停止按钮按下
|
{
|
IF_J9Close = false;
|
}
|
}
|
else
|
{
|
jtcount++;
|
}
|
}
|
msleep(500);
|
}
|
}
|
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------
|
void Work_Thread::SaveContinueFile(){
|
CHECK_DATA check_data;
|
check_data.testfilename = testFileName;
|
check_data.workstate = localData.SysWorkState;
|
check_data.alarmstate = localData.WPAlarmState;
|
check_data.PowerCtrl = PowerCtrl;
|
check_data.CapPS = sysState.CapPS;
|
for(int i=0;i<4;i++)
|
check_data.SubCapPS[i] = sysState.SubCapPS[i];
|
Check_Obj::MTest_Data(check_data,true);
|
}
|
|
void Work_Thread::APP_check(){/*run里调用*/
|
if(IF_RESTART){
|
if((check_count++)>120){//60s 120*500ms
|
check_count = 0;
|
WORK_RUN_EN = false;
|
QString app_restart = "/app/restart_app.sh";
|
system(app_restart.toLocal8Bit());
|
}
|
}
|
}
|
|
void Work_Thread::continuetest(CHECK_DATA check_data, FBO_DATA fbo_data){
|
testFileName = check_data.testfilename;
|
memcpy(&fboData,&fbo_data,sizeof(FBO_DATA));
|
fboData.SumCurrent = 0; //set curr=0
|
localData.TestType = sysState.TestType = fbo_data.m_DataType.TypeTag0;
|
localData.SysWorkState = check_data.workstate;
|
localData.WPAlarmState = check_data.alarmstate;
|
// qDebug()<<"Work_Thread-continuetest localData.SysWorkState="<<localData.SysWorkState<<";localData.WPAlarmState="<<localData.WPAlarmState;
|
sysState.CapPS = check_data.CapPS;
|
for(quint8 n=0; n<4; n++)
|
{
|
sysState.SubCapPS[n] = check_data.SubCapPS[n];
|
}
|
if(check_data.workstate == Discharging){
|
if(localData.Work_State == 0)
|
ResumeTestingFrom();
|
else{
|
fboData.m_TestTime.minute++;
|
if(fboData.m_TestTime.minute>=59){
|
fboData.m_TestTime.minute = 0;
|
fboData.m_TestTime.hour++;
|
}
|
|
sysState.CapPS += fbo_data.SumCurrent*60;
|
if(sysState.CapPS >= 36000)//电流扩大了10倍
|
{
|
sysState.CapPS -= 36000;
|
fboData.AllCap++; //--"安时数"加1
|
}
|
for(quint8 n=0; n<4; n++)
|
{
|
sysState.SubCapPS[n] += 60*fbo_data.SubCurrent[n];
|
if(sysState.SubCapPS[n] >= 36000)//电流扩大了10倍
|
{
|
sysState.SubCapPS[n] -= 36000;
|
fboData.SubCap[n]++; //--"安时数"加1
|
}
|
}
|
sysState.SaveDataEN = true;
|
}
|
// control_relay(localData.GroupVol);
|
if_steady = 0;
|
sysState.OnlineVollow = 0;
|
timer_1s->start();
|
}
|
else if(check_data.workstate == Paused_Dischg){
|
timer_1s->stop();
|
//delayupdate = 0;
|
}
|
else if(check_data.workstate == Charging){
|
if(localData.Work_State == 0){
|
if(check_data.alarmstate == CPNullCharging)//充电监测
|
ResumeChargeFrom(CPNullCharging);
|
else
|
ResumeChargeFrom(CPSmallCharging);
|
}
|
if_steady = 0;
|
sysState.OverChargeTime = 0;
|
sysState.OnlineVollow = 0;
|
timer_1s->start();
|
}
|
else if(check_data.workstate == Paused_charge){
|
timer_1s->stop();
|
}
|
}
|
|
void Work_Thread::set_app_checkcount(){
|
check_count=0;
|
}
|
|
void Work_Thread::setPowerCtrl(quint16 value){
|
PowerCtrl = value;
|
}
|
|
void Work_Thread::WriteEndFile(QString filename, FBO_DATA fdata){
|
FBO_DATA_HEAD_STOP fbo_data_head_stop;
|
fbo_data_head_stop.TestTimeLong = fdata.m_TestTime;
|
fbo_data_head_stop.StopType = 255;//未知停止
|
fbo_data_head_stop.BlockSum = 1;
|
fbo_data_head_stop.StandBy = 0;
|
fbo_data_head_stop.TestCap = fdata.AllCap;
|
for(quint8 g=0;g<4;g++)
|
{
|
fbo_data_head_stop.SMaxIndex[g] = 0;
|
fbo_data_head_stop.SMinIndex[g] = 0;
|
fbo_data_head_stop.SMaxVol[g] = 0;
|
fbo_data_head_stop.SMinVol[g] = 0;
|
}
|
|
ClassXML::CloseFBO_Data(filename,fbo_data_head_stop);
|
}
|
|
void Work_Thread::delay_ms(quint16 time){
|
msleep(time);
|
}
|
|
void Work_Thread::set_ifinit(bool value){
|
if_need_init = value;
|
}
|
|
void Work_Thread::setIOboardState(){
|
rs485->SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetRUN_State,1,300);
|
}
|
|
bool Work_Thread::adj_mon_vol(int cmd, int num, int num2){
|
/*
|
*cmd为指令,num为模块地址,num2为校准值
|
*/
|
bool res = false;
|
if(cmd == CMD_SetADJOffSet){
|
res = lora->adjmon_offset(num,num2);
|
}
|
else if(cmd == CMD_SetADJSlope){
|
res = lora->adjmon_slope(num,num2);
|
}
|
return res;
|
}
|
|
void Work_Thread::set_readmode(int mode){
|
lora->set_readmode(mode);
|
}
|
|
void Work_Thread::set_addrsingle(int addr){
|
lora->set_addrsingle(addr);
|
}
|
|
QString Work_Thread::get_loraversion(){
|
return lora->get_version();
|
}
|
|
void Work_Thread::getmodulevol(void *data){
|
int module0vol[4];
|
lora->getmodulevol(module0vol);
|
memcpy(data,module0vol,sizeof(module0vol));
|
}
|
|
void Work_Thread::GetBattVolData(void *data)
|
{
|
quint16 battVolData[MONOMER_NUM_MAX];
|
if(mon_source == MONO_TYPE_WIRED){
|
rs485wired->GetBattVolData(battVolData);
|
memcpy(data,battVolData,sizeof(battVolData));
|
}
|
else {
|
if(mon_use_type==2){
|
lora->GetBattVolData(battVolData);
|
memcpy(data,battVolData,sizeof(battVolData));
|
}else{
|
memcpy(data,fboData.SingleVol,MONOMER_NUM_MAX*sizeof(quint16));
|
}
|
}
|
}
|
|
quint8 Work_Thread::get_DCDC_count()
|
{
|
return DCDC_count;
|
}
|
|
quint8 Work_Thread::get_mon_source()
|
{
|
return mon_source;
|
}
|
|
void Work_Thread::mon_source_distinguish()
|
{
|
static bool _distinguish = false;
|
if(_distinguish==false)
|
{
|
if(rs485wired->if_com_normal())
|
{
|
_distinguish = true;
|
mon_source = MONO_TYPE_WIRED;
|
DATAVERSION = 0x05;
|
}
|
else
|
{
|
DATAVERSION = 0x02;
|
}
|
}
|
}
|