Стартовая страница › Форумы › Понять, как работает ПО › Архив
- В этой теме 23 ответа, 4 участника, последнее обновление 5 лет, 11 месяцев назад сделано
vg.
-
АвторЗаписи
-
04.06.2020 в 15:22 #16354
vg
УчастникЗдравствуйте, есть несколько вопросов по архивации в Rapid SCADA.
1) Как оценить примерный объём архива за некоторый срок (возможно понадобится архивация посекундных данных)? Могу ли я взять за основу, что запись для одного канала занимает 16 байт(номер канала — int 4 байта, значение канала — double 8 байт, статус канала — int 4 байта) и просто перемножить размер записи, количество каналов и время в секундах?
2) Если закончится место на диске или съёмном носителе, что тогда? Данные будут перетираться по принципу FIFO?
3) Иногда требуется запись прореженных данных в архив . То есть записывать в архив усреднённые данные по каналу за какой то интервал времени(раз в 5/10/15/20/30 и т.д. минут).
Размышляю в таком ключе:
Интервал записи часовых данных могу настроить под нужную периодичность минут в конфигурационном файле сервера.
Расчёт такого среднего могу осуществить с помощью формулы TimeAvg.
Затем написать формулу IntervalBeg() для своего интервала по аналогии со стандартной HourBeg() для проверки начала нового интервала.
Далее использовать формулу типа IntervalBeg()?TimeAvg(параметры):0 в канале «Минутный ТИ».
Попадёт ли такое значение канала в архив «часовых(нужных интервальных) данных»? Или возможны потери данных?4) Можно ли на Графиках ПРО отобразить архивные часовые данные? Подмену файлов .dat в папках архива не ест.
04.06.2020 в 15:43 #16355
manjey73Участникhttps://cloud.mail.ru/public/4tqk/3k5A5UWM6
Когда то давно Михаил поделился файлом для подсчета размера2) настраивается в Scada сколько хранить
3) из кода драйверов можно, вероятно модулей, возможно через API
4) Графики Про показывают архивные цветом (зеленый по умолчанию) в поле информации.
з.ы. для некоторых каналов не хватает построения графика по точкам. Может со временем появится. Мне пришлось заполнять, чтобы график как то выглядел адекватно пока…
Или попробовать графаной строить график. построение графика04.06.2020 в 15:59 #16356vg
Участник2) Верно, но там в сутках хранения настройка, а не в максимальном размере архива. То есть превышение размера носителя в теории возможно.
manjey73, большое спасибо за ответ.
04.06.2020 в 17:24 #16357
MikhailМодераторДобрый день!
Нужно рассчитать период хранения архивов таким образом, чтобы место не закончилось. То есть чтобы старые файлы своевременно удалялись автоматически. Размер файла архива за сутки фиксированный, если каналы не добавлялись — всё предсказуемо.
Если места на диске не хватит, то новые данные не смогут записаться.3) Сервер в любом случае пишет в архив с тем периодом, который установлен в настройках. При наступлении нового часа (нового интервала) в архив попадает то значение, которое есть на этот момент в текущих данных.
4) График строится по минутному архиву. Если подменить файл на часовой, то можно будет разглядеть точки на графике.
04.06.2020 в 18:05 #16358vg
УчастникБлагодарю.
11.08.2020 в 15:45 #16971vg
УчастникЗдравствуйте!
Пытаюсь разобраться в работе с архивами. В частности интересует архив событий.
По этой ссылке рассказано как получить доступ к данным:
https://rapidscada.ru/integration-with-rapid-scada/Но в логе ScadaServerSvc появляется ошибка:
Ошибка при компилировании исходного кода формул:
Строка 1295, колонка 13: error CS0012: Тип «System.Data.DataTable» определен в сборке, ссылка на которую отсутствует. Следует добавить ссылку на сборку «System.Data…»Ругается на метод Fill().
Если я правильно понял, то нужно добавить ссылку на файл ScadaData.dll, находящийся по адресу C:\SCADA\ScadaServer.
Собственно не понимаю как добавить ссылку в этот движок когда в обозревателе решений Visual Studio есть только одна строка — Решение.
https://pastenow.ru/313362a5f674162cf379d987bed259a7Там можно добавить существующий проект, но среди доступных расширений нет .dll
-
Ответ изменён 5 лет, 11 месяцев назад пользователем
vg.
12.08.2020 в 16:42 #16978
MikhailМодераторДобрый день!
Внутри формул доступны не все классы и методы. Вам нужно разработать модуль для SCADA-Сервера. Это отдельная DLL. Посмотрите исходный код существующих модулей.27.08.2020 в 17:50 #17088vg
УчастникБлагодарю за разъяснение!
Проконсультируйте пожалуйста по разработке модулей.
Пытаюсь следовать рекомендациям с Вашего сайта. Классы SrezTable и т.д. доступны, а вот сделать мои классы наследником от ModLogic и ModView не удаётся.
P.S.
Если мне не нужен интерфейс модуля могу ли я оставить класс View пустым?
-
Ответ изменён 5 лет, 11 месяцев назад пользователем
vg.
27.08.2020 в 17:57 #17090vg
УчастникP.S.S.
Мне нужен доступ только к моим функциям в созданной библиотеке.
27.08.2020 в 18:19 #17091vg
УчастникВ модулях при активации увидел ошибку:
Ошибка при создании экземпляра класса интерфейса модуля ModArchTestView: Не удалось привести тип объекта «Scada.Server.Modules.ModArchTestView» к типу «Scada.Server.Modules.ModView».
Значит нужны оба класса, но каким боком получить доступ к родительским классам не понимаю.
27.08.2020 в 20:10 #17092vg
УчастникСкачал Ваш пример выложенный на GitHub, в нём разумеется конфликтов нет, хотя даже при обновлении ссылок на библиотеки (Log и ScadaServerCommon) я всё равно не видел классов ModLogic и ModView. А по идее они лежат именно в ScadaServerCommon.dll, если я правильно понял.
Добавил свой метод, собрал решение, закинул в папку ScadaServer/Mod. Всё прекрасно активируется. Но собственно как теперь вызвать нужный мне метод?)
ё
В моём случае интересует отработка методов по нажатию кнопки, то есть мне нужен метод:public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)
По приёму команды ТУ.
Но ведь движок всё равно не увидит этот метод, так как он не видит Scada.Server.Modules, а следовательно и не увидит класса ModTestLogic.
Движок видит только Scada.Server.EngineОчевидно, что я чего то не понимаю, но не понимаю что именно).
P.S.
Извиняюсь за флуд выше28.08.2020 в 07:53 #17095Romiros
УчастникМодули для Scada-сервера создаются для более сложной обработки данных (сложныевычисления, экспорт, анализ и т.д.). Из формул конечно можно передать данные в модуль для расчета, но только не напрямую, а через какой-нибудь канал управления. Проще всю эту логику вести в самом модуле. Настроили в нем нужные входные каналы, провели расчет и записали в нужные каналы.
А если Вам нужно расширить функционал формул, то возможно лучше идти путем написания своего cs файла по такому принципу: https://github.com/RapidScada/scada-community/blob/master/Formulas/BasicFormulas/Avg.cs
28.08.2020 в 19:13 #17099
MikhailМодераторМетод Вашего модуля OnCommandReceived должен вызываться Сервером автоматически при получении команды ТУ, если модуль подключен в конфигурации Сервера.
У Вас на данный момент модуль нормально подключается?
28.08.2020 в 19:22 #17102vg
УчастникRomiros, спасибо за ответ!
Mikhail, да, в описании отображается сообщение:
«Серверный модуль для тестирования.»Немного растерялся в дальнейшей реализации.
Если Вас не затруднит, можете пояснить передаваемые параметры в этот метод?public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)
int ctrlCnlNum — это номер канала, на который будет реагировать сервер?
Command cmd — это какой то тип передаваемой команды по аналогии со «Стандартный», «Бинарный»?
bool passToClients — какой то пароль для клиентов, не понимаю о чём речь.P.S.
И даже поняв как настроить эти параметры, я не понимаю каким образом сервер будет подхватывать входные каналы из Rapid Scada.
-
Ответ изменён 5 лет, 11 месяцев назад пользователем
vg.
28.08.2020 в 19:33 #17104vg
УчастникМожет быть я просто должен ставить условия по передаваемым параметрам вроде этого?
public SrezTableLight Table { get; set; } public const string Path = "какой то путь"; public SrezTableLight ReadValue(SrezTableLight snapshotTable) { snapshotTable = new SrezTableLight(); SrezAdapter adapter = new SrezAdapter(); adapter.FileName = @"C:\SCADA\ArchiveDAT\Cur\current.dat"; adapter.Fill(snapshotTable); return snapshotTable; } public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients) { // the method executes when a command has been received // метод выполняется после приёма команды ТУ if(ctrlCnlNum == 10) { ReadValue(Table); File.Create(Path).Close(); using (StreamWriter sw = new StreamWriter(Path, false, System.Text.Encoding.Default)) { for (int i = 0; i < Table.SrezList.Count; i++) { sw.WriteLine(Table.SrezList.Values[i].ToString()); } } } WriteToLog("Process command by the module " + Name, Log.ActTypes.Action); } -
Ответ изменён 5 лет, 11 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.