C# 中 Pelco P 和 D 协议的实现






4.56/5 (22投票s)
2004年8月19日
10分钟阅读

361280

6147
这是一组完整的 C# 类,用于通过 RS422/485 的 'P' 和 'D' 协议控制 PELCO PTZ 摄像头、矩阵切换系统、接收器设备等。它支持所有命令,包括向上、向下、拉近、推远、向左、
引言
这是 GPL 软件。您可以随意使用,但请将任何改进反馈给我们。
这是一组完整的 C# 类,用于控制 PELCO PTZ 摄像头、矩阵切换系统,
接收器设备等,通过 RS422/485 的 'P' 和 'D' 协议。
它支持所有命令,包括向上、向下、拉近、推远、向左、向右、近焦、远焦,以及其他扩展命令。
要使用此功能,您需要在所需的串行端口输出上连接一个 RS232->RS422 适配器。
Pelco 不会返回任何有用的信息,因此您只需要支持 2 线(单向)通信即可。但是,我建议您阅读以了解命令是否已由设备接收。
本节介绍了向 Intercept Dome 发送命令时使用的协议,“P”版本协议和 Coaxitron 系列设备,以及 Pelco 的“D”版本接收器。这些协议使用无奇偶校验、一个起始位、八个数据位和一个停止位。推荐的波特率为 4800(4800, 8, N, 1, 1)。
理论
在这些协议中,消息结构不同。但是,这两个协议都使用 RS-485 端口来发送和接收消息。
以下所有值均以十六进制(基数 16)显示。
Pelco P 消息结构
字节型 |
值 |
函数 |
1 |
$A0 |
STX (开始传输) |
2 |
$00 到 $1F |
地址 |
3 |
数据字节 1 |
(见下文) |
4 |
数据字节 2 |
(见下文) |
5 |
数据字节 3 |
(见下文) |
6 |
数据字节 4 |
(见下文) |
7 |
$AF |
ETX (结束传输) |
8 |
$00-$FF |
校验和 |
字节 1 始终为 $A0
字节 2 是接收器地址,由接收器中的 DIP 开关设置
字节 3-6,见下文
字节 7 始终为 $AF
字节 8 是字节 1-7 的 XOR 和
协议是“零索引”的,因此协议中发送的第一个接收器的十六进制地址是 $00,对应于地址 1。
Pelco D 消息结构
“D”协议包含一些额外的开销以提高传输的可靠性。消息格式为
字 1 |
字 2 |
字 3 |
字 4 |
字 5 |
字 6 |
字 7 |
同步字节 |
地址 |
命令 1 |
命令 2 |
数据 1 |
数据 2 |
校验和 |
同步字节始终为 $FF。
地址是所控制的接收器/驱动器的逻辑地址。
以下结构构建这些消息并为发送到设备做准备
public struct Message // Pelco P Message
{
public static byte Address;
public static byte CheckSum;
public static byte Data1,Data2,Data3,Data4;
public static byte[] GetMessage(uint address, byte data1, byte data2, byte data3, byte data4)
{
if (address<0 & address>32)
throw new Exception("Protocol Pelco P support 32 devices only");
Address = Byte.Parse((address-1).ToString());
Data1 = data1;
Data2 = data2;
Data3 = data3;
Data4 = data4;
CheckSum = (byte)(STX ^ Address ^ Data1 ^ Data2 ^ Data3 ^ Data4 ^ ETX);
return new byte[]{STX,Address,Data1,Data2,Data3,Data4,ETX,CheckSum};
}
}
public struct Message //Pelco D Message
{
public static byte Address;
public static byte CheckSum;
public static byte Command1,Command2,Data1,Data2;
public static byte[] GetMessage(uint address, byte command1, byte command2, byte data1, byte data2)
{
if (address<1 & address>256)
throw new Exception("Protocol Pelco D support 256 devices only");
Address = Byte.Parse((address).ToString());
Data1 = data1;
Data2 = data2;
Command1 = command1;
Command2 = command2;
CheckSum = (byte)(STX ^ Address ^ Command1 ^ Command2 ^ Data1 ^ Data2);
return new byte[]{STX,Address,Command1,Command2,Data1,Data2,CheckSum};
}
}
基本消息格式
在两种 Pelco 协议中,“数据字节”中的位被分成两组。对于 Pelco P 协议中的平移和倾斜命令,其功能确定如下:
位号 | ||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 | |
数据 1 |
0 |
摄像头开启 |
自动扫描开启 |
摄像头开关 |
光圈关闭 |
光圈打开 |
近焦 |
远焦 |
数据 2 |
0 |
广角变焦 |
长焦变焦 |
向下倾斜 |
向上倾斜 |
向左平移 |
向右平移 |
0(用于平移/倾斜) |
数据 3 |
平移速度 $00 到 $3F, $40 表示 Turbo | |||||||
数据 4 |
倾斜速度 $00 到 $3F |
为了在 C# 中实现这一点,我们应该使用如下的二进制计算:
public enum PresetAction {Set,Clear,Goto} public enum PatternAction {Start,Stop,Run} public enum Action {Start,Stop} public enum LensSpeed {Low=0x00,Medium=0x01,High=0x02,Turbo=0x03} public enum Pan {Left = PanLeft,Right = PanRight} public enum Tilt {Up = TiltUp,Down = TiltDown} public enum Iris {Open = IrisOpen,Close = IrisClose} public enum Zoom {Wide = ZoomWide,Tele = ZoomTele} public enum Switch {On,Off} public enum Focus {Near = FocusNear,Far = FocusFar}
并像这样实现:
public byte[] CameraSwitch(uint deviceAddress,Switch action) { byte m_action = CameraOnOff; if(action == Switch.On) m_action += CameraOnOff; //Maybe wrong !!! return Message.GetMessage(deviceAddress,m_action,0x00,0x00,0x00); }
但在 Pelco D 协议中,它们完全不同。
位 7 |
位 6 |
位 5 |
位 4 |
位 3 |
位 2 |
位 1 |
位 0 | |
命令 1 |
模式 |
保留 |
保留 |
自动/手动扫描 |
摄像头开启/关闭 |
光圈关闭 |
光圈打开 |
近焦 |
命令 2 |
远焦 |
广角变焦 |
长焦变焦 |
向下 |
向上 |
左侧 |
右侧 |
始终为 0 |
模式位(命令 1 第 7 位)指示位 4 和 3 的含义。如果模式位为 ON 且位 4 和 3 也为 ON,则命令将启用自动扫描并开启摄像头。如果模式位为 OFF 且位 4 和 3 为 ON,则命令将启用手动扫描并关闭摄像头。当然,如果位 4 或位 3 中的任何一个为 OFF,则这些功能将不执行任何操作。
保留位(6 和 5)应设置为 0。
字 5 包含平移速度。平移速度范围为 $00(停止)到 $3F(高速),$FF 表示“turbo”速度。Turbo 速度是设备能达到的最高速度,它被单独考虑,因为它通常不是从高速到 turbo 的平滑过渡。也就是说,从一种速度到下一种速度通常看起来很平滑,并且会提供平滑的运动,除了进入和退出 turbo 速度。
字 6 包含倾斜速度。倾斜速度范围为 $00(停止)到 $3F(最高速度)。
字 7 是校验和。校验和是字节(不包括同步字节)的和模 256。
扩展命令集
除了上面显示的“PTZ”命令外,还有一些控制命令允许您访问某些设备的高级功能。
对于 Pelco P 协议,扩展命令集将设置数据字节 2 的位 0,并遵循下表中所示的格式。
命令 |
数据字节 1 |
数据字节 2 |
数据字节 3 |
数据字节 4 |
设置预设 XX |
00 |
03 |
00 |
01 到 FF |
清除预设 XX |
00 |
05 |
00 |
01 到 FF |
转到预设 XX |
00 |
07 |
00 |
01 到 FF |
翻转(旋转 180º) |
00 |
07 |
00 |
21 |
归零平移位置 |
00 |
07 |
00 |
22 |
自动扫描 |
00 |
09 |
00 |
00 |
停止自动扫描 |
00 |
0B |
00 |
00 |
远程复位 |
00 |
0F |
00 |
00 |
区域开始 |
00 |
11 |
00 |
01 到 08 |
区域结束 |
00 |
13 |
00 |
01 到 08 |
写入字符到屏幕 |
00 |
15 |
0 到 28 |
0 到 7F |
清除屏幕 |
00 |
17 |
00 |
00 |
报警确认 |
00 |
19 |
00 |
01 到 08 |
区域扫描开启 |
00 |
1B |
00 |
00 |
区域扫描关闭 |
00 |
一维 |
00 |
00 |
模式开始 |
00 |
1F |
00 |
00 |
模式停止 |
00 |
21 |
00 |
00 |
运行模式 |
00 |
23 |
00 |
00 |
变焦镜头速度 |
00 |
25 |
00 |
00 到 03 |
对焦镜头速度 |
00 |
27 |
00 |
00 到 03 |
在 Pelco D 实现中,它们如下所示:
命令 |
字 3 |
字 4 |
字 5 |
字 6 |
设置预设 |
00 |
03 |
00 |
01 到 20 |
清除预设 |
00 |
05 |
00 |
01 到 20 |
转到预设 |
00 |
07 |
00 |
01 到 20 |
翻转(180°) |
00 |
07 |
00 |
21 |
转到零平移 |
00 |
07 |
00 |
22 |
设置辅助 |
00 |
09 |
00 |
01 到 08 |
清除辅助 |
00 |
0B |
00 |
01 到 08 |
远程复位 |
00 |
0F |
00 |
00 |
设置区域开始 |
00 |
11 |
00 |
01 到 08 |
设置区域结束 |
00 |
13 |
00 |
01 到 08 |
将字符写入屏幕 |
00 |
15 |
X 位置 00 到 28 |
ASCII 值 |
清除屏幕 |
00 |
17 |
00 |
00 |
报警确认 |
00 |
19 |
00 |
报警号 |
区域扫描开启 |
00 |
1B |
00 |
00 |
区域扫描关闭 |
00 |
一维 |
00 |
00 |
设置模式开始 |
00 |
1F |
00 |
00 |
设置模式停止 |
00 |
21 |
00 |
00 |
运行模式 |
00 |
23 |
00 |
00 |
设置变焦速度 |
00 |
25 |
00 |
00 到 03 |
设置对焦速度 |
00 |
27 |
00 |
00 到 03 |
请注意,在 Pelco P 实现中,校验和是通过字节 1-7 的 XOR 二进制和计算的,而在 D 中,它是通过字节 1-6 的模 256 和计算的。
0A 00001010
88 10001000
小计 10010010 92
90 10010000
小计 00100010 22 (模 256 允许高位溢出)
00 00000000
小计 00100010 22
40 01000000
01100010 62
最终校验和值设备响应不是很重要,但要知道的是,在 Pelco P 中,响应将是 ACK 命令,而在 Pelco D 中,对其中一个命令的响应为四字节。第一个字节是同步字符(FF),第二个字节是接收器地址,第三个字节包含报警信息,第四个字节是校验和。
祝你好运
反馈
我将非常感谢您对该软件的有用性、对整体架构和/或基类效率的改进建议、任何错误报告等方面的反馈。
要联系我,请将所有意见发送至:tamir@khason.biz。您也可以访问我的网站 http://www.dotnet.us/ 了解更多关于我的信息。
开源许可协议
本软件程序(“程序”)根据本公共许可协议(“协议”)的条款提供。任何对程序的任何使用、复制或分发,即构成您接受本协议的条款。
Tamir Khason 特此授予您免费使用、复制、修改和分发本程序及其文档(如有)的许可,但前提是:(i) 您不得对本程序收取任何费用,并且您不得将本程序包含在任何预期或已收到报酬的软件或代码中;(ii) 下列版权声明出现在所有副本中;(iii) 版权声明和本协议均出现在所有支持性文档中;以及 (iv) 未经 Tamir Khason 特殊书面事先许可,不得在与分发本程序有关的广告或宣传中使用 Tamir Khason 的名称。
本程序按“原样”提供,不附带任何明示或暗示的保证或条件,包括但不限于任何所有权、不侵权、适销性或特定用途适用性的保证或条件。
您全权负责确定使用和分发本程序的适当性,并承担行使本协议项下权利的所有风险,包括但不限于程序错误、遵守适用法律、数据、程序或设备损坏或丢失,以及运营不可用或中断的风险和成本。
除本协议明确规定外,Tamir Khason 对任何直接、间接、偶然、特殊、惩戒性或后果性损害(包括但不限于利润损失)不承担任何责任,无论其如何引起以及基于何种责任理论,无论是合同、严格责任还是侵权行为(包括疏忽或其他)引起的,无论如何源于使用或分发本程序或行使本协议项下授予的任何权利,即使已被告知此类损害的可能性。
如果本协议的任何条款在适用法律下无效或不可执行,这不影响本协议其余条款的有效性或可执行性,且未经双方进一步行动,此类条款应以最小必要的程度进行修改,以使该条款有效且可执行。您有责任遵守您所在司法管辖区的任何出口法律,包括但不限于以色列。本协议受以色列国法律和以色列知识产权法律管辖。本协议的任何一方不得在本协议项下提起法律诉讼,除非自诉因发生之日起一年内。
如果您对本程序有任何意见、建议、改进、修改、变更、衍生作品或其他更改(统称为“贡献”),并希望提供给 Tamir Khason,请将此类贡献发送至:tamir@khason.biz。通过向 Tamir Khason 发送贡献,您承认并同意授予 Tamir Khason 一项非排他性的、全球性的、已全额付款的、免版税的许可,以复制、准备衍生作品、公开展示、公开表演、分发和再许可这些贡献,其源代码和/或目标代码形式,并且您在不享有任何会计权的情况下提供此许可。
本程序的版权声明如下:版权 © 2003 Tamir Khason。保留所有权利。由 Tadiran Security Systems ltd. 赞助。
这些协议的内容(非源代码或实现)被视为 Pelco 的财产。使用本协议的用户同意仅为 Pelco 的利益使用本协议。禁止出于对 Pelco 不利的目的使用本协议。