Evgenii Legotckoi
Evgenii Legotckoi7. April 2016 12:07

PTZ-Kamerasteuerung. Pelco-D-Protokoll

Pelco-D ist ein PTZ-Kamerasteuerungsprotokoll, das von der gleichnamigen Firma Pelco entwickelt wurde. In der Regel wird es über die RS482/485-Schnittstelle zur Kommunikation mit Videokameras mit Servoantrieben verwendet.

Das Pelco-D-Protokoll hat in seinem Arsenal eine Reihe von Standardsteuerbefehlen sowie eine erweiterte Reihe von Befehlen. In diesem Artikel werden wir herausfinden, wie man mit einem Standardsatz von Befehlen arbeitet. Analysieren wir das Pelco-D-Protokoll am Beispiel einer abstrakten Befehlsquelle und eines abstrakten SDK, das eine Nachricht zur weiteren Übertragung an die RS485-Schnittstelle empfängt. Dieser Vorbehalt wurde bewusst gemacht, da ich vor kurzem mit genau einer solchen Aufgabe konfrontiert wurde.

Es gibt also ein Protokoll, über das Daten übertragen werden, die Daten geparst und dann an das SDK übertragen werden, das die Nachricht bereits auf dem RS485-Übertragungsweg sendet. Unten ist ein Bild mit einem gelben Quadrat. In dieser Funktion wird die von uns benötigte Nachricht erstellt, die an das SDK übertragen werden muss.


Nachrichtenstruktur

Die Pelco-D-Protokollnachricht besteht aus 7 Bytes. Lassen Sie uns die Bedeutung jedes Bytes analysieren:

  1. Synchronisationsbyte - hat immer den Wert #FF in hexadezimaler Form;
  2. Adresse – Adressbyte der PTZ-Kamera oder eines anderen Geräts auf der RS485/482-Leitung;
  3. Befehl 1 – das erste Byte der standardmäßigen Pelco-D-Befehle;
  4. Befehl 2 – zweites Byte der standardmäßigen Pelco-D-Befehle;
  5. Daten 1 - Byte der Geschwindigkeit, mit der die Kamera nach rechts/links gedreht wird, nimmt Werte von #00 bis #3F an;
  6. Daten 2 - Byte der Geschwindigkeit der Kameraneigung nach oben/unten, nimmt Werte von #00 bis #3F an;
  7. Prüfsumme – ist eine 8-Bit-Summe von Bytes vom 2. bis zum 6.

Standardsatz von Befehlen

Um eine Nachricht zu senden, müssen Sie beide Nachrichtenbefehle bilden. Wenn die Daten nicht übertragen werden, müssen die für die eine oder andere Funktionalität verantwortlichen Bits auf Null gesetzt werden.

Betrachten Sie die Befehlsstruktur.

Das Sense-Bit ist für die Bedeutung der Bits 3 und 4 verantwortlich. Wenn dieses Bit gesetzt ist, sind die gesetzten Bits 3 und 4 für das Einschalten der Kamera bzw. den Autoscan verantwortlich, ansonsten sind die gesetzten Bits 3 und 4 für das Einschalten verantwortlich aus. Die Bits 5 und 6 sind reserviert und müssen auf 0 gesetzt werden. Weitere Einstellungen sind zuständig für Aperture (Iris), Focus (Focus), Zoom (Zoom), Tilt (Tilt), Rotate (PAN). Um die Aktivierung dieser Parameter zu ermöglichen, müssen Sie die entsprechenden Bits auf Eins setzen.

Beispiele für Befehle

Links abbiegen: FF 01 00 04 00 00 05
Rechts abbiegen: FF 01 00 02 00 00 03
Hochklappen: FF 01 00 08 00 00 09
Abkippen: FF 01 00 10 00 00 11
Zoom +: FF 01 00 20 00 00 21
Zoom -: FF 01 00 40 00 00 41

Beispielcode

In unserem abstrakten Code ist in einem Vakuum eine solche Situation entstanden, dass die folgenden Werte in die Funktion fallen:

  • Adresse Adresse;
  • PanSpeed - Geschwindigkeit mit Drehrichtung von -100 bis +100;
  • TiltSpeed - Geschwindigkeit mit Neigungsrichtung von -100 bis +100;
  • ZoomSpeed - Geschwindigkeit mit Zoomrichtung von -100 bis +100. Warum die Daten für Zoom auf diese Weise übermittelt wurden, ist für mich eine Frage, da Pelco keine Geschwindigkeitseinstellung hat, aber was es ist, ist es.

Aber das SDK akzeptiert den generierten Befehl bereits in Form eines Zeigers auf ein Datenarray und einer Angabe der Länge dieses Arrays. Das Ergebnis ist der folgende Code.

void ptzCmd(int addressPTZ, int panSpeed, int tiltSpeed, int zoomSpeed)
{
    unsigned char *dataPelco;
    unsigned char address, command1, command2, data1, data2, checkSum;
    address = command1 = command2 = data1 = data2 = checkSum = 0x00;

    dataPelco = (unsigned char*) malloc(7);
    memset(dataPelco,0,7);

    address = (unsigned char)addressPTZ;
    if(panSpeed < 0) {
        command2 |= 0x04;
        panSpeed *= (-1);
    } else if(panSpeed > 0) {
        command2 |= 0x02;
    }
    data1 = (unsigned char)panSpeed*63/100;

    if(tiltSpeed < 0) {
        command2 |= 0x10;
        tiltSpeed *= (-1);
    } else if(tiltSpeed > 0) {
        command2 |= 0x08;
    }
    data2 = (unsigned char)tiltSpeed*63/100;

    if(zoomSpeed < 0) {
        command2 |= 0x40;
    } else if(zoomSpeed > 0) {
        command2 |= 0x20;
    }
    checkSum = address + command1 + command2 + data1 + data2;
    checkSum %= 100;

    dataPelco[0] = 0xFF;
    dataPelco[1] = address;
    dataPelco[2] = command1;
    dataPelco[3] = command2;
    dataPelco[4] = data1;
    dataPelco[5] = data2;
    dataPelco[6] = checkSum;

    sdk_write_pelco_cmd(7, dataPelco); // 7 - это длина сообщения
    free(dataPelco);
}
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken