Пример #1
0
 public void ResetLogin()
 {
     if (Data.UserName != null)
     {
         Data.SendToSystemLog(string.Format("Выход из системы {0} на станции {1}", Data.UserName, Environment.MachineName));
     }
     Data.UserName              = null;
     Data.UserLevel             = UserLevel.None;
     Data.UserFullname          = null;
     Data.UserLogged            = false;
     UserListKeeper.CurrentUser = null;
 }
Пример #2
0
 public void LoginUser(string fullname, string shortname, UserLevel level)
 {
     if (Data.UserName != null)
     {
         Data.SendToSystemLog(string.Format("Выход из системы {0} на станции {1}", Data.UserName, Environment.MachineName));
     }
     Data.UserName     = shortname;
     Data.UserLevel    = level;
     Data.UserFullname = fullname;
     Data.UserLogged   = true;
     Data.SendToSystemLog(string.Format("Вход в систему {0} на станции {1}", shortname, Environment.MachineName));
 }
Пример #3
0
        private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            Data.SendToSystemLog(string.Format("Останов системы на станции {0}", Environment.MachineName));
            var dt = DateTime.Now + new TimeSpan(0, 0, 0, 1);

            while (dt > DateTime.Now)
            {
                Application.DoEvents();
            }
            //Код, выполняемый при остановке процесса
            try
            {
                if (_wcfEventService != null)
                {
                    _wcfEventService.Stop();
                }
            }
            catch (Exception ex)
            {
                Data.SendToErrorsLog("Ошибка при остановке локального сервера подписки: " + ex.FullMessage());
            }

            foreach (var worker in Workers.Where(worker => worker.IsBusy))
            {
                worker.CancelAsync();
            }
            dt = DateTime.Now + new TimeSpan(0, 0, 0, 1);
            while (dt > DateTime.Now)
            {
                Application.DoEvents();
            }
            _fileLogsWatcher.Changed -= fileSystemLogWatcher_Changed;
            _fileLogsWatcher.Created -= fileSystemLogWatcher_Changed;
            _fileLogsWatcher.Dispose();
            if (Data.RunningAsShell() || Data.MustWinLogOff)
            {
                WinLogOff();
            }
        }
