/// <summary> /// Конструктор для настройки конкретного КП /// </summary> public KpModbusView(int number) : base(number) { CanShowProps = number == 0; // определение параметров опроса КП по умолчанию KPLogic.ReqParams reqParams = new KPLogic.ReqParams(false); reqParams.Timeout = 1000; reqParams.Delay = 200; DefaultReqParams = reqParams; }
/// <summary> /// Конструктор для настройки конкретного КП /// </summary> /// <param name="number">Номер настраемого КП</param> public KPView(int number) { defaultCtrlCnlCount = -1; Number = number; ConfigDir = ""; LangDir = ""; CmdDir = ""; CanShowProps = false; DefaultCnls = null; DefaultReqParams = new KPLogic.ReqParams(true); }
/// <summary> /// Конструктор для настройки конкретного КП /// </summary> public KpSmsView(int number) : base(number) { // определение каналов КП по умолчанию DefaultCnls = new List <InCnlProps>(); InCnlProps inCnlProps = new InCnlProps(Localization.UseRussian ? "Связь" : "Connection", CnlType.TS); inCnlProps.Signal = 1; inCnlProps.ParamName = Localization.UseRussian ? "Связь" : "Connection"; inCnlProps.ShowNumber = false; inCnlProps.UnitName = Localization.UseRussian ? "Нет - Есть" : "No - Yes"; inCnlProps.EvEnabled = true; inCnlProps.EvOnChange = true; DefaultCnls.Add(inCnlProps); inCnlProps = new InCnlProps(Localization.UseRussian ? "Кол-во событий" : "Event count", CnlType.TI); inCnlProps.Signal = 2; inCnlProps.ParamName = Localization.UseRussian ? "Событие" : "Event"; inCnlProps.DecDigits = 0; inCnlProps.UnitName = Localization.UseRussian ? "Шт." : "Count"; DefaultCnls.Add(inCnlProps); string cnlName = Localization.UseRussian ? "Отправка SMS" : "Send SMS message"; inCnlProps = new InCnlProps(cnlName, CnlType.TS); inCnlProps.CtrlCnlProps = new CtrlCnlProps(cnlName, KPLogic.CmdType.Binary); inCnlProps.CtrlCnlProps.CmdNum = 1; DefaultCnls.Add(inCnlProps); cnlName = Localization.UseRussian ? "AT-команда" : "AT command"; inCnlProps = new InCnlProps(cnlName, CnlType.TS); inCnlProps.CtrlCnlProps = new CtrlCnlProps(cnlName, KPLogic.CmdType.Binary); inCnlProps.CtrlCnlProps.CmdNum = 2; DefaultCnls.Add(inCnlProps); // определение параметров опроса КП по умолчанию KPLogic.ReqParams reqParams = new KPLogic.ReqParams(false); reqParams.Timeout = 5000; reqParams.Delay = 500; DefaultReqParams = reqParams; }
/// <summary> /// Распознать настройку линии связи и создать соответствующую линию связи /// </summary> private CommLine ParseCommLine(int lineNum, XmlElement commLineElem, out bool lineActive) { try { lineActive = bool.Parse(commLineElem.GetAttribute("active")); if (!lineActive) return null; string lineName = commLineElem.GetAttribute("name"); bool lineBind = bool.Parse(commLineElem.GetAttribute("bind")); CommLine commLine = new CommLine(lineNum, lineName, lineBind); commLine.PassCmd = PassCmd; // получение настроек соединения линии связи XmlElement connElem = commLineElem.SelectSingleNode("Connection") as XmlElement; if (connElem != null) { XmlElement connTypeElem = connElem.SelectSingleNode("ConnType") as XmlElement; XmlElement commSettElem = connElem.SelectSingleNode("ComPortSettings") as XmlElement; if (connTypeElem != null && connTypeElem.GetAttribute("value").ToLower() == "comport" && commSettElem != null) { try { string portName = commSettElem.GetAttribute("portName"); string baudRate = commSettElem.GetAttribute("baudRate"); string dataBits = commSettElem.GetAttribute("dataBits"); string parity = commSettElem.GetAttribute("parity"); string stopBits = commSettElem.GetAttribute("stopBits"); bool dtrEnable = commSettElem.GetAttribute("dtrEnable").ToLower() == "true"; bool rtsEnable = commSettElem.GetAttribute("rtsEnable").ToLower() == "true"; commLine.SerialPort = new SerialPort(portName, int.Parse(baudRate), (Parity)Enum.Parse(typeof(Parity), parity, true), int.Parse(dataBits), (StopBits)Enum.Parse(typeof(StopBits), stopBits, true)); commLine.SerialPort.DtrEnable = dtrEnable; commLine.SerialPort.RtsEnable = rtsEnable; } catch (Exception ex) { commLine.ConfigError = true; Log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при распознавании параметров COM-порта линии связи {0}: {1}" : "Error parsing serial port parameters of communication line {0}: {1}", lineNum, ex.Message), Log.ActTypes.Exception); } } } // получение параметров линии связи XmlElement lineParamsElem = commLineElem.SelectSingleNode("LineParams") as XmlElement; if (lineParamsElem != null) { XmlNodeList paramNodes = lineParamsElem.SelectNodes("Param"); foreach (XmlElement paramElem in paramNodes) { try { string name = paramElem.GetAttribute("name"); string val = paramElem.GetAttribute("value"); if (name == "ReqTriesCnt") commLine.ReqTriesCnt = int.Parse(val); else if (name == "CycleDelay") commLine.CicleDelay = int.Parse(val); else if (name == "MaxCommErrCnt") commLine.MaxCommErrCnt = int.Parse(val); else if (name == "CmdEnabled") commLine.CmdEnabled = bool.Parse(val.ToLower()); } catch (Exception ex) { commLine.ConfigError = true; Log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при распознавании параметров линии связи {0}: {1}" : "Error parsing communication line {0} parameters: {1}", lineNum, ex.Message), Log.ActTypes.Exception); } } commLine.RefrParams = commonParams.RefrParams; } // получение пользовательских параметров линии связи XmlElement userParamsElem = commLineElem.SelectSingleNode("UserParams") as XmlElement; if (userParamsElem != null) { XmlNodeList paramNodes = userParamsElem.SelectNodes("Param"); foreach (XmlElement paramElem in paramNodes) { string name = paramElem.GetAttribute("name"); string val = paramElem.GetAttribute("value"); if (name != "" && !commLine.UserParams.ContainsKey(name)) commLine.UserParams.Add(name, val); } } // получение последовательности опроса линии связи XmlElement reqSeqElem = commLineElem.SelectSingleNode("ReqSequence") as XmlElement; if (reqSeqElem != null) { XmlNodeList kpNodes = reqSeqElem.SelectNodes("KP"); foreach (XmlElement kpElem in kpNodes) { string kpActive = kpElem.GetAttribute("active").ToLower(); if (kpActive == "true") { string kpNumber = kpElem.GetAttribute("number"); try { // получение типа КП string dllName = kpElem.GetAttribute("dll"); string typeFullName = "Scada.Comm.KP." + dllName + "Logic"; Type kpType; if (kpTypes.ContainsKey(dllName)) kpType = kpTypes[dllName]; else { // загрузка типа из библиотеки string path = KpDir + dllName + ".dll"; Log.WriteAction((Localization.UseRussian ? "Загрузка библиотеки КП: " : "Load device library: ") + path, Log.ActTypes.Action); Assembly asm = Assembly.LoadFile(path); kpType = asm.GetType(typeFullName); kpTypes.Add(dllName, kpType); } // получение параметров КП bool kpBind = bool.Parse(kpElem.GetAttribute("bind")); KPLogic.ReqParams reqParams = new KPLogic.ReqParams(); reqParams.Timeout = int.Parse(kpElem.GetAttribute("timeout")); reqParams.Delay = int.Parse(kpElem.GetAttribute("delay")); string time = kpElem.GetAttribute("time"); reqParams.Time = time == "" ? DateTime.MinValue : DateTime.Parse(time, CultureInfo.CurrentCulture); string period = kpElem.GetAttribute("period"); reqParams.Period = period == "" ? new TimeSpan(0) : TimeSpan.Parse(period); string group = kpElem.GetAttribute("group"); reqParams.CmdLine = kpElem.GetAttribute("cmdLine"); // создание экземпляра класса КП KPLogic kpLogic = Activator.CreateInstance(kpType, int.Parse(kpNumber)) as KPLogic; kpLogic.Bind = kpBind; kpLogic.Name = kpElem.GetAttribute("name"); string address = kpElem.GetAttribute("address"); kpLogic.Address = address == "" ? 0 : int.Parse(address); kpLogic.CallNum = kpElem.GetAttribute("callNum"); kpLogic.KPReqParams = reqParams; commLine.AddKP(kpLogic); } catch (Exception ex) { Log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при распознавании конфигурации КП {0}: {1}" : "Error parsing device {0} configuration: {1}", kpNumber, ex.Message), Log.ActTypes.Exception); } } } } return commLine; } catch (Exception ex) { Log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при распознавании конфигурации линии связи {0}: {1}" : "Error parsing communication line {0} configuration: {1}", lineNum, ex.Message), Log.ActTypes.Exception); lineActive = false; return null; } }