ISaGRAF. Version 3.4

         

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);                        восстановить сохраненное значение


Содержание раздела