예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
        }