Группа "Блоки сохранения"

Top  Previous  Next

Энергонезависимая память предназначена для хранения уставок, журналов событий, расписание, т.е. информацию, которая не должна пропадать при выключении питания контроллера. Эта память не используется для хранения программы, работающей на контроллере!

 

Организация и распределение памяти

 

Память делится на 2 части:

внутренняя - та которая расположена в самом контроллере
внешняя - та которая расположена на внешнем носителе (модуле памяти):

 

Контроллер

Внутренняя

Внешняя

SMH2010

64Кб

 

100 000 циклов записи

не поддерживается

Pixel12xx

Pixel25xx

256 байт

 

100 000 циклов записи

максимальный размер 261 888 байт;

 

по технологии  EEPROM  100 000 циклов записи

по технологии  FRAM количество циклов записи не ограничено

SMH2G

61440 байт

 

100 000 циклов записи

максимальный размер 261 888 байт;

 

по технологии  EEPROM  100 000 циклов записи

по технологии  FRAM количество циклов записи не ограничено

SMH2G(i)

20Мб

 

15 000 000 циклов записи

не поддерживается

SMH4

720 Mb

не поддерживается

Trim5

720 Mb

не поддерживается

 

Контроллеры позволяют записывать в энергонезависимую память так часто, как это возможно. До десяти и более раз в секунду. Но если злоупотреблять данной возможностью, то легко можно исчерпать ресурс памяти:

Ресурс памяти

Запись раз в секунду

Запись раз в минуту

Запись раз в час

100 000 циклов перезаписи

Память проработает 1 день

Память проработает 2 месяца

Память проработает 11 лет

15 000 000 циклов перезаписи

Память проработает 12 лет

Память проработает 30 лет

Память проработает 114 лет


Распределение энергонезависимой памяти

 

В зависимости от типа данных одна ячейка занимает разное количество байт:

Тип данных

Количество байт на 1 ячейку

bool

1

integer

2

long

4

real

4

 

Количество ячеек, размещаемых в одном блоке задается

на входе deep у блока EEPROM
length у блока ARRAY
в окне свойств у блока ARRAY ||

Название блока

Размер памяти, занимаемый блоком сохранения

EEPROM

deep, умноженное на количество байт на одну ячейку + 2 байта

ARRAY

length * количество байт на одну ячейку

ARRAY ||

число, указанное в свойствах * количество байт на одну ячейку

 

Энергонезависимая память распределяется автоматически по порядку следования блоков сохранения в проекте слева направо, сверху вниз.

На рисунке показана схема, в которой:

блок EEPROM(int) займет 12 (5 * 2 + 2) байт, с нулевого адреса по 11-й
блок ARRAY(long) займет 28 (7 * 4) байт с 12-го адреса по 40-й адрес

Такое распределение получается потому, что блок EEPROM(int) находится слева от блока ARRAY(long)

 

Правило распределения памяти касается и тех блоков, которые находятся внутри макросов:

На рисунке показана, схема в которой:

блок ARRAY(int) займет 102 (51 * 2) байт с нулевого адреса по 101-й адрес
блок EEPROM(long) внутри макроса займет 82 (20 * 4 + 2) байт, с 102-го адреса по 184-й адрес
блок ARRAY(real) займет 74 (18 * 4) байт с 185-го адреса по 255-й адрес

Такое распределение получается потому, что блок ARRAY(int) находится слева от макроса "Журнал". Макрос журнала, в свою очередь, находится слева от блока ARRAY(real).

 

Если внутренней памяти не хватает, SMLogix начинает распределять внешнюю память. При этом может так получиться, что часть памяти распределенной блоку будет располагаться во внутренней памяти, а часть во внешней.

 

 

На рисунке показана ситуация, когда второй блок ARRAY занимает часть внутренней памяти и часть внешней. Пример приведен для контроллера Pixel, который имеет 256 байт внутренней энергонезависимой памяти.


Расположение уставок во внутренней памяти

Уставки объекта будут храниться во внутренней памяти, если блоки, в которых они хранятся не выйдут за пределы её размера.

В контроллере Pixel 256 байт внутренней памяти, т.е. в нее могут поместиться:


Схема

128 уставок типа integer в блоке ARRAY (int)

128 * 2 = 256

Архив из 127 значений типа integer в блоке EEPROM (int)

127 * 2 + 2 = 256

64 уставки типа real в блоке ARRAY (real)

64 * 4 = 256

Архив из 63 значений типа real в блоке EEPROM (real)

63 * 4 + 2 = 254

Сочетание блоков, не превышающих 256 байт.

51 уставка типа integer в блоке ARRAY (int)

20 значений типа long в блоке EEPROM (long)

18 уставок типа real в блоке ARRAY (real)

(51 * 2) + (20 * 4 + 2) + (18 * 4) = 256

Если блоки не поместятся во внутреннюю память, а МП не будет подключен, то сработает системная авария "Переполнение EEPROM". Подробнее о системных авариях читайте в руководстве на контроллер


Расположение уставок во внешней памяти

Если нужно, чтобы уставки хранились во внешней памяти, то необходимо предварительно заполнить всю внутреннюю память.

 

В контроллерах Pixel размер внутренней памяти равен 256 байт.

Для её заполнения достаточно самым первым блоком программы (самый левый-верхний блок) установить "ничего не делающий" блок памяти:

На рисунке показана ситуация, когда левый блок ARRAY(bool) занял всю внутреннюю память. Следовательно правый блок ARRAY(bool) полностью располагается во внешней памяти.

 

В контроллере SMH2G размер внутренней памяти равен 61440 байт. Заполняем её блоком ARRAY(int) с размером, равным 61440/2 = 30720:

Блок ARRAY(bool) будет полностью располагаться во внешней памяти.


Инициализация памяти из SMLogix

Часто бывает нужно, чтобы после загрузки проекта в контроллер, уставки находились в заранее заданных значениях.

Для этого в SMLogix есть возможность загрузки данных в энергонезависимую память.

Эта возможность не поддерживается в контроллере SMH2010.

 

Для инициализации памяти необходимо выполнить следующие действия:

Задать значения уставок
Загрузить данные в контроллер

Загрузить данные можно двумя способами:

       1. непосредственно при загрузке проекта в контроллер

загружать проект обычным образом
если проект был изменён или в контроллер загружается новый проект, то будет предложено инициализировать память:

Если ответить ДА, то память будет инициализирована
Если ответить НЕТ, то инициализация будет пропущена и вопрос больше задаваться не будет

       2. загрузить данные без загрузки проекта.

открыть проект, который уже загружен в контроллер.
нажать на кнопку "Инициализация EEPROM" на напели инструментов в SMLogx

если проект в SMLogix и в контроллере совпадают, то будет осуществлена загрузка данных в энергонезависимую память контроллера.

Принципы работы блоков сохранения

Работу блоков сохранения можно разделить на несколько фаз:

Инициализация
Ожидание
Запись
Чтение

 

Инициализация

При старте программы после включения питания или окончания загрузки все блоки сохранения проходят инициализацию.

Блок EEPROM() читает последнее записанное значение
Блок ARRAY() с единичной длиной также читает читает последнее записанное значение
Блок ARRAYII() читает все значения и выдает их на соответствующие выходы

После успешной инициализации блоки памяти сигнализируют об этом, устанавливая 1 на выходе syn.

Инициализация не произойдёт, если блок распределен во внешнюю память, а модуль памяти не подключен.

Одновременно все блоки читать память не могут. Поэтому блоки инициализируются по очереди.

Эта операция может занимать несколько циклов программы.

Если подключить модуль памяти в любой момент работы контроллера, то все блоки, распределённые во внешнюю память, принудительно пройдут фазу инициализации

 

Ожидание

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

Если блок распределен во внешнюю память, то при отсутствии модуля памяти выход syn останется в нулевом состоянии

 

Запись

Операция записи нового значения начинается после получения фронта на входе start_wr.

Одновременно команду на запись могут получить много блоков сохранения. Но одновременно все блоки работать с памятью не могут, поэтому блоки производят операции по очереди.

При записи в память блоки совершают следующие действия:

на выход syn устанавливается 0
запись значения со входа bool/int/long/real во внутренний буфер. Пока не закончится операция записи, блок не будет реагировать на изменения на этом входе. Операция записи будет выполнена с содержимым внутреннего буфера
ожидание очереди на доступ к памяти. В зависимости от количества блоков, производящих операции с памятью, время ожидания может быть разным и занимать несколько циклов программы
когда получен доступ к памяти, блок осуществляет запись значения
после успешного завершения операции записи на выходе syn выставляется 1

 

Если после старта записи syn не выставлен в 1, то

либо блок распределен во внешнюю память, а МП не подключен
либо произошел системный сбой, обратитесь в техподдержку.

 

Данные на выходах можно считать правильными и операцию завершенной при получении 1 на выходе syn

 

Чтение

Операция чтения значения начинается после получения фронта на входе start_rd.

Одновременно команду на запись/чтение могут получить много блоков сохранения. Но одновременно все блоки работать с памятью не могут, поэтому блоки производят операции по очереди.

При чтении памяти блоки совершают следующие действия:

на выход syn устанавливается 0
ожидание очереди на доступ к памяти. В зависимости от количества блоков, производящих операции с памятью, время ожидания может быть разным и занимать несколько циклов программы
когда получен доступ к памяти, блок осуществляет чтение значения
запись полученного значения на выход bool/int/long/real. Пока не закончится операция записи блок не будет реагировать на изменения на этом входе. Операция записи будет выполнена с содержимым внутреннего буфера
после успешного завершения операции записи на выходе syn выставляется 1

 

Если после старта чтения 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 устанавливается количество записей, которые могут быть сохранены в этом блоке:

Если deep = 0, то блок не обрабатывается
Если deep = 1, то записанное число сразу же передается на выход блока
Надо учитывать, что размер одной записи соответствует типу блока

 

По фронту сигнала на входе 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 устанавливается количество ячеек, которые могут быть сохранены в этом блоке:

Если length = 0, то блок не обрабатывается
Если length = 1, то записанное число сразу же передается на выход блока
Надо учитывать, что размер одной записи соответствует типу блока

 

По фронту сигнала на входе 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х, а так же избавиться от дешифратора и мультиплексора. Так же ускоряется ввод значений по умолчанию.