예제 #1
0
        public General()
        {
            InitializeComponent();

            VentsTools.onChangeSettingsString += this.UpdateMessageLabel;
            _vt = new VentsTools();
            _cb = new CheckBoxLP();

            var onlyCheckBoxes = new List<FrameworkElement>();
            var allElem = new List<FrameworkElement>();
            //создадим список всех элементов на форме
            _vt.ChildControls(this, allElem);
            //выберем из списка только чекбоксы
            foreach (FrameworkElement elem in allElem)
            {
                if (elem.GetType() == _cb.GetType())
                    onlyCheckBoxes.Add(elem);
            }
            try
            {
                foreach (CheckBoxLP chbx in onlyCheckBoxes)
                {
                    try
                    {
                        if (RegistryWorker.GetKeyValue<int>(Microsoft.Win32.RegistryHive.LocalMachine, VentsConst._SETTINGSLOCATION, chbx.Name) != 0)
                            chbx.IsChecked = true;
                    }
                    catch (System.IO.IOException ex)
                    {
                        chbx.IsChecked = false;
                    }

                }
            }
            catch (Exception ex)
            {
                _log.Error(ex.Message + " (чтение из реестра)");
                VentsTools.currentSettingString = "Ошибка чтения реестра";
            }
        }
예제 #2
0
 /// <summary>
 /// Определяет временные рамки для <see cref="dateP"/>
 /// </summary>
 /// <param name="vt"></param>
 private void DatePickerInit(VentsTools vt)
 {
     VentsTools.currentActionString = "Показания за месяц";
     //получим самую первую дату записи в БД, преобразуем её первым днем месяца
     if (!_vt.ReadOneDate(ref _firstMonth, QueuePosition.First, VentsConst.connectionString, VentsConst._DATAtb))
         _log.Warn("Не удалось получить самую первую дату");
     int days = _firstMonth.Day;
     TimeSpan ts = new TimeSpan(days - 1, 0, 0, 0);
     _firstMonth = _firstMonth.Date - ts;
     Dispatcher.Invoke(new Action(() => dateP.DisplayDateStart = _firstMonth));
     //тоже самое с последней датой, преобразовывать не обязательно
     _lastMonth = DateTime.MaxValue;
     if (!_vt.ReadOneDate(ref _lastMonth, QueuePosition.Last, VentsConst.connectionString, VentsConst._DATAtb))
         _log.Warn("Не удалось получить последнюю дату");
     Dispatcher.Invoke(new Action(() => dateP.DisplayDateEnd = _lastMonth));
     Dispatcher.Invoke(new Action(() => dateP.IsEnabled = true));
 }
예제 #3
0
        /// <summary>
        /// Заполняет список <see cref="_ventsData"/> из таблицы конфигурации в базе данных. Ожидает подключения к базе данных, если такового нет.
        /// </summary>
        /// <param name="vt"><see cref="VentsTools"/></param>
        private void VentsDataCfg(VentsTools vt)
        {
            bool connectionState = false;

            while (!connectionState)
            {
                connectionState = _vt.FillVentsData(ref _ventsData);

                if (!connectionState && this.IsVisible)
                {
                    VentsTools.currentActionString = "Нет подключения к базе данных, проверьте настройки сети";
                    Thread.Sleep(3000);
                }
                if (!this.IsVisible)
                    _fvdThread.Suspend();
            }
        }
예제 #4
0
        /// <summary>
        /// Производит первоначальную инициализацию данных на странице
        /// </summary>
        private void StartInit()
        {
            ProgressBarPerform = new KeyValuePair<bool, int>(true, 1000);
            VentsTools.currentActionString = "Подключаюсь к Базе данных";

            _vt = new VentsTools();

            VentsDataCfg(_vt); //заполним данные по вентиляторам
            DatePickerInit(_vt);

            //отобразим наш листбокс
            Dispatcher.Invoke(new Action(() =>
            {
                VentsListBox.ItemsSource = _ventsData;
                VentsListBox.Focus();
                VentsListBox.SelectedItem = VentsListBox.Items.CurrentItem;
            }));

            ProgressBarPerform = new KeyValuePair<bool, int>(false, 1000);
        }
예제 #5
0
 /// <summary>
 /// Определяет временные рамки для <see cref="dateP"/>
 /// </summary>
 /// <param name="vt"></param>
 private void DatePickerInit(VentsTools vt)
 {
     if (!_vt.ReadOneDate(ref _firstDay, QueuePosition.First, VentsConst.connectionString, VentsConst._DATAtb))
         _log.Warn("Не удалось получить самую первую дату");
     Dispatcher.Invoke(new Action(() => dateP.DisplayDateStart = _firstDay));
     _firstDay = DateTime.MaxValue;
     if (!_vt.ReadOneDate(ref _lastDay, QueuePosition.Last, VentsConst.connectionString, VentsConst._DATAtb))
         _log.Warn("Не удалось получить последнюю дату");
     Dispatcher.Invoke(new Action(() => dateP.DisplayDateEnd = _lastDay));
     Dispatcher.Invoke(new Action(() => dateP.IsEnabled = true));
 }
예제 #6
0
        private void DirtyJob()
        {
            VentsTools VT = new VentsTools();
            bool refreshValues = false;
            if (VT.ReadConfigFromDB(VentsConst.connectionString, VentsConst._CONFtb, ref _ventsData))
                if (ReadDataFromPLC())
                {
                    //проверим нет ли значений превышающих _MAX_ENERGY_COUNTER (*100 квтч), если есть - добавим число к общему значению счетчика (ventEnergyConf.tb 'countvalue')
                    //также проверим нет ли нулевых значений (что может означать неисправность, например "нет связи")
                    //если есть ноль, проверим сообщение об ошибке, и если есть ошибка заменим значение на -1
                    foreach(Vents record in _ventsData)
                    {
                        
                        if (record.value >= VentsConst._MAX_ENERGY_COUNTER)
                        {
                            #region лямбда
                            ventdel vd = (DB, start, size) =>
                            {
                                string RDY_REF_state = "";
                                try
                                {
                                    if (_client.ConnectTo(VentsConst._ipPLC, VentsConst._RACK, VentsConst._SLOT) != 0)
                                        throw new Exception("Cant connect to PLC");

                                    int result;
                                    byte[] buffer = new byte[1];
                                    System.Collections.BitArray ba;

                                    result = _client.DBRead(DB, start+1, size, buffer); //vent.startBit+1,- secont byte of Input Stateword (RDY_REF bit is a 3rd bit)
                                    if (result != 0)
                                        ShowError(result);
                                    else
                                    {
                                        _client.Disconnect();
                                        ba = new System.Collections.BitArray(new byte[] { buffer[0] });
                                        return ba.Get(2) ? RDY_REF_state = "Ebabled" : RDY_REF_state = "Disabled";
                                    }
                                    return RDY_REF_state;
                                }
                                catch (Exception ex)
                                {
                                    _log.Error(ex.Message);
                                    return RDY_REF_state;
                                }
                            };
                        #endregion
                            //обновим значение счетчика в БД, перед этим проверим не включен ли вентилятор
                            if (vd(record.DB, record.startBit, 1) == "Disabled")
                            {
                                if (VT.UpdateCountValuesConfTB(record))
                                    //сбросим счетчик на частотном преобразователе
                                    if (SendResetBitToPLC(record.resetM))
                                    {
                                        refreshValues = true;
                                        Thread.Sleep(1000);
                                    }
                            }
                        }
                        if(record.value == 0)
                        {

                        }
                    }
                    //если обнаружено превышение счетчика, то не будем записывать считанные данные, а подождем немного и выполним "грязную работу" еще раз
                    if (refreshValues)
                    {
                        Thread.Sleep(1000);
                        new Thread(DirtyJob).Start();
                    }
                    else
                    {
                        //сохраним значения в БД, если за этот час не было записей
                        int LRCHres = VT.LastRecordCurrentHour(System.DateTime.Now);
                        if(LRCHres== 0 )
                            VT.WriteDataToDB(_ventsData);
                        else if (_debugBit)
                            VT.WriteDataToDB(_ventsData);
                    }
                }
        }