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

📄 uniprotocol_timepos.pas

📁 很好用的串口通信工具软件。Comport目录下是用到的通信控件。
💻 PAS
📖 第 1 页 / 共 2 页
字号:
            end;
        else
          FCommState := csHalt;
        end;
      end;
    csAdjustTime:
      begin
        case SendResult of
          srACK:
            begin
              FFrameNo := 0;
              if FindParams(FSenderSerialNO + '_Phone') <> '' then // 上传电话
                FCommState := csSetPhoneCode
              else
              begin
                // 校验密匙
                if (FindParams('SetSecureKey') = '1') and (GetSubParams(FSenderSerialNO + '_Key', 0) <> '') then
                  FCommState := csUpdateKey
                else if (FindParams('SetSecureKey') = '2') and (GetSubParams(FSenderSerialNO + '_Key', 0) <> '') then
                  FCommState := csAppendKey
                else
                  FCommState := csGetHistoryData;
              end;
            end;
        else
          FCommState := csHalt;
        end;
      end;
    csSetPhoneCode:
      begin
        case SendResult of
          srACK:
            begin
              Inc(FFrameNo);
              if (FFrameNo >= 4) then
              begin
                FFrameNO := 0;
                if (FindParams('SetSecureKey') = '1') and (GetSubParams(FSenderSerialNO + '_Key', 0) <> '') then
                  FCommState := csUpdateKey
                else if (FindParams('SetSecureKey') = '2') and (GetSubParams(FSenderSerialNO + '_Key', 0) <> '') then
                  FCommState := csAppendKey
                else if FindParams(FSenderSerialNO + '_AlertLimit') <> '' then
                  FCommState := csSetAlertLimit
                else
                  FCommState := csGetHistoryData;
              end;
            end;
        else
          FCommState := csHalt;
        end;
      end;
    csUpdateKey, csAppendKey:
      begin
        case SendResult of
          srACK:
            begin
              Inc(FFrameNo);
              if (GetSubParams(FSenderSerialNO + '_Key', FFrameNO) = '') then
              begin
                FFrameNO := 0;
                if FindParams(FSenderSerialNO + '_AlertLimit') <> '' then
                  FCommState := csSetAlertLimit
                else
                  FCommState := csGetHistoryData;
              end;
            end;
        else
          FCommState := csHalt;
        end;
      end;
    csSetAlertLimit:
      begin
        case SendResult of
          srAck:
            begin
              FFrameNO := 0;
              FCommState := csGetHistoryData;
            end;
        else
          FCommState := csHalt;
        end;
      end;
    csGetHistoryData:
      begin
        case SendResult of
          srGetData:
            begin
              Inc(FFrameNO);
              if FDataCount > 0 then
                FProcessRatio := FFrameNo * 100 div FDataCount;
              if FProcessRatio > 100 then FProcessRatio := 100;
              if Copy(Packet, 4, 16) = StringOfChar(#0, 16) then
              begin
                FFrameNO := 0;
                FCommState := csNotifyHangup
              end
              else
              begin
              // 如果数据尚未传输完毕,则保存数据
                for i := 1 to 16 do
                  currentData := currentData + IntToHex(Ord(Packet[3 + i]), 2);
                FDatas.Add('Data=' + currentData);
              end;
            end;
        else
          FCommState := csHalt;
        end;
      end;
    csNotifyHangup:
      begin
        Inc(FFrameNo);
        if (FFrameNo = 1) then
        begin
          if (SendResult <> srACK) then FCommState := csHalt;
        end
        else
        begin
          FCommSuccess := True;
          FCommState := csHalt;
        end;
      end;
  end;

  // 根据状态(FCommState) 生成命令
  if FCommState <> csHalt then
    with FHostCmd do
    begin
      case FCommState of
        csGetDataInfo:
          begin
            Comment := '【读取数据信息】';
            Command := #$FE + #$10;
            Command := Command + Chr(CrcOfString(Command));
            Send_Interval := 1000;
            No_Response_Interval := 300;
            Max_Send_Times := 10;
            SetLength(Echos, 1);
            Echos[0].Echo_Head := csACK;
            Echos[0].Echo_Size := 14;
            Echos[0].Echo_HaveCRC := True;
            curACK := '';
            curNAK := '';
          end;
        csAdjustTime:
          begin
            Comment := '【校正时间】';
            Command := AdjustTimeCommand;
            Send_Interval := 1000;
            No_Response_Interval := 1000;
            Max_Send_Times := 10;
            SetLength(Echos, 0);
            curACK := csACK + #$FD + #$5B;
            curNAK := '';
          end;
        csSetPhoneCode:
          begin
            Comment := '【校正电话号码】';
            Command := #$FA + Chr(FFrameNo) + Chr(Length(GetSubParams(FSenderSerialNO + '_Phone', FFrameNo))) + GetSubParams(FSenderSerialNO + '_Phone', FFrameNo);
            Command := Command + Chr(CrcOfString(Command));
            Send_Interval := 1000;
            No_Response_Interval := 300;
            Max_Send_Times := 10;
            SetLength(Echos, 0);
            curACK := csACK + Chr(FFrameNo) + #$FA;
            curACK := curACK + Chr(CrcOfString(CurACK));
            curNAK := '';
          end;
        csUpdateKey, csAppendKey:
          begin
            case FCommState of
              csUpdateKey:
                begin
                  Comment := '【更新密钥】';
                  Command := #$F9 + Chr(FFrameNo shr 8) + Chr(FFrameNo and $FF); //?
                  CurACK := csACK + chr(FFrameNO shr 8) + chr(FFrameNo and $FF);
                end;
              csAppendKey:
                begin
                  Comment := '【追加密钥】';
                  Command := #$F8;
                  CurACK := csACK + #$F8;
                end;
            end;
            CurAcK := CurAck + chr(CrcofString(CurAck));
            CurNAK := '';
            Command := Command + ConvHexStrToBinary(GetSubParams(FSenderSerialNO + '_Key', FFrameNo)) + #0; // 1字节预留
            Command := Command + Chr(CrcOfString(Command));
            Send_Interval := 1000;
            No_Response_Interval := 300;
            Max_Send_Times := 10;
            SetLength(Echos, 0);
          end;
        csSetAlertLimit:
          begin
            Comment := '【设定报警条件】';
            Command := #$F5 + GetAlterLimit;
            Command := Command + Chr(CrcOfString(Command));
            Send_Interval := 100;
            No_Response_Interval := 300;
            Max_Send_Times := 10;
            SetLength(Echos, 0);
            CurAck := csAck + #$F5;
            CurAck := CurAck + chr(CrcofString(CurAck));
            CurNAK := '';
          end;
        csGetHistoryData:
          begin
            Comment := '【接收数据】';
            Command := #$FB + Chr(FFrameNo shr 8) + Chr(FFrameNo and $FF);
            Command := Command + Chr(CrcOfString(Command));
            Send_Interval := 100;
            No_Response_Interval := 300;
            Max_Send_Times := 10;
            SetLength(Echos, 1);
            Echos[0].Echo_Head := #$FB + Chr(FFrameNo shr 8) + Chr(FFrameNo and $FF);
            Echos[0].Echo_Size := 20;
            Echos[0].Echo_HaveCRC := True;
            curACK := '';
            curNAK := '';
          end;
      end;
    end;
  Result := FHostCmd;
end;

initialization
  // 注册协议处理插件
  RegisterExecutorClass(TTimePos);
finalization

end.

⌨️ 快捷键说明

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