/// <summary> /// return id - последний записанный id /// (можно переносить новые id с таб. Model_dateTime в таб. Model_CycleDateTime /// </summary> private void YesRecords_CalcTransitionCmena(LoadCpu loadCpu, SqlContext db, long idMaxCycle) { var lastDateTime = db.model_dateTime.FirstOrDefault(oldDt => oldDt.Id_DateTime == idMaxCycle); if (lastDateTime == null) { // if nextDateTime = 7, 15, 23 hours there + 1 sec. long tempMaxCycle = idMaxCycle - 1; lastDateTime = db.model_dateTime.FirstOrDefault(oldDt => oldDt.Id_DateTime == tempMaxCycle); if (lastDateTime == null) { return; } } var next_DateTime = db.model_dateTime.FirstOrDefault(nextDt => nextDt.Id_DateTime > idMaxCycle); if (next_DateTime == null) { return; } // if nextDateTime = 7, 15, 23 hours there + 1 sec. next_DateTime.DateTime = protectingTransitionSmena(next_DateTime.DateTime); List <DateTime> downtimeArr = calcTransitionCmena(db, lastDateTime.DateTime, next_DateTime.DateTime); CalcDowntimeCmenaToSql(loadCpu, db, lastDateTime.Id_DateTime, next_DateTime.Id_DateTime, downtimeArr, true); }
// calc and insert DowntimeCmena to BD SQL private void CalcDowntimeCmenaToSql(LoadCpu loadCpu, SqlContext db, long lastId, long nextId, List <DateTime> downtimeArr, bool flagYesRecords) { for (int i = 1; i < downtimeArr.Count; i++) { if ((!flagYesRecords) && (i == downtimeArr.Count - 1)) { return; // ели нет последнего колеса, выход, не записывая первую запись } Model_CycleDateTime mCycleDateTime = new Model_CycleDateTime(); // признак простоя перехода смен foreach (var itemSmenPattern in transitionSmenPattern) { if ((downtimeArr[i].Hour == itemSmenPattern) && (downtimeArr[i].Second == 0) && (downtimeArr[i].Minute == 0)) { mCycleDateTime.FlagDownTimeSmena = true; break; } else { mCycleDateTime.FlagDownTimeSmena = false; } } mCycleDateTime.Id_DateTime = Convert.ToInt64( loadCpu.NormalIntToString(downtimeArr[i].Year) + loadCpu.NormalIntToString(downtimeArr[i].Month) + loadCpu.NormalIntToString(downtimeArr[i].Day) + loadCpu.NormalIntToString(downtimeArr[i].Hour) + loadCpu.NormalIntToString(downtimeArr[i].Minute) + loadCpu.NormalIntToString(downtimeArr[i].Second) ); //TODO проверка на дубликаты в БД var lastDateTime = db.model_CycleDateTime.FirstOrDefault(oldDt => oldDt.Id_DateTime == mCycleDateTime.Id_DateTime); if (lastDateTime != null) { // если Id существует в БД // ПРОВЕРКА НА ДУБЛИКАТЫ!!!!! continue; } mCycleDateTime.CycleTime = keyNull; mCycleDateTime.DownTime = keyNull; mCycleDateTime.Microsimple = false; db.model_CycleDateTime.Add(mCycleDateTime); //db.SaveChanges(); SaveChangesSql(db, mCycleDateTime.Id_Cycle, "CalcDowntimeCmenaToSql(SqlContext db, long lastId, long nextId, List<DateTime> downtimeArr, bool flagYesRecords)"); } }
/// <summary> /// 1. if MAX ID_wheel > MAX ID_cycle => OK (go to work) /// 2. if marker SMENA time => (go to work2) /// 3. /// </summary> public WorkCycleTable() { dateTimeDefoult = new DateTime(1985, 1, 1, 1, 1, 1); // datetime for error LoadCpu loadCpu = new LoadCpu(); string[] result = Properties.Settings.Default.shiftTransition.ToString().Split(','); foreach (var itemHour in result) { transitionSmenPattern.Add(Convert.ToInt32(itemHour)); // itemHour = 7,15,23 } WorkCycle(loadCpu); }
/// <summary> /// Makes the status, for a long time there was no connection with the CPU /// isNoConnectionTimeSec = false - No Connection /// </summary> private void NoConnectionTimeSec(LoadCpu loadCpu) { if (LoadCpu.statusConnCpu) { isNoConnectionTimeSec = false; } else { // no connection to CPU long differenceTime = Convert.ToInt64(DateTime.Now.Subtract(tempNoConnectionTimeSec).TotalSeconds); if (differenceTime >= noConnectionLimitTimeSec) { isNoConnectionTimeSec = true; } } }
private void WorkCycle(LoadCpu loadCpu) { while (true) { // STOP if (Form1.stopThreadAll) { return; } using (var db = new SqlContext()) { try { Thread.Sleep(Properties.Settings.Default.timerWorkCycle); long idLast_DateTime = CheckEqualityMaxId(db); WorkCpu.statusConnSql = true; switch (idLast_DateTime) { case -1: NoRecords_CalcTransitionCmena(loadCpu, db, idLast_DateTime); // return "-1" - (idDateTimeMax = idCycleMax) новых id нет для переноса, проверка на переход смен break; case -2: continue; // return "-2" - нет записей в таб. Model_dateTime (таб. пустая) case -3: NoMaxIdTableCycle_CalcTransitionCmena(db); // return "-3" - нет записей в таб. Model_CycleDateTime (таб. пустая) break; default: YesRecords_CalcTransitionCmena(loadCpu, db, idLast_DateTime); // return id - последний записанный id (можно переносить новые id с таб. Model_dateTime в таб. Model_CycleDateTime break; } } catch (Exception ex) { logger.Error(ex.Message, " WorkCycle()"); Thread.Sleep(Properties.Settings.Default.timerException); WorkCpu.statusConnSql = false; } } //System.Diagnostics.Debug.Print(++flagDebug + " ----- " + System.DateTime.Now + "\n"); CalcSaveDowntimeToSql(); } }
public SettingsForm() { InitializeComponent(); loadCpu = new LoadCpu(); cpuTypeComboBox.Text = GetCpuTypeConnect.GetStrCpuType(Properties.Settings.Default.CpuType); ipTypeTextBox.Text = Properties.Settings.Default.IpCpu; rackCpuTextBox.Text = Properties.Settings.Default.RackCpu.ToString(); slotCpuTextBox.Text = Properties.Settings.Default.SlotCpu.ToString(); timeSleepExceptionBox.Text = Properties.Settings.Default.timerException.ToString(); timerStandartCycleTextBox.Text = Properties.Settings.Default.timerStandartCycle.ToString(); timerMicroDowntimeTextBox.Text = Properties.Settings.Default.timerMicroDowntime.ToString(); dbLimitCpuTextBox.Text = Properties.Settings.Default.DataBlockLimit.ToString(); dbDatetimeCpuTextBox.Text = Properties.Settings.Default.DataBlockDatetime.ToString(); shiftTransitionTextBox.Text = Properties.Settings.Default.shiftTransition; new Thread(cycleWord).Start(); }
private void WriteDateTimeToSql(LoadCpu loadCpu, Model_dateTime modelDTBase, int newIndexDb) { using (SqlContext db = new SqlContext()) { statusConnSql = true; try { // check id for duplicates Model_dateTime myEntity = db.model_dateTime.FirstOrDefault(p => p.Id_DateTime == modelDTBase.Id_DateTime); if (myEntity == null) { // add to BD SQL -------------------------WRITE-----<-----<-----< db.model_dateTime.Add(modelDTBase); db.SaveChanges(); } loadCpu.WritePositionLimitsCpu(newIndexDb); // write PositionRead } catch (Exception ex) { Thread.Sleep(Properties.Settings.Default.timerException); try { // add to BD SQL -------------------------WRITE-----<-----<-----< db.model_dateTime.Add(modelDTBase); db.SaveChanges(); statusConnSql = true; } catch (Exception ex2) { logger.Error(ex2.Message, " --- WriteDateTimeToSql(Model_dateTime modelDTBase, int newIndexDb) --> no load MAX Id"); statusConnSql = false; } logger.Error(ex.Message, " --- WriteDateTimeToSql(Model_dateTime modelDTBase, int newIndexDb) --> no load MAX Id"); Thread.Sleep(Properties.Settings.Default.timerException); statusConnSql = false; } } }
private int LocationIndexDb(LoadCpu loadCpu, LimitsCpu limitsCpu) { // last index BD if (limitsCpu.PositionRead == limitsCpu.PositionMax) { if (limitsCpu.PositionRead != limitsCpu.PositionWrite) { limitsCpu.PositionRead = limitsCpu.PositionMin; return(limitsCpu.PositionMin); } else { return(limitsCpu.PositionRead); } } // not to do if (limitsCpu.PositionRead == limitsCpu.PositionWrite) { return(limitsCpu.PositionRead); // - addPositionIndex; } // ok if (limitsCpu.PositionRead >= limitsCpu.PositionMin - addPositionIndex) { if (CheckDateTimeCpu(loadCpu, limitsCpu)) { return(limitsCpu.PositionWrite + addPositionIndex); // idex > Write --> new value (will Write < Read) } else { return(limitsCpu.PositionRead + addPositionIndex); // (will Write > Read) } } else { // bad return(limitsCpu.PositionMin - addPositionIndex); } }
/// <summary> /// return "-1" - (idDateTimeMax = idCycleMax) /// новых id нет для переноса, проверка на переход смен /// </summary> /// <param name="db">пердаем SqlContext</param> /// <param name="idCycleMax">миксим. id а таб. Model_CycleDateTime</param> private void NoRecords_CalcTransitionCmena(LoadCpu loadCpu, SqlContext db, long idMaxCycle) { // PositionRead == PositionWrite ==> считаем простой; if ((!loadCpu.checkWriteReadEqually) && (isFirstNoRecords_CalcTransitionCmena)) { isFirstNoRecords_CalcTransitionCmena = true; return; } long idCycleMax = db.model_CycleDateTime.DefaultIfEmpty() .Where(p => p.FlagDownTimeSmena == false) .Max(p => p.Id_DateTime); Model_dateTime m_dateTime = db.model_dateTime.FirstOrDefault(idDb => idDb.Id_DateTime == idCycleMax); if (m_dateTime == null) { return; } List <DateTime> downtimeArr = calcTransitionCmena(db, m_dateTime.DateTime, DateTime.Now); CalcDowntimeCmenaToSql(loadCpu, db, idMaxCycle, idCycleMax, downtimeArr, false); // calc and insert DowntimeCmena to BD SQL }
public WorkCpu() { LoadCpu loadCpu = new LoadCpu(); while (true) { // STOP if (Form1.stopThreadAll) { return; } workCpuStatus = true; // Makes the status, for a long time there was no connection with the CPU NoConnectionTimeSec(loadCpu); // select limits--------------- LimitsCpu limitsCpu = loadCpu.ReadLimits(); if (limitsCpu == null) { continue; // error connect } if ((limitsCpu.PositionRead < limitsCpu.PositionMin) || (limitsCpu.PositionRead > limitsCpu.PositionMax)) { loadCpu.WritePositionLimitsCpu(limitsCpu.PositionMin); // write PositionRead continue; } //------------------------------ writeIndex = limitsCpu.PositionWrite; readIndex = limitsCpu.PositionRead; // new PositionRead + 1 int newIndexDb = LocationIndexDb(loadCpu, limitsCpu); // if there isn't data if (newIndexDb < limitsCpu.PositionMin) { FindMaxIdFromSql(); continue; } else { // loading data all CPU-------- Model_dateTime modelDTBase = loadCpu.ReadDatetime(newIndexDb); if (modelDTBase == null) { continue; // error connect } if (modelDTBase.Id_DateTime == -1) { loadCpu.WritePositionLimitsCpu(newIndexDb); // write PositionWrite (+1) continue; } //------------------------------ idMaxSql = modelDTBase.Id_DateTime; // save ID to static // ok <<< Write id and DateTime to SQL WriteDateTimeToSql(loadCpu, modelDTBase, newIndexDb); } if (Form1.stopThreadAll) { return; // STOP } Thread.Sleep(Properties.Settings.Default.timerWorkCycle); } }
/// <summary> /// Write перегнал Read (1 цикл) /// </summary> /// <returns> /// false - продолжать с Read (+2) /// true - продолжать с Write (+2) /// </returns> private bool CheckDateTimeCpu(LoadCpu loadCpu, LimitsCpu limitsCpu) { //---------------------------------------------------------------- // loading data all CPU var tempDtRead = loadCpu.ReadDatetime(limitsCpu.PositionRead); var tempDtWrite = loadCpu.ReadDatetime(limitsCpu.PositionWrite); if ((tempDtRead == null) || (tempDtWrite == null)) { return(false); } long dtRead = tempDtRead.Id_DateTime; long dtWrite = tempDtWrite.Id_DateTime; // no connections > 1 hour if ((!isNoConnectionTimeSec) && (dtRead < dtWrite)) { // after (перегнал) return(false); } //---------------------------------------------------------------- long dtdtReadAfterWrite; if ((limitsCpu.PositionWrite + addPositionIndex > limitsCpu.PositionMax) || (limitsCpu.PositionWrite < limitsCpu.PositionMin)) { var tempDtdtReadAfterWrite = loadCpu.ReadDatetime(limitsCpu.PositionMin); if (tempDtdtReadAfterWrite == null) { return(false); } else { dtdtReadAfterWrite = tempDtdtReadAfterWrite.Id_DateTime; } } else { var tempDtdtReadAfterWrite = loadCpu.ReadDatetime(limitsCpu.PositionWrite + addPositionIndex); if (tempDtdtReadAfterWrite == null) { return(false); } else { dtdtReadAfterWrite = tempDtdtReadAfterWrite.Id_DateTime; } } if (dtdtReadAfterWrite == 0) { // before return(false); } // no connections > 1 hour if (isNoConnectionTimeSec) { // after (перегнал) if ((dtRead < dtWrite) && (dtRead > dtdtReadAfterWrite)) { // true - Is present to SQL (dtdtReadAfterWrite) if (!IsCheckPresent(dtdtReadAfterWrite)) { return(true); } } } // before return(false); }