/// <summary> /// Конструктор /// </summary> /// <param name="name">Наименование канала управления</param> /// <param name="cmdType">Тип команды</param> public CtrlCnlProps(string name, KPLogic.CmdType cmdType) { Name = name; CmdType = cmdType; CmdNum = 0; CmdValName = ""; FormulaUsed = false; Formula = ""; EvEnabled = false; }
/// <summary> /// Загрузить из файла команду и проверить её корретность /// </summary> private bool LoadCmd(string fileName, out string cmdType, out Dictionary <string, string> cmdParams, out KPLogic.Command kpCmd) { bool result = false; cmdType = ""; cmdParams = null; kpCmd = null; FileStream fileStream = null; StreamReader streamReader = null; try { string target = ""; DateTime date = DateTime.MinValue; DateTime time = DateTime.MinValue; int lifeTime = 0; bool endFound = false; fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); streamReader = new StreamReader(fileStream, Encoding.Default); while (!streamReader.EndOfStream) { string line = streamReader.ReadLine().Trim(); string lineL = line.ToLower(); if (cmdParams == null) { if (lineL == "[command]") { cmdParams = new Dictionary <string, string>(); } } else { if (lineL.StartsWith("target=")) { target = lineL.Remove(0, 7); } else if (lineL.StartsWith("date=")) { string[] vals = lineL.Remove(0, 5).Split('.'); date = new DateTime(int.Parse(vals[2]), int.Parse(vals[1]), int.Parse(vals[0])); } else if (lineL.StartsWith("time=")) { string[] vals = lineL.Remove(0, 5).Split(':'); time = new DateTime(DateTime.MinValue.Year, DateTime.MinValue.Month, DateTime.MinValue.Day, int.Parse(vals[0]), int.Parse(vals[1]), int.Parse(vals[2])); } else if (lineL.StartsWith("lifetime=")) { lifeTime = int.Parse(lineL.Remove(0, 9)); } else if (lineL.StartsWith("cmdtype=")) { cmdType = line.Remove(0, 8); try { KPLogic.CmdType kpCmdType = (KPLogic.CmdType)Enum.Parse( typeof(KPLogic.CmdType), cmdType, true); kpCmd = new KPLogic.Command(kpCmdType); } catch { } } else if (lineL.StartsWith("end=")) { endFound = true; } else { int ind = lineL.IndexOf("="); if (ind >= 0) { cmdParams[lineL.Substring(0, ind)] = lineL.Substring(ind + 1); } if (kpCmd != null) { if (lineL.StartsWith("kpnum=")) { kpCmd.KPNum = int.Parse(lineL.Remove(0, 6)); } else if (lineL.StartsWith("cmdnum=")) { if (kpCmd.CmdType != KPLogic.CmdType.Request) { kpCmd.CmdNum = int.Parse(lineL.Remove(0, 7)); } } else if (lineL.StartsWith("cmdval=")) { if (kpCmd.CmdType == KPLogic.CmdType.Standard) { lineL = lineL.Remove(0, 7); string s1 = lineL.Replace('.', ','); string s2 = lineL.Replace(',', '.'); double val; if (double.TryParse(s1, out val)) { kpCmd.CmdVal = val; } else if (double.TryParse(s2, out val)) { kpCmd.CmdVal = val; } } } else if (lineL.StartsWith("cmddata=")) { if (kpCmd.CmdType == KPLogic.CmdType.Binary) { int len = lineL.Length; byte[] cmdData = new byte[(len - 8) / 2]; for (int i = 9, j = 0; i < len; i += 2, j++) { string byteStr = lineL[i - 1].ToString() + lineL[i].ToString(); cmdData[j] = byte.Parse(byteStr, NumberStyles.HexNumber); } kpCmd.CmdData = cmdData; } } } } } } if (cmdParams != null && target == "scadacommsvc" && endFound) { // удаление успешно обработанного файла команды streamReader.Close(); streamReader = null; fileStream.Close(); fileStream = null; File.Delete(fileName); // проверка команды DateTime cmdDT = new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second); DateTime nowDT = DateTime.Now; string cmdInfo = (Localization.UseRussian ? " Тип: " : " Type: ") + cmdType; cmdInfo += kpCmd == null ? "" : (Localization.UseRussian ? ", КП: " + kpCmd.KPNum + ", номер: " + kpCmd.CmdNum : ", device: " + kpCmd.KPNum + ", number: " + kpCmd.CmdNum); if (nowDT.AddSeconds(-lifeTime) <= cmdDT && cmdDT <= nowDT.AddSeconds(lifeTime)) { log.WriteAction((Localization.UseRussian ? "Получена команда из файла." : "The command is received from file.") + cmdInfo, Log.ActTypes.Action); result = true; } else { log.WriteAction((Localization.UseRussian ? "Получена неактуальная команда из файла." : "The outdated command is received from file.") + cmdInfo, Log.ActTypes.Action); } cmdType = cmdType.ToLower(); } } catch (ThreadAbortException) { } catch (Exception ex) { log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при приёме команды из файла {0}: {1}" : "Error receiving command from file {0}: {1}", Path.GetFileName(fileName), ex.Message), Log.ActTypes.Exception); } finally { if (streamReader != null) { streamReader.Close(); } if (fileStream != null) { fileStream.Close(); } } return(result); }