Пример #4
0
        private void FormMain_Load(object sender, EventArgs e)
        {
            #region Защита от повторного запуска

            var process = RunningInstance();
            if (process != null)
            {
                Application.Exit(); return;
            }

            #endregion

            Width = 0; Height = 1;

            Data.Session = new MemIniFile("");

            Data.FileToErrorsFullName = Path.ChangeExtension(Application.ExecutablePath, ".err");
            Data.ResetErrorsLog();

            var tasksFileName = Path.ChangeExtension(Application.ExecutablePath, ".tsk");
            Data.Tasks = new MemIniFile(tasksFileName);

            var configFileName = Path.ChangeExtension(Application.ExecutablePath, ".ini");
            Data.Config = new MemIniFile(configFileName);
            var currentPath = Application.StartupPath;

            var configFolder = Path.Combine(currentPath, "MultiFillingConfig");
            if (!Directory.Exists(configFolder))
            {
                try
                {
                    Directory.CreateDirectory(configFolder);
                }
                catch (Exception ex)
                {
                    Data.SendToErrorsLog("Ошибка при создании папки " + configFolder + ": " + ex.FullMessage());
                    Application.Exit();
                    return;
                }
            }
            Data.ConfigFolder = configFolder;

            #region импорт файла типов вагонов

            //var typeFile = Path.Combine(configFolder, "waggontypes.txt");
            //if (File.Exists(typeFile))
            //{
            //    TypesListKeeper.Clear();
            //    var n = 0;
            //    foreach (var vals in File.ReadLines(typeFile).Select(line => line.Split(new[] { '\t' })))
            //    {
            //        if (n > 0 && vals.Length == 5)
            //        {
            //            int diameter, throat, deflevel;
            //            if (!string.IsNullOrWhiteSpace(vals[0]) &&
            //                int.TryParse(vals[1], out diameter) &&
            //                int.TryParse(vals[2], out throat) &&
            //                int.TryParse(vals[3], out deflevel))
            //            {
            //                TypesListKeeper.Add(vals[0], diameter, throat, deflevel);
            //            }
            //        }
            //        n++;
            //    }
            //    typeFile = Path.Combine(configFolder, "wagtypes.xml");
            //    TypesListKeeper.SaveTypesData(typeFile);
            //}

            #endregion

            TypeDataKeeper.LoadTypesData(Path.Combine(configFolder, "wagtypes.xml"));

            #region импорт и экспорт файла вагонов

            //var wagFile = Path.Combine(configFolder, "_waggons.txt");
            //if (File.Exists(wagFile))
            //{
            //    var filename = Path.Combine(configFolder, "waggons.txt");
            //    using (var stream = new FileStream(filename, FileMode.Append))
            //    {
            //        using (var writer = new StreamWriter(stream))
            //        {
            //            var n = 0;
            //            foreach (var vals in File.ReadLines(wagFile).Select(line => line.Split(new[] {'\t'})))
            //            {
            //                if (n > 0 && vals.Length == 5)
            //                {
            //                    var number = vals[0];
            //                    var ntype = vals[1];
            //                    int factlevel;
            //                    if (!string.IsNullOrWhiteSpace(number) &&
            //                        !string.IsNullOrWhiteSpace(ntype) &&
            //                        int.TryParse(vals[2], out factlevel))
            //                    {
            //                        var content = string.Format("{0}\t{1}\t{2}", number, ntype, factlevel);
            //                        writer.WriteLine(content);
            //                        writer.Flush();
            //                    }
            //                }
            //                n++;
            //            }
            //        }
            //    }
            //}

            #endregion

            var logFolder = Path.Combine(currentPath, "MultiFillingLogs");
            if (!Directory.Exists(logFolder))
            {
                try
                {
                    Directory.CreateDirectory(logFolder);
                }
                catch (Exception ex)
                {
                    Data.SendToErrorsLog("Ошибка при создании папки " + logFolder + ": " + ex.FullMessage());
                    Application.Exit();
                    return;
                }
            }
            Data.LogsFolder = logFolder;

            Data.SendToSystemLog(string.Format("Запуск системы на станции {0}", Environment.MachineName));
            var dt = DateTime.Now + new TimeSpan(0, 0, 0, 3);
            while (dt > DateTime.Now)
            {
                Application.DoEvents();
            }

            _fileLogsWatcher = new FileSystemWatcher
            {
                Path = logFolder,
                EnableRaisingEvents = true,
                Filter              = "*.log",
                NotifyFilter        = NotifyFilters.LastWrite,
                SynchronizingObject = this
            };
            _fileLogsWatcher.Changed += fileSystemLogWatcher_Changed;
            _fileLogsWatcher.Created += fileSystemLogWatcher_Changed;


            var historyFolder = Path.Combine(currentPath, "MultiFillingHistory");
            if (!Directory.Exists(historyFolder))
            {
                try
                {
                    Directory.CreateDirectory(historyFolder);
                }
                catch (Exception ex)
                {
                    Data.SendToErrorsLog("Ошибка при создании папки " + historyFolder + ": " + ex.FullMessage());
                    Application.Exit();
                    return;
                }
            }
            Data.HistoryFolder = historyFolder;

            Data.SystemShell       = Data.Config.ReadBool("GeneralFor" + Environment.UserName, "SystemShell", false);
            Data.StartTaskPeriod   = Data.Config.ReadInteger("General", "StartTaskPeriod", 3000);
            Data.StopTaskPeriod    = Data.Config.ReadInteger("General", "StopTaskPeriod", 3000);
            Data.DeleteLogsAfter   = Data.Config.ReadInteger("General", "DeleteLogsAfter", 90);
            Data.DeleteTrendsAfter = Data.Config.ReadInteger("General", "DeleteTrendsAfter", 14);

            Data.ShowReadyAndAlarm   = Data.Config.ReadBool("FillingPageCommon", "ShowReadyAndAlarm", false);
            Data.UseSmartLevel       = Data.Config.ReadBool("FillingPageCommon", "UseSmartLevel", true);
            Data.SmartLevelDifferent = Data.Config.ReadInteger("FillingPageCommon", "SmartLevelDifferent", 3);
            Data.SmartLevelQueueSize = Data.Config.ReadInteger("FillingPageCommon", "SmartLevelQueueSize", 15);

            // Загрузка конфигурации опроса
            try
            {
                LoadFetchConfiguration();
            }
            catch (Exception ex)
            {
                Data.SendToErrorsLog("Ошибка при загрузке конфигурации опроса: " + ex.FullMessage());
            }

            #region Построение рабочих панелей

            var monitors = Screen.AllScreens;

            _panels = new FormPanel[monitors.Length];

            if (!Data.Config.KeyExists("Station", "Monitors"))
            {
                Data.Config.WriteInteger("Station", "Monitors", 1);
                Data.Config.UpdateFile();
            }
            var screens = Data.Config.ReadInteger("Station", "Monitors", 1);

            for (var i = 0; i < monitors.Length; i++)
            {
                _panels[i] = new FormPanel(this, monitors[i].Primary, monitors[i].WorkingArea)
                {
                    Visible      = false,
                    DisplayIndex = i + 1
                };
                _panels[i].Show(this);
                _panels[i].Refresh();
                if (screens > 0 && i + 1 >= screens)
                {
                    break;
                }
            }

            #endregion

            Data.StationNodes[0] = new StationNode {
                Name = "Станция 1", Index = 1
            };
            Data.StationNodes[1] = new StationNode {
                Name = "Станция 2", Index = 2
            };
            Data.StationNodes[2] = new StationNode {
                Name = "Станция 3", Index = 3
            };
            Data.StationNodes[3] = new StationNode {
                Name = "Станция 4", Index = 4
            };

            Data.EnableLocalEventServer = Data.Config.ReadBool("DataEventServers", "EnableLocalEventServer", false);

            // Запуск сервера событий
            if (Data.EnableLocalEventServer)
            {
                _wcfEventService = WcfEventService.EventService;
                try
                {
                    _wcfEventService.Start();
                }
                catch (Exception ex)
                {
                    Data.SendToErrorsLog("Ошибка при запуске локального сервера событий: " + ex.FullMessage());
                }
                // Подключаемся клиентом сами к себе для рассылки событий возможным клиентам
                Data.LocalEventClient = new EventClient.EventClient();
                Data.LocalEventClient.Connect("localhost", 9901, new[] { "Fetching", "Logging", "Trending" },
                                              PropertyUpdate, ShowError, ClientFileReceived, UpdateLocalConnectionStatus);
            }


            Data.SelfIpAddress = Data.Config.ReadString("DataEventServers", "SelfIpAddress", "");
            //var selfIpAddresses = Dns.GetHostAddresses(Dns.GetHostName());

            // Подключаемся клиентом к другим станциям
            for (var i = 1; i <= Data.StationNodes.Length; i++)
            {
                var enable = Data.Config.ReadBool("DataEventServers", "EnableEventServer" + i, false);
                Data.StationNodes[i - 1].Enable = enable;
                var addr = Data.Config.ReadString("DataEventServers", "AddressEventServer" + i, "");
                if (!enable)
                {
                    continue;
                }
                IPAddress address;
                if (IPAddress.TryParse(addr, out address))
                {
                    Data.StationNodes[i - 1].Address = address;
                    if (addr.Equals(Data.SelfIpAddress))
                    {
                        Data.StationNodes[i - 1].ItThisStation = true;
                        Data.StationNodes[i - 1].Descriptor    = "Эта станция";
                    }
                    if (!Data.StationNodes[i - 1].ItThisStation)
                    {
                        var id = Data.ConnectToEventServer(addr, 9901, new[] { "Fetching", "Logging", "Trending" },
                                                           PropertyUpdate, ShowError, ClientFileReceived,
                                                           UpdateConnectionStatus);
                        Data.StationNodes[i - 1].ClientId = id;
                    }
                }
                else
                {
                    Data.SendToErrorsLog(
                        string.Format("Ошибка в IP-адресе для сервера подписки {0} в файле конфигурации", i));
                }
            }

            // ----
            lock (Data.RiserNodes)
            {
                foreach (var riser in Data.RiserNodes.Values)
                {
                    if (string.IsNullOrWhiteSpace(riser.Number))
                    {
                        continue;
                    }
                    var riserName = string.Format("{0}_{1}_{2}_{3}_{4}",
                                                  riser.Channel, riser.Overpass, riser.Way,
                                                  riser.Product, riser.Riser);
                    Data.UpdateRiserProperty(riserName, "Number", riser.Number);
                    Data.UpdateRiserProperty(riserName, "Ntype", riser.Ntype);
                    Data.UpdateRiserProperty(riserName, "FactHeight", riser.FactHeight.ToString("0"));
                    Data.UpdateRiserProperty(riserName, "Setpoint", riser.Setpoint.ToString("0"));
                    Data.UpdateRiserProperty(riserName, "FilledKind", "");
                }
            }
            // Запуск таймера для фонового удаления старых архивов
            _timer.Enabled = true;
        }
