Сохранение значений скрипта между запусками

<< Click to Display Table of Contents >>

Navigation:  Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Начало работы >

Сохранение значений скрипта между запусками

Ранее мы писали, что значение любой переменной между перезапусками можно сохранить - включив флаг Восстановление при рестарте. Данный функционал работает также для скриптов, при этом можно сохранять не только значения Выходов, но и внутренние переменные.

Для примера включим у ФБ "Скрипт" флаг Восстановление при рестарте.

sluzhebnie_skript_rukovodstvo_i_primery_nachalo_raboty_sohranenie_znachenij_skripta_mezhdu_zapuskami

Перейдем на вкладку Код. Создадим один вход Выполнить и два выхода Val1 и Val2.

sluzhebnie_skript_rukovodstvo_i_primery_nachalo_raboty_sohranenie_znachenij_skripta_mezhdu_zapuskami1

Наш класс помечен специальным атрибутом - [FBRetain]:

[FBRetain]
public partial class ФБ : ScriptBase

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

Для пример объявим две переменные:

double SaveVal1;
double SaveVal2;

Сделаем чтобы в данные переменные сохранилось бы значение по переднему фронту на входе Выполнить.

public override void Execute()
{
    if (Выполнить == true && M == false)
    {
        SaveVal1 = 10;
        SaveVal2 = 20;
    }
    M = Выполнить;
}

Теперь, чтобы убедится, что наши значения действительно будут сохраняться между перезапусками, мы запишем их результат на выходы Val1 и Val2, при старте MasterSCADA - в методе Start.

public override void Start()
{
 Val1 = SaveVal1;
 Val2 = SaveVal2;
}

Итоговый код будет выглядеть так:

[FBRetain]
public partial class ФБ : ScriptBase
{
    double SaveVal1;
    double SaveVal2;
    bool? M = false;
    public override void Start()
    {
        Val1 = SaveVal1;
        Val2 = SaveVal2;
    }
    public override void Execute()
    {
        if (Выполнить == true && M == false)
        {
            SaveVal1 = 10;
            SaveVal2 = 20;
        }
        M = Выполнить;
    }
}

Теперь проверим работу скрипта в режиме исполнения - подадим сигнал на вход Выполнить.

sluzhebnie_skript_rukovodstvo_i_primery_nachalo_raboty_sohranenie_znachenij_skripta_mezhdu_zapuskami2

На выходах 0, потому что значение записывается на них только в момент старта. Перезапустим систему:

sluzhebnie_skript_rukovodstvo_i_primery_nachalo_raboty_sohranenie_znachenij_skripta_mezhdu_zapuskami3

Значения записались. Как мы можем видеть внутренние переменные скрипта также могут сохраняться.

Если этого не требуется - то просто уберите атрибут [FBRetain] из кода.

Если нужно сохранять только несколько переменных, то уберите атрибут [FBRetain] у всего скрипта, а конкретные переменные наоборот - пометьте им. Например сделаем чтобы сохранялась только одна переменная SaveVal:

public partial class ФБ : ScriptBase
{
 [FBRetain] double SaveVal1;
 double SaveVal2;
 bool? M = false; 
 //остальной код без изменений

Теперь сохранится только SaveVal1, а переменная SaveVal2 сохраняться не будет.

Можно оставить атрибут [FBRetain] на всем классе, а пометить переменные которые сохранять не нужно - для этого используется атрибут [FBNonRetain]. Например, опять же оставим чтобы сохранялось только значение SaveVal1:

[FBRetain]
public partial class ФБ : ScriptBase
{
 double SaveVal1;
 [FBNonRetain] double SaveVal2;
 bool? M = false;
 public override void Start()
 //остальной код без изменений

Следует помнить, что сохраняются только простые типы данных, сложные типы - структуры и классы не сохраняются между перезапусками.​