📄 pelcount.pas
字号:
unit PelcoUnt;
interface
uses SysUtils, Dialogs, LyfCom;
const
ACK = $A2;
NAK = $AA;
STX = $A0;
ETX = $AF;
type
TPelco = class
private
InUse: Boolean; //串口使用标志,防止多线程访问冲突
FComOK: boolean; //串口打开成功
PelcoMsg: Array[0..255] of Char; //发送的指令
FeedBack: Array[0..255] of Char; //反馈的信息
FBCode: Integer; //执行码
MsgLen: Integer; //指令长度
FBLen: Integer; //反馈信息长度
MyCom: TLCom; //串口对象
Mon, Cam: Integer; //当前监视器、摄像机号
procedure GenCRC(Buf: PChar; var Len: Integer); //产生CRC码
// function ChkCRC(Buf: PChar; Len: Integer): Boolean; //检查CRC码
function IntToBCD(Ch: Integer): Integer; //整型转BCD码
function BCDToInt(Ch: Integer): Integer; //BCD码转整型
function SendOrder(NeedFB: Boolean = True): Boolean; //发送指令
function GetFB: Boolean; //接收反馈信息
function SwNext(NeedFB: Boolean = True): Boolean; //下一路视频
function SwPrevious(NeedFB: Boolean = True): Boolean; //上一路视频
protected
public
function GetComErr: String; //获取串口错误信息
function GetComStatus: String; //获取串口状态信息
procedure CloseCom; //关闭串口
function OpenCom(Port, BaudRate, Parity, ByteSize, StopBits: Integer): Boolean; //打开串口
function GetErrMsg: String; //获取错误信息
function GetCurMon: Integer; //获取当前监视器号
function GetCurCam: Integer; //获取当前摄像机号
function LogIn(Pin: Integer; NeedFB: Boolean = True): Boolean; //登录矩阵
procedure LogOut; //登出矩阵
function SwToMon(MonNo: Integer; NeedFB: Boolean = True): Boolean; //切换到监视器
function SwToCam(CamNo: Integer; NeedFB: Boolean = True): Boolean; //切换到摄像机
function PanUp(Speed: Integer = 8; NeedFB: Boolean = True): Boolean; //转动云台向上
function PanDown(Speed: Integer = 8; NeedFB: Boolean = True): Boolean; //转动云台向下
function PanLeft(Speed: Integer = 8; NeedFB: Boolean = True): Boolean; //转动云台向左
function PanRight(Speed: Integer = 8; NeedFB: Boolean = True): Boolean; //转动云台向右
function ApertureOpen(NeedFB: Boolean = True): Boolean; //打开光圈
function ApertureClose(NeedFB: Boolean = True): Boolean; //关闭光圈
function FocusNear(NeedFB: Boolean = True): Boolean; //近聚焦
function FocusFar(NeedFB: Boolean = True): Boolean; //远聚焦
function Feature(NeedFB: Boolean = True): Boolean; //特写
function Panorama(NeedFB: Boolean = True): Boolean; //全景
function StopPanLens(NeedFB: Boolean = True): Boolean; //停止云台和镜头动作
function SavePreset(No: Integer; NeedFB: Boolean = True): Boolean; //保存预置点
function LoadPreset(No: Integer; NeedFB: Boolean = True): Boolean; //调用预置点
function Aux(AuxNo: Integer; NeedFB: Boolean = True): Boolean; //辅助开关
function StartMacro(var Buf: array of Byte; NeedFB: Boolean = True): Boolean; //开始巡视
function StopMacro(NeedFB: Boolean = True): Boolean; //停止巡视
property ComOK: boolean Read FComOK Write FComOK;
constructor Create;
destructor Destroy; override;
published
end;
implementation
{ TPelco }
function TPelco.BCDToInt(Ch: Integer): Integer;
var
i, j: Integer;
begin
i:= Ch div 16;
j:= Ch mod 16;
Result:= i * 10 + j;
end;
{
function TPelco.ChkCRC(Buf: PChar; Len: Integer): Boolean;
var
CRC: Char;
I: Integer;
begin
CRC:= Char(0);
for I := 0 to Len - 2 do
begin
CRC:= Char(Byte(CRC) xor Byte(Buf[I]));
end;
if Buf[Len - 1] = CRC then
Result:= True
else
Result:= False;
end;
}
procedure TPelco.CloseCom;
begin
MyCom.ClosePort;
end;
constructor TPelco.Create;
begin
MyCom:= TLCom.Create;
Mon:= 1;
Cam:= 1;
InUse:= False;
end;
destructor TPelco.Destroy;
begin
MyCom.Free;
end;
procedure TPelco.GenCRC(Buf: PChar; var Len: Integer);
var
CRC: Char;
I: Integer;
begin
CRC:= Char(0);
for I := 0 to Len - 1 do
begin
CRC:= Char(Byte(CRC) xor Byte(Buf[I]));
end;
Buf[Len]:= CRC;
Len:= Len + 1;
end;
function TPelco.GetComErr: String;
begin
Result:= MyCom.GetError;
end;
function TPelco.GetCurCam: Integer;
begin
Result:= Cam;
end;
function TPelco.GetCurMon: Integer;
begin
Result:= Mon;
end;
function TPelco.GetErrMsg: String;
var
ErrMsg: String;
begin
case FBCode of
1, 2, 3, 4, 5, 6, 7, 8, 9: ErrMsg:= '系统错误';
10: ErrMsg:= '无法访问该监视器';
11: ErrMsg:= '该监视器不存在';
12: ErrMsg:= '无法访问该摄像机';
13: ErrMsg:= '该摄像机不存在';
14: ErrMsg:= '无法访问该GPI';
15: ErrMsg:= '该GPI不存在';
16: ErrMsg:= '宏超载';
17: ErrMsg:= '该宏不存在';
18: ErrMsg:= '该报警不存在';
19: ErrMsg:= '无法访问该报警';
20, 21, 22, 23, 24: ErrMsg:= '系统致命错误';
25: ErrMsg:= '通信错误,调制解调器';
26: ErrMsg:= '通信错误,无中断';
27: ErrMsg:= '通信错误,超出限度';
28: ErrMsg:= '通信错误,奇偶校验';
29: ErrMsg:= '通信错误,取字节';
30: ErrMsg:= '通信错误,暂停';
31: ErrMsg:= '通信错误,系统错误';
32: ErrMsg:= '通信错误,达到最大重试次数';
33: ErrMsg:= '通信错误,IIR';
34: ErrMsg:= '接收缓冲区溢出';
35: ErrMsg:= '发送缓冲区溢出';
36: ErrMsg:= '打印机缓冲区溢出';
37: ErrMsg:= '系统错误,发送标记丢失';
38: ErrMsg:= '系统错误,接收标记丢失';
39: ErrMsg:= '矩阵无反应';
40: ErrMsg:= 'PIN码错误';
41: ErrMsg:= '读写串口出错';
else ErrMsg:= '无法获取错误信息';
end;
Result:= ErrMsg;
end;
function TPelco.GetFB: Boolean;
begin
if (FBLen = 0) then //没有接收到任何数据
begin
FBCode:= 39;
Result:= False;
Exit;
end;
if ((FBLen = 17) and (FeedBack[1] = Char($B1))) then //成功反馈
begin
Mon:= BCDToInt(Byte(FeedBack[2]));
Cam:= BCDToInt(Byte(FeedBack[6])) + BCDToInt(Byte(FeedBack[5])) * 100;
FBCode:= 0;
Result:= True;
Exit;
end;
if ((FBLen = 5) and ((FeedBack[1] = Char($E1)) or (FeedBack[1] = Char($E2)))) then //PIN码正确
begin
FBCode:= BCDToInt(Byte(FeedBack[2]));
Result:= True;
Exit;
end;
if (FBLen = 5) then //PIN码错误
begin
if ((FeedBack[1] = Char($D3)) and (FeedBack[2] = Char($0))) then
begin
FBCode:= 40;
Result:= False;
Exit;
end;
end;
Result:= True;
end;
function TPelco.IntToBCD(Ch: Integer): Integer;
var
i, j: Integer;
begin
i:= Ch div 10;
j:= Ch mod 10;
Result:= i * 16 + j;
end;
function TPelco.LogIn(Pin: Integer; NeedFB: Boolean): Boolean;
begin
MsgLen:= 7;
PelcoMsg[0]:= Char(STX);
PelcoMsg[1]:= Char($F4);
PelcoMsg[2]:= Char($01);
PelcoMsg[3]:= Char(IntToBCD(Pin div 100));
PelcoMsg[4]:= Char(IntToBCD(Pin mod 100));
PelcoMsg[5]:= Char($01);
PelcoMsg[6]:= Char(ETX);
Result:= SendOrder(NeedFB);
end;
procedure TPelco.LogOut;
begin
MsgLen:= 5;
PelcoMsg[0]:= Char(STX);
PelcoMsg[1]:= Char($B1);
PelcoMsg[2]:= Char($0);
PelcoMsg[3]:= Char($1);
PelcoMsg[4]:= Char(ETX);
SendOrder(False);
end;
function TPelco.OpenCom(Port, BaudRate, Parity, ByteSize,
StopBits: Integer): Boolean;
var
BR, P, BS, SB: Integer;
begin
//匹配波特率
case BaudRate of
1200: BR:= 7;
1800: BR:= 8;
2400: BR:= 9;
4800: BR:= 10;
7200: BR:= 11;
9600: BR:= 12;
19200: BR:= 13;
else
begin
Result:= False;
Exit;
end;
end;
//匹配校验位
case Parity of
0: P:= 0;
1: P:= 1;
2: P:= 2;
else
begin
Result:= False;
Exit;
end;
end;
//匹配长度
case ByteSize of
5: BS:= 0;
6: BS:= 1;
7: BS:= 2;
8: BS:= 3;
else
begin
Result:= False;
Exit;
end;
end;
//匹配停止位
case StopBits of
1: SB:= 0;
2: SB:= 1;
else
begin
Result:= False;
Exit;
end;
end;
MyCom.SetPara(Port, BR, P, BS, SB);
Result:= MyCom.OpenPort;
end;
function TPelco.PanDown(Speed: Integer = 8; NeedFB: Boolean = True): Boolean;
begin
MsgLen:= 10;
PelcoMsg[0]:= Char(STX);
PelcoMsg[1]:= Char($C0);
PelcoMsg[2]:= Char(IntToBCD(Mon));
PelcoMsg[3]:= Char(IntToBCD(Cam div 100));
PelcoMsg[4]:= Char(IntToBCD(Cam mod 100));
PelcoMsg[5]:= Char(0);
PelcoMsg[6]:= Char($10);
PelcoMsg[7]:= Char(0);
PelcoMsg[8]:= Char(Speed * 8 - 1);
PelcoMsg[9]:= Char(ETX);
Result:= SendOrder(NeedFB);
end;
function TPelco.PanLeft(Speed: Integer = 8; NeedFB: Boolean = True): Boolean;
begin
MsgLen:= 10;
PelcoMsg[0]:= Char(STX);
PelcoMsg[1]:= Char($C0);
PelcoMsg[2]:= Char(IntToBCD(Mon));
PelcoMsg[3]:= Char(IntToBCD(Cam div 100));
PelcoMsg[4]:= Char(IntToBCD(Cam mod 100));
PelcoMsg[5]:= Char(0);
PelcoMsg[6]:= Char($4);
PelcoMsg[7]:= Char(Speed * 8 - 1);
PelcoMsg[8]:= Char(0);
PelcoMsg[9]:= Char(ETX);
Result:= SendOrder(NeedFB);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -