CСохранение переменных приложения
Сохраняемые переменные
Редактор переменных системы разработки поддерживает атрибут ‘сохранять’ для каждой внутренней переменной (т.е. не входной и не выходной).
В конце каждого цикла целевой задачи значения сохраняемых переменных копируются в специальную область памяти. Этой областью обычно является питаемая от батареи RAM.
Во время старта если хотя бы одна переменная имела атрибут сохраняемой, ISaGRAF ищет сохраняемые переменные:
- Если данное приложение уже запускалось ранее, ISaGRAF находит сохраненные значения и присваивает их соответствующим сохраняемым переменным.
- Если ранее работало другое приложение или не было никакого, то ISaGRAF понимает, что сохраненные значения недействительны и переустанавливает все сохраняемые переменные в 0.
Область памяти для сохранения переменных определяется в системе разработки в меню Make/Опции выполнения приложения/Сохраняемые переменные. Указанная строка должна иметь следующий формат:
boo_add , boo_size , ana_add , ana_size , tmr_add , tmr_size , msg_add , msg_size
где:
boo_add Шестнадцатеричный адрес, используемый для сохранения булевских переменных. Должен быть отличен от 0.
boo_size Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу. Для хранения булевской переменной требуется 1 байт.
ana_add Шестнадцатеричный адрес, используемый для сохранения аналоговых переменных. Должен быть отличен от 0.
ana_size Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу. Всегда требуется минимум 4 байта плюс 4 байта для хранения каждой аналоговой переменной.
tmr_add Шестнадцатеричный адрес, используемый для сохранения таймерных переменных. Должен быть отличен от 0.
tmr_size Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу. Для хранения таймерной переменной требуется 5 байт.
msg_add Шестнадцатеричный адрес, используемый для сохранения строковых переменных. Должен быть отличен от 0.
msg_size Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу.
Для хранения таймерной переменной требуется 256 байт.
Требования
- Должны быть специфицированы все поля для всех типов даже если Вы не собираетесь сохранять все типы переменных. В таком случае для неиспользуемого типа переменных Вы должны указать нулевой размер (за исключением аналогов, где минимальный размер - 4) и любой отличный от нуля адрес.
Пример:
Предположим, требуется резервирование
20 булевских переменных
0 аналоговых переменных
0 таймерных переменных
3 строковых переменных
Пусть память, питаемая от батареи, находится по адресу 0xA2F200.
Предположим, что:
Булевские переменные будут храниться, по адресу 0xA2F200 и будут занимать в точности 20 байт.
Аналоги будут по адресу 0xA2F214, и для них нужно 4 байта.
Фиктивный адрес для таймеров будет 0xA2F200, т.к. размер памяти - нулевой.
Строковые переменные будут храниться по адресу 0xA2F218, причем им требуется 3*256 байт.
Таким образом, в системе разработке должна быть введена строка
A2F200,14,A2F214,4,A2F200,0,A2F218,300
Функциональный вызов SYSTEM
Если нужно хранить большинство переменных приложения, то следует использовать функцию SYSTEM, чтобы иметь дело со всем множеством переменных (подробнее о функции SYSTEM см. в Руководстве пользователя). Заметим, что в этом случае резервирование и восстановление управляются программистом на уровне приложения.
Прежде всего, Вы должны определить место расположения резервных копий всех типов переменных:
<новый_адрес>:=SYSTEM(SYS_INITxxx,<адрес>);
где
- <адрес> адрес расположения памяти для резервирования (16#шестнадцацеричное значение). Он должен иметь четное значение, в противном случае операция не выполнится.
- SYS_INITxxx может быть:
* SYS_INTBOO для определения начала памяти под булевские переменные.
* SYS_INTANA для определения начала памяти под аналоговые переменные.
* SYS_INTTMR для определения начала памяти под таймерные переменные.
* SYS_INTALL для определения начала памяти под все булевские, аналоговые и таймерные переменные.
- <новый_адрес> значение следующего свободного адреса, который равен <адрес> + зарезервированная память в байтах согласно SYS_INITxxx. Это позволяет проконтролировать выделенный объем памяти. Если операция не выполнилась, <новый_адрес> получает нулевое значение.
Теперь можно сделать запрос на резервирование. Эту процедуру можно вызвать в любой момент в приложении; резервирование будет выполнено в конце текущего цикла. Если аппаратура дает возможность информировать пользователя с помощью булевского входа или C функции об отказе питания и обеспечивает хотя бы один цикл ISaGRAF после этого, резервирование можно делать только при обнаружении такого отказа:
<ошибка>:=SYSTEM(SYS_SAVxxx,0);
где
- SYS_SAVxxx может быть:
* SYS_SAVBOO для резервирования всех булевских переменных.
* SYS_SAVANA для резервирования всех аналоговых переменных.
* SYS_SAVTMR для резервирования всех таймерных переменных.
* SYS_SAVALL для резервирования всех булевских, аналоговых и таймерных переменных.
- <ошибка> получает значение ненулевого кода ошибки если операция не выполнилась. (SYS_INITxxx не отработала).
Наконец, Вы можете пожелать восстановить значения зарезервированных переменных. Эту процедуру можно вызвать в любой момент в приложении; резервирование будет выполнено в конце текущего цикла. Формат команды восстановления следующий
<ошибка>:=SYSTEM(SYS_RESTxxx,0);
где
- SYS_RESTxxx может быть:
* SYS_RESTBOO для восстановления всех булевских переменных.
* SYS_RESTANA для восстановления всех аналоговых переменных.
* SYS_RESTTMR для восстановления всех таймерных переменных.
* S YS_RESTALL для восстановления всех булевских, аналоговых и таймерных переменных.
- <ошибка> получает значение ненулевого кода ошибки если операция не выполнилась. (SYS_INITxxx не отработала).
Вот сводка команд функции SYSTEM для управления резервированием переменных
Команда |
Значение |
|
Ключевое слово |
Значение |
|
SYS_INITBOO |
16#20 |
Инициал. Резервирование булевских |
SYS_SAVBOO |
16#21 |
Сохранить булевские |
SYS_RESTBOO |
16#22 |
Восстановить булевские |
SYS_INITANA |
16#24 |
Инициал. Резервирование аналогов |
SYS_SAVANA |
16#25 |
Сохранить аналоги |
SYS_RESTANA |
16#26 |
Восстановить аналоги |
SYS_INITTMR |
16#28 |
Инициал. Резервирование таймеров |
SYS_SAVTMR |
16#29 |
Сохранить таймеры |
SYS_RESTTMR |
16#2A |
Восстановить таймеры |
SYS_INITALL |
16#2C |
Инициал. Резервирование всех типов |
SYS_SAVALL |
16#2D |
Сохранить все типы |
SYS_RESTALL |
16#2E |
Восстановить все типы |
Команда (ключевое слово) |
Аргумент |
Возвр. Значение |
SYS_INITxxx |
адрес памяти |
след. свободный адрес |
SYS_SAVxxx |
0 |
0 если успех |
SYS_RESTxxx |
0 |
0 если успех |
Наконец, используя функции “C” или функциональные блоки Вы можете построить процедуры доступа к памяти, питаемой от батареи, чтобы в любой момент сохранять и восстанавливать переменные в приложении.
Примеры:
1) Процедура, предназначенная для приложения:
backup, restore_temp, restore_date, restore_cnt - “C” процедуры пользователя.
backup(temperature,date,cnt); сохранение трех критических переменных
temperature:=restore_temp(); восстановление температуры
data:=restore_date(); восстановление даты
cnt:=restore_cnt(); восстановление счетчика
2) Процедура общего назначения:
backup_init, backup_link, restore - “C” процедуры пользователя.
save_id:=backup_init(address,size); выделить область в энергонезависимой памяти
backup(save_id,cpt1,3); сохранить cpt1 как третий элемент
rest_id:=backup_link(address,size); прилинковать выделенную память
cpt1:=restore(rest_id,3); восстановить сохраненное значение