Блокировка выдачи сообщений

<< Click to Display Table of Contents >>

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

Блокировка выдачи сообщений

Иногда возникают ситуации, когда необходимо заблокировать выдачу определенных (или всех) сообщений в объекте. Например, сейчас идет пусконаладка объекта, ремонт или объект на простое - в этом случае могут формироваться различные сообщения, которые никому не интересны и не нужны. С помощью скрипта можно выключить формирование определенных сообщений.

Создадим в который добавим Событие с сообщением, Расчет и значение в объекте, которым назначим шкалы. Также создадим скрипт, у которого сделаем один вход - Блокировать.

sluzhebnie_skript_rukovodstvo_i_primery_generaciya_arhiva_blokirovka_vydachi_soobshchenij1

Событие, Расчет и Значение могут формировать сообщения - Событие от прописанного на вкладке Сообщение, а Расчет и Значение - от шкалы. Теперь сделаем, чтобы скрипт мог отключить выдачу сообщений от всех этих переменных.

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

HostFB.AlarmManager.ChangeEventLock(_eventId, true);

Первым параметром в метод передается ID нашего сообщения, вторым - true или false, т.е. заблокировать или разблокировать.

В методе Start мы с помощью NavigateChilds переберем все переменные объекта, найдем нужные нам переменные и сформируем их EventID.

List<EventID> Events = new List<EventID>();
public override void Start()
{
    HostFB.TreeItemHlp.Parent.NavigateChilds(delegate (ITreeObjectHlp item)
    {
        if (item.ObjectType == EObjectType.otValue || item.ObjectType == EObjectType.otCommand
                                                   || item.ObjectType == EObjectType.otParser)
            Events.Add(new EventID(item.ID, PoutEventGroup.Limit, 0));
        if (item.ObjectType == EObjectType.otEvent)
            Events.Add(new EventID(item.ID, EventType.ObjectEvent, 0));
        return true;
    }, TreeItemMask.All, NavigateItemsFlags.CurrentComputer);
 
    // EventID(int sourceID, EventType sourceType, int objectStateId)
    // PoutEventGroup.Limit - контроль значений
    // PoutEventGroup.HighRateOfChange - максимальная скорость изменения
    // PoutEventGroup.System - все остальное
}

В NavigateChilds мы проверяем, какого именно у нас типа переменная - значение (otValue), команда (otCommand) или Расчет (otParser). В этом случае мы создаем EventID с ID нашей переменой и типом сообщения - Контроль значения (PoutEventGroup.Limit). Если же мы обнаружили событие (otEvent), то создается EventID типа EventType.ObjectEvent - т.е. сообщение от события. В обоих случаях EventID помещаются в коллекцию Events.

Коллекция готова, теперь можно отключать и включать сообщения от данных источников.

public override void Execute()
{
    if (Блокировать.HasValue == false) return;
    bool Block = Блокировать.Value;
    foreach (EventID _eventId in Events)
    {
        HostFB.AlarmManager.ChangeEventLock(_eventId, Block);
    }
}

Код очевидный и в комментарии не нуждается. Итоговый код будет выглядеть так:

public partial class ФБ : ScriptBase
{
 
    List<EventID> Events = new List<EventID>();
    public override void Start()
    {
        HostFB.TreeItemHlp.Parent.NavigateChilds(delegate (ITreeObjectHlp item)
        {
            if (item.ObjectType == EObjectType.otValue || item.ObjectType == EObjectType.otCommand
                                                       || item.ObjectType == EObjectType.otParser)
                Events.Add(new EventID(item.ID, PoutEventGroup.Limit, 0));
            if (item.ObjectType == EObjectType.otEvent)
                Events.Add(new EventID(item.ID, EventType.ObjectEvent, 0));
            return true;
        }, TreeItemMask.All, NavigateItemsFlags.CurrentComputer);
 
        // EventID(int sourceID, EventType sourceType, int objectStateId)
        // PoutEventGroup.Limit - контроль значений
        // PoutEventGroup.HighRateOfChange - максимальная скорость изменения
        // PoutEventGroup.System - все остальное
    }
 
    public override void Execute()
    {
        if (Блокировать.HasValue == false) return;
        bool Block = Блокировать.Value;
        foreach (EventID _eventId in Events)
        {
            HostFB.AlarmManager.ChangeEventLock(_eventId, Block);
        }
    }
}

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

sluzhebnie_skript_rukovodstvo_i_primery_generaciya_arhiva_blokirovka_vydachi_soobshchenij2

В журнале и окне сообщений новых сообщений не появилось.

Теперь выключим блокировку, события отключим (переведем в нормальные состояния) и включим снова.

sluzhebnie_skript_rukovodstvo_i_primery_generaciya_arhiva_blokirovka_vydachi_soobshchenij3

Теперь сообщения появились.

Пример скрипта можно скачать по ссылке.