/// <summary> /// Отправить команду ТУ /// </summary> /// <remarks>Метод выполняется в потоке линии связи при появлении команды ТУ</remarks> public virtual void SendCmd(Command cmd) { LastCmdDT = DateTime.Now; lastCommSucc = CanSendCmd; if (sendCmdText == "") { StringBuilder sb = new StringBuilder(Localization.UseRussian ? " Команда " : " Command to the "); AppendKPDescr(sb); sendCmdText = sb.ToString(); } WriteToLog(""); WriteToLog(LastSessDT.ToString(CommUtils.CommLineDTFormat) + sendCmdText); if (CanSendCmd) { // добавление команды в список последних команд lastCmdList.Add(cmd); while (lastCmdList.Count > LastCmdListSize) { lastCmdList.RemoveAt(0); } } else { WriteToLog(Localization.UseRussian ? "КП не поддерживает отправку команд" : "The device does not support sending commands"); } }
/// <summary> /// Получить информацию о работе КП /// </summary> public virtual string GetInfo() { StringBuilder sbInfo = new StringBuilder(); sbInfo.AppendLine(Caption).AppendLine(new string('-', Caption.Length)); if (Localization.UseRussian) { sbInfo .Append("DLL : ").AppendLine(Dll) .Append("Состояние : ").AppendLine(WorkStateStr) .Append("Сеанс связи : ") .AppendLine(LastSessDT > DateTime.MinValue ? LastSessDT.ToLocalizedString() : "время неопределено") .Append("Команда ТУ : ") .AppendLine(LastCmdDT > DateTime.MinValue ? LastCmdDT.ToLocalizedString() : "время неопределено") .AppendLine() .Append("Сеансы связи (всего / ошибок) : ") .Append(kpStats.SessCnt).Append(" / ").Append(kpStats.SessErrCnt).AppendLine() .Append("Команды ТУ (всего / ошибок) : ") .Append(kpStats.CmdCnt).Append(" / ").Append(kpStats.CmdErrCnt).AppendLine() .Append("Запросы (всего / ошибок) : ") .Append(kpStats.ReqCnt).Append(" / ").Append(kpStats.ReqErrCnt).AppendLine(); } else { sbInfo .Append("DLL : ").AppendLine(Dll) .Append("State : ").AppendLine(WorkStateStr) .Append("Comm. session : ") .AppendLine(LastSessDT > DateTime.MinValue ? LastSessDT.ToLocalizedString() : "time is undefined") .Append("Command : ") .AppendLine(LastCmdDT > DateTime.MinValue ? LastCmdDT.ToLocalizedString() : "time is undefined") .AppendLine() .Append("Comm. sessions (total / errors) : "). Append(kpStats.SessCnt).Append(" / ").Append(kpStats.SessErrCnt).AppendLine() .Append("Commands (total / errors) : ") .Append(kpStats.CmdCnt).Append(" / ").Append(kpStats.CmdErrCnt).AppendLine() .Append("Requests (total / errors) : ") .Append(kpStats.ReqCnt).Append(" / ").Append(kpStats.ReqErrCnt).AppendLine(); } AppendKPTagsInfo(sbInfo); AppendLastArcSrezInfo(sbInfo); AppendLastEventsInfo(sbInfo); if (CanSendCmd) { AppendLastCmdsInfo(sbInfo); } return(sbInfo.ToString()); }
/// <summary> /// Выполнить сеанс опроса КП /// </summary> /// <remarks>Метод выполняется в потоке линии связи циклически или по времени</remarks> public virtual void Session() { LastSessDT = DateTime.Now; lastCommSucc = true; if (sessText == "") { StringBuilder sb = new StringBuilder(Localization.UseRussian ? " Сеанс связи с " : " Communication session with the "); AppendKPDescr(sb); sessText = sb.ToString(); } WriteToLog(""); WriteToLog(LastSessDT.ToString(CommUtils.CommLineDTFormat) + sessText); }
/// <summary> /// Processes new data received from OPC server. /// </summary> private void OpcSession_Notification(Session session, NotificationEventArgs e) { try { Monitor.Enter(opcLock); WriteToLog(""); LastSessDT = DateTime.Now; if (subscrByID != null && subscrByID.TryGetValue(e.Subscription.Id, out SubscriptionTag subscriptionTag)) { WriteToLog(string.Format(Localization.UseRussian ? "{0} КП {1}. Обработка новых данных. Подписка: {2}" : "{0} Device {1}. Process new data. Subscription: {2}", LastSessDT.ToLocalizedString(), Number, e.Subscription.DisplayName)); ProcessDataChanges(subscriptionTag, e.NotificationMessage); ProcessEvents(e.NotificationMessage); lastCommSucc = true; } else { WriteToLog(string.Format(Localization.UseRussian ? "Ошибка: подписка [{0}] \"{1}\" не найдена" : "Error: subscription [{0}] \"{1}\" not found", e.Subscription.Id, e.Subscription.DisplayName)); lastCommSucc = false; } } catch (Exception ex) { WriteToLog((Localization.UseRussian ? "Ошибка при обработке новых данных: " : "Error processing new data: ") + ex); lastCommSucc = false; } finally { CalcSessStats(); Monitor.Exit(opcLock); } }