Стартовая страница › Форумы › Ошибки в работе › Ошибки Сервера › Переподключение коммуникатора.
- В этой теме 9 ответов, 4 участника, последнее обновление 11 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
05.04.2025 в 20:50 #37975
OlegУчастникДоброго времени суток.
Столкнулись с проблемой — каждые 20…40 секунд пропадает свзять между сервером и коммуникатором. Копится очередь данных до 100..300, потом происходит переподключение, коммуникатор передает данные и нормально работает 20..40 секунд, далее все повторяется. Ошибки на скриншотах. Порты проверяли, ничем не занято.На другой порт перешли с 10000 на 10007 — не помогло.
Выяснили, что ошибка происходит если активен канал, у которого вызывается формула. Формула делает две вещи:
копирует текстовый файл с сетевого диска на локальный; извлекает цифру из скопированного текстового файла.
Ошибка, как потом поняли, стала проявляться после того, как выключили удаленный компьютер, на котором и была расшарена папка как удаленный диск. В формуле конечно исключения не обрабатывались. Потом добавили обработку — если исключение, то пишем в канал например -1. Исключение обрабатывается, но отвал коммуникатор/сервер никуда не ушли. Если подключить сетевой диск обратно — все хорошо. В чем может быть проблема?Формулу уже доработали костылем — проверяем пинг компютера (если выключен, выходим).
Скриншоты ниже:https://disk.yandex.ru/i/nEDb-q6n7A7GWQ
https://disk.yandex.ru/i/2gAc1GqHlnMb1g
05.04.2025 в 23:22 #37976
JurasskParkУчастникРади интереса…
https://rapidscada.net/store/Module/ru/DrvParserTextJP
Попробуйте читать значение через драйвер, там 30 тегов и 1 задача без лицензии работает.05.04.2025 в 23:48 #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. Сразу отдавать ответ05.04.2025 в 23:58 #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 разные, то на одной машине может быть запятая, а на другой точка…06.04.2025 в 08:44 #37979
manjey73УчастникУ вас файл пишется некоторое время, даже на том же диске, где система.
Формулы выполняются в цикле, ну начиная так от 10 раз в секунду при маленьком проекте.06.04.2025 в 10:36 #37980
OlegУчастникРади интереса…
https://rapidscada.net/store/Module/ru/DrvParserTextJP
Попробуйте читать значение через драйвер, там 30 тегов и 1 задача без лицензии работает.Спасибо, попробую)
06.04.2025 в 11:05 #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] Нормальная работа невозможна06.04.2025 в 13:39 #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; } }06.04.2025 в 18:16 #37983
JurasskParkУчастникКстати, медленная проверка доступности каталога, может действительно будет принята серверов за зависание и его перегружать?
Но тут только Михаил скажет есть такая проверка или нет.07.04.2025 в 12:00 #37985
MikhailМодераторДобрый день!
В формулах должны быть только расчёты. Работа с внешними источниками данных — только в драйверах и модулях. Если вычисление формулы работает не мгновенно, а с файлами именно так и получается, то работа Сервера будет блокироваться. -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.
