суббота, 24 октября 2015 г.

Управление купольной антивандальной камерой STC-2901 по RS-485 из скрипта VBS

Сегодня устройства для удаленного мониторинга и регистрации событий являются неотъемлемой частью любой системы автоматизации промышленных объектов. Ввиду своей удаленности, на линию связи таких устройств оказывают существенное влияние внешние факторы, такие как: промышленные помехи, влияние соседних устройств, климатические условия, нестабильность питания и т.д. Безусловным лидером в плане помехозащищенности является двухпроводный дифференциальный интерфейс RS-485, гарантирующий дальность связи до километра. Что, наряду с вандалозащищенным исполнением систем наблюдения, позволяет обеспечить дистанционное управление купольными IP-камерами в пределах не только внутренних помещений, но и нескольких зданий, а это: и регулировка контрастности и поворот, наклон, контроль положения и т.п. Как правило, серьезные системы мониторинга, для удобства использования, идут в комплекте с клавиатурой и джойстиком. Но встречаются и исключения (сколь любят экономить люди). Вот и на сей раз, обратились с просьбой реализовать программный контроль подобной камеры с обычной клавиатуры, ввиду потери комплектности. Под катом мы реализуем вариант простого приложения на VBS c голосовым сопровождением для управления по интерфейсу RS-485 (по протоколу Pelco-D) таким высокотехнологичным гаджетом как купольная антивандальная камера STC-2901.

Cистемные требования и зависимости
  1.  Win OS 32/64-bit.
  2.  COM-сервер DynWrapX.dll.
  3.  SAPI (для озвучивания используется интерфейс по-умолчанию).
  4.  Физический RS-232 or virtual COM over USB на базе конвертора USB/RS-485 или RS-232/RS-485.
  5.  Подключенная камера STC-2901 или любая другая с поддержкой протокола Pelco-D.
Кишочки скрипта:
' STC-2901.VBS
' Демонстрационный скрипт управления купольной антивандальной камерой STC-2901 по RS-485 c голосовым сопровождением
' Поддержка следующих команд: влево-вправо-вверх-вниз
'
' Разработчик: Бадло Сергей Григорьевич aka raxp
' H-page: http://raxp.radioliga.com
' Зависимости:
' · Win OS 32/64-bit
' · COM-сервер DynWrapx.dll
' · SAPI (для озвучивания используется интерфейс по-умолчанию)
' · Физический RS-232 or virtual COM over USB/RS-485
' · Подключенная камера STC-2901
'
' Региcтрация интерфейсов (обязательно первично однократно):
' · в данном скрипте задайте порт подключения проектора
' · запустите regdynwrapx.bat (на Windows Vista/7/8/8.1/10 запускать правой кнопкой мыши от имени Администратора)
' Использование:
' · запустите run_STC-2901.cmd
' · для завершения нажмите 'Escape'


' Список команд

cmdon = chr(255)&chr(00)&chr(00)&chr(00)&chr(00)&chr(00)&chr(00)    ' активация FF 00 00 00 00 00 00
cmdup = chr(255)&chr(01)&chr(00)&chr(08)&chr(00)&chr(32)&chr(41)    ' Up        FF 01 00 08 00 20 29
cmddown = chr(255)&chr(01)&chr(00)&chr(16)&chr(00)&chr(32)&chr(49)  ' Down      FF 01 00 10 00 20 31
cmdleft = chr(255)&chr(01)&chr(00)&chr(04)&chr(32)&chr(00)&chr(37)  ' Left      FF 01 00 04 20 00 25
cmdright = chr(255)&chr(01)&chr(00)&chr(02)&chr(32)&chr(00)&chr(35) ' Right     FF 01 00 02 20 00 23


' подключаем голосовое сопровождение
' при надоедливости голоса speakon = false

Dim Speak
speakon = true ' разрешаем голосовое сопровождение
Set Speak = CreateObject("sapi.spvoice")
' регистрируем COM объект DynamicWrapperX в тихом режиме
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ("regsvr32.exe dynwrapx.dll /s"),3, true
' создаем объект DynamicWrapperX
Set Wrap = CreateObject("DynamicWrapperX.2")
Wrap.Register "user32.dll", "GetAsyncKeyState", "i=l", "f=s", "r=l"

' Настройка порта COM1, на котором конвертор RS-485/USB
port = "COM1"
' регистрируем функи для работы с портом
Wrap.Register "KERNEL32.DLL", "CreateFile", "i=sllllll", "r=l"
Wrap.Register "KERNEL32.DLL", "WriteFile", "i=lslll", "r=l" ' ANSI
' вариант с Unicode - Wrap.Register "KERNEL32.DLL", "WriteFile", "i=lllll", "r=l"
Wrap.Register "KERNEL32.DLL", "CloseHandle", "i=l", "r=l"
Wrap.Register "KERNEL32.DLL", "EscapeCommFunction", "i=hu", "r=l"
' забиваем аттрибуты
GENERIC_WRITE = 1073741824
FILE_SHARE_READ = 1
FILE_SHARE_WRITE = 2
OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL = 128
cbWritten = " "
pcbWritten = Wrap.StrPtr(cbWritten)
' открываем нужный нам порт COMn
hFile = Wrap.CreateFile(port, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
' отключаем сигналы на DTR/RTS
Wrap.EscapeCommFunction hFile, 4
Wrap.EscapeCommFunction hFile, 6

' Информируем пользователя о начале работы
if (speakon = true) then
Speak.Speak "Готов измываться над камерой."
End if

p = true

' запускаем бесконечный цикл по условию нажатия 'Escape' с задержкой
Do While Wrap.GetAsyncKeyState(27) = "0"

'задержка на кол-во миллисекунд
WScript.Sleep 500
' отлавливаем нажатие Up
upt = Wrap.GetAsyncKeyState(38)
' отлавливаем нажатие Down
downt = Wrap.GetAsyncKeyState(40)
' отлавливаем нажатие Left
leftt = Wrap.GetAsyncKeyState(37)
' отлавливаем нажатие Right
rightt = Wrap.GetAsyncKeyState(39)


if (upt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdon, Len(cmdon), pcbWritten, 0
 Wrap.WriteFile hFile, cmdup, Len(cmdup), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Камера вверх."
 End if
End if

if (downt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdon, Len(cmdon), pcbWritten, 0
 Wrap.WriteFile hFile, cmddown, Len(cmddown), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Камаера вниз."
 End if
End if

if (leftt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdon, Len(cmdon), pcbWritten, 0
 Wrap.WriteFile hFile, cmdleft, Len(cmdleft), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Камера влево."
 End if
End if

if (rightt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdon, Len(cmdon), pcbWritten, 0
 Wrap.WriteFile hFile, cmdright, Len(cmdright), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Камера вправо."
 End if
End if

Loop ' завершение цикла

' закрываем порт
Wrap.CloseHandle(hFile)
' озвучиваем
if (speakon = true) then
 Speak.Speak "Видеонаблюдение завершено."
End if
Подключение устройств на шине RS-485 с использованием конвертора AC3-M


Использование
  1.  Задайте порт подключения конвертора USB/RS-485 от камеры.
  2.  Запустите 'regdynwrapx_2.bat' (на Windows Vista/7/8/8.1/10 запускать правой кнопкой мыши от имени Администратора).
  3.  Запустите 'run_STC-2901.cmd'.



Ресурсы
  1. Полный комплект скриптов.
  2. Протокол Pelco-D и набор команд.

1 комментарий:

  1. Вы хотите разместить свою рекламу у меня в блоге? Обратитесь в форму связи ниже.

    ОтветитьУдалить

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.