Good day everyone. I am trying to create a software to comunicate modbus devices to my software. I have problem on CRC16 sometimes the device respond sometimes not.
Details below:
function CRC16(Data: AnsiString): AnsiString;
var
i,j,iSum,f : Integer;
begin
iSum := $FFFF;
for i := 1 to Length(Data) do
begin
iSum := iSum xor Ord(Data[i]);
for j := 1 to 8 do
begin
f := iSum and $0001;
iSum := iSum shr 1;
if f = 1 then iSum := iSum xor $A001;
end;
end;
Result := AnsiChar(Lo(iSum)) + AnsiChar(Hi(iSum));
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
YearVar : String;
AnsiOrig : ansiString;
Ansi : ansiString;
Ansi2 : ansiString;
YearConvert : Integer;
YearUpdater : String;
YearUpdaterCRC : String;
begin
CloseAllConnection;
ComPortUpdate.Open;
if ComPortUpdate.Connected then
Begin
YearConvert := StrToInt(Edit1.Text);
AnsiOrig := IntToHex(YearConvert,4);
Ansi := Copy(AnsiOrig,1,2);
Ansi2 := Copy(AnsiOrig,3,2);
{ShowMessage(AnsiOrig);
ShowMessage(Ansi);
ShowMessage(Ansi2); }
YearUpdater := chr(StrToInt('$' + EditAddress.Text)) + chr($06) + chr($02)+
chr($04) + chr(StrtoInt('$' + Ansi)) + chr(StrtoInt('$' + Ansi2));
YearUpdaterCrc := CRC16(YearUpdater);
//ShowMessage(StringToHex(YearUpdater + YearUpdaterCRC));
ComPortUpdate.WriteStr(YearUpdater + YearUpdaterCRC);
ComPortUpdate.ClearBuffer(True,True);
End
else
begin
ShowMessage('Communication port is not connected');
end;
end;
This works:
YearUpdater := chr(StrToInt('$' + EditAddress.Text)) + chr($06) + chr($02) + chr($04) +
chr($07) + chr($E0);
but this does not work:
YearUpdater := chr(StrToInt('$' + EditAddress.Text)) + chr($06) + chr($02) + chr($04) +
chr($07) + chr($DF);
I think has a wrong check digit.
Please help, or maybe post a working CRC16 function. Thanks in advance.