⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pelcount.pas

📁 派尔高矩阵切换协议代码实现,希望对各位有所帮助
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -