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 = "Ошибка чтения реестра"; } }
/// <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)); }
/// <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(); } }
/// <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); }
/// <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)); }
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); } } }