Пример #5
0
        public void SetStopCount(int value, bool remoted)
        {
            var stoped = value > _stopCount && RiserMode > RiserState.Waiting;

            _stopCount = value;
            if (!stoped)
            {
                return;
            }
            FillingEnded = DateTime.Now;
            FilledKind   = (StopCause & 0x2000) > 0;
            FilledLevel  = CurrentLevel;
            //------------------------------------------------
            var masks = new[]
            {
                0x01,
                0x02,
                0x04,
                0x08,
                0x10,
                0x20,
                0x40,
                0x80,
                0x0100,
                0x0200,
                0x0400,
                0x0800,
                0x1000,
                0x2000,
                0x4000,
                0x8000
            };
            var messages = new[]
            {
                "Налив завершен аварийно. Сработал сигнализатор аварийный",
                "Налив завершен кнопкой \"СТОП\" пульта управления",
                "Налив завершен аварийно. Неисправность цепи готовности",
                "Налив завершен аварийно. Неисправность сигнализатора уровня",
                "Налив завершен аварийно. Истекло время работы без связи",
                "Налив завершен аварийно. Заземление отсутствует",
                "Налив завершен аварийно. Ошибка клапана большого прохода",
                "Налив завершен аварийно. Ошибка клапана малого прохода",
                "Налив завершен аварийно. Ток сигнализатора уровня меньше минимального",
                "Налив завершен аварийно. Ток сигнализатора уровня больше максимального",
                "Налив завершен аварийно. Ток сигнализатора аварийного меньше минимального",
                "Налив завершен аварийно. Ток сигнализатора аварийного больше максимального",
                "Налив завершен аварийно. Нет рабочего положения",
                "Налив завершен автоматически",
                "Налив завершен оператором АРМ",
                "Налив завершен аварийно. Неверные данные налива"
            };
            string stopcause = null;

            for (var i = 0; i < masks.Length; i++)
            {
                if ((StopCause & masks[i]) <= 0)
                {
                    continue;
                }
                if (!remoted)
                {
                    Data.SendToSystemLog(messages[i], Address, WaggonData);
                }
                if (stopcause == null)
                {
                    stopcause = messages[i];
                }
            }
            if (stopcause != null && !remoted)
            {
                Data.SendToFillingLog(FillingStarted, Address, WaggonData, FillingEnded, FillingUser, stopcause);
            }
        }