Периодически останавливается служба коммуникатора

Стартовая страница Форумы Ошибки в работе Ошибки Коммуникатора Периодически останавливается служба коммуникатора

Просмотр 15 сообщений - с 1 по 15 (из 17 всего)
  • Автор
    Сообщения
  • #9696
    Аватарgordec
    Участник

    Добрый день, помогите пожалуйста найти причину ошибки. Периодически останавливается служба коммуникатора. Библиотека кп связывается с устройствами и отдает правильные данные температур, через несколько часов исправной работы коммуникатора в логах появляется такое:
    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();
            }
    #9697
    Аватарmanjey73
    Участник

    Когда делал драйвер Ping то столкнулся с проблемой.
    1. не удобно использовать async так как пришлось бы отлавливать какой ПК вернул ответ и как-то правильно формировать теги
    2. у Ping тоже есть свой Timeout и он ну очень плохо жил с Timeout Коммуникатора.

    В итоге сделал в коде таймер, который меньше Timeout-а Коммуникатора и запросы ping шли в пределах данного таймера.
    Например имеем 20 ПК, за первый опрос драйвер успел опросить 7 ПК (например большой ping) на следующем вызове ping выполнялся с 8-ого ПК и так по кругу в пределах установленного таймера.

    Может и тут такая же песня, да еще и ошибку выдает ? У меня вроде не было ошибок, просто зависал опрос и все…

    #9701
    baurbaur
    Участник

    Добрый день,
    драйвер Ping опубликован? можно получить экземпляр?

    #9702
    Аватарmanjey73
    Участник

    https://cloud.mail.ru/public/D3Mg/hrDAkWK9s

    исходники…
    Он далеко не допиленный, но принцип таймера думаю будет понятен.
    Список IP в файле listip.txt

    Допиливать некогда немного…

    • Этот ответ был изменен 2 года, 10 месяцев назад от Аватарmanjey73.
    #9706
    MikhailMikhail
    Модератор

    Добрый день!

    Ошибка происходит не в потоке линии связи, а в отдельном потоке. Т.к. она не отлавливается, служба Коммуникатора падает полностью. В первую очередь нужно понять в каком потоке происходит исключение. Затем подумать, можно ли в этом потоке поставить try catch или как-то ещё поймать и обработать ошибку. Вы создаёте какие-нибудь потоки, которых не видно в приведенном коде?

    #9717
    АватарRomiros
    Участник

    Походу многие писали драйвер ping :). Но у меня он работает асинхронно, без таймера и отвечает в нужные теги. Пишите кому нужно.

    #9718
    Аватарmanjey73
    Участник

    Romiros, так выложили бы 🙂 у меня на примерно 50 компах зависал, когда пытался сделать асинхронный запрос или через поток

    #9722
    baurbaur
    Участник

    исходники…
    Он далеко не допиленный, но принцип таймера думаю будет понятен.
    Список IP в файле listip.txt

    спасибо, скачал

    Походу многие писали драйвер ping :). Но у меня он работает асинхронно, без таймера и отвечает в нужные теги. Пишите кому нужно.

    просим выложить, для сравнения

    #9723
    АватарRomiros
    Участник

    Manjey бросил исходники Вам на почту. Можете выложить dll в общий доступ для всех? Она там скомпилирована. Пусть народ потестит.
    Тайм-аут в настройках КП соответствует ожиданию ответа Ping.

    #9724
    Аватарmanjey73
    Участник

    https://cloud.mail.ru/public/Gotv/pqpo5p398

    Глянул мельком, я так понимаю тоже не допилена, какие-то кусочки от snmp, еще что-то…
    Мне для теста нужно будет Raspberry притащить, на ней больше всего проблем с зависонами были…

    #9725
    АватарRomiros
    Участник

    Да фразы я точно не менял. Может ещё что. У меня заработала стабильно, я на этом и остановился. Просто если востребована такая библиотека, можно допилить нормально. Я думал только я использую, на форуме никто не спрашивал.

    #9726
    Аватарmanjey73
    Участник

    Да спрашивали, даже на скорую руку что-то лепили… В какой теме не помню.
    Мне тоже нужно было пинговать компы, по сути тоже лепил на скорую руку, в том числе и костыль делал 🙂

    #9727
    baurbaur
    Участник

    Остановился на добавлении входящего канала, там импорт не идет.

    #9729
    MikhailMikhail
    Модератор

    Лучше всего выкладывайте на GitHib. Тогда я смогу добавить драйвер в список доступных модулей. Примеры как выкладывать, можно найти в этом списке. Судя по всему, востребованный драйвер.

    #9733
    Аватарgordec
    Участник

    Итак, кп сейчас работает без сбоев. Но появилось больше вопросов чем ответов. У меня в коммуникаторе в настройках кп был установлен канал связи UDP, читая где-то выше я так понял нужно было вообще оставить канал связи пустым — но в таком варианте моя кп даже не заводится, пишет ошибка соединения. В итоге установил канал связи «Последовательный порт» и все проблемы исчезли, во всяком случае сутки полет нормальный, тогда как ранее служба работала не более 6-7 часов. Но я не понимаю, какое отношение имеет канал связи к моей библиотеке ? что это ?

Просмотр 15 сообщений - с 1 по 15 (из 17 всего)
  • Вы должны авторизироваться для ответа в этой теме.