Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Tip

GRABBER Устройство видеоввода

MACRO Макрокоманда

CAM Камера

MONITOR Монитор видеонаблюдения

Форматы и функции

Формат процедуры событий для Устройства видеоввода:

...

Формат оператора для описания действий с устройством видеоввода Устройством видеоввода:

Code Block
languagecpp
DoReact("GRABBER","_id_","_команда_" [,"_параметры_"]);

Формат процедуры событий для объекта Камера:

Code Block
languagecpp
OnEvent("CAM","_id_","_событие_")

Формат оператора для описания действий с Камерой:

Code Block
languagecpp
DoReact("CAM","_id_","_команда_" [,"_параметры_"]);

Функция проверки состояния объекта Камера:

Code Block
CheckState("CAM","номер","состояние")

Формат процедуры событий для объекта Монитор:

Code Block
languagecpp
OnEvent("MONITOR","_id_","_событие_")

Формат оператора для действий с Монитором:

Code Block
DoReact("MONITOR","_id_","_команда_"[,"_параметры_"]);

Примеры

...

  1. Необходимо установить для первого устройства видеоввода первый канал, максимальную скорость оцифровки, разрешение полукадр и формат PAL при запуске первой макрокоманды.

    Code Block
    languagecpp
    OnEvent("MACRO","1","RUN") // запуск макрокоманды 1
    {
    	DoReact("GRABBER","1", "SETUP", "chan<1>,mode<0>,resolution<1>,format<PAL>"); 
    	//установка для первой платы видеоввода канал - 1, скорость оцифровки - 
    	максимальная, разрешение - полукадр, формат - PAL
    }
  2. Необходимо при запуске третьей макрокоманды установить диски D:\ и F:\ для записи видеоархива.

    Code Block
    languagecpp
    OnEvent("MACRO","3","RUN") //запуск макрокоманды 3
    {
    	DoReact("GRABBER","1","SET_DRIVES","drives<D:\,F:\>"); //запись видеоархива на диски D:\ и F:\
    }
  3. Необходимо вывести первую видеокамеру на первый аналоговый выход платы и отключить первые аналоговые выходы первой и второй плат при ошибке подключения ко второй плате видеоввода.

    Code Block
    languagecpp
    OnEvent("GRABBER","2"," UPS_FATAL_ERROR") //ошибка подключения к плате видеоввода 2
    {
    	DoReact("CAM","1","MUX1"); //вывод видеокамеры 1 на 1-ый аналоговый вывод платы
    	Wait(5);
    	DoReact("GRABBER","1","MUX1_OFF"); //отключение 1-го аналогового выхода первой платы
    	DoReact("GRABBER","2","MUX1_OFF"); //отключение 1-го аналогового выхода второй платы
    }
    Info
    titleПримечание.
    Если аналоговые выходы двух и более плат соединяются параллельно, и видеокамера 1, например, принадлежит первому грабберу, а видеокамера 2 − второму, то при вызове команды «DoReact("CAM","1","MUX1");»  необходимо сначала вызвать команду «DoReact("GRABBER","2","MUX1_OFF");» и, соответственно, при вызове команды «DoReact("CAM","2","MUX1");» необходимо сначала вызвать команду «DoReact("GRABBER","1","MUX1_OFF");». Иначе произойдет наслоение сигналов.
  4. Необходимо отключить второй аналоговый выход платы видеоввода при восстановлении питания от сети.

    Code Block
    languagecpp
    OnEvent("GRABBER","1","UPS_ONLINE") //восстановление питания от сети
    {
    	DoReact("GRABBER","1","MUX2_OFF"); //отключение аналогового выхода 2
    }


