Beispiel #1
0
 /// <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;
 }
Beispiel #2
0
        /// <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);
        }