Стартовая страница › Форумы › Rapid SCADA на Linux-контроллерах и Raspberry Pi › Сохранение данных при перезагрузке Raspberry Pi
Помечено: retain
- В этой теме 34 ответа, 4 участника, последнее обновление 4 года, 10 месяцев назад сделано Mikhail.
-
АвторСообщения
-
04.08.2017 в 13:03 #6908djbond07Участник
Добрый день! Вопрос такой. При установке мы в /etc/fstab пишем строчку
tmpfs /etc/scada/ArchiveDAT/Cur tmpfs defaults,noatime,size=10m 0 0
Это позволяет не насиловать флешку, и писать текущий срез в RAM. В итоге когда малина перезагружается, мы теряем текущий срез. Нет проблем, если во входных каналах у нас просто логика прописана, но есть такие вещи, как наработка, счётчики всякие, значение которых не хотелось бы терять. Кто-нибудь сталкивался с подобным или пытался решить данную проблему?04.08.2017 в 13:11 #6909djbond07УчастникКак вариант сделать так, чтобы при отсутствии текущего среза при запуске системы, вместо него подставлялся бы последний минутный срез.
04.08.2017 в 21:04 #6911MikhailМодераторЗдесь на форуме manjey73 решал такую проблему. Насколько я помню, он сохраняет в файлы и потом загружает нужные значения.
А вообще было бы полезно написать модуль для SCADA-Сервера, который будет дружелюбным для пользователей и позволит выбрать, какие каналы сохранять в момент перезапуска.04.08.2017 в 21:05 #6912MikhailМодераторИдея с минутным срезом интересная.
04.08.2017 в 21:18 #6917manjey73УчастникLinux и дружелюбие пока несовместимы 🙂 настраивать через конфиги будет не удобно до тех пор, пока и в Linux не появится GUI для ScadaComm и ScadaServer/
моя формула Retain для конфигурационных переменных. Пишет файл при каждом изменении указанных переменных как Retain.
Для счетчиков она несколько непригодна так как так же будет убивать флешку.
Ее надо доработать так, чтобы она писала в tmpfs и каждую минуту писала в обычный файл, при запуске чтобы читался файл.07.08.2017 в 11:46 #6933djbond07УчастникДобрый день! Вопрос к manjey73 больше, по формуле Retain. Пытаюсь тестировать на Windows, в сервер пишет такие ошибки:
Строка 480, колонка 1: error CS0103: Имя «SetVal» отсутствует в текущем контексте
Строка 539, колонка 38: error CS0234: Имя типа или пространства имен «Linq» отсутствует в пространстве имен «System» (пропущена ссылка на сборку?)
SetVal Встречается в формуле Load_Retain
linq в формуле Save_Retain
Можете подсказать как пофиксить это?07.08.2017 в 11:55 #6935manjey73УчастникКакая версия у вас SCADA ? Возможно с этим связаны ошибки ?
В формуле Retain необходимо правильно указать путь к файлу, в Windows он будет отличаться, это необходимо для работы всех формул. В примере я вроде это указывал.
Вероятно ошибки связаны с этим.Хотя странно, у меня на Windows записан путь для Linux ПК и ошибок не вызывает при перезапуске Сервера.
07.08.2017 в 12:22 #6945djbond07УчастникЯ прописал путь так
string pathRet = @»e:\Retain\retain.txt»;
Не думаю, что дело в пути. В формуле C# явно ругань идёт на то, что переменную SetVal не объявили. Вот этак строчка из формулы LoadRetain:SetVal(Convert.ToInt32(RetLoad[i].Substring(RetLoad[i].IndexOf("[")+1, RetLoad[i].IndexOf(", ")-(RetLoad[i].IndexOf("[")+1)),10),Convert.ToDouble(RetLoad[i].Substring(RetLoad[i].IndexOf(", ")+2,RetLoad[i].IndexOf("]")-(RetLoad[i].IndexOf(", ")+2))));
А в случае с Linq, вот строчка в формуле SaveRet:
RetSave[i] = Convert.ToString(System.Linq.Enumerable.ElementAt(DictRet, i));
В принципе я даже примерно понимаю, что делать. В 1 случае как-то объявить переменную, SetVal. Или вообще убрать эту строчку из формулы, так как она скорей всего относится только к каналу управления (Вам виднее).
Во 2-м случае прописать Using Sustem.Linq; или как-то так. Но где это прописать? И опять же, Вы писали код, и может дело вообще в другом?
Посмотрите, пожалуйста, пост #6686, может Вы что-то потом меняли в формулах?07.08.2017 в 12:38 #6949manjey73УчастникSetVal — это функция RapidScada — ее не надо объявлять, в том то и дело.
Смотрите документацию Использование формулНа счет второй ошибки странно, пока в CalcEngine.cs нет явного указания
using System.Linq; — Михаил обещал добавить в следующих версиях, а так же добавить чуть больше символов на формулы, когда появится такая возможность.
Но можно вызывать напрямую, как и System.IO, однако на одно у вас ругается, а на второе нет…
Не могу сказать с чем это связано, возможно не установлены какие-то компоненты .NET ?Я выложил точную копию формул, которые на данный момент у меня работают на Raspberry
07.08.2017 в 12:43 #6953manjey73УчастникПроверьте правильность написания SetVal — при такой ошибке возможно не тот символ в записи, так компилятор может ругаться, если не совпадают имена встроенных функций с записью, тогда он считает что это новая переменная и она не объявлена.
09.08.2017 в 10:57 #6975MikhailМодераторSetVal можно увидеть в C:\SCADA\ScadaServer\Log\CalcEngine.cs
Linq скорее всего не получится вызвать, т.к. мало написать using System.Linq, нужно, чтобы была подключена соответствующая DLL.24.08.2017 в 12:30 #7107djbond07УчастникДобрый день! Хотелось бы вернуться к вопросу. Посмотрел в файл
C:\SCADA\ScadaServer\Log\CalcEngine.cs
И не нашёл там функции SetVal(). Искал и с помощью поиска, и просто посмотрел в начале, где все они объявляются, её нет. Есть только Val(), Stat() и математические всякие. Смотрел на SCADA 5.0.2 и на SCADA 5.2.1. (На 5.2.1 просто вставил базу sdf в скаду 5.0.2 и запустил, чтобы сгенерировать файл CalcEngine).
Что с этим делать? Может просто добавить вручную в блок формул данную формулу? Тогда нужен её текст. А вообще странно всё это.24.08.2017 в 14:01 #7108manjey73УчастникДанная формула в самой scada, а то, что вы видите в CalcEngine.cs просто в части предустановленных формул есть запись Val(), вот и все.
Просто в канале управления в формуле напишите SetVal(№ канала), поставьте галочку «Использовать формулу» и перезапустите сервер и вы таки найдете эту запись в CalcEngine.cs
SetVal() была доступна раньше, но появилась только на предыдущей версии scada для прямой записи в каналах управления. Раньше ее можно было использовать только внутри формул.
В документации на сайте смотрите Использование формул
24.08.2017 в 14:26 #7112djbond07УчастникПроверил по Вашему способу, только добавил формулу не в канал управления, а во входной канал. Записи не появилось, появилась только ещё одна ошибка.
Строка 497, колонка 56: error CS0103: Имя «SetVal» отсутствует в текущем контексте.
Ругань идёт как раз на использование функции, которая не объявлена.
На какой версии скады у Вас работает данная схема?- Этот ответ был изменен 6 лет, 7 месяцев назад от djbond07.
24.08.2017 в 14:44 #7114manjey73УчастникНа последней от 17.08 и предпоследней, которая была до нее.
Последняя лучше :), теперь email отправляются на русском.Прощу прощения, формула должна выглядеть так SetVal(int, double)
int — номер канала
double — значение
Например запись значения в нужный канал будет таким SetVal(105, Cmd) -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.