Объявление

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

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

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

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

    Пояснение механизма работы с 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 в программе.

    Последний раз редактировалось Таушканов Константин; 20-12-2018, 12:30 PM.

  • #2
    Здравствуйте.
    На некоторых ПЛК-40 плохо работает функциональный блок TRetainStorage. В программе есть раздел c предопределенными переменными:

    VAR_GLOBAL RETAIN
    Open_Cap : BYTE := 2;
    Zagr : BYTE := 3;
    . . .
    END_VAR

    После загрузки программы, при подключенном ПЛК к ПК, подав команду "Старт", можно наблюдать экран настроек с загруженными параметрами.
    Нажмите на изображение для увеличения.*  Название:	Retain1.jpg* Просмотров:	1* Размер:	88.7 Кб* ID:	185


    После отключения ПЛК от ПК и перезагрузки ПЛК все переменные обнуляются. Вернее значения просто не сохраняются.
    Нажмите на изображение для увеличения.*  Название:	Retain2.jpg* Просмотров:	1* Размер:	88.6 Кб* ID:	186


    Последний раз редактировалось Юрий; 21-03-2019, 08:38 AM.

    Комментарий


    • #3
      Сообщение от Юрий Посмотреть сообщение
      Здравствуйте.
      На некоторых ПЛК-40 плохо работает функциональный блок TRetainStorage. В программе есть раздел c предопределенными переменными:

      VAR_GLOBAL RETAIN
      Open_Cap : BYTE := 2;
      Zagr : BYTE := 3;
      . . .
      END_VAR

      После загрузки программы, при подключенном ПЛК к ПК, подав команду "Старт", можно наблюдать экран настроек с загруженными параметрами.
      Нажмите на изображение для увеличения.* Название:	Retain1.jpg* Просмотров:	1* Размер:	88.7 Кб* ID:	185


      После отключения ПЛК от ПК и перезагрузки ПЛК все переменные обнуляются. Вернее значения просто не сохраняются.
      Нажмите на изображение для увеличения.* Название:	Retain2.jpg* Просмотров:	1* Размер:	88.6 Кб* ID:	186

      Здравствуйте, где происходит вызов функционального блока, TRetainStorage?
      Каким образом происходит сохранение(принудительное через ForceSave, или по таймауту) и куда сохраняются переменные, на внутренний накопитель или внешний?

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

      Комментарий


      • #4
        Блок TRetainStorage вызывается в отдельной задаче. Время цикла задачи и период сохранения пробовал разное, сейчас время цикла задачи стоит 500 ms.

        Нажмите на изображение для увеличения.*  Название:	Retain1.jpg* Просмотров:	1* Размер:	17.0 Кб* ID:	191


        Обнаружилась следующая особенность. После загрузки программы, нажимаю "Старт", изменяю любой параметр, счетчик записей сразу показывает 1. После этого контроллер можно выключить, все параметры сохраняются.
        Что такое пути сохранения для файла Retain и как их проверить не знаю.
        Последний раз редактировалось Юрий; 28-03-2019, 08:07 AM.

        Комментарий


        • #5
          Сообщение от Юрий Посмотреть сообщение
          Блок TRetainStorage вызывается в отдельной задаче. Время цикла задачи и период сохранения пробовал разное, сейчас время цикла задачи стоит 500 ms.

          Нажмите на изображение для увеличения.* Название:	Retain1.jpg* Просмотров:	1* Размер:	17.0 Кб* ID:	191





          Обнаружилась следующая особенность. После загрузки программы, нажимаю "Старт", изменяю любой параметр, счетчик записей сразу показывает 1. После этого контроллер можно выключить, все параметры сохраняются.
          Что такое пути сохранения для файла Retain и как их проверить не знаю.
          1 минута не много для сохранения retain?
          По умолчанию на входе блока если не задавать период сохранения установлено - 5с

          Получается, если в течении 1 минуты не сохранить переменные и перезапустить плк, то они не сохранятся.

          Если Вы устанавливаете 1 минуту для сохранения retain, то после сохранения переменной, в течении текущей минуты, новая запись переменной не произойдет, если сохранять retain нужно чаще, то время сохранения нужно уменьшить.
          Последний раз редактировалось Пушкарев Андрей; 28-03-2019, 09:58 AM.

          Комментарий


          • #6
            Сообщение от Пушкарев Андрей Посмотреть сообщение

            1 минута не много для сохранения retain?
            По умолчанию на входе блока если не задавать период сохранения установлено - 5с

            Получается если в течении 1 минуты не сохранить переменные, и перезапустить плк, то они не сохранятся.
            И еще какой приоритет установлен у задачи в которой вызывается блок TRetainStorage?

            Также в режиме отладки необходимо проверить инициализируются ли переменные при старте ПЛК , возможно, где-то в коде происходит перезапись переменных, например если они лежат в структуре или массиве.
            Последний раз редактировалось Пушкарев Андрей; 28-03-2019, 10:03 AM.

            Комментарий


            • #7
              Я разное время ставил, начиная с 20 мс. 1 мин. взята из рекомендации в первом сообщении.

              Для работы необходимо указать место хранения retain переменных (EnStorageDevice.DevSysFS - файловая система, EnStorageDevice.DevSD - sd карта, период сохранения (рекомендуется от 1 минуты)).
              Приоритет задачи ставил 0, 1, 2. Переменные в программе никак не меняются. Если загрузить программу и сразу нажать "Старт", переменные имеют заданные значения. Это видно из первой картинки. Просто запись не происходит, можно ждать сколько угодно.
              Нажмите на изображение для увеличения.   Название:	Retain3.jpg  Просмотров:	1  Размер:	22.5 Кб  ID:	195
              Если изменить любой параметр, то произойдет запись.
              Нажмите на изображение для увеличения. 

Название:	Retain4.jpg 
Просмотров:	1201 
Размер:	21.5 Кб 
ID:	198


              Последний раз редактировалось Юрий; 28-03-2019, 12:40 PM.

              Комментарий


              • #8
                Сообщение от Юрий Посмотреть сообщение
                Я разное время ставил, начиная с 20 мс. 1 мин. взята из рекомендации в первом сообщении.



                Приоритет задачи ставил 0, 1, 2. Переменные в программе никак не меняются. Если загрузить программу и сразу нажать "Старт", переменные имеют заданные значения. Это видно из первой картинки. Просто запись не происходит, можно ждать сколько угодно.
                Нажмите на изображение для увеличения. 

Название:	Retain3.jpg 
Просмотров:	1211 
Размер:	22.5 Кб 
ID:	195
                Я правильно понимаю, что у Вас при старте плк, переменные загружаются уже инициализированные по умолчаюнию, Вы их изменяете, а они не сохраняются после перезапуска плк?

                Комментарий


                • #9
                  Сообщение от Пушкарев Андрей Посмотреть сообщение

                  Я правильно понимаю, что у Вас при старте плк, переменные загружаются уже инициализированные по умолчаюнию, Вы их изменяете, а они не сохраняются после перезапуска плк?
                  Переменные Вы естественно определяете как:

                  var retain
                  variable1: int;
                  end_var

                  все правильно?

                  Комментарий


                  • #10
                    Переменные предопределенные

                    Код:
                    VAR_GLOBAL RETAIN
                      Open_Cap : BYTE := 2;
                      Zagr : BYTE := 3;
                      . . .
                    END_VAR
                    Они не сохраняются после загрузки программы. После перезагрузки ПЛК одни нули. Приходится устанавливать значения вручную. После этого все работает нормально.
                    Последний раз редактировалось Юрий; 29-03-2019, 04:48 AM.

                    Комментарий


                    • #11
                      Сообщение от Юрий Посмотреть сообщение
                      Переменные предопределенные

                      VAR_GLOBAL RETAIN
                      Open_Cap : BYTE := 2;
                      Zagr : BYTE := 3;
                      . . .
                      END_VAR
                      Они не сохраняются после загрузки программы. После перезагрузки ПЛК одни нули. Приходится устанавливать значения вручную. После этого все работает нормально.
                      Тогда , мне нужен Ваш проект, чтоб я мог посмотреть в чем дело.

                      Комментарий


                      • #12
                        С ОВЕНовскими таких проблем не было.

                        Проект.zip

                        В этом проекте я не поменял время.
                        Вложения
                        Последний раз редактировалось Юрий; 28-03-2019, 01:05 PM.

                        Комментарий


                        • #13
                          Сообщение от Юрий Посмотреть сообщение
                          С ОВЕНовскими таких проблем не было.

                          Проект.zip
                          Подкорректировал Ваш, проект для работы с Retain.

                          Что было:

                          При первом запуске проекта из среды Codesys после загрузки ПЛК, происходит создание файла Retain и инициализация переменных объявленных в разделе var global retain.

                          При этом если зайти в настройки параметров, то мы видим, что переменные определенные в var global retain присутствуют

                          Нажмите на изображение для увеличения.   Название:	image_54.jpg  Просмотров:	2  Размер:	86.3 Кб  ID:	207
                          Но если не вносить ни каких изменений и редактирование переменных, выключить питание ПЛК, то при следующем запуске получим нулевые переменные не смотря на то, что они инициализированы по умолчанию в var global retain:

                          Нажмите на изображение для увеличения.   Название:	image_55.jpg  Просмотров:	1  Размер:	86.2 Кб  ID:	208

                          Это происходит по тому, что при первом старте ПЛК, файл Retain является пустым, в нем ничего не записано, а блок TRetainStorage записывает перемененные, по их изменению, либо принудительно, по появлению сигнала на входе ForceSave.

                          Получается, что при старте и работе ПЛК изменения переменных не произошло, следовательно сохранять нечего, файл Retain остается пустым.

                          Отключаем питания ПЛК, он вновь запускается и начинает анализировать файл Retain, и в соответствии с ним переписывает область памяти var global retain, а так как файл пустой var global retain и все объявленные в нем переменные переписываются заново и получают значение ноль.

                          Для решения данной ситуации, достаточно при первом старте ПЛК, произвести однократный вызов блока TRetainStorage и с помощью ForceSave записать файл Retain,

                          сделать это можно, например вот так:

                          (* ==== При первом старте плк, инициализируем файл 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 global retain, и уже потом будет их хранить, пока вновь не произойдет изменение переменной в var global retain.

                          За это уже отвечает блок TRetainStorage вызываемый в отельной задаче.


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

                          RetainFB(destination := EnStorageDevice.DevSysFS);



                          Также заметил, замедление визуализации при вызове диалоговых окон, и работе с ними.

                          Исправил эту ситуацию путем уменьшения интервала в задаче VISU_TASK рекомендуемое значение для ПЛК-40: 60 - 70мс, изначально в проекте было установлено 200мс, что давало замедление при работе с визуализацией.

                          откорректированный проект: project_upd.zip
                          Вложения

                          Комментарий


                          • #14
                            if bFirstCycle then


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

                            bFirstCycle := false;

                            end_if
                            Спасибо за рекомендации.
                            В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.

                            Комментарий


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

                              Спасибо за рекомендации.
                              В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
                              При каждом включении, переменные, будут актуальные, взятые из файл Retain, если в нем было изменение, то получаете актуальный файл, если не было, то исходный файл с значениями из var global retain.

                              Комментарий

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