Сообщение от Никадим
Посмотреть сообщение
Объявление
Свернуть
Пока нет объявлений.
Механизм работы с Retain-переменными в ПЛК-40
Свернуть
X
-
Да, все верно библиотека должна быть только одна AgavaLibraries версии 3.5.10.8
-
Спасибо!
Я доставил библиотеку AgavaLibraries версии 3.5.10.8, но у меня так же стоит библиотека версии 3.5.14.10. И он выдает ошибку.
Правильно ли я понимаю, что библиотека версии 3.5.14.10 является старее, чем 3.5.10.8 и мне надо удалить версию 3.5.14.10?
Прокомментировать:
-
Если SVRetain1.ClearFRAM(); // метод у Вас отсутствует значит у Вас старая версия библиотек, скачайте и установите обновленные библиотеки.Сообщение от Никадим Посмотреть сообщениеСпасибо за пояснения!
1. В примере не понятно следующая часть кода:
Codesys выдает ошибку, что метод ClearFRAM не является частью блока TRetainStorage и в Менеджере библиотек у данного функционального блока отсутствуют методы.Код:if clearFram then clearFram := false; SVRetain1.ClearFRAM(); // Метод очищает область памяти FRAM (а именно в эта строка) end_if
Объясните пожалуйста.
2. Время выполнения задачи для блока TRetainStorage должно быть больше, меньше или всё равно, чем время SaveFilterTime?
Во вопрос в том, что будет если задать время задачи больше времени периода сохранения, и что будет если задать время задачи меньше времени периода сохранения?
3. Можете подсказать, что я сделал не так? При выключение питания через 5 минут и включении retain-переменные обнуляются.
Объявил ФБ TRetainStorage глобально, и так же переменные.
Добавил в основную программу PLC_PRG проверку первого цикла для сохранения
Отдельно сделал программу и задачу для ФБ TRetainStorage, период сохранения задал 120 с.
2. Время выполнения задачи для блока TRetainStorage должно быть больше, меньше или всё равно, чем время SaveFilterTime?
Во вопрос в том, что будет если задать время задачи больше времени периода сохранения, и что будет если задать время задачи меньше времени периода сохранения?
Блок должен вызваться чаще чем SaveFilterTime, блок нужно вызывать в каждом цикле программы. Он отслеживает изменение в области Retain и по изменению производит запись данных из области в файл.
"Добавил в основную программу PLC_PRG проверку первого цикла для сохранения" - в новой версии биб-ки этого делать больше не нужно.
Устанавливаете новые биб-ки AgavaLibraries.3.5.10.8 , в свойствах библиотеки AgavaPlc выбираете версию 3.5.10.1 делаете заводской сброс ПЛК, далее загружаете тестовый проект.Последний раз редактировалось Пушкарев Андрей; 20-05-2021, 04:10 AM.
Прокомментировать:
-
Спасибо за пояснения!
1. В примере не понятно следующая часть кода:
Codesys выдает ошибку, что метод ClearFRAM не является частью блока TRetainStorage и в Менеджере библиотек у данного функционального блока отсутствуют методы.Код:if clearFram then clearFram := false; SVRetain1.ClearFRAM(); // Метод очищает область памяти FRAM (а именно в эта строка) end_if
Объясните пожалуйста.
2. Время выполнения задачи для блока TRetainStorage должно быть больше, меньше или всё равно, чем время SaveFilterTime?
Во вопрос в том, что будет если задать время задачи больше времени периода сохранения, и что будет если задать время задачи меньше времени периода сохранения?
3. Можете подсказать, что я сделал не так? При выключение питания через 5 минут и включении retain-переменные обнуляются.
Объявил ФБ TRetainStorage глобально, и так же переменные.
Добавил в основную программу PLC_PRG проверку первого цикла для сохранения
Отдельно сделал программу и задачу для ФБ TRetainStorage, период сохранения задал 120 с.
Последний раз редактировалось Никадим; 19-05-2021, 04:30 PM.
Прокомментировать:
-
Добрый день, пример для работы с TRetainStorage представлен в SDK. Найти его можно по следующему пути.Сообщение от Никадим Посмотреть сообщение
Здравствуйте!
Могли бы вы, предоставить пример работы с Retain-переменными на ПЛК АГАВА 40? В данной беседе размещен только один пример, который можно скачать и посмотреть, и он является, согласно беседе, не полностью работоспособным.
Приоритет у задачи Retain переменных должен быть выше или ниже задачи MainTask, или может быть одинаковым?
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.
Прокомментировать:
-
Здравствуйте!Сообщение от Таушканов Константин Посмотреть сообщениеПояснение механизма работы с 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, или может быть одинаковым?
Прокомментировать:
-
(* ==== При первом старте плк, инициализируем файл Retain значениями из области определения var global retain ==== *)
if bFirstCycle then
RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.
bFirstCycle := false;
end_if
(* ==== Вызов блока для работы с retain переменными ==== *)
RetainFB(destination := EnStorageDevice.DevSysFS);
Проблема с ненужной перезаписью переменных решилась очень просто. Определение ключа принудительной записи необходимо поместить в область Retain-переменных.
В операторе IF строки поменять местами.Код:VAR RETAIN bFirstCycle : BOOL := true; END_VAR
Код: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, 07:22 AM.
Прокомментировать:
-
При хранении retain на внутренней eMMC количество циклов записи весьма значительное (зависит от размера свободного пространства) и составляет более 10 000 циклов. При хранении переменных на SD-карте количество циклов перезаписи опеределяется качеством и объемом SD-карты. Так же в ПЛК-40 имеется возможность хранения retain в области FRAM, ресурс которой практически не ограничен (миллион и более циклов).Сообщение от Юрий Посмотреть сообщение
Спасибо за рекомендации.
В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
Прокомментировать:
-
Все верно, а Вы когда будете переменные изменять у Вас запись происходить не будет?Сообщение от Юрий Посмотреть сообщениеЯ имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
В Ваш код добавил строку
После включения счетчик показывает 1.Код:(* ==== Вызов блока для работы с retain переменными ==== *) RetainFB(destination := EnStorageDevice.DevSysFS); CountR := RetainFB.AttemptSaveCounter;
или у вас ПЛК будет выключаться и включаться с периодичностью в 1с?
тип памяти установленной в ПЛК - 40 eMMC которая имеет не малый ресурс, при условии что писать Вы туда будет не чаще 1 минуты.
Если переживаете за внутреннюю eMMС, то тогда пишите retain на SD карту.
RetainFB(destination := EnStorageDevice.DevSD)
Прокомментировать:
-
Я имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
В Ваш код добавил строку
После включения счетчик показывает 1.Код:(* ==== Вызов блока для работы с retain переменными ==== *) RetainFB(destination := EnStorageDevice.DevSysFS); CountR := RetainFB.AttemptSaveCounter;
Прокомментировать:
-
При каждом включении, переменные, будут актуальные, взятые из файл Retain, если в нем было изменение, то получаете актуальный файл, если не было, то исходный файл с значениями из var global retain.Сообщение от Юрий Посмотреть сообщение
Спасибо за рекомендации.
В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
Прокомментировать:
-
Спасибо за рекомендации.if bFirstCycle then
RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.
bFirstCycle := false;
end_if
В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
Прокомментировать:

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