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

📄 main.pas

📁 HD 6P RFID 发卡器、考勤卡钟 RS232 通讯接口程序 Delphi 源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  CreateObject(handle,GB_GB,false);  //动态库函数调用前必须先创建此对象
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
   DestroyObject;        //动态库退出时必须先销毁此对象
end;

procedure TMainForm.BtSetWKClick(Sender: TObject);
var
   OldKey, NewKey :BLOCKSTRUCT;    //块结构
   kk              :integer;
begin
  memo1.Lines.Clear;
  //默认密码A和密码B为16个FF,要修改成其他密码时请多多小心注意,卡密码丢失后无法找回
  for kk:=1 to 16 do
  begin
    Oldkey.Data[kk]:=$FF;     //16进制FF
    NewKey.Data[kk]:=$FF;
  end;
  //修改卡密码的命令
  SetCardRootKey(OldKey.Data, NewKey.Data);
end;

procedure TMainForm.BtReadSectorClick(Sender: TObject);
var
 Sector :HEADER_SECTOROPRSTRUCT;
 kk:integer;
begin
  memo1.Lines.Clear;
  //默认读取的扇区为0扇区,扇区密码全部为FF,分为密码A和密码B:长度为6个BYTE
  Sector.BlockFlag[1]:=true;
  Sector.BlockFlag[2]:=true;
  Sector.BlockFlag[3]:=true;
  Sector.BlockFlag[4]:=true;
  Sector.SectorNum :=0; //扇区号
  Sector.AuthMode :=1; //认证方式
  for kk:=1 to 6 do
  begin
    Sector.AuthKeyA[KK]:=$FF;
    Sector.AuthKeyB[kk]:=$FF;
  end;
  SendCommand(integer(MT_READ_SECTOR), @Sector, sizeof(HEADER_SECTOROPRSTRUCT));
end;



procedure TMainForm.BtInicardClick(Sender: TObject);
begin
  memo1.Lines.Clear;
  m_cardID.CardType :=1;
  if m_cardid.CardID =0 then
     showmessage('请先寻卡')
  else
     SendCommand(integer(MT_INIT_CARDOFHD6K),  @m_CardID, sizeof(m_CardID));// 初始化卡
  //初始化卡完成的工作是:将卡的0-5扇区绑定,0 扇区密码不变但将1-5扇区的密码修改
end;

procedure TMainForm.BtReadCardClick(Sender: TObject);
begin
  memo1.Lines.Clear;
  if m_cardID.CardID <>0 then
  begin
    //读卡时注意卡m_CardID.CardType 存放的是钱包索引
    m_CardID.CardType :=$01;
    if SendCommand(integer(MT_READDATA_CARDOFHD6K), @m_CardID, sizeof(m_CardID))=false then
       showmessage('命令发送失败');
  end
  else begin
    Showmessage('请先寻卡');
    Exit;
  end;
end;

procedure TMainForm.BtWriteCardClick(Sender: TObject);
var
  CardInfo : CARDINFO_HD6K;
  Str      : string;
  kk       : integer;
begin
  memo1.Lines.Clear;
  if m_cardID.CardID <>0 then
  begin
    CardInfo.CardID := M_CardID;     //写卡时要带上寻卡时读出的资料,否则命令失败
    CardInfo.CardNo := 12345;       // 卡号
    str:= 'gxj760998';
    for kk:=1 to length(str) do            // 持卡人编号
        CardInfo.PersonNo[kk]:=str[kk];
    str :='张三';
    for kk:=1 to length(str) do            // 持卡人姓名
        CardInfo.Myname[kk]:=str[kk];
    CardInfo.GradeNo  :=0;      // 级别
    CardInfo.GroupNo  := 0;     // 分组
    str:= '000000';
    if length(str)=6 then
    for kk:=1 to length(str) do
        CardInfo.Password[kk] :=str[kk]
    else begin
       ShowMessage('密码要6位数字');
       exit;
    end;
    CardInfo.DeptNo:=250;//部门编号
    CardInfo.CardType := 0;                                      // 卡类型
    CardInfo.CardType :=CardInfo.CardType+ Integer(CARDTYPE_POS);          //收费
    CardInfo.CardType :=CardInfo.CardType+ integer(CARDTYPE_ATT);          //考勤
    CardInfo.CardType := CardInfo.CardType+Integer(CARDTYPE_ACC);          //门禁
    CardInfo.CardType :=CardInfo.CardType+ integer(CARDTYPE_OPR);          //操作员
    CardInfo.OprCardType := integer(OPRCARDTYPE_ENDOPR);                  //操作员类行
    //CardInfo.OprCardType := Integer(OPRCARDTYPE_ENDCONFIG);
    CardInfo.StartDate.Year := 2006-2000;   // 启用日期
    CardInfo.StartDate.Month := 5;
    CardInfo.StartDate.Day := 10;
    CardInfo.DeadDate.Year := 2010 - 2000;    // 截止日期
    CardInfo.DeadDate.Month := 10;
    CardInfo.DeadDate.Day :=10;

    CardInfo.QuotaPerDay := 100;       // 日限额-元
    CardInfo.QuotaPerTimes := 50;   // 次限额-元
    CardInfo.CardDeposit := 30;       // 卡押金-元
    CardInfo.CertType := Integer(CERTTYPE_ID);   //证件类型
    str:='1234567890';
    for kk:=1 to length(str) do
        Cardinfo.CertNo[kk]:=str[kk];

    CardInfo.LockFlag := true;    //1锁,0不锁               // 锁卡标志
    CardInfo.IsWriteEW := true; //1 写,0不写                  // 是否写钱包
    CardInfo.EWallet.CardID :=m_CardID;
    CardInfo.EWallet.IndexOfEW:=1;      // 钱包索引号
    CardInfo.EWallet.Deposit :=50;       // 本次充值额
    CardInfo.EWallet.Balance :=50;       // 钱包余额

    CardInfo.EWallet.SumOfDeposit:=0;       // 累计充值额
    CardInfo.EWallet.TraceOfEW :=0;         // 钱包流水号
    CardInfo.EWallet.IntradaySumOfAmount:=0;  // 当日累计消费额

    CardInfo.EWallet.LastDate_D.Year :=06;    // 充值日期时间
    CardInfo.EWallet.LastDate_D.Month :=05;
    CardInfo.EWallet.LastDate_D.Day  :=10;

    if prop.ReaderID <>0 then
    begin
      CardInfo.EWallet.ReaderSN := Prop.ReaderID ;             // Reader序列号
    end
    else begin
      ShowMessage('请先读读卡器');
      exit;
    end ;
  SendCommand(Integer(MT_WRITEDATA_CARDOFHD6K), @CardInfo, sizeof(CardInfo));  // 写卡
  end
  else ShowMessage('请先寻卡');
