Объявление

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

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

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

  • Юрий
    Участник ответил
    (* ==== При первом старте плк, инициализируем файл 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);

    Прокомментировать:


  • Юрий
    Участник ответил
    FRAM доступен по адресу /sys/bus/i2c/devices/0-0050/fram. Размер FRAM - 8 кб.
    Все равно непонятно.

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

    Прокомментировать:


  • Таушканов
    Участник ответил
    FRAM доступен по адресу /sys/bus/i2c/devices/0-0050/fram. Размер FRAM - 8 кб.

    Прокомментировать:


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

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

    Прокомментировать:


  • Таушканов
    Участник ответил
    Сообщение от Юрий Посмотреть сообщение

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

    Прокомментировать:


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

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

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

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

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

    Прокомментировать:


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

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

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

    Прокомментировать:


  • Пушкарев Андрей
    Участник ответил
    Сообщение от Юрий Посмотреть сообщение

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

    Прокомментировать:


  • Юрий
    Участник ответил
    if bFirstCycle then


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

    bFirstCycle := false;

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

    Прокомментировать:


  • Пушкарев Андрей
    Участник ответил
    Сообщение от Юрий Посмотреть сообщение
    С ОВЕНовскими таких проблем не было.

    Проект.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
    Вложения

    Прокомментировать:


  • Юрий
    Участник ответил
    С ОВЕНовскими таких проблем не было.

    Проект.zip

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

    Прокомментировать:


  • Пушкарев Андрей
    Участник ответил
    Сообщение от Юрий Посмотреть сообщение
    Переменные предопределенные

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

    Прокомментировать:


  • Юрий
    Участник ответил
    Переменные предопределенные

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

    Прокомментировать:


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

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

    var retain
    variable1: int;
    end_var

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

    Прокомментировать:


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



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

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

    Прокомментировать:

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