Стартовая страница › Форумы › Ошибки в работе › Ошибки Коммуникатора › Периодически останавливается служба коммуникатора
- В этой теме 16 ответов, 5 участников, последнее обновление 5 лет, 10 месяцев назад сделано gordec.
-
АвторСообщения
-
21.06.2018 в 11:21 #9696gordecУчастник
Добрый день, помогите пожалуйста найти причину ошибки. Периодически останавливается служба коммуникатора. Библиотека кп связывается с устройствами и отдает правильные данные температур, через несколько часов исправной работы коммуникатора в логах появляется такое:
2018-06-20 19:01:57 <DA-TD13><система><ACT> Получена неактуальная команда из файла: тип=Standard, КП=0, номер=1
2018-06-20 19:01:57 <DA-TD13><система><ACT> Получена неактуальная команда из файла: тип=Standard, КП=0, номер=1
2018-06-20 19:01:57 <DA-TD13><система><ACT> Получена неактуальная команда из файла: тип=Standard, КП=0, номер=1
2018-06-20 19:01:57 <DA-TD13><система><ACT> Получена неактуальная команда из файла: тип=Standard, КП=0, номер=1
И как кульминация:
2018-06-20 19:01:57 <DA-TD13><система><EXC> Необработанное исключение: System.ObjectDisposedException: Дескриптор SafeHandle был закрыт
в System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
в System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
в Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle handle)
в System.Threading.EventWaitHandle.Set()
в Scada.Comm.Devices.KpTestLogic.CallBackMethodSocket3(IAsyncResult asyncresult)
в System.Net.LazyAsyncResult.Complete(IntPtr userToken)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Net.ContextAwareResult.Complete(IntPtr userToken)
в System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
в System.Net.Sockets.Socket.MultipleAddressConnectCallback(IAsyncResult result)
в System.Net.LazyAsyncResult.Complete(IntPtr userToken)
в System.Net.ContextAwareResult.Complete(IntPtr userToken)
в System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
в System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
в System.Threading.ThreadPoolWorkQueue.Dispatch()Ниже прилагаю кусок кода кп:
public sealed class KpTestLogic : KPLogic { //коллекция конфигурации устройств private readonly List<CfgList> _cfg = new List<CfgList>(); private TcpClient _clientSocket; //событие тайм-аут при недоступности конечного устройства private ManualResetEvent _timeoutObject; //флаг соединения устройства private bool _isConnectionSuccessful; //поток чтения-записи private NetworkStream _serverStream; public KpTestLogic(int number) : base(number) { //загрузка конфигурации устройств LoadCfg(); CanSendCmd = true; //коллекция тэгов видимых в комуникаторе скады List<TagGroup> tagGroups = new List<TagGroup>(); //создание группы тэгов TagGroup tagGroup = new TagGroup("Socket3"); //локальная переменная счетчика тэгов int countPoint = 1; //создание тэгов из конфигурации устройств foreach (var cfg in _cfg) { //тэг температуры tagGroup.KPTags.Add(new KPTag(countPoint++, cfg.Name)); //тэг ошибки tagGroup.KPTags.Add(new KPTag(countPoint++, cfg.Name+"(Error)")); // тэг состояния соединения с устройством tagGroup.KPTags.Add(new KPTag(countPoint++, cfg.Name+"(Status)")); } //добавить группу тэгов в коллекцию tagGroups.Add(tagGroup); //проинициализировать тэги коммуникатора из коллекции InitKPTags(tagGroups); } private void LoadCfg() { //(ip device, port device, name point, number AI: 0 and 1) _cfg.Add(new CfgList("172.17.0.190",9761, "Серверная ШС",0)); _cfg.Add(new CfgList("172.17.0.191", 9761, "Северная звуковая", 0)); _cfg.Add(new CfgList("172.17.0.192", 9761, "Восточная звуковая", 0)); _cfg.Add(new CfgList("172.17.0.193", 9761, "Западная гл.серверная", 0)); _cfg.Add(new CfgList("172.17.0.193", 9761, "Западная гл.серверная", 1)); _cfg.Add(new CfgList("172.17.0.194", 9761, "Южная звуковая", 0)); } public override void Session() { base.Session(); //счетчик итераций цикла считываний int countIteration = 0; foreach (var cfg in _cfg) { try { _clientSocket = new TcpClient(); _timeoutObject = new ManualResetEvent(false); _serverStream = default(NetworkStream); int value = -1000; if (ConnectSocket3(cfg.Port, cfg.Ip)) { value = GetAi(cfg.PortAi); SetCurData(countIteration++, value, 1); SetCurData(countIteration++, value < -54 || value > 125 ? 1 : 0, 1); } SetCurData(countIteration++, value != -1000 ? 1 : 0, 1); } catch (Exception) { // ignored } finally { DisconnectSocket3(); _serverStream?.Close(); _timeoutObject?.Close(); _clientSocket?.Close(); } } CalcSessStats(); }
21.06.2018 в 11:48 #9697manjey73УчастникКогда делал драйвер Ping то столкнулся с проблемой.
1. не удобно использовать async так как пришлось бы отлавливать какой ПК вернул ответ и как-то правильно формировать теги
2. у Ping тоже есть свой Timeout и он ну очень плохо жил с Timeout Коммуникатора.В итоге сделал в коде таймер, который меньше Timeout-а Коммуникатора и запросы ping шли в пределах данного таймера.
Например имеем 20 ПК, за первый опрос драйвер успел опросить 7 ПК (например большой ping) на следующем вызове ping выполнялся с 8-ого ПК и так по кругу в пределах установленного таймера.Может и тут такая же песня, да еще и ошибку выдает ? У меня вроде не было ошибок, просто зависал опрос и все…
21.06.2018 в 13:09 #9701baurУчастникДобрый день,
драйвер Ping опубликован? можно получить экземпляр?21.06.2018 в 13:32 #9702manjey73Участникhttps://cloud.mail.ru/public/D3Mg/hrDAkWK9s
исходники…
Он далеко не допиленный, но принцип таймера думаю будет понятен.
Список IP в файле listip.txtДопиливать некогда немного…
- Этот ответ был изменен 5 лет, 10 месяцев назад от manjey73.
21.06.2018 в 18:32 #9706MikhailМодераторДобрый день!
Ошибка происходит не в потоке линии связи, а в отдельном потоке. Т.к. она не отлавливается, служба Коммуникатора падает полностью. В первую очередь нужно понять в каком потоке происходит исключение. Затем подумать, можно ли в этом потоке поставить try catch или как-то ещё поймать и обработать ошибку. Вы создаёте какие-нибудь потоки, которых не видно в приведенном коде?
21.06.2018 в 22:16 #9717RomirosУчастникПоходу многие писали драйвер ping :). Но у меня он работает асинхронно, без таймера и отвечает в нужные теги. Пишите кому нужно.
21.06.2018 в 22:55 #9718manjey73УчастникRomiros, так выложили бы 🙂 у меня на примерно 50 компах зависал, когда пытался сделать асинхронный запрос или через поток
22.06.2018 в 10:31 #9722baurУчастникисходники…
Он далеко не допиленный, но принцип таймера думаю будет понятен.
Список IP в файле listip.txtспасибо, скачал
Походу многие писали драйвер ping :). Но у меня он работает асинхронно, без таймера и отвечает в нужные теги. Пишите кому нужно.
просим выложить, для сравнения
22.06.2018 в 10:50 #9723RomirosУчастникManjey бросил исходники Вам на почту. Можете выложить dll в общий доступ для всех? Она там скомпилирована. Пусть народ потестит.
Тайм-аут в настройках КП соответствует ожиданию ответа Ping.22.06.2018 в 13:21 #9724manjey73Участникhttps://cloud.mail.ru/public/Gotv/pqpo5p398
Глянул мельком, я так понимаю тоже не допилена, какие-то кусочки от snmp, еще что-то…
Мне для теста нужно будет Raspberry притащить, на ней больше всего проблем с зависонами были…22.06.2018 в 14:08 #9725RomirosУчастникДа фразы я точно не менял. Может ещё что. У меня заработала стабильно, я на этом и остановился. Просто если востребована такая библиотека, можно допилить нормально. Я думал только я использую, на форуме никто не спрашивал.
22.06.2018 в 14:30 #9726manjey73УчастникДа спрашивали, даже на скорую руку что-то лепили… В какой теме не помню.
Мне тоже нужно было пинговать компы, по сути тоже лепил на скорую руку, в том числе и костыль делал 🙂22.06.2018 в 18:04 #9727baurУчастникОстановился на добавлении входящего канала, там импорт не идет.
22.06.2018 в 19:57 #9729MikhailМодераторЛучше всего выкладывайте на GitHib. Тогда я смогу добавить драйвер в список доступных модулей. Примеры как выкладывать, можно найти в этом списке. Судя по всему, востребованный драйвер.
23.06.2018 в 10:28 #9733gordecУчастникИтак, кп сейчас работает без сбоев. Но появилось больше вопросов чем ответов. У меня в коммуникаторе в настройках кп был установлен канал связи UDP, читая где-то выше я так понял нужно было вообще оставить канал связи пустым — но в таком варианте моя кп даже не заводится, пишет ошибка соединения. В итоге установил канал связи «Последовательный порт» и все проблемы исчезли, во всяком случае сутки полет нормальный, тогда как ранее служба работала не более 6-7 часов. Но я не понимаю, какое отношение имеет канал связи к моей библиотеке ? что это ?
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.