Программы В системе Inspector+ встроен гибкий механизм

advertisement
Программы
В системе Inspector+ встроен гибкий механизм настройки автоматической или
автоматизированной реакции на события, поступающие в систему от реальных
конечных устройств охранных систем (камер, датчиков, считывателей и т.д.). Это
механизм макрокоманд и скриптов. Кроме того можно обрабатывать события
поступающие от виртуальных объектов самой системы Inspector+ (смена экрана,
выполнение макрокоманды и др.).
Выше была рассмотрена работа с макрокомандами. Уже они сами по себе дают вам
широкие дополнительные возможности по управлению системой. Однако, этого может
оказаться мало. В случае возникновения необходимости воссоздать сложную реакцию
системы вам на помощь придёт программа.
Применение встроенного в систему языка скриптов позволит вам вводить практически
любые отношения между объектами и событиями системы
Создание программы
Создайте объект Программа.
Этот объект является дочерним по отношению к Inspector+.
Панель настройки созданного объекта Программа и является тем окном, где нужно будет
писать программу на языке скриптов Inspector+.
Кроме текста самой программы на этой панели вы можете установить временную зону
(см. Расписание), когда эта программа будет запускаться. Из выпадающего списка вы
можете выбрать один из вариантов:



Никогда. Программа не активна и не реагирует на задействованные в ней события
системы.
Всегда. Программа всегда активна.
Временная зона. Программа активна в пределах созданной вами предварительно
временной зоны
Во время написания и редактирования программы устанавливается временная зона –
Никогда.
Встроенного компелятора( отладчика) нет, поэтому выдаваться будут только ошибки.
Например. Есть цикл 100 раз, а в нем синтаксическая ошибка. Окошко с ошибкой будет
появляться 100 раз. В этом случае, необходимо быстро нажать Ок в окошке с ошибкой,
войти в редактирование программы , выбрать временную зону Никогда и нажать кнопку
Настройка.
Если невозможно остановить программу и Инспектор завис, то в этом случае можно:
1. Выйти из Инспектора+( свернуть окна, если не получается использовать kill),
затем держа одновременно клавиши CTRL и SHIFT запустить Инспектор+. Таким
образом можно попасть в конфигурацию системы, а не в саму программу и
изменить ее настройки – отключить программу. Можно попробовать поймать тот
момент когда Инспектор грузит конфигурацию и в этот момент нажать клавиши
CTRL и SHIFT.
2. Можно заменить старую базу данных Инспектора на новую взятую с другого
компьютера или сохраненную заранее.
Функции в встроенном языке скриптов
Язык скриптов написан на языке программирования Visual Ci
Скрипт состоит из набора процедур.
Существует 3 процедуры, которые будут выполнены системой при возникновении
соответсвующего события:
OnInit() – запуск системы (используется для инициализации переменных)
OnTime (день недели (1-7), день месяца, месяц, год, часы, минуты, секунды) – таймер
OnEvent(тип источника, номер, событие) - остальные события
Примеры использования OnTime()
//-----------------------------------------------------------------------------------OnTime(N,N,N,N,N,N,N)
{
// код помещенный здесь будет выполятся каждую секунду
}
//-----------------------------------------------------------------------------------OnTime(W,D,X,Y,H,C,S)
{
//W - день недели ( 0 - понедельник, 6 - воскресенье);
//D - дата в формате "число-месяц-год", 16 августа 2001 года это "16-08-01"
//X,Y - зарезервировано
//H - час
//C - минуты
//S - секунды
// ВЫПОЛНЯЯ СРАВНЕНИЕ С ПАРАМЕТРАМИ ДАЛЕЕ УКАЗЫВАЕТСЯ ДЕЙСТВИЕ
}
//-----------------------------------------------------------------------------------// ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
OnTime(W,"16-08-01",X,Y,"11","11","30")
{
// помещенный здесь код сработает 16 августа 2001 года в 11 часов 11 минут 30 секунд
}
OnTime(W,D,X,Y,"11","11","30")
{
// помещенный здесь код сработает каждый день в 11 часов 11 минут 30 секунд
}
OnTime(W,"16-08-01",X,Y,H,C,S)
{
// помещенный здесь код ,будет срабатывать 16 августа 2001 года
// каждую секунду
}
OnTime(W,"16-08-01",X,Y,"11","11",S)
{
// помещенный здесь код ,будет срабатывать 16 августа 2001 года
// c 11 часов 11 минут по 11 часов 12 минут каждую секунду
}
OnTime("0",D,X,Y,"21","0","0")
{
// помещенный здесь код ,будет срабатывать каждый понедельник
// в 21 часов 00 минут 00 секунд
}
Уровень 1.
Скрипт 1.1.
Постановка задачи: создадим программу, которая ставит на охрану камеру 1 при
возникновении одного события, и снимаетее с охраны при возникновении второго.
Код:
OnEvent("MACRO","1","RUN")
{
DoReact("CAM","1","ARM");
}
OnEvent("MACRO","2","RUN")
{
DoReact("CAM","1","DISARM");
}
Описание: В данном случае первое событие – запуск Макрокоманды 1, второе – запуск
Макрокоманды 2.
Теперь мы подставляем конкретное событие:
Скрипт 1.2.
Постановка задачи: Допустим, у нас на Дисплее1 у нас находится одна камера, которая
подключена к телеметрии. Нам необходимо выводить окно управления телеметрией
всякий раз, когда активируется Дисплей 1.
Код:
OnEvent("DISPLAY","1","ACTIVATE")
{
DoReact("DIALOG","SAMSUNG","CLOSE_ALL");
DoReact("DIALOG","SAMSUNG","RUN");
}
OnEvent("DISPLAY","1","DEACTIVATE")
{
DoReact("DIALOG","SAMSUNG","CLOSE_ALL");
}
Помимо этого, в событиях и реакциях могут присутствовать некоторые параметры. Это
мы можем наблюдать в дебаговском окошке. Параметры можно использовать в скриптах.
Например, мы активизируем камеру на Мониторе1. Нам необходимо, чтобы данная
камера выводилась на аналоговый выход граббера. В общем случае мы не знаем, какая из
камер будет активизирована. Однако, проследив событие активизации монитора (Event :
MONITOR
1
ACTIVATE_CAM
slave_id<CLASS-4>,core_global<1>,cam<5>,owner<CLASS-
4>,time<16:16:27>,date<23-09-04>),
можем обнаружить, что параметр cam меняется в
зависимости от того, на какую камеру щелкнули.
Скрипт 1.3.
Постановка задачи: Выводить на монитор камеру, на которую щелкнули мышкой.
Код:
OnEvent("MONITOR","1","ACTIVATE_CAM")
{
DoReact("CAM",cam,"MUX1");
}
Далее стоит остановиться на функции OnTime. Сделаем скрипт, который каждую минуту
экспортировал бы файл в JPEG.
Скрипт 1.4.
Постановка задачи: Написать программу, которая каждую минуту экспортировал бы
файл в JPEG.
Код:
OnTime(D,W,X,Y,H,M,"00")
{
DoReact("MONITOR","1","EXPORT_FRAME","cam<3>");
}
Уровень 2.
Теперь мы научимся создавать программы с использованием оператора цикла for, и
оператора условия if, а также применять операторы задержки Wait и Sleep.
Скрипт 2.1.
Постановка задачи: по началу Временной зоны1 Камера1 встает на охрану. По
окончанию Временной зоны1 Камера1 снимается с охраны. При этом в обоих случаях
проверяется условие, произошло ли определенное событие.
Код:
OnEvent("MACRO","1","RUN")
{
i=1;
}
OnEvent("MACRO","2","RUN")
{
i=0;
}
OnEvent("TIME_ZONE","1","ACTIVATE")
{
if(i)
{
DoReact("CAM","1","ARM");
}
}
OnEvent("TIME_ZONE","1","DEACTIVATE")
{
if(i)
{
DoReact("CAM","1","DISARM");
}
}
Описание: в данном случае «определенное событие» - это запуск Макрокоманды1,
которая приравнивает переменную i к единице. Макрокоманда2 приравнивает i к 0, и
используется исключительно для отладки. Вместо события «запуск Макрокоманды»
может использоваться любое другое событие.
Далее составим программу, выводящую диалоговое окно, с задержкой в 5 секунд при
активизации Дисплея1.
Код:
Скрипт 2.2.
OnEvent("DISPLAY","1","ACTIVATE")
{
DoReact("DIALOG","SAMSUNG","CLOSE_ALL");
Wait(5);
DoReact("DIALOG","SAMSUNG","RUN");
}
OnEvent("DISPLAY","1","DEACTIVATE")
{
DoReact("DIALOG","SAMSUNG","CLOSE_ALL");
}
Составим программу с оператором цикла for:
Скрипт 2.3.
Постановка задачи: На объекте установлено 5 камер. По определенному событию (в
данном случае это запуск Макрокоманды1), выводим последовательно на аналоговый
выход все 6 камер с интервалом в 2 секунды.
Код:
OnEvent("MACRO","1","RUN")
{[
a=0;
exit=0;
for(i=5;strequal(exit,0);i=i-1)
{
a=str(a+1);
DoReact("CAM",a,"MUX1");
Wait(2);
if (strequal(a,5))
{a=0;}
}
]}
OnEvent("MACRO","2","RUN")
{
exit=1;
}
Описание: Камеры будут листаться до тех пор, пока переменная exit не станет отличной
от нуля. Запуск Макрокоманды2 приравнивает exit 1, и как следствие прекращает
листание камер.
Условный оператор if необходим для того, чтобы отсчет велся постоянно от 1 до 6, и не
более.
Скрипт 2.4.
Постановка задачи: Создадим программу, в которой каждую минуту выполнялся бы
экспорт кадров в JPEG по всем 5 камерам, за исключением 4-ой.
Код:
OnTime(D,W,X,Y,H,M,"00")
{
a=0;
for(i=5;i>0;i=i-1)
{
a=str(a+1);
if(a!=4)
{ DoReact("MONITOR","1","EXPORT_FRAME","cam<"+a+">"); }
}
}
Описание: В программе переменная i выполняет роль счетчика, а переменная a является
номером камеры. В теле цикла стоит условный оператор, где проверяется, не равен ли
номер камеры 4. Если результат положительный (а не равно 4) – проводится экспорт
кадров в JPEG.
Уровень 3.
Здесь мы научимся использовать оператор DoCommand. С помощью оператора
DoCommand мы имеем возможность запускать любое Windows – приложение, а также bat
–
файлы.
Эта
возможность
значительно
расширяет
возможности
системы
и
«интеллектуализирует» ее работу.
В скобках данной команды необходимо записывается команда в том виде, в котором она
бы записывалась, если б запускалась из «Пуск/Выполнить».
Скрипт 3.1.
Постановка задачи: По запуску Макрокоманды 1 запускать окно реестра.
Код:
OnEvent("MACRO","1","RUN")
{
DoCommand("regedit");
}
Скрипт 3.2.
Постановка задачи: установлено ПО Face Inspector Pro и создана база данных лиц
известных террористов, и лиц находящихся в уголовном розыске. Как только было
распознано лицо человека, похожего на то, что есть в базе, запускается конвертор
видеоархива в формат
avi. Функциональное назначение данной программы
–
автоматический сбор досье на людей, т.е. нарушитель еще не совершил преступления, а
досье на него уже собирается.
OnEvent("MACRO","1","RUN")
{
DoReact("CAM","3","REC");
date1=date;
time1=time;
}
OnEvent("MACRO","2","RUN")
{
DoReact("CAM","3","REC_STOP");
date2=date;
time2=time;
command="cmd /c ####C:\inspector
"+time1+","+date2+" "+time2;
3.9.2
release\tools\backup.exe####,3,"+date1+"
DoCommand(command);
}
Описание: Событие «Лицо распознано» в данном случае заменено Макрокомандой1.
Когда лицо нарушителя распознано, запоминается время и дата в переменные time1 и
date1. После того как тревога прошла, о чем свидетельствует событие Макрокоманда2,
фиксируется дата и время окончания тревоги соответственно в переменные date2 и time2.
Далее происходит запуск утилиты backup.exe с параметрами, включающими в себя время
начала события и его окончания.
Скрипт 3.3.
Постановка задачи: создать программу, которая каждую минуту экспортирует кадры в
JPEG формат, и помещает их в папки следующим образом:
В папке С:\EXPORT
создаются вложенные папки, с названием, соответствующее дате. В папке с названием
даты – создаются папки, с названием соответствующие часу. А уже в эти папку
осуществляется экспорт кадра.
Код:
OnTime(W,D,X,Y,"00","00","00")
//OnEvent("MACRO","1","RUN")
{
path=strrtrim("c:\EXPORT\ ")+date;
command="cmd /c mkdir "+path;
DoCommand(command);
}
OnTime(W,D,X,Y,H,"00","00")
//OnEvent("MACRO","2","RUN")
{
time1=time;
t1=extract_substr(time1,":",0);
path=strrtrim("c:\EXPORT\ ")+date;
path=strrtrim(path+"\ ");
path=path+t1;
command1="cmd /c mkdir "+path;
DoCommand(command1);
}
OnTime(W,D,X,Y,H,M,"00")
//OnEvent("MACRO","3","RUN")
{
time1=time;
t1=extract_substr(time1,":",0);
t2=extract_substr(time1,":",1);
t3=extract_substr(time1,":",2);
path=strrtrim("c:\EXPORT\ ")+date;
path=strrtrim(path+"\ ");
path=path+t1;
filename=strrtrim(path+"\ ")+t1+"_"+t2+"_"+t3+".jpg";
DoReact("MONITOR","1","EXPORT_FRAME","cam<1>,file<"+filename+">");
}
Описание:
Операторы extract_substr и strrtrim см. Значение в руководстве программиста.
В первой части программы создается каталог, в который будет происходить экспорт
кадра. Во второй части программы создается каталог, соответствующий часу уже внутри
каталога-даты. В третьей части программы проводится экспорт кадра в каталог, который
был создан во второй части программы.
Для отладки частей программы можно использовать соответственно Макрокоманды 1, 2, 3
(см. закомментированная часть).
Скрипты 3.2. и 3.3 можно дополнить следующим скриптом:
Скрипт 3.4.
Постановка задачи: в определенный момент происходит копирование собранного
материала по локальной сети. В случае со сбором досье (скрипт 3.2) копирование
осуществляется сразу же, как произошло распознавание объекта. В варианте с экспортом
файлов резервное копирование может осуществляться в определенный момент (например
в 21:00:00).
Рассмотрим вариант с копированием JPEG – файлов. В 21:00:00 должно осуществляться
резервное копирование всех файлов, собранных за день.
OnTime(W,D,X,Y,"21","00","00")
//OnEvent("MACRO","4","RUN")
{
DoCommand("cmd /c xcopy /y/s "+strrtrim("c:\EXPORT\ ")+date+" \\class-3\upload");
}
Описание:
Ньюанс: папка, в которую происходит копирование должна быть доступной для
изменения и копирования. В случае со сбором досье копирование можно осуществлять
как на жесткий диск, так и на компакт – диск.
Уровень 4.
В этой части мы научимся создавать объекты в И+, модифицировать настройки этих
объектов,
и
удалять
объекты
с
помощью
команд
CREATE_OBJECT,
UPDATE_OBJECT, DELETE_OBJECT.
Необходимо отметить следующее:
1. при операциях создания и модификации объекта обязательно необходимо указывать id
родительского объекта (параметр parent_id).
2. Параметры objtype, parent_id, name задаются в явном виде. Остальные параметры,
такие как например level_id для объекта «DEPARTMENT», задаются неявно: сначала идет
описание количества изменяемых параметров, затем описывается их тип, и после этого
задается значение.
Так, например, если необходимо поменять параметр «Уровень
доступа» в настройках отдела, синтаксис будет выглядеть следующим образом:
params<1>,param0_name<level_id>,param0_val<*>. Стоит отметить, что можно сразу
создать объект с определенным набором параметров, каждый из которых имеет
определенное значение. Например, создать тот же отдел с параметром level_id («уровень
доступа») как «Полный доступ» как показано ниже.
Рассмотрим программу создания, модификации и удаления отдела.
Скрипт 4.1.
Постановка задачи: создать программу, которая создает отдел, модифицирует один из
его параметров, удаляет отдел и создает отдел с определенным набором параметров.
Код:
OnEvent("MACRO","1","RUN")
{
NotifyEvent("CORE","","CREATE_OBJECT","objtype<DEPARTMENT>,parent_id<>,objid<
1>,name<Департамент1>");
}
OnEvent("MACRO","2","RUN")
{
NotifyEvent("CORE","","UPDATE_OBJECT","objtype<DEPARTMENT>,parent_id<>,objid<
1>,name<Department 1>,params<1>,param0_name<level_id>,param0_val<*>");
}
OnEvent("MACRO","3","RUN")
{
NotifyEvent("CORE","","DELETE_OBJECT","objtype<DEPARTMENT>,objid<1>");
}
OnEvent("MACRO","4","RUN")
{
NotifyEvent("CORE","","CREATE_OBJECT","objtype<DEPARTMENT>,parent_id<>,objid<
1>,name<Отдел 1>,params<1>,param0_name<level_id>,param0_val<*>");
}
Описание: в первой части программы создаем отдел. id отдела равен 1, имя –
«Департамент 1».
Во второй части мы модифицируем объект, устанавливая уровень доступа в положение
«Полный доступ».
В третьей части удаляем объект.
В четвертой части программы рассматривается возможность создания отдела с уже
определенным набором параметров (level_id установлен как «Полный доступ»).
Скрипт 4.2.
Постановка задачи: Далее рассмотрим программу создания 10-ти отделов, в каждом из
которых находится по 10 пользователей.
Код:
OnEvent("MACRO","1","RUN")
{
dep=0;
per=0;
for(i=1;i<11;i=str(i+1))
{
dep=i;
NotifyEvent("CORE","","CREATE_OBJECT","objtype<DEPARTMENT>,parent_id<>,objid<
"+dep+">,name<Департамент "+dep+">");
for(j=1;j<11;j=str(j+1))
{
per=str(per+1);
NotifyEvent("CORE","","CREATE_OBJECT","objtype<PERSON>,parent_id<"+dep+">,objid
<"+per+">,name<Пользователь "+per+">");
}
}
}
Описание: в программе использованы счетчики: i – является счетчиком для создания
отделов, j – счетчик, используемый для создания пользователей в этих отделах.
Переменная dep отражает номер отдела, который будет создан, а переменная per – номер
пользователя.
В названиях отделов и пользователей также учитывается их порядковый номер.
Данная программа весьма полезна для отладки, если на объекте установлено СКД. В
оборудование СКД «Рубеж» и «Apollo» предусмотрена пересылка конфигурации. При
этом критически важным является время, за которое эта конфигурация может быть
переслана (особенно в сетевых конфигурациях). Поэтому бывает необходимо создать
несколько сот пользователей и несколько десятков отделов, чтобы протестировать чтолибо. Данная программа применялась для тестирования пересылки конфигурации в СКД
на объекте «Северсталь» г. Череповец.
Модифицировав код можно получить, например, программу по созданию 8 плат
видеоввода, к каждой из которых подключено по 8 камер. (Для видеоподсистемы Video Hi
Live IV - 64). Если создавать такую конфигурацию вручную, то затраченное время будет
составлять порядка 30 минут.
Бывают ситуации, когда необходимо поменять определенный параметр у группы
объектов. Например, на каждого пользователя может быть заведена карточка, срок
действия которой ограничен. Например, карточки действуют до 01.01.2005. Это значит,
что после Нового Года, когда люди выйдут на работу, СКД их не пропустит.
Если пользователей немного, дату можно поменять вручную. Если же их было создано
несколько тысяч (Как например на объекте JackPot в Москве 2161 пользователей), то
менять вручную даты довольно проблематично.
Проблема решается довольно изящно с помощью программы, код которой приведен ниже.
Скрипт 4.3.
Постановка задачи: Создать программу, которая меняет дату окончания действия
карточки у созданных в скрипте 4.2 пользователей на 01.01.2007
OnEvent("MACRO","1","RUN")
{
a=0;
for(i=1;i<101;i=str(i+1))
{
a=str(a+1);
dep=GetObjectParam("PERSON",i,"parent_id");
NotifyEvent("CORE","","UPDATE_OBJECT","objtype<PERSON>,objid<"+a+">,parent_id<"
+dep+">,params<1>,param0_name<expired>,param0_val<21.01.2007>");
}
}
Описание: Здесь переменная i выполняет роль счетчика, переменная per соответствует
порядковому номеру Пользователя. Как упоминалось ранее, для модификации объекта
необходимо обязательно указывать значение параметра parent_id. Поэтому используется
функция
GetObjectParam("PERSON",i,"parent_id"),
которая
возвращает
значение
параметра parent_id для каждого из объектов «Пользователь».
Код, приведенный ниже, можно модифицировать и получить программу, которая меняла
бы разрешение камер существующих в системе. Например, нам необходимо знать
зависимость загрузки процессора от разрешения камер. Если у нас в системе 64 камер, то
замена значений занимает порядка 3 минут, что раздражает. Использование скрипта в
этом случае значительно облегчает задачу.
Download