Группа "Блоки сохранения" |
Top Previous Next |
Энергонезависимая память предназначена для хранения уставок, журналов событий, расписание, т.е. информацию, которая не должна пропадать при выключении питания контроллера. Эта память не используется для хранения программы, работающей на контроллере!
Организация и распределение памяти
Память делится на 2 части:
Контроллеры позволяют записывать в энергонезависимую память так часто, как это возможно. До десяти и более раз в секунду. Но если злоупотреблять данной возможностью, то легко можно исчерпать ресурс памяти:
Распределение энергонезависимой памяти
В зависимости от типа данных одна ячейка занимает разное количество байт:
Количество ячеек, размещаемых в одном блоке задается
Энергонезависимая память распределяется автоматически по порядку следования блоков сохранения в проекте слева направо, сверху вниз.
На рисунке показана схема, в которой:
Такое распределение получается потому, что блок EEPROM(int) находится слева от блока ARRAY(long)
Правило распределения памяти касается и тех блоков, которые находятся внутри макросов: На рисунке показана, схема в которой:
Такое распределение получается потому, что блок ARRAY(int) находится слева от макроса "Журнал". Макрос журнала, в свою очередь, находится слева от блока ARRAY(real).
Если внутренней памяти не хватает, SMLogix начинает распределять внешнюю память. При этом может так получиться, что часть памяти распределенной блоку будет располагаться во внутренней памяти, а часть во внешней.
На рисунке показана ситуация, когда второй блок ARRAY занимает часть внутренней памяти и часть внешней. Пример приведен для контроллера Pixel, который имеет 256 байт внутренней энергонезависимой памяти. Расположение уставок во внутренней памяти Уставки объекта будут храниться во внутренней памяти, если блоки, в которых они хранятся не выйдут за пределы её размера. В контроллере Pixel 256 байт внутренней памяти, т.е. в нее могут поместиться:
Если блоки не поместятся во внутреннюю память, а МП не будет подключен, то сработает системная авария "Переполнение EEPROM". Подробнее о системных авариях читайте в руководстве на контроллер Расположение уставок во внешней памяти Если нужно, чтобы уставки хранились во внешней памяти, то необходимо предварительно заполнить всю внутреннюю память.
В контроллерах Pixel размер внутренней памяти равен 256 байт. Для её заполнения достаточно самым первым блоком программы (самый левый-верхний блок) установить "ничего не делающий" блок памяти: На рисунке показана ситуация, когда левый блок ARRAY(bool) занял всю внутреннюю память. Следовательно правый блок ARRAY(bool) полностью располагается во внешней памяти.
В контроллере SMH2G размер внутренней памяти равен 61440 байт. Заполняем её блоком ARRAY(int) с размером, равным 61440/2 = 30720: Блок ARRAY(bool) будет полностью располагаться во внешней памяти. Инициализация памяти из SMLogix Часто бывает нужно, чтобы после загрузки проекта в контроллер, уставки находились в заранее заданных значениях. Для этого в SMLogix есть возможность загрузки данных в энергонезависимую память. Эта возможность не поддерживается в контроллере SMH2010.
Для инициализации памяти необходимо выполнить следующие действия:
Загрузить данные можно двумя способами:
Принципы работы блоков сохранения Работу блоков сохранения можно разделить на несколько фаз:
При старте программы после включения питания или окончания загрузки все блоки сохранения проходят инициализацию.
После успешной инициализации блоки памяти сигнализируют об этом, устанавливая 1 на выходе syn. Инициализация не произойдёт, если блок распределен во внешнюю память, а модуль памяти не подключен. Одновременно все блоки читать память не могут. Поэтому блоки инициализируются по очереди. Эта операция может занимать несколько циклов программы. Если подключить модуль памяти в любой момент работы контроллера, то все блоки, распределённые во внешнюю память, принудительно пройдут фазу инициализации
Ожидание После фазы инициализации блоки сохранения находятся в состоянии ожидании команды за запись или чтение. Если блок распределен во внешнюю память, то при отсутствии модуля памяти выход syn останется в нулевом состоянии
Операция записи нового значения начинается после получения фронта на входе start_wr. Одновременно команду на запись могут получить много блоков сохранения. Но одновременно все блоки работать с памятью не могут, поэтому блоки производят операции по очереди. При записи в память блоки совершают следующие действия:
Если после старта записи syn не выставлен в 1, то
Данные на выходах можно считать правильными и операцию завершенной при получении 1 на выходе syn
Операция чтения значения начинается после получения фронта на входе start_rd. Одновременно команду на запись/чтение могут получить много блоков сохранения. Но одновременно все блоки работать с памятью не могут, поэтому блоки производят операции по очереди. При чтении памяти блоки совершают следующие действия:
Если после старта чтения syn не выставлен в 1, то
Данные на выходах можно считать правильными и операцию завершенной при получении 1 на выходе syn EEPROM (bool), EEPROM (int), EEPROM (long), EEPROM (real) Входы: start_wr - начать запись указанного значения (работает по фронту) start_rd - начать чтение указанного элемента массива (работает по фронту) bool/int/long/real - значение, которое будет записано rd_offset - адрес элемента, из которого будет осуществлена чтение deep - глубина стека массива Выходы: syn - состояние блока (0 - занят; 1 - готов к работе) bool/int/long/real - результат последнего чтения
Описание. Блок организует в памяти стек по принципу FIFO ("первый вошел, первый вышел"): Запись возможна только в ячейку с адресом 0. При записи все ранее записанные значения сдвигаются на одну ячейку как показано на рисунке. Значение, которое было записано раньше всех (ячейка N) теряется. Данный блок сделан для облегчения реализации журнала событий. Чтение возможно из любой ячейки. На входе deep устанавливается количество записей, которые могут быть сохранены в этом блоке:
По фронту сигнала на входе start wr происходит запись числа с входа bool/int/long/real по адресу 0. По фронту сигнала на входе start rd происходит чтение числа по адресу rd_offset. rd offset = 0 соответствует последней пришедшей записи, rd offset = 1 - предпоследней и т.д. По окончании операции прочитанное значение выводится на выход bool/int/long/real.
На выходе syn устанавливается 1, когда блок готов к работе, т.е.:
Доступна функция записи данных в память из Лоджика. ARRAY (bool), ARRAY (int), ARRAY (long), ARRAY (real) Входы start_wr - начать запись указанного значения (работает по фронту) start_rd - начать чтение указанного элемента массива (работает по фронту) wr_addr - адрес элемента, в который будет осуществлена запись bool/int/long/real - - значение, которое будет записано rd_addr - адрес элемента, из которого будет осуществлена чтение length - длина массива Выходы syn - состояние блока (0 - занят; 1 - готов к работе) bool/int/long/real - результат последнего чтения
Описание. Блок организует в памяти массив, любая ячейка которого доступна на запись и чтение.
На входе length устанавливается количество ячеек, которые могут быть сохранены в этом блоке:
По фронту сигнала на входе start wr происходит запись числа с входа bool/int/long/real по адресу wr_addr . По фронту сигнала на входе start rd происходит чтение числа из энергонезависимой памяти по адресу rd_addr. По окончании операции прочитанное значение выводится на выход bool/int/long/real.
На выходе syn устанавливается 1, когда блок готов к работе, т.е.:
Доступна функция записи данных в память из Лоджика. ARRAY || (bool), ARRAY || (int), ARRAY || (long), ARRAY || (real) Входы start_wr - начать запись указанного значения (работает по фронту) start_rd - начать чтение всех элементов массива (работает по фронту) wr_addr - адрес элемента, в который будет осуществлена запись bool/int/long/real - - значение, которое будет записано mux - адрес элемента, значение которого появится на выходе outmux. Обрабатывать сигнал syn при смене адреса нет необходимости, если инициализация блока уже прошла Выходы syn - состояние блока (0 - занят; 1 - готов к работе) outmux - значение элемента с адресом, указанным на входе mux out* - выход. Количество выходов можно изменять Описание. Блок организует в памяти массив, любая ячейка которого доступна на запись и чтение. Блок ARRAY || работает аналогично блоку ARRAY с тем отличием, что осуществляет одновременный доступ на чтение ко всем элементам массива. Количество ячеек, которые могут быть сохранены в этом блоке изменяется через свойства блока. Надо учитывать, что размер одной ячейки соответствует типу блока.
По фронту сигнала на входе start wr происходит запись числа с входа bool/int/long/real по адресу wr_addr. После окончания операции на соответствующий выход out выдается записанное значение. По фронту сигнала на входе start rd происходит чтение всех ячеек из энергонезависимой памяти. По окончании операции прочитанные значения выводится на выходы out.
На выходе syn устанавливается 1, когда блок готов к работе, т.е.:
Доступна функция записи данных в память из Лоджика. Данный блок позволяет уменьшить количество блоков при создании меню "Настойки". При реализации этой задачи требуется хранить в памяти большое количество уставок при этом необходимо, что бы их значения постоянно были доступны другим макросам. Приведем пример из проекта Конструктора. В примере блоки "ARRAY(real)" хранят 3 уставки. В реальной ситуации их может оказаться гораздо больше. Значения на выходах блоков доступны другим макросам через переменные Выход1, Выход2, Выход3.
Применение блока "ARRAY ||" позволяет поставить 1 блок сохранения вместо 3х, а так же избавиться от дешифратора и мультиплексора. Так же ускоряется ввод значений по умолчанию.
|