#include #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"); connect(rs485,SIGNAL(SendCommData(COMM_DATA)),this,SLOT(RecvCommData(COMM_DATA))); rs485->start(); nrf905module = new ModuleDrv(Module905Com); qRegisterMetaType("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 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;g100) { if(fboData.SubCurrent[g]>5) { if(fboData.SingleVol[battindex] 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;i5)) { fboData.SumVoltage = localData.GroupVol; } else { fboData.SumVoltage = temvol; } } fboData.SumCurrent = localData.InnerCurrVal+localData.ExterCurrVal; for(quint8 g=0;g 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_cursetWorkNum(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.SumVoltageSingleWriteIOModule(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:"<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:"<SingleWriteIOModule(rs485->DeviceAddr,RegAddr_SetIO_Ctrl,PowerCtrl,200); // qDebug()<<"OpenChargePower:CONTROL_CHR--PowerCtrl:"<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;i100) && */(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((current5)) { 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((current5)) { 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((current5)) { 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((current5)) { 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:"< 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:"< 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 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 /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="<=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; } } }