ISaGRAF. Version 3.4

          

CСохранение переменных приложения


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

CСохранение переменных приложения
        Функциональный вызов 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Сохранение переменных приложения
       
Пользовательская реализация

Наконец, используя функции “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);                        восстановить сохраненное значение


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