Примеры использования событий и реакций объекта Камера:

  1. При постановке первой камеры на охрану выполнить перевод камеры в цветной режим и начать запись с нее.

    Code Block
    languagecpp
    OnEvent("CAM","1","ARM") //первая видеокамера поставлена на охрану
    {
    	DoReact("CAM","1","SETUP","color<1>"); //установка цветного режима видеокамеры
    	DoReact("CAM","1","REC"); //запись с первой видеокамеры
    }
  2. Необходимо поставить на охрану первую видеокамеру при отключении пятой видеокамеры.

    Code Block
    languagecpp
    OnEvent("CAM","5","DETACH") //пятая видеокамера отключена 
    {
    	DoReact("CAM","1","ARM"); //первая видеокамера поставлена на охрану
    }
  3. Необходимо использовать половину ресурсов при записи у первой видеокамеры (то есть, если в системе через первую плату видеоввода подключено 4 видеокамеры, то первая будет записывать со скоростью 6 кадров/сек, а остальные три – по 2-2,5 кадра/сек.), если она находится в тревожном состоянии.

    Code Block
    languagecpp
    OnEvent("CAM","1","MD_START") //первая видеокамера находится в тревожном состоянии
    {
    	DoReact("CAM","1","SETUP","rec_priority<2>"); //использование половины ресурсов при записи
    }
  4. Необходимо установить максимальную компрессию синхронно с четвертым микрофоном звуковой платы на первой видеокамере при записи на диск видео с первой видеокамеры.

    Code Block
    languagecpp
    OnEvent("CAM","1","REC") //первая видеокамера ведет запись на диск
    {
    	DoReact("CAM", "1", "SETUP", "compression<5>, audio_type<OLXA_LINE>, audio_id<4>"); //первая видеокамера, максимальная компрессия, 
    синхронно с четвертым микрофоном звуковой платы
    }
  5. Необходимо начать запись с первой видеокамеры с минимальным качеством в черно-белом режиме, когда она выйдет из состояния тревоги.

    Code Block
    languagecpp
    OnEvent("CAM","1","MD_STOP") //первая видеокамера перестала находиться в тревожном состоянии
    {
    	value = 5;
    	DoReact("CAM", "1", "SETUP", "compression<" + value + ">,сolor<0>"); 
    	//начать запись первой видеокамеры с минимальным качеством в ч/б   //восстановление питания от сети
    {
    	DoReact("GRABBER","1","MUX2_OFF");             //отключение аналогового выхода 2
    }режиме
    }
  6. Необходимо начать запись с первой видеокамеры в режиме «откат», когда она снята с охраны.

    Code Block
    languagecpp
    OnEvent("CAM","1","DISARM")  //первая видеокамера снята с охраны
    {
    	DoReact("CAM","1","REC","rollback<1>");  //начать запись с первой видеокамеры в режиме «откат»
    }
  7. Установить новые параметры видеоканала при подключении первой видеокамеры.

    Code Block
    languagecpp
    OnEvent("CAM","1","ATTACH") //подключена первая видеокамера
    {
    	VIDEO_CANAL_ID = GETOBJECTPARAM("CAM","1","PARENT_ID"); //определяем идентификатор видеоканала, которому принадлежит первая видеокамера
    	DoReact("GRABBER",VIDEO_CANAL_ID,"SETUP","chan<0>,mode<0>,resolution<1>,format<pal>"); //устанавливаем новые параметры видеоканала
    }
  8. По макрокоманде 2 запустить автопанорамирование на камере 1.

    Code Block
    languagecpp
    OnEvent ("MACRO","2","RUN")
    {
        DoReact("CAM","1","CRUISE_START","cruise_id<1>,action<CRUISE_START>,cam_id<1>");
    }
  9. Есть определенное количество камер (num). Необходимо проверить работу детектора движения по всем камерам (можно использовать для проверки работоспособности датчиков охраны).

    Для решения задачи используется эмуляция линейного символьного массива (строка), т.е. заполняется массив символов (в примере это символ «N»). Далее при сработке детектора движения по камере меняется соответствующий (идентификатору камеры) элемент массива (меняется на "Y"). Таким образом, на выходе образуется символьный массив из «N» (камера не сработала) и «Y» (камера сработала). Подсчитывается количество сработок и выдается сообщение об общем количестве камер и количество камер, у которых сработал детектор. Старт проверки по Макрокоманде 1. Остановка по Макрокоманде 2.

    Code Block
    languagecpp
    OnInit()
    {
        run=0;
    }
    
    OnEvent("MACRO","1","RUN")
    {
        run=1; flag=""; num=8;
        for(i=1;i<str(num+1);i=str(i+1))
        {
            DoReact("CAM",i,"DISARM");
            DoReact("CAM",i,"REC_STOP");
            DoReact("CAM",i,"ARM");
            flag=flag+"N";
            if(i<num) {flag=flag+"|";}
        }
    }
    
    OnEvent("CAM",N,"MD_START")
    {
        if(run)
        {
            nn=str((N*2)-1);
            flag=strleft(flag,str(nn-1))+"Y"+strright(flag,str(((num*2)-1)-nn));
        }
    }
    
    OnEvent("MACRO","2","RUN")
    {
        run=0; fin=0;
        for(i=1;i<str(num+1);i=str(i+1))
        {
            tmp=extract_substr(flag,"|",str(i-1));
            if(strequal(tmp,"Y")) {fin=str(fin+1);}
            DoReact("CAM",i,"DISARM");
        }
        tmp="Всего:"+str(num)+" Сработало:"+str(fin);
        rez=MessageBox("",tmp,0);
    }
  10. При возникновении тревоги по камере 1 накладывать титры на видеоизображение с данной камеры. При окончании тревоги накладывать титры об окончании тревоги.

    Code Block
    languagecpp
    OnEvent("CAM","1","MD_START")
    {
        DoReact("CAM","1","CLEAR_SUBTITLES","title_id<1>"); //удалить все титры с видеоизображения
        DoReact("CAM","1","ADD_SUBTITLES","command<Камера 1 Тревога " + time + "\r>,page<BEGIN>,title_id<1>"); 
        //параметр time позволяет включить в титры время регистрации события
    }
    
    OnEvent("CAM","1","MD_STOP")
    {
        DoReact("CAM","1","ADD_SUBTITLES","command<Камера 1 Конец тревоги " + time + "\r>,page<END>,title_id<1>");
    }
    Info
    titleПримечание

    При использовании параметров page<BEGIN> и page<END> будут заполняться соответствующие поля в базе титров, что даст возможность производить поиск данных с помощью интерфейсного объекта Поиск по титрам.


