Объявление

Свернуть
Пока нет объявлений.

Механизм работы с Retain-переменными в ПЛК-40

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • #16
    Я имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
    В Ваш код добавил строку
    Код:
    (* ==== Вызов блока для работы с retain переменными ==== *)
         RetainFB(destination := EnStorageDevice.DevSysFS);
    
         CountR := RetainFB.AttemptSaveCounter;
    После включения счетчик показывает 1.

    Нажмите на изображение для увеличения. 

Название:	Retain6.jpg 
Просмотров:	501 
Размер:	7.8 Кб 
ID:	215

    Комментарий


    • #17
      Сообщение от Юрий Посмотреть сообщение
      Я имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
      В Ваш код добавил строку
      Код:
      (* ==== Вызов блока для работы с retain переменными ==== *)
      RetainFB(destination := EnStorageDevice.DevSysFS);
      
      CountR := RetainFB.AttemptSaveCounter;
      После включения счетчик показывает 1.

      Нажмите на изображение для увеличения. 

Название:	Retain6.jpg 
Просмотров:	501 
Размер:	7.8 Кб 
ID:	215
      Все верно, а Вы когда будете переменные изменять у Вас запись происходить не будет?
      или у вас ПЛК будет выключаться и включаться с периодичностью в 1с?

      тип памяти установленной в ПЛК - 40 eMMC которая имеет не малый ресурс, при условии что писать Вы туда будет не чаще 1 минуты.

      Если переживаете за внутреннюю eMMС, то тогда пишите retain на SD карту.
      RetainFB(destination := EnStorageDevice.DevSD)

      Комментарий


      • #18
        Сообщение от Юрий Посмотреть сообщение

        Спасибо за рекомендации.
        В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
        При хранении retain на внутренней eMMC количество циклов записи весьма значительное (зависит от размера свободного пространства) и составляет более 10 000 циклов. При хранении переменных на SD-карте количество циклов перезаписи опеределяется качеством и объемом SD-карты. Так же в ПЛК-40 имеется возможность хранения retain в области FRAM, ресурс которой практически не ограничен (миллион и более циклов).

        Комментарий


        • #19
          Все верно, а Вы когда будете переменные изменять у Вас запись происходить не будет?
          Переменные изменяются редко, чаще всего при наладке оборудования.

          Так же в ПЛК-40 имеется возможность хранения retain в области FRAM, ресурс которой практически не ограничен (миллион и более циклов).
          Про эту возможность нельзя ли поподробней.
          Последний раз редактировалось Юрий; 29-03-2019, 07:22 AM.

          Комментарий


          • #20
            FRAM доступен по адресу /sys/bus/i2c/devices/0-0050/fram. Размер FRAM - 8 кб.

            Комментарий


            • #21
              FRAM доступен по адресу /sys/bus/i2c/devices/0-0050/fram. Размер FRAM - 8 кб.
              Все равно непонятно.

              И все же напрашивается некоторая доработка блока TRetainStorage, чтобы он сам записывал переменные после загрузки программы.
              Всем спасибо. Будем считать, что вопрос закрыт.

              Комментарий


              • #22
                (* ==== При первом старте плк, инициализируем файл Retain значениями из области определения var global retain ==== *)

                if bFirstCycle then

                RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.

                bFirstCycle := false;

                end_if

                (* ==== Вызов блока для работы с retain переменными ==== *)

                RetainFB(destination := EnStorageDevice.DevSysFS);

                Проблема с ненужной перезаписью переменных решилась очень просто. Определение ключа принудительной записи необходимо поместить в область Retain-переменных.

                Код:
                VAR RETAIN
                     bFirstCycle : BOOL := true;
                END_VAR
                В операторе IF строки поменять местами.

                Код:
                if bFirstCycle then
                
                bFirstCycle := false;
                
                RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.
                
                end_if
                
                (* ==== Вызов блока для работы с retain переменными ==== *)
                
                RetainFB(destination := EnStorageDevice.DevSysFS);

                Комментарий


                • #23
                  Сообщение от Таушканов Константин Посмотреть сообщение
                  Пояснение механизма работы с Retain-переменными в ПЛК-40: в какой момент происходит запись (при пропадании питания, программно или еще как-нибудь), куда именно они сохраняются. Пояснение про "период сохранения" в TRetainStorage.

                  Запись области retain происходит программно, с использованием вызова тела экземпляра блока TRetainStorage. Этот фукциональный блок использует таймер, который сохраняет retain переменные либо во внутреннюю память, либо на uSD карту. Пути (взяты из исходников фукционального блока):
                  PATH_FS: string := '/usr/bin/codesys/PlcLogic/Retain.ret';
                  PATH_MMC: string := '/run/media/mmcblk0p1/Retain.ret';

                  Для работы необходимо указать место хранения retain переменных (EnStorageDevice.DevSysFS - файловая система, EnStorageDevice.DevSD - sd карта, период сохранения (рекомендуется от 1 минуты)).

                  Для сохранения переменных можно использовать встроенный таймер, указывая период сохранения. Для этого нужно постоянно вызывать тело фукционального блока, чтобы таймер работал. Либо можно использовать параметр ForceSave для принудительного сохранения.

                  Длительность процедуры записи переменных на накопитель может составлять от единиц до десятков мсек. Это зависит от загруженности ОС Linux, runtime Codesys и от того как используется блок TRetainStorage в программе.
                  Здравствуйте!
                  Могли бы вы, предоставить пример работы с Retain-переменными на ПЛК АГАВА 40? В данной беседе размещен только один пример, который можно скачать и посмотреть, и он является, согласно беседе, не полностью работоспособным.
                  Приоритет у задачи Retain переменных должен быть выше или ниже задачи MainTask, или может быть одинаковым?

                  Комментарий


                  • #24
                    Сообщение от Никадим Посмотреть сообщение

                    Здравствуйте!
                    Могли бы вы, предоставить пример работы с Retain-переменными на ПЛК АГАВА 40? В данной беседе размещен только один пример, который можно скачать и посмотреть, и он является, согласно беседе, не полностью работоспособным.
                    Приоритет у задачи Retain переменных должен быть выше или ниже задачи MainTask, или может быть одинаковым?
                    Добрый день, пример для работы с TRetainStorage представлен в SDK. Найти его можно по следующему пути.

                    Codesys_AgavaSDK_20210210_SP10\Примеры\AgavaPlc\ПЛ К-40\Retain.project

                    в примере показано как работать с FRAM памятью и Retain переменными.

                    Сохранение в памяти FRAM(ограничение по сохранению 8кб, включая контрольную сумму, данные превышающие размер сохранения,
                    сохранены не будут, при этом блок TRetainStorage на выходе RTSIECResult выдаст код ошибки 51 - ERR_NO_RETAIN_MEMORY).
                    FRAM Имеет огромный ресурс и отличается быстрой записью. Позволяет писать динамические, часто
                    изменяемые значения, например: наработку оборудования.

                    Для использования энергонезависимых переменных(FRAM) их следуют объявлять в проекте как "PersistentVars".


                    Входные значения блока TRetainStorage:

                    Destination - Место хранения Retain-переменных. Необходимо выбрать из перечисления EnStorageDevice область сохранения данных.

                    1. EnStorageDevice.DevFRAM - энергонезависимая память FRAM(8кб).

                    2. EnStorageDevice.DevSD - сохранение в файл Retain, место хранения файла - SD карта ПКЛ-40\50.

                    3. EnStorageDevice.DevSysFS - сохранение в файл Retain, место хранения emmc ПЛК-40\50.

                    SaveFilterTime - Период сохранения, c.

                    Данный входной параметр, служит для экономии ресурса накопителя(emmc,eeprom), обеспечивает период сохранения данных, предотвращает постоянную запись во
                    внутреннею память ПКЛ-40\50, тем самым продлевает срок эксплуатации накопителя emmc(Накопитель emmc имеет ограниченный ресурс записи, об этом стоит помнить
                    при разработке ПО. Если стоит необходимость частого сохранения retain данных, чаще чем 1 раз в 10 минут, то для этих целей необходимо использовать FRAM.

                    Если для хранения используется FRAM , то период сохранения(SaveFilterTime) можно установить - 0с.

                    Все переменные объявленные в области PersistentVars(FRAM) и Retain(Retain.ret) записываются в память FRAM или файл Retain.ret по изменению своего значения.
                    SaveFilterTime лишь задает время сохранения измененной переменной или переменных, и защищает от постоянной записи в накопитель.

                    Например: идет изменение переменной в области памяти Retain в каждом цикле программы блок TRetainStorage отслеживает такое изменение и производит запись в файл либо в FRAM данных объявленных в соответствующих областях памяти. SaveFilterTime - период времени через который будет выполнена следующая запись в файл или накопитель FRAM, таким образом запись будет не в каждом цикле программы , а через период времени указанный в SaveFilterTime.

                    AttemptSaveCounter - Счетчик записей Retain-переменных на носитель.
                    Данный параметр отображает текущее количество сохранений на накопитель.

                    RTSIECResult - Код состояния блока TRetainStorage. Возвращает код ошибки работы блока. Описание кода ошибки можно увидеть в библиотеке CmpErrors.


                    ПРИМЕЧАНИЕ:

                    Блок TRetainStorage желательно объявить глобально и вызывать в отдельной задаче и программе.


                    Пример демонстрирующий работу TRetainStorage: Retain.zip

                    Для корректной работы примера необходимо установить версию библиотек AgavaLibraries.3.5.10.8 из Codesys_AgavaSDK_20210210_SP10 или новее.
                    Вложения
                    Последний раз редактировалось Пушкарев Андрей; 20-05-2021, 04:07 AM.

                    Комментарий


                    • #25
                      Спасибо за пояснения!
                      1. В примере не понятно следующая часть кода:
                      Код:
                      if clearFram then
                         clearFram := false;
                         SVRetain1.ClearFRAM(); // Метод очищает область памяти FRAM (а именно в эта строка)
                      end_if
                      Codesys выдает ошибку, что метод ClearFRAM не является частью блока TRetainStorage и в Менеджере библиотек у данного функционального блока отсутствуют методы.
                      Объясните пожалуйста.

                      2. Время выполнения задачи для блока TRetainStorage должно быть больше, меньше или всё равно, чем время SaveFilterTime?
                      Во вопрос в том, что будет если задать время задачи больше времени периода сохранения, и что будет если задать время задачи меньше времени периода сохранения?

                      3. Можете подсказать, что я сделал не так? При выключение питания через 5 минут и включении retain-переменные обнуляются.
                      Объявил ФБ TRetainStorage глобально, и так же переменные.
                      Добавил в основную программу PLC_PRG проверку первого цикла для сохранения
                      Отдельно сделал программу и задачу для ФБ TRetainStorage, период сохранения задал 120 с.

                      Вложения
                      Последний раз редактировалось Никадим; 19-05-2021, 04:30 PM.

                      Комментарий


                      • #26
                        Сообщение от Никадим Посмотреть сообщение
                        Спасибо за пояснения!
                        1. В примере не понятно следующая часть кода:
                        Код:
                        if clearFram then
                        clearFram := false;
                        SVRetain1.ClearFRAM(); // Метод очищает область памяти FRAM (а именно в эта строка)
                        end_if
                        Codesys выдает ошибку, что метод ClearFRAM не является частью блока TRetainStorage и в Менеджере библиотек у данного функционального блока отсутствуют методы.
                        Объясните пожалуйста.

                        2. Время выполнения задачи для блока TRetainStorage должно быть больше, меньше или всё равно, чем время SaveFilterTime?
                        Во вопрос в том, что будет если задать время задачи больше времени периода сохранения, и что будет если задать время задачи меньше времени периода сохранения?

                        3. Можете подсказать, что я сделал не так? При выключение питания через 5 минут и включении retain-переменные обнуляются.
                        Объявил ФБ TRetainStorage глобально, и так же переменные.
                        Добавил в основную программу PLC_PRG проверку первого цикла для сохранения
                        Отдельно сделал программу и задачу для ФБ TRetainStorage, период сохранения задал 120 с.
                        Если SVRetain1.ClearFRAM(); // метод у Вас отсутствует значит у Вас старая версия библиотек, скачайте и установите обновленные библиотеки.

                        2. Время выполнения задачи для блока TRetainStorage должно быть больше, меньше или всё равно, чем время SaveFilterTime?
                        Во вопрос в том, что будет если задать время задачи больше времени периода сохранения, и что будет если задать время задачи меньше времени периода сохранения?

                        Блок должен вызваться чаще чем SaveFilterTime, блок нужно вызывать в каждом цикле программы. Он отслеживает изменение в области Retain и по изменению производит запись данных из области в файл.

                        "Добавил в основную программу PLC_PRG проверку первого цикла для сохранения" - в новой версии биб-ки этого делать больше не нужно.

                        Устанавливаете новые биб-ки AgavaLibraries.3.5.10.8 , в свойствах библиотеки AgavaPlc выбираете версию 3.5.10.1 делаете заводской сброс ПЛК, далее загружаете тестовый проект.
                        Последний раз редактировалось Пушкарев Андрей; 20-05-2021, 04:10 AM.

                        Комментарий


                        • #27
                          Спасибо!
                          Я доставил библиотеку AgavaLibraries версии 3.5.10.8, но у меня так же стоит библиотека версии 3.5.14.10. И он выдает ошибку.
                          Правильно ли я понимаю, что библиотека версии 3.5.14.10 является старее, чем 3.5.10.8 и мне надо удалить версию 3.5.14.10?

                          Комментарий


                          • #28
                            Сообщение от Никадим Посмотреть сообщение
                            Спасибо!
                            Я доставил библиотеку AgavaLibraries версии 3.5.10.8, но у меня так же стоит библиотека версии 3.5.14.10. И он выдает ошибку.
                            Правильно ли я понимаю, что библиотека версии 3.5.14.10 является старее, чем 3.5.10.8 и мне надо удалить версию 3.5.14.10?
                            Да, все верно библиотека должна быть только одна AgavaLibraries версии 3.5.10.8

                            Комментарий

                            Обработка...
                            X