private void DeviceThread(DataRow dr) { DateTime SrvDate; DateTime ddd; Boolean DeviceOK; Int16 archType_moment = 1; Int16 ncall = 0; Int16 nmaxcall = 5; Int16 minrepeat = 5; try { #region "init" ncall = Convert.ToInt16(dr["ncall"]); nmaxcall = Convert.ToInt16(dr["nmaxcall"]); minrepeat = Convert.ToInt16(dr["minrepeat"]); Int32 id_bdc; id_bdc = Convert.ToInt32(dr["id_bd"].ToString()); SrvDate = DateTime.Now; try { SrvDate = Convert.ToDateTime(dr["ServerDate"].ToString()); } catch { } { TvMain.ClearDuration(); if (TvMain.LockDevice(id_bdc, 60 * 40, false)) { if (TvMain.DeviceInit(id_bdc)) { DeviceOK = true; //TvMain.SaveLog(id_bdc,0,"??",1,"Инициализация транспортного уровня:OK"); } else { bool SkipErr = false; if (TvMain.TVD != null) { if (TvMain.TVD.Transport == 0) { if (TvMain.TVD.ComPort == "") { SkipErr = true; } if (TvMain.PortBusy) { SkipErr = true; } } } if (!SkipErr) { string tError = ""; try { tError = TvMain.ConnectStatus(); } catch (Exception) { tError = ""; } if (tError != "") { TvMain.WriteErrToDB(id_bdc, DateTime.Now, tError); TvMain.SaveLog(id_bdc, 0, "??", 1, tError); } else { if (TvMain.TVD != null) { if (TvMain.TVD.DriverTransport != null) { tError = TvMain.TVD.DriverTransport.GetError; } } TvMain.WriteErrToDB(id_bdc, DateTime.Now, "Ошибка транспорта. " + tError); TvMain.SaveLog(id_bdc, 0, "??", 1, "Ошибка транспорта. " + tError); } } DeviceOK = false; TvMain.UnLockDevice(id_bdc); TvMain.SaveLog(id_bdc, 0, "??", 1, "Снятие блокировки устройства"); } } else { TvMain.SaveLog(id_bdc, 0, "??", 1, "Тепловычислитель занят"); DeviceOK = false; } if (DeviceOK) { TvMain.connect(); if (TvMain.isConnected() == false) { string tError = ""; try { tError = TvMain.ConnectStatus(); } catch (Exception) { tError = ""; } if (tError != "") { TvMain.WriteErrToDB(id_bdc, DateTime.Now, tError); TvMain.SaveLog(id_bdc, 0, "??", 1, tError); } else { TvMain.WriteErrToDB(id_bdc, DateTime.Now, "Ошибка соединения. " + tError); TvMain.SaveLog(id_bdc, 0, "??", 1, "Ошибка соединения. " + tError); } if (ncall + 1 < nmaxcall) { TvMain.SetNCALLToPlanCall(id_bdc.ToString(), ncall + 1); TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlock", DateTime.Now); } else { TvMain.SetNCALLToPlanCall(id_bdc.ToString(), 0); ddd = SrvDate; try { ddd = Convert.ToDateTime(dr["dnextcurr"].ToString()); } catch (System.Exception ex) { InfoReport("Прибор ID= " + id_bdc.ToString() + " error converting dnextcurr :" + dr["dnextcurr"].ToString()); TvMain.SaveLog(id_bdc, 3, "??", 0, "Ошибка преобразования даты (dnextcurr) :" + dr["dnextcurr"].ToString() + " " + ex.Message); } while (ddd < SrvDate) { ddd = ddd.AddHours(1); } ddd = ddd.AddMinutes(-minrepeat); TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlock", ddd); } ErrorReport("Прибор ID " + dr["id_bd"].ToString() + " Counter initialization Error!"); DeviceOK = false; } else { TvMain.SaveLog(id_bdc, 0, "??", 1, "Соединение с тепловычислителем:OK"); } } #endregion "init" if (DeviceOK) { TvMain.SetNCALLToPlanCall(id_bdc.ToString(), 0); #region "moment" ddd = SrvDate; if (TvMain.TVD.IsConnected()) { InfoReport("Прибор ID= " + id_bdc.ToString() + " чтение текущих архивов на " + ddd.ToString()); try { if (TvMain.LockDevice(id_bdc, 400, true)) { TvMain.HoldLine(); String str; TvMain.ClearDuration(); str = TvMain.readmarch(); if (str.Length == 0) { TvMain.WriteErrToDB(id_bdc, SrvDate, "Ошибка чтения архива"); TvMain.SaveLog(id_bdc, archType_moment, "??", 1, "Ошибка чтения текущего архива"); } else { if (str.Substring(0, 6) != "Ошибка") { if (TvMain.TVD.isMArchToDBWrite) { TvMain.SaveLog(id_bdc, archType_moment, "??", 1, "Текущий архив" + ":OK"); TvMain.WritemArchToDB(); } //); TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnextcurr", SrvDate.AddMilliseconds(500)); } else { TvMain.WriteErrToDB(id_bdc, SrvDate, str); TvMain.SaveLog(id_bdc, archType_moment, "??", 1, "Ошибка чтения текущего архива " + str); TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnextcurr", SrvDate.AddMilliseconds(500)); } } //TvMain.UnLockDevice(id_bdc); } }//try catch (Exception Ex) { TvMain.WriteErrToDB(id_bdc, SrvDate, "Ошибка чтения архива:" + Ex.Message); ErrorReport("Прибор ID " + dr["id_bd"].ToString() + " read arch failed, " + Ex.Message); } }//if (ccurr) #endregion "moment" #region "commands" if (TvMain.TVD.IsConnected()) { InfoReport("Прибор ID= " + id_bdc.ToString() + " Отработка очереди комманд "); try { if (TvMain.LockDevice(id_bdc, 2000, true)) { TvMain.HoldLine(); TvMain.ClearDuration(); if (TvMain.TVD.ProcessComands() > 0) { TvMain.SaveLog(id_bdc, archType_moment, "??", 1, "Отработка очереди комманд: OK"); } } }//try catch (Exception Ex) { TvMain.SaveLog(id_bdc, archType_moment, "??", 1, "Отработка очереди комманд:" + Ex.Message); ErrorReport("Прибор ID " + dr["id_bd"].ToString() + " commands processing error, " + Ex.Message); } } #endregion TvMain.UnLockDevice(id_bdc); string transpname = ""; if (TvMain.TVD != null) { if (TvMain.TVD.Transport == 0) { transpname = TvMain.TVD.ComPort; } } TvMain.SaveLog(id_bdc, 0, "??", 1, "Закрытие канала. " + transpname); } else { ErrorReport("Прибор ID " + dr["id_bd"].ToString() + " transport initialization Error!"); } } } catch (System.Exception threadEx) { ErrorReport("Прибор ID " + dr["id_bd"].ToString() + " thread failed, " + threadEx.Message); } }
private void CallThr(object objct) { ThreadObj obj; obj = (ThreadObj)objct; DateTime SrvDate; Boolean DeviceOK; try { Int32 id_bdc; bool chour = false, ccurr = false, c24 = false, csum = false; id_bdc = Convert.ToInt32(obj.dr["id_bd"].ToString()); if (obj.dr["chour"].ToString() == "1") { chour = true; } if (obj.dr["ccurr"].ToString() == "1") { ccurr = true; } if (obj.dr["c24"].ToString() == "1") { c24 = true; } if (obj.dr["csum"].ToString() == "1") { csum = true; } SrvDate = DateTime.Now; try { SrvDate = Convert.ToDateTime(obj.dr["ServerDate"].ToString()); } catch { } if (chour || ccurr || c24 || csum) { lock (thisLock) { if (obj.TvMain.DeviceInit(id_bdc, NextPort + 1)) //NextPort + 1 { DeviceOK = true; NextPort = NextPort + 1; } else { DeviceOK = false; } } if (DeviceOK) { InfoReport("CounterID " + obj.dr["id_bd"].ToString() + " NPORT Device ready!"); InfoReport("CounterID " + obj.dr["id_bd"].ToString() + " MAP to port " + obj.TvMain.TVD.RetPortID); InfoReport("CounterID " + obj.dr["id_bd"].ToString() + " Driver " + obj.TvMain.TVD.CounterName()); obj.TvMain.connect(); DateTime ddd; ddd = SrvDate; try { ddd = Convert.ToDateTime(obj.dr["dnexthour"].ToString()); } catch { } if (chour && ddd <= SrvDate) { InfoReport("Thread " + id_bdc.ToString() + " read hour archive at " + SrvDate.ToString()); //DateTime dlasthour, nowhour,tempdate; DateTime tempdate; Int16 numhour; numhour = Convert.ToInt16("0" + obj.dr["numhour"].ToString()); if (ddd.AddHours(numhour) <= SrvDate.AddHours(1)) { //dlasthour = Convert.ToDateTime(obj.dr["dlasthour"].ToString()); tempdate = ddd; tempdate = tempdate.AddHours(-1); for (int j = 0; j <= numhour - 1; j++) { try { tempdate = tempdate.AddHours(1); //transaction = TvMain.dbconnect.BeginTransaction(IsolationLevel.ReadCommitted) String str; //TvMain.ClearDBarch(DateTimePickerAfter.Value, DateTimePickerBefor.Value, archType_hour, ListBox1.SelectedItem("ID_BD").ToString) //InfoReport("readarch"); str = obj.TvMain.readarch(archType_hour, tempdate.Year, tempdate.Month, tempdate.Day, tempdate.Hour); //InfoReport("readarch->" + str ); if (str.Length == 0) { //transaction.Rollback() WarningReport("CounterID: " + obj.dr["id_bd"].ToString() + " " + str + tempdate.ToString()); } else { if (str.Substring(1, 6) != "ќшибка") { obj.TvMain.ClearDBArchString(archType_hour, tempdate.Year, tempdate.Month, tempdate.Day, tempdate.Hour, id_bdc); InfoReport("CounterID " + id_bdc.ToString() + " -> " + obj.TvMain.WriteArchToDB()); } else { //transaction.Rollback() WarningReport("CounterID: " + obj.dr["id_bd"].ToString() + " " + str + tempdate.ToString()); } } } catch (Exception Ex) { //transaction.Rollback() ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " failed, " + Ex.Message); } }//for (int j = 0;j <= razn.Hours + razn.Days * 24;j++) obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnexthour", ddd.AddHours(numhour)); tempdate = new DateTime(ddd.Year, ddd.Month, ddd.Day, ddd.Hour, 0, 0); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlasthour", tempdate.AddSeconds(-1)); } else { //dlasthour = Convert.ToDateTime(obj.dr["dlasthour"].ToString()); tempdate = ddd; tempdate = tempdate.AddHours(1); for (int j = 0; j <= numhour - 1; j++) { try { tempdate = tempdate.AddHours(-1); //transaction = TvMain.dbconnect.BeginTransaction(IsolationLevel.ReadCommitted) String str; //TvMain.ClearDBarch(DateTimePickerAfter.Value, DateTimePickerBefor.Value, archType_hour, ListBox1.SelectedItem("ID_BD").ToString) str = obj.TvMain.readarch(archType_hour, tempdate.Year, tempdate.Month, tempdate.Day, tempdate.Hour); if (str.Substring(1, 6) != "ќшибка") { obj.TvMain.ClearDBArchString(archType_hour, tempdate.Year, tempdate.Month, tempdate.Day, tempdate.Hour, id_bdc); InfoReport("CounterID " + id_bdc.ToString() + " -> " + obj.TvMain.WriteArchToDB()); } else { //transaction.Rollback() WarningReport("CounterID: " + obj.dr["id_bd"].ToString() + " " + str + tempdate.ToString()); } } catch (Exception Ex) { //transaction.Rollback() ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " failed, " + Ex.Message); } }//for (int j = 0;j <= razn.Hours + razn.Days * 24;j++) obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnexthour", ddd.AddMinutes(Convert.ToDouble(obj.dr["icall"].ToString()))); tempdate = new DateTime(ddd.Year, ddd.Month, ddd.Day, ddd.Hour, 0, 0); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlasthour", tempdate.AddSeconds(-1)); } }//if (chour) ddd = SrvDate; try { ddd = Convert.ToDateTime(obj.dr["dnext24"].ToString()); } catch { } if (c24 && ddd <= SrvDate) { InfoReport("Thread " + id_bdc.ToString() + " read day archive at " + SrvDate.ToString()); DateTime tempdate; Int16 num24; num24 = Convert.ToInt16(obj.dr["num24"].ToString()); if (ddd.AddDays(num24) <= SrvDate.AddDays(1)) { tempdate = ddd; tempdate = tempdate.AddDays(-1); try { for (int j = 0; j <= num24 - 1; j++) { tempdate = tempdate.AddDays(1); //transaction = TvMain.dbconnect.BeginTransaction(IsolationLevel.ReadCommitted) String str; //TvMain.ClearDBarch(DateTimePickerAfter.Value, DateTimePickerBefor.Value, archType_hour, ListBox1.SelectedItem("ID_BD").ToString) str = obj.TvMain.readarch(archType_day, tempdate.Year, tempdate.Month, tempdate.Day, tempdate.Hour); if (str.Substring(1, 6) != "ќшибка") { obj.TvMain.ClearDBArchString(archType_day, tempdate.Year, tempdate.Month, tempdate.Day, 0, id_bdc); InfoReport("CounterID " + id_bdc.ToString() + " -> " + obj.TvMain.WriteArchToDB()); //obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnext24", ddd.AddHours(Convert.ToDouble(obj.dr["icall24"].ToString()))); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnext24", ddd.AddDays(num24)); tempdate = new DateTime(ddd.Year, ddd.Month, ddd.Day, 0, 0, 0); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlastday", tempdate.AddSeconds(-1)); } else { WarningReport("CounterID: " + obj.dr["id_bd"].ToString() + " " + str + tempdate.ToString()); } } //for (int j = 0; j <= razn.Days; j++) } //try catch (Exception Ex) { //transaction.Rollback() ErrorReport("CounterID: " + obj.dr["id_bd"].ToString() + " read arch failed, " + Ex.Message); } } else { tempdate = ddd; tempdate = tempdate.AddDays(1); try { for (int j = 0; j <= num24 - 1; j++) { tempdate = tempdate.AddDays(-1); //transaction = TvMain.dbconnect.BeginTransaction(IsolationLevel.ReadCommitted) String str; //TvMain.ClearDBarch(DateTimePickerAfter.Value, DateTimePickerBefor.Value, archType_hour, ListBox1.SelectedItem("ID_BD").ToString) str = obj.TvMain.readarch(archType_day, tempdate.Year, tempdate.Month, tempdate.Day, tempdate.Hour); if (str.Substring(1, 6) != "ќшибка") { obj.TvMain.ClearDBArchString(archType_day, tempdate.Year, tempdate.Month, tempdate.Day, 0, id_bdc); InfoReport("CounterID " + id_bdc.ToString() + " -> " + obj.TvMain.WriteArchToDB()); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnext24", ddd.AddHours(Convert.ToDouble(obj.dr["icall24"].ToString()))); tempdate = new DateTime(ddd.Year, ddd.Month, ddd.Day, 0, 0, 0); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlastday", tempdate.AddSeconds(-1)); } else { WarningReport("CounterID: " + obj.dr["id_bd"].ToString() + " " + str + tempdate.ToString()); } } //for (int j = 0; j <= razn.Days; j++) } //try catch (Exception Ex) { //transaction.Rollback() ErrorReport("CounterID: " + obj.dr["id_bd"].ToString() + " read arch failed, " + Ex.Message); } } }//if (c24) if (ccurr) { ddd = SrvDate; } try { ddd = Convert.ToDateTime(obj.dr["dnextcurr"].ToString()); } catch { } if (ccurr && ddd <= SrvDate) { DateTime tempdate; Double nmin; InfoReport("Thread " + id_bdc.ToString() + " read current data at " + SrvDate.ToString()); try { String str; str = obj.TvMain.readmarch(); InfoReport("CounterID " + id_bdc.ToString() + " -> " + str); if (str.Substring(1, 6) != "ќшибка") { InfoReport("CounterID " + id_bdc.ToString() + " -> " + obj.TvMain.WritemArchToDB()); tempdate = ddd; nmin = Convert.ToDouble(obj.dr["icallcurr"].ToString()); while (tempdate.AddMinutes(nmin) <= SrvDate) { tempdate = tempdate.AddMinutes(nmin); } tempdate = tempdate.AddMinutes(nmin); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnextcurr", tempdate); } }//try catch (Exception Ex) { ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " read arch failed, " + Ex.Message); } }//if (ccurr) if (csum) { ddd = SrvDate; } try { ddd = Convert.ToDateTime(obj.dr["dnextsum"].ToString()); } catch { } if (csum && ddd <= SrvDate) { DateTime tempdate; Double nmin; InfoReport("Thread " + id_bdc.ToString() + " read total data at " + SrvDate.ToString()); try { String str; str = obj.TvMain.readtarch(); InfoReport("CounterID " + id_bdc.ToString() + " -> " + str); if (str.Substring(1, 6) != "ќшибка") { InfoReport("CounterID " + id_bdc.ToString() + " -> " + obj.TvMain.WriteTArchToDB()); tempdate = ddd; nmin = Convert.ToDouble(obj.dr["icallsum"].ToString()); while (tempdate.AddMinutes(nmin) <= SrvDate) { tempdate = tempdate.AddMinutes(nmin); } tempdate = tempdate.AddMinutes(nmin); obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dnextsum", tempdate); } }//try catch (Exception Ex) { ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " read arch failed, " + Ex.Message); } }//if (ccurr) // finalization obj.TvMain.SetTimeToPlanCall(id_bdc.ToString(), "dlastcall", SrvDate); try { if (obj != null) { if (obj.TvMain != null) { obj.TvMain.EndInit(false); InfoReport("Thread " + id_bdc.ToString() + " close NPort "); } } } catch (System.Exception closeEx) { ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " thread failed, " + closeEx.Message); } } else { ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " NPORT Device initialization Error! Check IP:" + obj.dr["NPIP"].ToString()); } } else { InfoReport("CounterID " + obj.dr["id_bd"].ToString() + " plan is active, but no tasks to process!"); } } catch (System.Exception threadEx) { ErrorReport("CounterID " + obj.dr["id_bd"].ToString() + " thread failed, " + threadEx.Message); } obj = null; }