Сохранение данных при перезагрузке Raspberry Pi

Стартовая страница Форумы Rapid SCADA на Linux-контроллерах и Raspberry Pi Сохранение данных при перезагрузке Raspberry Pi

Помечено: 

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

    Добрый день! Вопрос такой. При установке мы в /etc/fstab пишем строчку
    tmpfs /etc/scada/ArchiveDAT/Cur tmpfs defaults,noatime,size=10m 0 0
    Это позволяет не насиловать флешку, и писать текущий срез в RAM. В итоге когда малина перезагружается, мы теряем текущий срез. Нет проблем, если во входных каналах у нас просто логика прописана, но есть такие вещи, как наработка, счётчики всякие, значение которых не хотелось бы терять. Кто-нибудь сталкивался с подобным или пытался решить данную проблему?

    #6909
    djbond07
    Участник

    Как вариант сделать так, чтобы при отсутствии текущего среза при запуске системы, вместо него подставлялся бы последний минутный срез.

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

    Здесь на форуме manjey73 решал такую проблему. Насколько я помню, он сохраняет в файлы и потом загружает нужные значения.
    А вообще было бы полезно написать модуль для SCADA-Сервера, который будет дружелюбным для пользователей и позволит выбрать, какие каналы сохранять в момент перезапуска.

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

    Идея с минутным срезом интересная.

    #6917
    manjey73
    Участник

    Linux и дружелюбие пока несовместимы 🙂 настраивать через конфиги будет не удобно до тех пор, пока и в Linux не появится GUI для ScadaComm и ScadaServer/

    моя формула Retain для конфигурационных переменных. Пишет файл при каждом изменении указанных переменных как Retain.
    Для счетчиков она несколько непригодна так как так же будет убивать флешку.
    Ее надо доработать так, чтобы она писала в tmpfs и каждую минуту писала в обычный файл, при запуске чтобы читался файл.

    #6933
    djbond07
    Участник

    Добрый день! Вопрос к manjey73 больше, по формуле Retain. Пытаюсь тестировать на Windows, в сервер пишет такие ошибки:
    Строка 480, колонка 1: error CS0103: Имя «SetVal» отсутствует в текущем контексте
    Строка 539, колонка 38: error CS0234: Имя типа или пространства имен «Linq» отсутствует в пространстве имен «System» (пропущена ссылка на сборку?)
    SetVal Встречается в формуле Load_Retain
    linq в формуле Save_Retain
    Можете подсказать как пофиксить это?

    #6935
    manjey73
    Участник

    Какая версия у вас SCADA ? Возможно с этим связаны ошибки ?

    В формуле Retain необходимо правильно указать путь к файлу, в Windows он будет отличаться, это необходимо для работы всех формул. В примере я вроде это указывал.
    Вероятно ошибки связаны с этим.

    Хотя странно, у меня на Windows записан путь для Linux ПК и ошибок не вызывает при перезапуске Сервера.

    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    #6945
    djbond07
    Участник

    Я прописал путь так
    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, может Вы что-то потом меняли в формулах?

    • Этот ответ был изменен 6 лет, 7 месяцев назад от djbond07.
    • Этот ответ был изменен 6 лет, 7 месяцев назад от djbond07.
    #6949
    manjey73
    Участник

    SetVal — это функция RapidScada — ее не надо объявлять, в том то и дело.
    Смотрите документацию Использование формул

    На счет второй ошибки странно, пока в CalcEngine.cs нет явного указания
    using System.Linq; — Михаил обещал добавить в следующих версиях, а так же добавить чуть больше символов на формулы, когда появится такая возможность.
    Но можно вызывать напрямую, как и System.IO, однако на одно у вас ругается, а на второе нет…
    Не могу сказать с чем это связано, возможно не установлены какие-то компоненты .NET ?

    Я выложил точную копию формул, которые на данный момент у меня работают на Raspberry

    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    #6953
    manjey73
    Участник

    Проверьте правильность написания SetVal — при такой ошибке возможно не тот символ в записи, так компилятор может ругаться, если не совпадают имена встроенных функций с записью, тогда он считает что это новая переменная и она не объявлена.

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

    SetVal можно увидеть в C:\SCADA\ScadaServer\Log\CalcEngine.cs
    Linq скорее всего не получится вызвать, т.к. мало написать using System.Linq, нужно, чтобы была подключена соответствующая DLL.

    #7107
    djbond07
    Участник

    Добрый день! Хотелось бы вернуться к вопросу. Посмотрел в файл
    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).
    Что с этим делать? Может просто добавить вручную в блок формул данную формулу? Тогда нужен её текст. А вообще странно всё это.

    #7108
    manjey73
    Участник

    Данная формула в самой scada, а то, что вы видите в CalcEngine.cs просто в части предустановленных формул есть запись Val(), вот и все.

    Просто в канале управления в формуле напишите SetVal(№ канала), поставьте галочку «Использовать формулу» и перезапустите сервер и вы таки найдете эту запись в CalcEngine.cs

    SetVal() была доступна раньше, но появилась только на предыдущей версии scada для прямой записи в каналах управления. Раньше ее можно было использовать только внутри формул.

    В документации на сайте смотрите Использование формул

    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    • Этот ответ был изменен 6 лет, 7 месяцев назад от manjey73.
    #7112
    djbond07
    Участник

    Проверил по Вашему способу, только добавил формулу не в канал управления, а во входной канал. Записи не появилось, появилась только ещё одна ошибка.

    Строка 497, колонка 56: error CS0103: Имя «SetVal» отсутствует в текущем контексте.

    Ругань идёт как раз на использование функции, которая не объявлена.
    На какой версии скады у Вас работает данная схема?

    • Этот ответ был изменен 6 лет, 7 месяцев назад от djbond07.
    #7114
    manjey73
    Участник

    На последней от 17.08 и предпоследней, которая была до нее.
    Последняя лучше :), теперь email отправляются на русском.

    Прощу прощения, формула должна выглядеть так SetVal(int, double)
    int — номер канала
    double — значение
    Например запись значения в нужный канал будет таким SetVal(105, Cmd)

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