end;

procedure TMainForm.BtEraseCardClick(Sender: TObject);
begin
  memo1.Lines.Clear;
  //洗卡与初始化卡是相对立的,它的任务是将卡扇区0-5的绑定解除,并还原其密码为FF.
  if m_cardID.CardID <>0 then
  begin
    SendCommand(integer(MT_ERASE_CARDOFHD6K), @m_CardID, sizeof(m_CardID));// 洗卡(清卡密码及数据)
  end
  else ShowMessage('请先寻卡');
end;

procedure TMainForm.BtClearClick(Sender: TObject);
begin
  memo1.Lines.Clear;
  //此命令在将扇区的数据快清零
  if m_cardID.CardID <>0 then
  begin
     SendCommand(integer(MT_ERASEDATA_CARDOFHD6K), @m_CardID, sizeof(m_CardID));// 清卡数据
  end
  else ShowMessage('请先寻卡');
end;

procedure TMainForm.BtReaderClick(Sender: TObject);
begin
  memo1.Lines.Clear;
  SendCommand(Integer(MT_RECV_READERPROP),nil,0);// 取读卡器属性
end;

procedure TMainForm.BtReadEWClick(Sender: TObject);
begin
  memo1.Lines.Clear;
  if m_cardID.CardID <>0 then
  begin
     m_CardID.CardType :=1;//钱包索引,如果是
     SendCommand(integer(MT_READEW_CARDOFHD6K), @m_CardID, sizeof(m_CardID));// 读钱包命令
  end
  else ShowMessage('请先寻卡');
end;

procedure TMainForm.BtWriteEWClick(Sender: TObject);
var
   m_EWInfo :EW_HD6K;
begin
  memo1.Lines.Clear;
  if m_cardID.CardID <>0 then
  begin
    m_EWInfo.CardID :=m_CardID; //写卡时 要带上此卡的序列号
    m_EWInfo.IndexOfEW :=1;   // 钱包索引号
    m_EWInfo.Deposit:=100;    // 本次充值额
    m_EWInfo.Balance:=100;   // 钱包余额
    m_EWInfo.SumOfDeposit:=100; // 累计充值额
    m_EWInfo.TraceOfEW:=0;         // 钱包流水号
    m_EWInfo.IntradaySumOfAmount:=0; // 当日累计消费额
    m_EWInfo.ReaderSN:=prop.ReaderID ;   // Reader序列号
    m_EWInfo.LastDate_D.Year :=06;      // 充值日期时间
    m_EWInfo.LastDate_D.Month :=05;
    m_EWInfo.LastDate_D.Day :=10;
    SendCommand(integer(MT_WRITEEW_CARDOFHD6K), @m_EWInfo, sizeof(m_EWInfo));// 写钱包
  end
  else ShowMessage('请先寻卡');
end;

procedure TMainForm.BTSetWaitTimeClick(Sender: TObject);
var
   nWaitTime :integer;
begin
  nWaitTime :=4000;
  SendCommand(Integer(MT_SET_WAITTIME), @nWaitTime, sizeof(integer));// 设置操作等待时间
end;

procedure TMainForm.ReadCard4kClick(Sender: TObject);
var
   bSecNo : byte;
begin
  //'BYTE bSecNo = csedtSecNumOfHD4k->Value;
  //'if (MySetCardRootKey())
  //'if (TimerOn(2000, btnReadCardOfHD4k))
  //'SendCommand(MT_READ_CARDOFHD4K, &bSecNo, sizeof(bSecNo));// 读HD4k卡
  bSecNo := 3;//要读的扇区号
  SendCommand(integer(MT_READ_CARDOFHD4K), @bSecNo, sizeof(bSecNo))
end;

procedure TMainForm.writecard4KClick(Sender: TObject);
VAR
   ATTCardinfo : ATTGUARDCARD_HD4K;
   POSCardInfo : POSCARD_HD4K;
   OPRCardInfo : OPRCARD_HD4K;
   Str      : string;
   kk       : integer;
begin
   // 考勤门禁卡
   //ATTCardinfo.SectorNo := 2;// 扇区号
   //ATTCardinfo.FileSort := integer(FILEOFHD4K_ATT);
   //ATTCardinfo.CardNo := 1245;
   //str :='gxj76';
   //for kk:=1 to length(str) do            // 人员编号
   //     attcARDinfo.PersonNo[kk]:=str[kk];
   //ATTCardinfo.Grade := 1;
   //ATTCardinfo.Group := 2;
   //for kk:=1 to 4 do            // 卡密码
   //     attcARDinfo.Password[kk]:='0';
   //str :='张三';
   // for kk:=1 to length(str) do            // 持卡人姓名
   //     ATTCardinfo.myName[kk]:=str[kk];
   //ATTCardinfo.Date.Year := 2006-2000;
   //ATTCardinfo.Date.Month := 05;
   //ATTCardinfo.Date.Day := 16;
   //SendCommand(integer(MT_WRITE_CARDOFHD4K), @ATTCardinfo, sizeof(ATTGUARDCARD_HD4K));// 写HD4k考勤卡

   // 消费卡文件
   POSCardInfo.SectorNo := 3;// 扇区号
   POSCardInfo.FileSort := integer(FILEOFHD4K_POS);
   POSCardInfo.CardNo := 123456;
     str := '你好';
   //posCardInfo.myName :=str;
   for kk:=1 to length(str) do
       POSCardInfo.myName[kk] :=str[kk];
   //for kk:=1 to 4 do
       //'POSCardInfo.Password[kk] :='0';
   //POSCardInfo.myName := 'nihao';
   POSCardInfo.Group := 20;
   POSCardInfo.Date.Year := 6;
   POSCardInfo.Date.Month :=5;
   POSCardInfo.Date.Day := 16;
   POSCardInfo.Balance := 50;
   SendCommand(integer(MT_WRITE_CARDOFHD4K), @POSCardInfo, sizeof(POSCARD_HD4K));// 写消费卡

   // 操作员卡
   //OPRCardInfo.SectorNo = 2;// 扇区号
   //OPRCardInfo.FileSort = integer(FILEOFHD4K_OPR);
   //OPRCardInfo.CardNo = 15421;
   //str := '你好';
   //memset(OPRCardInfo.myName, 0x00, sizeof(CardInfo.Name));
   //memcpy(OPRCardInfo.myName, edtNameOfHD4k->Text.c_str(), edtNameOfHD4k->Text.Length());
   //memcpy(OPRCardInfo.Password, edtPasswordOfHD4k->Text.c_str(), edtPasswordOfHD4k->Text.Length());
   //OPRCardInfo.Date.Year = csedtYearOfHD4k->Value - 2000;
   //OPRCardInfo.Date.Month = csedtMonthOfHD4k->Value;
   //OPRCardInfo.Date.Day = csedtDayOfHD4k->Value;
   //OPRCardInfo.POSID = csedtPOSIDOfHD4k->Value;
   //OPRCardInfo.OprID = csedtOprIDOfHD4k->Value;
   //if (TimerOn(2000, btnWriteCardOfHD4k))
       //SendCommand(MT_WRITE_CARDOFHD4K, &OPRCardInfo, sizeof(OPRCARD_HD4K));// 写操作员卡
end;

procedure TMainForm.ReadEW4KClick(Sender: TObject);
var
   bSecNo : byte;
begin
  bSecNo := 3;
  SendCommand(integer(MT_READEW_CARDOFHD4K), @bSecNo, sizeof(bSecNo));// 读HD4k钱包
end;

procedure TMainForm.WriteEW4kClick(Sender: TObject);
var
  EWInfo : EW_HD4k;
begin
  EWInfo.SectorNo := 3;// 扇区号
  EWInfo.FileSort := integer(FILEOFHD4K_POS);
  EWInfo.CardNo := 12345;
  EWInfo.Balance := 100;
  EWInfo.TraceOfEW := 0;
  EWInfo.Date.Year := 2006 - 2000;
  EWInfo.Date.Month := 05;
  EWInfo.Date.Day := 12;
  SendCommand(integer(MT_WRITEEW_CARDOFHD4K), @EWInfo, sizeof(EW_HD4K));// 写HD4k钱包
end;

procedure TMainForm.BtRWLogClick(Sender: TObject);
begin
  SetCommLog(true,true);
  ShowMessage('设定读写日志成功');
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -