PDA

Просмотр полной версии : СПК107 Persistent - сколько вас?



Raikkonen
19.02.2022, 18:50
Добрый день!
Пишу программу, и решил сделать свою авторизацию.
Логично, что для этого неплохо бы использовать персистент переменные, но вот беда!

Имеем всего-навсего структуру


TYPE user_struct:
STRUCT
name: WSTRING(20);
pass: UDINT;
END_STRUCT
END_TYPE


и ее экземпляр



VAR_GLOBAL PERSISTENT RETAIN
users: ARRAY [0..49] OF user_struct;
END_VAR


Так вот не нравится это ей.
Ошибки:
с0414 Недостаточно persistent-памяти!
с0415 Недостаточно persistent-памяти: Переменная 'users' занимает 2800 байт, наибольший непрерывный промежуток 648 байт.

Неужели 50 строк по 20 символов (41 байт кажется) это неподъемная величина?

Попытался где попало поискать настройки памяти целевой платформы - не нашел ничего похожего.

Как быть? Это я что-то не настроил, или и правда это слишком много?

Евгений Кислов
19.02.2022, 18:59
Добрый день.
У вас точно СПК1хх [М01], с портом Ethernet?
Если да - то выкладывайте проект.

У меня проблема не воспроизводится.

Объем энергонезависимых (Retain/Persistent) переменных наших современных контроллеров - 64 Кб.

59416

Евгений Кислов
19.02.2022, 19:28
Посмотрел проект, который вы прислали в личку.
После команды Компиляция - Очистить всё он без проблем загрузился в мой контроллер.
Предварительно я в ballon_type_struct и user_struct длину строк увеличил до 80 символов.

59417

valkv
24.02.2022, 07:57
Столкнулся с этой ситуацией в своем проекте Spk107 в теплице (https://owen.ru/forum/showthread.php?t=35914). Согласно документации codesys при объявлении Persistent внутри POU, весь POU пишется в энергонезависимую память. На первом этапе 'Компиляция - Очистить всё', удаляет дефрагментацию памяти, и это помогает. Но при дальнейшем увеличении кода в POU проект встает по ошибке, так как я объявляю несколько однотипных объектов. Пришлось все Persistent объявить в отдельном файле и удалить такие переменные из fb, что очень неудобно в ООП при тиражировании объектов, так как приходится сначала создать объект, потом привязать созданные для каждого объекта переменные к соответствующему объекту. Кто знает другой путь?

kondor3000
24.02.2022, 13:22
Столкнулся с этой ситуацией в своем проекте Spk107 в теплице (https://owen.ru/forum/showthread.php?t=35914). Согласно документации codesys при объявлении Persistent внутри POU, весь POU пишется в энергонезависимую память. На первом этапе 'Компиляция - Очистить всё', удаляет дефрагментацию памяти, и это помогает. Но при дальнейшем увеличении кода в POU проект встает по ошибке, так как я объявляю несколько однотипных объектов. Пришлось все Persistent объявить в отдельном файле и удалить такие переменные из fb, что очень неудобно в ООП при тиражировании объектов, так как приходится сначала создать объект, потом привязать созданные для каждого объекта переменные к соответствующему объекту. Кто знает другой путь?

Сначала пишется программа с обычными и глобальными переменными. Все переменные в слейве (слейвах) и так GLOBAL RETAIN , если нужны ещё такие переменные их вырезаете из глобальных и вставляете в VAR_GLOBAL RETAIN PERSISTENT. Обычно их не так и много.
Кроме того некоторые переменные лучше просто инициализировать при старте программы, а некоторые вообще просто константы, которые и не надо в RETAIN пихать.

valkv
24.02.2022, 17:46
Так и пришлось сделать, но это неудобно. Удобно в fb объекта объявлять RETAIN PERSISTENT. И когда размножаешь объект, то эти переменные автоматически привязываются к копиям объекта.