Примеры использования событий и реакций объекта Монитор:

  1. При запуске первой макрокоманды проиграть запись с видеокамеры 1 на мониторе 4 с указанными датой и временем.

    Code Block
    languagecpp
    OnEvent("MACRO","1","RUN")
    {
    	DoReact("MONITOR","4","ARCH_FRAME_TIME","cam<1>,date<"+date+">,time<11:00:00>");
    	DoReact("MONITOR","4","KEY_PRESSED","key<PLAY>");
    }
  2. При печати кадра с первой видеокамеры перейти в режим просмотра видеоархива на первой видеокамере монитора 4, и перейти на 10 кадров далее, начиная с фрагмента указанной даты и времени.

    Code Block
    languagecpp
    OnEvent("CAM", "1", "PRINT")
    {
    	DoReact("MONITOR","4","ARCH_FRAME_TIME","cam<1>,date<"+date+">,time <11:00:00>"); 
     	for(i=0;i<10;i=i+1) 
     	{ 
     		DoReact ("MONITOR","4","KEY_PRESSED","key<FF>"); 
     	}
    }
  3. Приблизить видеоизображение на экране монитора, если видеокамера находится в состоянии тревоги, и вернуть в исходное состояние при ее окончании.

    Code Block
    languagecpp
    OnEvent("CAM","1","MD_START")
    {
    	DoReact("MONITOR","1","KEY_PRESSED","key<ZOOM_IN>");
    }
    
    OnEvent("CAM", "1", "MD_STOP");
    {
    	DoReact("MONITOR","1","KEY_PRESSED","key<ZOOM_OUT>");
    }
  4. Вывести на экран монитора раскладку под номером 1 при срабатывании макрокоманды.

    Code Block
    OnEvent("MACRO","1","RUN")
    {
    	DoReact("MONITOR","1","KEY_PRESSED","key<SELECT_LAYOUT>,number<1>");
    }
  5. Команда запуска экспорта видео с Камеры 1 в Мониторе 1, начиная с момента времени 24-10-14 17:10:38 и заканчивая 24-10-14 17:10:50, в файл c:\aaa.avi.
    Примеры запуска экспорта тремя способами: через IIDK (порт 900 и порт 1030) и через скрипт.
    1. IIDK (порт 900)
      MONITOR|1|START_AVI_EXPORT|start<24-10-14 17:10:38>,finish<24-10-14 17:10:50>,avi_path<c:\aaa.avi>,cam<1>
    2. IIDK (порт 1030)
      CORE||DO_REACT|source_type<MONITOR>,source_id<1>,action<START_AVI_EXPORT>,params<4>,param0_name<avi_path>,
      param0_val<c:\aaa.avi>,param1_name<cam>,param1_val<1>,param2_name<finish>,param2_val<24-10-14 17:10:50>,
      param3_name<start>,param3_val<24-10-14 17:10:38>
    3. Скрипт (запуск по Макрокоманде 1)

      Code Block
      languagecpp
      OnEvent("MACRO","1","RUN")
      {
      	DoReact("CORE","","DO_REACT","source_type<MONITOR>,source_id<1>,action<START_AVI_EXPORT>,params<4>,
          param0_name<avi_path>,param0_val<c:\aaa.avi>,param1_name<cam>,param1_val<1>,param2_name<finish>,
           param2_val<24-10-14 17:10:50>,param3_name<start>,param3_val<24-10-14 17:10:38");
      }
  6. По макрокоманде 1 включать управление телеметрией при помощи мыши на камере 4, выведенной на монитор 10, по макрокоманде 2 отключать.

    Code Block
    languagecpp
    OnEvent("MACRO","1","RUN")
    {
        DoReact("MONITOR","10","CONTROL_TELEMETRY","cam<4>,on<1>");
    }
    
    OnEvent("MACRO","2","RUN")
    {
        DoReact("MONITOR","10","CONTROL_TELEMETRY","cam<4>,on<0>");
    }
  7. Выводить активную камеру на аналоговый монитор.

    Code Block
    languagecpp
    OnEvent ("MONITOR","1","ACTIVATE_CAM")
    {
        DoReact ("CAM",cam,"MUX1");
    }
  8. Выводить тревожную камеру в режим однократера.

    Code Block
    languagecpp
    OnEvent ("CAM",N,"MD_START")
    {
        DoReact ("MONITOR","1","ACTIVATE_CAM","cam<"+N+">");
        DoReact ("MONITOR","1","KEY_PRESSED","key<SCREEN.1>");
    }
  9. Тревожный монитор, на котором всегда остается видео от последней тревожной камеры.

    Code Block
    languagecpp
    OnInit()
    {
        counter=0;
    }
    
    OnEvent("CAM",T,"MD_START")
    {
        if(strequal(counter,"0"))
        {
            DoReact("MONITOR","2","REMOVE_ALL");
            DoReact("MONITOR","2","ADD_SHOW","cam<"+T+">");
        }
        counter=str(counter+1);
    }
    
    
    OnEvent("CAM",M,"MD_STOP")
    {
        counter=str(counter-1);
        if(strequal(counter,"0"))
        {
            DoReact("MONITOR","2","ADD_SHOW","cam<"+M+">");
        }
    }
  10. По макрокоманде 1 включить проигрывание по раскладкам на всех серверах в окне Монитора видеонаблюдения (Монитор 1), по макрокоманде 2 отключить проигрывание по раскладкам на всех серверах.
    Code Block
    languagecpp
    if(Event.SourceType == "MACRO" && Event.SourceId=="1" && Event.Action=="RUN")
    {
        DoReactStr("MONITOR", "1","START_PAGING_LAYOUTS","");
    }
    
    if (Event.SourceType == "MACRO" && Event.SourceId == "2" && Event.Action == "RUN") 
    {
        DoReactStr("MONITOR", "1", "STOP_PAGING_LAYOUTS","");
    }