Переподключение коммуникатора.

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

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

    Доброго времени суток.
    Столкнулись с проблемой — каждые 20…40 секунд пропадает свзять между сервером и коммуникатором. Копится очередь данных до 100..300, потом происходит переподключение, коммуникатор передает данные и нормально работает 20..40 секунд, далее все повторяется. Ошибки на скриншотах. Порты проверяли, ничем не занято.На другой порт перешли с 10000 на 10007 — не помогло.
    Выяснили, что ошибка происходит если активен канал, у которого вызывается формула. Формула делает две вещи:
    копирует текстовый файл с сетевого диска на локальный; извлекает цифру из скопированного текстового файла.
    Ошибка, как потом поняли, стала проявляться после того, как выключили удаленный компьютер, на котором и была расшарена папка как удаленный диск. В формуле конечно исключения не обрабатывались. Потом добавили обработку — если исключение, то пишем в канал например -1. Исключение обрабатывается, но отвал коммуникатор/сервер никуда не ушли. Если подключить сетевой диск обратно — все хорошо. В чем может быть проблема?

    Формулу уже доработали костылем — проверяем пинг компютера (если выключен, выходим).
    Скриншоты ниже:

    https://disk.yandex.ru/i/nEDb-q6n7A7GWQ

    https://disk.yandex.ru/i/2gAc1GqHlnMb1g

    https://disk.yandex.ru/i/vPnT5Ls3nDWqmw

    https://disk.yandex.ru/i/YW_QPDjH9doHTw

    #37976
    JurasskPark
    Участник

    Ради интереса…
    https://rapidscada.net/store/Module/ru/DrvParserTextJP
    Попробуйте читать значение через драйвер, там 30 тегов и 1 задача без лицензии работает.

    #37977
    JurasskPark
    Участник
    
    public double CVD_QR_Progess(int PC)
    {
        double ret = 0;
        if(Val(PC) != 0)
        {
            string pathSource = @"\\network\progress.txt";
            string pathNew    = @"C:\temp\file_copy.txt";
            
            File.Delete(pathNew);
            
            try
            {
                File.Copy(pathSource, pathNew, true);
            }
            catch
            {
                return ret = -0.1;
            }
            
            try
            {
                if(File.Exists(pathNew))
                {
                    string lastline = File.ReadLines(pathNew).Last();
                    return ret             = Convert.ToDouble(lastline);  
                }       
            }
            catch
            {
                return ret = -0.2;
            }
        }
        else
        {
           return ret = -0.3; 
        }
        
       return ret;
    }
    

    1. Удалять файл копирования перед чтением нового файла
    2. Проверять на наличие перед чтением
    3. Сразу отдавать ответ

    #37978
    JurasskPark
    Участник
    
    public double CVD_QR_Progess(int PC)
    {
        double ret = 0;
        if(Val(PC) != 0)
        {
            string pathSource = @"\\network\progress.txt";
            string pathNew    = @"C:\temp\file_copy.txt";
            
            File.Delete(pathNew);
            
            try
            {
                File.Copy(pathSource, pathNew, true);
            }
            catch
            {
                return ret = -0.1;
            }
            
            try
            {
                if(File.Exists(pathNew))
                {
                    string lastline = File.ReadLines(pathNew).Last();
                    string s        = lastline.Replace(",", ".").Trim();
                    return ret      = Convert.ToDouble(s); 
                }       
            }
            catch
            {
                return ret = -0.2;
            }
        }
        else
        {
           return ret = -0.3; 
        }
        
       return ret;
    }
    

    Или даже заменять запятую на точку, в зависимости от языковых настроек.
    Кстати, если PC разные, то на одной машине может быть запятая, а на другой точка…

    #37979
    manjey73
    Участник

    У вас файл пишется некоторое время, даже на том же диске, где система.
    Формулы выполняются в цикле, ну начиная так от 10 раз в секунду при маленьком проекте.

    #37980
    Oleg
    Участник

    Ради интереса…
    https://rapidscada.net/store/Module/ru/DrvParserTextJP
    Попробуйте читать значение через драйвер, там 30 тегов и 1 задача без лицензии работает.

    Спасибо, попробую)

    #37981
    Oleg
    Участник

    Спасибо за советы, попробую. Но проблема я так понимаю не в том, что скада не успевает. Проблема в том, что даже вот с такой формулой, если отключит сетевой диск, передача данных сервер<->коммуникатор подвисает. Если подключить диск обратно — все хорошо. Файл то текстовый там пару килобайт, сеть гигабит, все в локальной сети.

    public double CVA_QR_Progress()
    {
    double ret = 0;
    string pathSource = @»\\10.1.1.1\Progress\progress.txt»;
    string pathNew = @»E:\QR_CVA_Progress_Local_Copy.txt»;
    try
    {
    File.Copy(pathSource, pathNew, true);
    }
    catch
    {
    return ret = -1;
    }
    try
    {
    string lastLine = File.ReadLines(pathNew).Last();
    ret = Convert.ToDouble(lastLine);
    }
    catch
    {
    return ret = -2;
    }
    return ret;
    }

    Кстати, может кто писал формулу для определения доступности диска?
    Я пробовал через свойство DriveInfo.IsReady. Не работает. Если просто получить данные о дисках, например формулой ниже — нет прав. Так это можно было бы использовать, чтобы мониторить периодически не только доступность диска, но и свободное место на диске с архивами..

    Формула, без дальнейших действий:

    public double CVA_QR_Progress()

    {

    System.IO.FileSystem.DriveInfo[] drives = System.IO.FileSystem.DriveInfo.GetDrives();

    return 0;
    }

    Ошибка:

    2025-04-06 11:03:03 [T490][T490$][ERR] Ошибка при компиляции исходного кода скриптов и формул:
    (807,11): error CS0122: ‘FileSystem’ is inaccessible due to its protection level
    (807,53): error CS0122: ‘FileSystem’ is inaccessible due to its protection level
    Проверьте исходный код в файле C:\Program Files\SCADA\ScadaServer\Log\CalcEngine.cs
    2025-04-06 11:03:03 [T490][T490$][ERR] Нормальная работа невозможна

    #37982
    JurasskPark
    Участник
    
           public double CVA_QR_Progress()
           {
                double ret = 0;
                string networkPath = @"\\SERVER\SharedFolder"; // Укажите сетевой путь к каталогу
    
            if (IsNetworkDirectoryAvailable(networkPath))
            {
                Console.WriteLine("Сетевой каталог доступен.");
                return ret = 1;
            }
            else
            {
                Console.WriteLine("Сетевой каталог недоступен.");
                return ret = -1;
            }
        }
    
        static bool IsNetworkDirectoryAvailable(string path)
        {
            try
            {
                // Проверяем, существует ли каталог и доступен ли он для чтения
                return Directory.Exists(path);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при проверке каталога: {ex.Message}");
                return false;
            }
        }
    

    001

    #37983
    JurasskPark
    Участник

    Кстати, медленная проверка доступности каталога, может действительно будет принята серверов за зависание и его перегружать?
    Но тут только Михаил скажет есть такая проверка или нет.

    #37985
    Mikhail
    Модератор

    Добрый день!
    В формулах должны быть только расчёты. Работа с внешними источниками данных — только в драйверах и модулях. Если вычисление формулы работает не мгновенно, а с файлами именно так и получается, то работа Сервера будет блокироваться.

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)
  • Для ответа в этой теме необходимо авторизоваться.