📄 uniprotocol_timepos.pas
字号:
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 + -