Сообщение от Юрий
Посмотреть сообщение
Что было:
При первом запуске проекта из среды Codesys после загрузки ПЛК, происходит создание файла Retain и инициализация переменных объявленных в разделе var global retain.
При этом если зайти в настройки параметров, то мы видим, что переменные определенные в var global retain присутствуют
Но если не вносить ни каких изменений и редактирование переменных, выключить питание ПЛК, то при следующем запуске получим нулевые переменные не смотря на то, что они инициализированы по умолчанию в var global retain:
Это происходит по тому, что при первом старте ПЛК, файл 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
Прокомментировать: