示例#1
0
		void PingJournal()
		{
			JournalParser journalParser;
			if (IsFirstTimeReadJournal && !String.IsNullOrEmpty(GkDatabase.RootDevice.GetReservedIpAddress())) // Находим последнее событие на КАУ первый раз (при запуске сервера)
			{
				journalParser = GetKauJournalById(-1);
				if (journalParser != null)
					LastKauId = journalParser.KauJournalRecordNo;
				IsFirstTimeReadJournal = false;
			}
			using (var gkLifecycleManager = new GKLifecycleManager(GkDatabase.RootDevice, "Проверка журнала"))
			{
				if (IpAddress != GkDatabase.RootDevice.GetGKIpAddress())
				{
					if (!String.IsNullOrEmpty(IpAddress))
					{
						var lastKauJournal = GetKauJournalById(LastKauId);
						if (lastKauJournal != null)
							LastId = lastKauJournal.GKJournalRecordNo;
					}
					IpAddress = GkDatabase.RootDevice.GetGKIpAddress();
				}
				var newLastId = GetLastId();
				if (newLastId == -1)
					return;
				if (LastId == -1)
					LastId = newLastId;
				if (newLastId > LastId)
				{
					for (int index = LastId + 1; index <= newLastId; index++)
					{
						gkLifecycleManager.Progress(index - LastId, newLastId - LastId);
						journalParser = ReadAndPublish(index);
						if (journalParser != null && journalParser.KauJournalRecordNo != 0)
							LastKauId = journalParser.KauJournalRecordNo;
					}
					LastId = newLastId;

					gkLifecycleManager.AddItem("Изменение индекса в БД");
					using (var skdDatabaseService = new RubezhDAL.DataClasses.DbService())
					{
						var gkIpAddress = GKManager.GetIpAddress(GkDatabase.RootDevice);
						skdDatabaseService.GKMetadataTranslator.SetLastJournalNo(gkIpAddress, LastId);
					}
				}
			}
		}
示例#2
0
		public void WriteConfig(GKDevice gkControllerDevice, GKProgressCallback progressCallback, Guid clientUID)
		{
			Errors = new List<string>();

			progressCallback = GKProcessorManager.StartProgress("Запись конфигурации", "Проверка связи", 1, false, GKProgressClientType.Administrator, clientUID);
			try
			{
				var gkDatabase = DescriptorsManager.GkDatabases.FirstOrDefault(x => x.RootDevice.UID == gkControllerDevice.UID);
				if (gkDatabase != null)
				{
					var kauDatabases = new List<KauDatabase>();
					var lostKauDatabases = new List<KauDatabase>();
					using (var gkLifecycleManager = new GKLifecycleManager(gkDatabase.RootDevice, "Проверка связи"))
					{
						gkLifecycleManager.AddItem("ГК");
						var pingResult = DeviceBytesHelper.Ping(gkDatabase.RootDevice);
						if (pingResult.HasError)
						{
							Errors.Add("Устройство " + gkDatabase.RootDevice.PresentationName + " недоступно");
							return;
						}

						foreach (var kauDatabase in gkDatabase.KauDatabases)
						{
							gkLifecycleManager.AddItem(kauDatabase.RootDevice.PresentationName);
							pingResult = DeviceBytesHelper.Ping(kauDatabase.RootDevice);
							if (!pingResult.HasError)
							{
								kauDatabases.Add(kauDatabase);
							}
							else
							{
								lostKauDatabases.Add(kauDatabase);
							}
						}
					}

					for (int i = 0; i < 3; i++)
					{
						Errors = new List<string>();

						var summaryDescriptorsCount = 4 + gkDatabase.Descriptors.Count;
						kauDatabases.ForEach(x => { summaryDescriptorsCount += 3 + x.Descriptors.Count; });

						var title = "Запись конфигурации в " + gkDatabase.RootDevice.PresentationName + (i > 0 ? " Попытка " + (i + 1) : "");
						progressCallback = GKProcessorManager.StartProgress(title, "", summaryDescriptorsCount, false, GKProgressClientType.Administrator, clientUID);
						var result = DeviceBytesHelper.GoToTechnologicalRegime(gkDatabase.RootDevice, progressCallback, clientUID);
						if (!result)
						{
							Errors.Add("Не удалось перевести " + gkControllerDevice.PresentationName + " в технологический режим\nУстройство не доступно, либо вашего IP адреса нет в списке разрешенного адреса ГК");
							continue;
						}

						result = DeviceBytesHelper.EraseDatabase(gkDatabase.RootDevice, progressCallback, clientUID);
						if (!result)
						{
							Errors.Add("Не удалось стереть базу данных ГК");
							continue;
						}

						foreach (var kauDatabase in kauDatabases)
						{
							result = DeviceBytesHelper.GoToTechnologicalRegime(kauDatabase.RootDevice, progressCallback, clientUID);
							if (!result)
							{
								Errors.Add("Не удалось перевести КАУ в технологический режим");
								continue;
							}

							if (!DeviceBytesHelper.EraseDatabase(kauDatabase.RootDevice, progressCallback, clientUID))
							{
								Errors.Add("Не удалось стереть базу данных КАУ");
								continue;
							}

							if (!WriteConfigToDevice(kauDatabase, progressCallback, clientUID))
							{
								Errors.Add("Не удалось записать дескриптор КАУ");
							}
						}

						result = WriteConfigToDevice(gkDatabase, progressCallback, clientUID);
						if (!result)
						{
							Errors.Add("Не удалось записать дескриптор ГК");
							continue;
						}


						var gkFileReaderWriter = new GKFileReaderWriter();
						gkFileReaderWriter.WriteFileToGK(gkControllerDevice, clientUID);
						if (gkFileReaderWriter.Error != null)
						{
							Errors.Add(gkFileReaderWriter.Error);
							break;
						}

						foreach (var kauDatabase in kauDatabases)
						{
							if (!DeviceBytesHelper.GoToWorkingRegime(kauDatabase.RootDevice, progressCallback, clientUID, kauDatabase.RootDevice.Driver.IsKau))
							{
								Errors.Add("Не удалось перевести " + kauDatabase.RootDevice.PresentationName + " в рабочий режим");
							}
						}

						if (!DeviceBytesHelper.GoToWorkingRegime(gkDatabase.RootDevice, progressCallback, clientUID, false))
						{
							Errors.Add("Не удалось перевести " + gkDatabase.RootDevice + " в рабочий режим");
						}
						break;
					}

					foreach (var kauDatabase in lostKauDatabases)
					{
						Errors.Add("Устройство " + kauDatabase.RootDevice.PresentationName + " недоступно");
					}
				}
			}
			catch (Exception e)
			{
				Logger.Error(e, "GKDescriptorsWriter.WriteConfig");
				Errors.Add(e.Message);
			}
			finally
			{
				if (progressCallback != null)
					GKProcessorManager.StopProgress(progressCallback, clientUID);
			}
		}
示例#3
0
		bool WriteConfigToDevice(CommonDatabase commonDatabase, GKProgressCallback progressCallback, Guid clientUID)
		{
			using (var gkLifecycleManager = new GKLifecycleManager(commonDatabase.RootDevice, "Запись дескрипторов"))
			{
				for (int descriptorNo = 0; descriptorNo < commonDatabase.Descriptors.Count; descriptorNo++)
				{
					var descriptor = commonDatabase.Descriptors[descriptorNo];
					gkLifecycleManager.Progress(descriptorNo + 1, commonDatabase.Descriptors.Count);
					var progressStage = commonDatabase.RootDevice.PresentationName + ": запись " + descriptor.GKBase.PresentationName + " " + "(" + descriptor.GetDescriptorNo() + ")" + " из " + commonDatabase.Descriptors.Count;
					GKProcessorManager.DoProgress(progressStage, progressCallback, clientUID);

					var packs = CreateDescriptors(descriptor);
					foreach (var pack in packs)
					{
						for (int i = 0; i < 10; i++)
						{
							var sendResult = SendManager.Send(commonDatabase.RootDevice, (ushort)(pack.Count), 17, 0, pack);
							if (sendResult.HasError)
							{
								if (i >= 9)
								{
									GKProcessorManager.StopProgress(progressCallback, clientUID);
									gkLifecycleManager.AddItem("Ошибка");
									return false;
								}
							}
							else
								break;
						}
					}
				}
				GKProcessorManager.DoProgress(commonDatabase.RootDevice.PresentationName + " Запись завершающего дескриптора", progressCallback, clientUID);
				WriteEndDescriptor(commonDatabase);
				return true;
			}
		}
示例#4
0
		public void WriteFileToGK(GKDevice gkControllerDevice, Guid clientUID)
		{
			using (var gkLifecycleManager = new GKLifecycleManager(gkControllerDevice, "Запись файла в ГК"))
			{
				gkLifecycleManager.AddItem("Формирование хэша");
				var gkFileInfo = new GKFileInfo();
				gkFileInfo.Initialize(gkControllerDevice);
				var bytesList = new List<byte>();
				bytesList.AddRange(gkFileInfo.InfoBlock);
				bytesList.AddRange(gkFileInfo.FileBytes);

				gkLifecycleManager.AddItem("Перевод в режим записи файла");
				var sendResult = SendManager.Send(gkControllerDevice, 0, 21, 0);
				if (sendResult.HasError)
				{
					Error = "Невозможно начать процедуру записи ";
					gkLifecycleManager.AddItem("Ошибка");
					return;
				}

				var progressCallback = GKProcessorManager.StartProgress("Запись файла в " + gkControllerDevice.PresentationName, null, bytesList.Count / 256, false, GKProgressClientType.Administrator, clientUID);
				for (var i = 0; i < bytesList.Count; i += 256)
				{
					gkLifecycleManager.Progress(i + 1, bytesList.Count);
					GKProcessorManager.DoProgress("Запись блока данных " + i + 1, progressCallback, clientUID);

					var bytesBlock = BitConverter.GetBytes((uint)(i / 256 + 1)).ToList();
					bytesBlock.AddRange(bytesList.GetRange(i, Math.Min(256, bytesList.Count - i)));
					for (int j = 0; j < 10; j++)
					{
						sendResult = SendManager.Send(gkControllerDevice, (ushort)bytesBlock.Count(), 22, 0, bytesBlock);
						var result = sendResult.Bytes.Count > 0 && sendResult.Bytes[0] == 1;
						if (!sendResult.HasError && result)
							break;
						if (j == 9)
						{
							Error = "Невозможно записать блок данных " + i;
							gkLifecycleManager.AddItem("Ошибка");
							return;
						}
					}
				}
				gkLifecycleManager.AddItem("Запись последнего блока данных");
				var endBlock = BitConverter.GetBytes((uint)(bytesList.Count() / 256 + 1)).ToList();
				sendResult = SendManager.Send(gkControllerDevice, 0, 22, 0, endBlock);
				var endResult = sendResult.Bytes.Count > 0 && sendResult.Bytes[0] == 0;
				if (sendResult.HasError || !endResult)
				{
					Error = "Невозможно завершить запись файла ";
					gkLifecycleManager.AddItem("Ошибка");
				}
				var sendResultRead = SendManager.Send(gkControllerDevice, 4, 23, 256, new List<byte>(BitConverter.GetBytes(1)));
				if (!gkFileInfo.InfoBlock.SequenceEqual(sendResultRead.Bytes))
				{
					Error = "Не удалось корректно записать информационный блок ";
					gkLifecycleManager.AddItem("Ошибка");
				}
			}
		}
示例#5
0
		public OperationResult<string> ReadConfigFileFromGK(GKDevice gkControllerDevice, GKProgressCallback progressCallback, Guid clientUID)
		{
			progressCallback = GKProcessorManager.StartProgress("Чтение конфигурационного файла из " + gkControllerDevice.PresentationName, "Проверка связи", 1, true, GKProgressClientType.Administrator, clientUID);
			try
			{
				using (var gkLifecycleManager = new GKLifecycleManager(gkControllerDevice, "Чтение файла ГК"))
				{
					gkLifecycleManager.AddItem("Чтение информационного блока");
					var gkFileInfo = ReadInfoBlock(gkControllerDevice);
					if (Error != null)
					{
						gkLifecycleManager.AddItem("Ошибка чтения информационного блока");
						return OperationResult<string>.FromError("Ошибка чтения информационного блока");
					}

					var allbytes = new List<byte>();
					uint i = 2;
					progressCallback = GKProcessorManager.StartProgress("Чтение конфигурационного файла из " + gkControllerDevice.PresentationName, "", (int)(gkFileInfo.FileSize / 256), true, GKProgressClientType.Administrator, clientUID);
					while (true)
					{
						if (progressCallback.IsCanceled)
							return OperationResult<string>.FromError("Операция отменена");
						GKProcessorManager.DoProgress("Чтение блока данных " + i, progressCallback, clientUID);
						gkLifecycleManager.Progress((int)i, (int)(gkFileInfo.FileSize / 256));

						var data = new List<byte>(BitConverter.GetBytes(i++));
						var sendResultBytesCount = 256;
						for (int j = 0; j < 10; j++)
						{
							var sendResult = SendManager.Send(gkControllerDevice, 4, 23, 256, data);
							allbytes.AddRange(sendResult.Bytes);
							sendResultBytesCount = sendResult.Bytes.Count();
							if (!sendResult.HasError)
								break;
							if (j == 9)
							{
								return OperationResult<string>.FromError("Невозможно прочитать блок данных " + i);
							}
						}
						if (sendResultBytesCount < 256)
							break;
					}
					if (allbytes.Count == 0)
						return OperationResult<string>.FromError("Конфигурационный файл отсутствует");

					var folderName = AppDataFolderHelper.GetFolder("TempServer");
					var configFileName = Path.Combine(folderName, "ConfigFromGK.fscp");
					if (Directory.Exists(folderName))
						Directory.Delete(folderName, true);
					Directory.CreateDirectory(folderName);
					var fileStream = new FileStream(configFileName, FileMode.CreateNew, FileAccess.ReadWrite);
					fileStream.Write(allbytes.ToArray(), 0, allbytes.Count);
					fileStream.Close();

					return new OperationResult<string>(configFileName);
				}
			}
			catch (Exception e)
			{
				Logger.Error(e, "GKDescriptorsWriter.WriteConfig");
				return OperationResult<string>.FromError("Непредвиденная ошибка");
			}
			finally
			{
				if (progressCallback != null)
					GKProcessorManager.StopProgress(progressCallback, clientUID);
			}
		}
示例#6
0
		void RunMonitoring()
		{
			using (var gkLifecycleManager = new GKLifecycleManager(GkDatabase.RootDevice, "Цикл мониторинга"))
			{
				gkLifecycleManager.AddItem("Проверка лицензии");
				var hasLicense = LicenseManager.CurrentLicenseInfo.LicenseMode != LicenseMode.NoLicense;
				if (HasLicense != hasLicense)
				{
					HasLicense = hasLicense;
					foreach (var descriptor in GkDatabase.Descriptors)
					{
						descriptor.GKBase.InternalState.IsNoLicense = !HasLicense;
					}
					NotifyAllObjectsStateChanged();
				}
				if (!hasLicense)
					return;

				if (WatcherManager.IsConfigurationReloading)
				{
					if ((DateTime.Now - WatcherManager.LastConfigurationReloadingTime).TotalSeconds > 100)
						WatcherManager.IsConfigurationReloading = false;
				}
				if (WatcherManager.IsConfigurationReloading)
					return;

				if (IsDBMissmatchDuringMonitoring)
				{
					if ((DateTime.Now - LastMissmatchCheckTime).TotalSeconds > 60)
					{
						gkLifecycleManager.AddItem("Ошибка сопоставления конфигурации. Опрос объектов");
						GetAllStates();
						LastMissmatchCheckTime = DateTime.Now;
					}
					return;
				}

				try
				{
					if (MustCheckTechnologicalRegime)
					{
						if ((DateTime.Now - LastTechnologicalRegimeCheckTime).TotalSeconds > 10)
						{
							LastTechnologicalRegimeCheckTime = DateTime.Now;
							CheckTechnologicalRegime();
							NotifyAllObjectsStateChanged();

							TechnologicalRegimeCheckCount++;
							if (TechnologicalRegimeCheckCount >= 10)
								MustCheckTechnologicalRegime = false;
						}
					}
				}
				catch (Exception e)
				{
					Logger.Error(e, "Watcher.OnRunThread CheckTechnologicalRegime");
				}

				try
				{
					gkLifecycleManager.AddItem("Проверка задач");
					CheckTasks();
				}
				catch (Exception e)
				{
					Logger.Error(e, "Watcher.OnRunThread CheckTasks");
				}

				try
				{
					gkLifecycleManager.AddItem("Проверка задержек");
					CheckDelays();
				}
				catch (Exception e)
				{
					Logger.Error(e, "Watcher.OnRunThread CheckDelays");
				}

				try
				{
					PingJournal();
				}
				catch (Exception e)
				{
					Logger.Error(e, "Watcher.OnRunThread PingJournal");
				}

				try
				{
					gkLifecycleManager.AddItem("Проверка измерений");
					CheckMeasure();
				}
				catch (Exception e)
				{
					Logger.Error(e, "Watcher.OnRunThread CheckMeasure");
				}

				try
				{
					if ((DateTime.Now - LastKAUMeasureTime) > TimeSpan.FromHours(1))
					{
						LastKAUMeasureTime = DateTime.Now;
						gkLifecycleManager.AddItem("Измерение токопотребления");
						CheckKAUMeasure();
					}
				}
				catch (Exception e)
				{
					Logger.Error(e, "Watcher.OnRunThread CheckKAUMeasure");
				}
			}
		}
示例#7
0
		bool CheckTechnologicalRegime()
		{
			using (var gkLifecycleManager = new GKLifecycleManager(GkDatabase.RootDevice, "Проверка технологического режима"))
			{
				gkLifecycleManager.AddItem(GkDatabase.RootDevice.PresentationName);
				var isInTechnologicalRegime = DeviceBytesHelper.IsInTechnologicalRegime(GkDatabase.RootDevice);
				gkLifecycleManager.AddItem("Обновление состояний технологического режима");
				foreach (var descriptor in GkDatabase.Descriptors)
				{
					descriptor.GKBase.InternalState.IsInTechnologicalRegime = isInTechnologicalRegime;
				}

				if (!isInTechnologicalRegime)
				{
					foreach (var kauDatabase in GkDatabase.KauDatabases)
					{
						gkLifecycleManager.AddItem(kauDatabase.RootDevice.PresentationName);
						var isKAUInTechnologicalRegime = DeviceBytesHelper.IsInTechnologicalRegime(kauDatabase.RootDevice);
						gkLifecycleManager.AddItem("Обновление состояний технологического режима");
						foreach (var device in kauDatabase.RootDevice.AllChildrenAndSelf)
						{
							device.InternalState.IsInTechnologicalRegime = isKAUInTechnologicalRegime;
						}
					}
				}
				return isInTechnologicalRegime;
			}
		}