Im vorherigen Artikel wurde die Möglichkeit in Betracht gezogen, mit dem Pelco-D-Protokoll zu arbeiten, und jetzt werden wir die Arbeit mit dem Pelco-P-Protokoll in Betracht ziehen - das ist eine modifizierte Variante des bisherigen PTZ-Kamerasteuerungsprotokolls, das ebenfalls von der gleichnamigen Firma Pelco entwickelt wird. Wird auch über die RS482/485-Schnittstelle verwendet, um mit Kameras zu kommunizieren, die mit Servoantrieben ausgestattet sind.
Das Pelco-P-Protokoll verfügt außerdem über einen Satz von Standardsteuerbefehlen sowie einen erweiterten Satz von Befehlen. Überlegen Sie, wie wir mit Standardbefehlen arbeiten können. Analysieren wir das Pelco-P-Protokoll am Beispiel einer abstrakten Befehlsquelle und eines abstrakten SDK, das eine Nachricht zur weiteren Übertragung an die RS485-Schnittstelle empfängt.
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 Prüfsumme ist die XOR-Summe über die Bytes 1 bis 7. Wie Sie sehen können, verwendet dieses Protokoll 8 Bytes, um eine Nachricht zu übertragen, und nicht 7, wie bei Pelco-D.
Es ist zu beachten, dass im Pelco-P-Protokoll die Adressierung nicht bei 1, sondern bei 0 beginnt. Das heißt, die erste Adresse wird als #00 übertragen, aber das Interessanteste ist, dass diese Adresse als 01 in angegeben wird B. den Einstellungen der PTZ-Kamera, sollten Sie diesen Punkt bei der Entwicklung einer Schicht für die Arbeit mit diesem Protokoll berücksichtigen.
PAN- und TILT-Befehle
Beispiele für Befehle
Links abbiegen: A0 00 00 04 20 00 AF 2B
Rechts abbiegen: A0 00 00 02 20 00 AF 2D
Aufklappen: A0 00 00 08 00 20 AF 27
Nach unten neigen: A0 00 00 10 00 20 AF 3F
Alle Aktionen stoppen: A0 00 00 00 00 00 AF 0F
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, data1, data2, data3, data4, checkSum; address = data1 = data2 = data3 = data4 = checkSum = 0x00; dataPelco = (unsigned char*) malloc(8); memset(dataPelco,0,8); address = (unsigned char)addressPTZ; --address; if(pan < 0) { data2 |= 0x04; pan *= (-1); } else if(pan > 0) { data2 |= 0x02; } data3 = pan*63/100; if(tilt < 0) { data2 |= 0x10; tilt *= (-1); } else if(tilt > 0) { data2 |= 0x08; } data4 = tilt*63/100; if(zoom < 0) { data2 |= 0x40; } else if(zoom > 0) { data2 |= 0x20; } checkSum ^= 0xA0; checkSum ^= address; checkSum ^= data1; checkSum ^= data2; checkSum ^= data3; checkSum ^= data4; checkSum ^= 0xAF; dataPelco[0] = 0xA0; dataPelco[1] = address; dataPelco[2] = data1; dataPelco[3] = data2; dataPelco[4] = data3; dataPelco[5] = data4; dataPelco[6] = 0xAF; dataPelco[7] = checkSum; sdk_write_pelco_cmd(8, dataPelco); // 8 - это длина сообщения free(dataPelco); }