<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с архивом сообщений > Блокировка выдачи сообщений |
Иногда возникают ситуации, когда необходимо заблокировать выдачу определенных (или всех) сообщений в объекте. Например, сейчас идет пусконаладка объекта, ремонт или объект на простое - в этом случае могут формироваться различные сообщения, которые никому не интересны и не нужны. С помощью скрипта можно выключить формирование определенных сообщений.
Создадим в который добавим Событие с сообщением, Расчет и значение в объекте, которым назначим шкалы. Также создадим скрипт, у которого сделаем один вход - Блокировать.
Событие, Расчет и Значение могут формировать сообщения - Событие от прописанного на вкладке Сообщение, а Расчет и Значение - от шкалы. Теперь сделаем, чтобы скрипт мог отключить выдачу сообщений от всех этих переменных.
Для того чтобы заблокировать выдачу сообщения, нужно по каждому источнику сообщений выполнить метод:
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);
}
}
}
Проверим работу в режиме исполнения. Включим блокировку, и вызовем срабатывание наших событий:
В журнале и окне сообщений новых сообщений не появилось.
Теперь выключим блокировку, события отключим (переведем в нормальные состояния) и включим снова.
Теперь сообщения появились.
Пример скрипта можно скачать по ссылке.