package com.dev.fbs9009;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.Iterator;
|
import java.util.List;
|
|
import com.base.Com;
|
import com.battdata_rt.BattData_RT;
|
import com.battdata_rt.BattData_RT_Array;
|
import com.config.AppConfig;
|
import com.config.AppParam;
|
import com.sql.MysqlConnPool;
|
|
public class MyModBusRecordDataThread2 extends Thread{
|
private MysqlConnPool mysql_pool;
|
private BattData_RT_Array DataArray;
|
private AppParam app_Param; //Èí¼þÉèÖõIJÎÊý
|
private List<RecordDataThread> recordThreads; //µ±Ç°ÕýÔÚÔËÐеļǼÀúÊ·Êý¾ÝµÄÏß³Ì
|
private long timeout = 60*60; //³¬Ê±Ê±³¤(1Сʱ)
|
|
public MyModBusRecordDataThread2(MysqlConnPool gB_MysqlConnPool, BattData_RT_Array gB_DataArray,
|
AppParam gB_App_Param) {
|
this.mysql_pool = gB_MysqlConnPool;
|
this.app_Param = gB_App_Param;
|
this.DataArray = gB_DataArray;
|
|
this.recordThreads = new ArrayList<RecordDataThread>();
|
}
|
|
|
@Override
|
public void run() {
|
MyModBusSocketThread_SQL.createTb_ld9testdata_inf(mysql_pool); //´´½¨ÀúÊ·Êý¾ÝµÄinf±í
|
System.out.println("MyModBusRecordDataThread Start at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
|
while(true){
|
try {
|
//ʶ±ðµ±Ç°ËùÓеÄÉ豸ÖÐÊÇ·ñ´æÔÚÕýÔÚºËÈݲâÊÔµÄÉ豸
|
for(int i=0;i<this.DataArray.getItemCount();i++){
|
MyModBusData ld9ModBusData = this.DataArray.getItem(i).myModBusData;
|
for(int j = 0;ld9ModBusData != null && j< ld9ModBusData.getDev_count();j++) {
|
int test_monnum = 0;
|
if((ld9ModBusData.getLd_sys()[j] != null)
|
&& (ld9ModBusData.getLd_sys()[j] != null)
|
&& (test_monnum = ld9ModBusData.getLd_sys()[j].getNowTestMonNum())>0
|
&& (ld9ModBusData.getLd_batt_states()[j].isDischarge())
|
&& (test_monnum == ld9ModBusData.getLd_batt_states()[j].getNowTestMonnum()) //Åжϵ±Ç°ÕýÔڷŵçµÄµ¥ÌåÊÇͬһ½Úʱ²Å¿ªÊ¼¼Ç¼Êý¾Ý£¨½â¾öÊý¾ÝÑÓ³Ùbug£©
|
){
|
|
test_monnum = 9*j+test_monnum; //µ±Ç°²âÊÔµÄµç³Ø×éµ¥Ìå±àºÅ
|
if(!isExistInDischage(recordThreads,this.DataArray.getItem(i),test_monnum) && !isTimeOut(ld9ModBusData.getThreadRunTime(), timeout)){
|
System.err.println(ld9ModBusData.getBattgroupid()+"ÕýÔÚ½øÐкËÈݲâÊÔ...." + test_monnum);
|
|
RecordDataThread thread = new RecordDataThread(mysql_pool,DataArray.getItem(i), app_Param,j);
|
recordThreads.add(thread);
|
thread.start();
|
}
|
}
|
}
|
}
|
sleep(500);
|
|
if(recordThreads.size() > 0) {
|
//ÒÆ³ýÒѾ¼Ç¼Íê³ÉµÄ·Åµç¼Ç¼Ïß³Ì
|
for(Iterator<RecordDataThread> it = recordThreads.iterator();it.hasNext();) {
|
RecordDataThread thread = it.next();
|
if(thread.thread_over) {
|
it.remove();
|
}
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
/*
|
* ÅжÏÊÇ·ñÒѾÔڼǼµ±Ç°ÕýÔڷŵçµÄµç³Ø×éÐÅÏ¢
|
*/
|
public boolean isExistInDischage(List<RecordDataThread> recordThread,BattData_RT rtdata,int test_monnum){
|
boolean flag = false;
|
for(int i=0;i<recordThread.size();i++){
|
if(recordThread.get(i).getBattData().BattGroupId == rtdata.BattGroupId
|
&& recordThread.get(i).thread_isRuning
|
&& recordThread.get(i).test_monnum == test_monnum
|
){
|
flag = true; //µ±Ç°µç³Ø×éµÄ·ÅµçÊý¾ÝÕýÔڼǼ
|
break;
|
}
|
}
|
return flag;
|
}
|
|
/**
|
* ÅжÏÖ¸¶¨Ê±¼ä¾àÀ뵱ǰʱ¼äÊÇ·ñ³¬Ê±
|
* @param time ÐèÒªÅжϵÄʱ¼ä
|
* @param timeout2 ³¬Ê±Ê±³¤(Ãë)
|
* @return
|
*/
|
public boolean isTimeOut(Date time,long timeout2){
|
Date now = new Date();
|
long timelong = Math.abs((now.getTime() - time.getTime())/1000);
|
if(timelong > timeout2){
|
return true;
|
}else{
|
return false;
|
}
|
}
|
|
//¼Ç¼ÀúÊ·Êý¾ÝÏß³Ì
|
class RecordDataThread extends Thread{
|
private boolean thread_isRuning = true;
|
private boolean thread_over = false;
|
public int test_monnum; //±»²âµç³Ø×éµ¥Ìå±àºÅ(1-9*n)
|
public int dev_index;
|
private BattData_RT battData;
|
private MysqlConnPool mysql_pool;
|
private AppParam app_Param;
|
|
public RecordDataThread(MysqlConnPool gB_MysqlConnPool, BattData_RT battData, AppParam gB_App_Param,int dev_index){
|
this.mysql_pool = gB_MysqlConnPool;
|
this.battData = battData;
|
this.app_Param = gB_App_Param;
|
this.dev_index = dev_index;
|
}
|
|
@Override
|
public void run() {
|
long SaveDataTimeInterval = app_Param.getSaveDataTimeInterval(AppParam.AppParam_Discharge); //»ñÈ¡±£´æÊý¾ÝµÄʱ¼ä¼ä¸ô
|
long minTestTime = app_Param.getTestTimeLongMinimum(AppParam.AppParam_Discharge); //»ñÈ¡±£´æÊý¾ÝµÄ×îÉÙʱ³¤
|
|
//´´½¨µ±Ç°µç³Ø×éµÄ²âÊԼǼ±í¸ñ _id±í
|
MyModBusSocketThread_SQL.createTb_ld9testdata(mysql_pool,battData.BattGroupId);
|
//´´½¨µ±Ç°µç³Ø×éµÄ²âÊԼǼ±í¸ñ stop_id±í
|
MyModBusSocketThread_SQL.createTb_ld9testdatastop(mysql_pool,battData.BattGroupId);
|
|
MyModBusData myModBusData = battData.myModBusData;
|
|
|
Date lasttime = new Date();
|
LD_sys_state sys_state = myModBusData.getLd_sys()[dev_index];
|
LD_batt_states batt_state = myModBusData.getLd_batt_states()[dev_index];
|
|
sys_state.setTest_starttime(lasttime);
|
sys_state.setNewRecord(true);
|
|
//int maxTestRecordCount = MyModBusSocketThread_SQL.searchMaxTestReCord(mysql_pool,battData.BattGroupId); //ÉèÖõ±Ç°²âÊԵIJâÊÔ±ÊÊý
|
LD_sys_state last_sys_state = MyModBusSocketThread_SQL.searchMaxTestRecordByBattGroupId(mysql_pool, battData.BattGroupId);
|
int test_record_count = 0;
|
sys_state.setTest_mon_num(sys_state.getNowTestMonNum());
|
this.test_monnum = 9*dev_index + sys_state.getNowTestMonNum();
|
if(last_sys_state != null){
|
//int mon_num = MyModBusSocketThread_SQL.searchMaxMonNum(mysql_pool,battData.BattGroupId,maxTestRecordCount);
|
//boolean isExist = MyModBusSocketThread_SQL.searchMonHasDischarge(mysql_pool,battData.BattGroupId,last_sys_state.getTest_record_count(),this.test_monnum);
|
|
boolean isMaxMon = MyModBusSocketThread_SQL.searchDeviceHasDischarge(mysql_pool,this,last_sys_state.getTest_record_count()); //¼ì²éµ±Ç°µç³Ø×é×îºóÒ»´Î²âÊÔµ±Ç°É豸ÊÇ·ñ´æÔÚµ±Ç°µ¥ÌåºóÃæµ¥ÌåµÄ·ÅµçÊý¾Ý
|
if(isMaxMon) {
|
test_record_count = last_sys_state.getTest_record_count() + 1;
|
}else {
|
if(Math.abs((double)(new Date().getTime() - last_sys_state.getRecord_historytime().getTime()))/1000 > 24*60*60) {
|
test_record_count = last_sys_state.getTest_record_count() + 1;
|
}else {
|
test_record_count = last_sys_state.getTest_record_count();
|
}
|
}
|
}else{
|
test_record_count = 1;
|
}
|
|
sys_state.setTest_record_count(test_record_count);
|
sys_state.setRecord_num(1); //ÉèÖ÷ŵç¼Ç¼±ÊÊý
|
|
while(thread_isRuning){
|
try {
|
if(isTimeOut(myModBusData.getThreadRunTime(), timeout) || sys_state.getRecord_num() > app_Param.getTestDataRecordCountMax(AppParam.AppParam_Discharge)){
|
//µ±Í¨Ñ¶³¬Ê±1Сʱ»òÕ߼ǼÊý¾Ý±ÊÊý³¬¹ýÖ¸¶¨±ÊÊýʱֹͣ¼Ç¼Êý¾Ý
|
myModBusData.getLd_batt_states()[dev_index].getLd_batts()[test_monnum-1].setStop_reason(0); //ÉèÖ÷ŵçÍ£Ö¹ÔÒò
|
thread_isRuning = false;
|
}
|
if(sys_state.isNewRecord()) {
|
sys_state.setRecord_num(1);;
|
}
|
Date nowDate = new Date();
|
long TimeInter = getTimeLong(lasttime,nowDate);
|
if(TimeInter >= SaveDataTimeInterval || sys_state.isNewRecord() || !batt_state.isDischarge()) {
|
lasttime = nowDate;
|
long testTimeLong = Math.abs(getTimeLong(sys_state.getTest_starttime(),nowDate));
|
sys_state.setTest_timelong(testTimeLong);
|
|
//if(sys_state.getNowTestMonNum()>0){ //µ±Ç°ÕýÔڷŵç
|
if(batt_state.isDischarge()){ //µ±Ç°ÕýÔڷŵç
|
int now_test_monnum = batt_state.getNowTestMonnum()+dev_index*9; //»ñÈ¡µ±Ç°µç³Ø×éÖзŵçµÄµ¥Ìå±àºÅ
|
|
//±»²âµÄµç³Ø×éµ¥Ìå±àºÅ¸Ä±ä
|
if(now_test_monnum != test_monnum){ //·ÅµçµÄµ¥Ìå·¢Éú±ä»¯Ê±
|
System.out.println(this.test_monnum+"---->"+now_test_monnum +"--->"+test_monnum+"·ÅµçµÄµ¥ÌåºÅ±ä»¯,½áÊø¼Ç¼");
|
thread_isRuning = false;
|
}
|
|
sys_state.setRecord_historytime(lasttime);
|
MyModBusSocketThread_SQL.insertOrUpdate(mysql_pool,battData,dev_index); //¸üвâÊÔµÄinf±íÖеÄÊý¾Ý
|
MyModBusSocketThread_SQL.insertOrUpdateMonData(mysql_pool,battData,dev_index); //¸üвâÊÔ_ID±íÖеÄÊý¾Ý
|
MyModBusSocketThread_SQL.insertOrUpdateMonStopData(mysql_pool,battData,dev_index); //¸üвâÊÔStop±íÖеÄÊý¾Ý
|
//System.out.println("¼Ç¼һ±ÈÊý¾Ý"+battData.record_num);
|
sys_state.setRecord_num(sys_state.getRecord_num()+1);;
|
}else {
|
System.out.println("·Åµç½áÊø");
|
thread_isRuning = false;
|
}
|
|
if(!thread_isRuning) {
|
System.out.println("battgroupid:"+battData.BattGroupId+"\ttest_monnum"+test_monnum+"·Åµç½áÊø,²¢¼Ç¼×îºóÒ»±ÈÊý¾ÝµÄÍ£Ö¹ÔÒò"+myModBusData.getLd_batt_states()[dev_index].getLd_batts()[sys_state.getTest_mon_num()-1].getStop_reason()); //¼ÌÐø¼Ç¼±¾´ÎµÄ×îºóÒ»±ÊÊý¾Ý
|
MyModBusSocketThread_SQL.updateStopReason(mysql_pool,battData,dev_index);
|
break;
|
}
|
}
|
sys_state.setNewRecord(false);
|
sleep(1000);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
thread_over = true;
|
}
|
|
/**
|
* »ñÈ¡Á½¸öʱ¼äÖ®¼äµÄʱ¼ä¼ä¸ô(Ãë)
|
* @param start
|
* @param end
|
* @return
|
*/
|
public long getTimeLong(Date start,Date end){
|
return Math.abs((end.getTime()-start.getTime())/1000);
|
}
|
|
public boolean isThread_isRuning() {
|
return thread_isRuning;
|
}
|
|
public void setThread_isRuning(boolean thread_isRuning) {
|
this.thread_isRuning = thread_isRuning;
|
}
|
|
public BattData_RT getBattData() {
|
return battData;
|
}
|
|
public void setBattData(BattData_RT battData) {
|
this.battData = battData;
|
}
|
|
public boolean isThread_over() {
|
return thread_over;
|
}
|
|
public void setThread_over(boolean thread_over) {
|
this.thread_over = thread_over;
|
}
|
}
|
|
}
|