Сообщение от Никадим
Посмотреть сообщение
Объявление
Свернуть
Пока нет объявлений.
Механизм работы с Retain-переменными в ПЛК-40
Свернуть
X
-
-
Спасибо!
Я доставил библиотеку AgavaLibraries версии 3.5.10.8, но у меня так же стоит библиотека версии 3.5.14.10. И он выдает ошибку.
Правильно ли я понимаю, что библиотека версии 3.5.14.10 является старее, чем 3.5.10.8 и мне надо удалить версию 3.5.14.10?
Прокомментировать:
-
Сообщение от Никадим Посмотреть сообщениеСпасибо за пояснения!
1. В примере не понятно следующая часть кода:
Код: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. В примере не понятно следующая часть кода:
Код: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.
Прокомментировать:
-
Сообщение от Никадим Посмотреть сообщение
Здравствуйте!
Могли бы вы, предоставить пример работы с 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-переменных.
Код: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 переменными ==== *) RetainFB(destination := EnStorageDevice.DevSysFS); CountR := RetainFB.AttemptSaveCounter;
или у вас ПЛК будет выключаться и включаться с периодичностью в 1с?
тип памяти установленной в ПЛК - 40 eMMC которая имеет не малый ресурс, при условии что писать Вы туда будет не чаще 1 минуты.
Если переживаете за внутреннюю eMMС, то тогда пишите retain на SD карту.
RetainFB(destination := EnStorageDevice.DevSD)
Прокомментировать:
-
Я имею в виду, что при каждом включении происходит принудительная запись, а память имеет ограниченное число циклов перезаписи.
В Ваш код добавил строку
Код:(* ==== Вызов блока для работы с retain переменными ==== *) RetainFB(destination := EnStorageDevice.DevSysFS); CountR := RetainFB.AttemptSaveCounter;
Прокомментировать:
-
Сообщение от Юрий Посмотреть сообщение
Спасибо за рекомендации.
В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
Прокомментировать:
-
if bFirstCycle then
RetainFb(destination := EnStorageDevice.DevSysFS, ForceSave := true); // ForceSave - принудительная запись.
bFirstCycle := false;
end_if
В таком случае при каждом включении ПЛК будет происходить перезапись переменных, что не очень хорошо.
Прокомментировать:
Прокомментировать: