Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расчет контрольной суммы (RS-232) / 25 сообщений из 27, страница 1 из 2
02.12.2020, 15:43
    #40023990
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Всем привет.
При изменении параметра прибора (устанавливаем число 20) читаю с порта (RS232) следующие данные
Код: pascal
1.
AA 02 01 00 02 01 14 F6 28


При установке числа 19 получаем такой ответ
Код: pascal
1.
AA 02 01 00 02 01 13 76 39


Так понял, что последние два байта - это контрольная сумма.
Подскажите, каким вычислением получается такая CRC? Пробовал использовать алгоритмы работы CRC16, но что-то не то получается.
...
Рейтинг: 0 / 0
02.12.2020, 15:48
    #40023993
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
HadroranТак понял, что последние два байта - это контрольная сумма.

Спецификация протокола прибора позволит "знать", а не "понимать".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2020, 15:52
    #40023995
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Dimitry Sibiryakov,

В том то и дело, что китайсы любезно видимо забыли его просто положить
...
Рейтинг: 0 / 0
02.12.2020, 15:56
    #40023996
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
И чёрную коробочку без единой надписи снаружи они наглухо заварили?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2020, 16:14
    #40023998
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Dimitry Sibiryakov

И чёрную коробочку без единой надписи снаружи они наглухо заварили?..

ну реально нет инфы на эту хрень
RFID считыватель CL7206C
Продажники и те нихрена предоставить не могут... печалька
...
Рейтинг: 0 / 0
02.12.2020, 16:20
    #40024000
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Hadroran,

а зачем тебе эта CRC?
...
Рейтинг: 0 / 0
02.12.2020, 16:27
    #40024003
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
ъъъъъ
Hadroran,

а зачем тебе эта CRC?


Ну кроме 19 и 20 есть же и другие цыферки...
...
Рейтинг: 0 / 0
02.12.2020, 16:47
    #40024007
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Hadroran,

С тебя пиво.

Пальцем в небо, но:
https://crccalc.com/

02 01 00 02 01 14
CRC-16/BUYPASS 0xF628

02 01 00 02 01 13
CRC-16/BUYPASS 0x7639
...
Рейтинг: 0 / 0
02.12.2020, 17:00
    #40024010
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Алгоритм тыкания пальцем в небо:

I. Смотрим ГОСТ Р исо/м эк 1 8 0 0 0 - 6 2 - 2014 видим слова CRC. Вроде топик стартер в чем-то прав.

II. Ищем онлайн CRC калькулятор, охреневаем от количества вариантов CRC )))

III.
1. Вбиваем циферки - видим хрень
2. По опыту ))), пытаемся переставить байты местами ( Big Endian, Low Endian ) - это не получается. А CRC все-же CRC 16 ))). Что наводит на мысль, что топик стартер в чем-то не прав )))
3. Добиваем 00 в конец - видим хрень
4. Убираем AA в начале - и печалимся... т.к. результат достигнут, а не булькает (((
...
Рейтинг: 0 / 0
02.12.2020, 17:20
    #40024022
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Leonid Kudryavtsev,

Спасибо, (бульк)
ща применим
...
Рейтинг: 0 / 0
02.12.2020, 18:11
    #40024036
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Hadroranну реально нет инфы на эту хрень
RFID считыватель CL7206C

Правда? А у меня первая же ссылка в гугле - на мануал, где, помимо всего прочего,
говорится "support ISO18000-6C/6B protocols".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2020, 18:17
    #40024038
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Dimitry Sibiryakov

Hadroranну реально нет инфы на эту хрень
RFID считыватель CL7206C

Правда? А у меня первая же ссылка в гугле - на мануал, где, помимо всего прочего,
говорится "support ISO18000-6C/6B protocols".


стыжуся...
...
Рейтинг: 0 / 0
02.12.2020, 18:45
    #40024045
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Dimitry Sibiryakov

support ISO18000-6C/6B protocols

Вроде данный стандарт про радиоканал, а не про API между считывателем и компьютером. Т.ч. с точки зрения документации API, мало чего дает. IMHO
...
Рейтинг: 0 / 0
02.12.2020, 18:49
    #40024046
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
А что-то не получается.
Выдает данные вычислений по модбасу. Подскажите, где ошибка?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function GetCRC16_BYPASS(const HexData: string): UInt16;
var
  Buffer: Array of Byte;
  b:TArray<Byte>;
  CRC: UInt16;
  Mask: UInt16;
  I: Integer;
  J: Integer;
begin
  SetLength(Buffer, Length(HexData) div 2);
  HexToBin(PChar(HexData), Buffer, Length(Buffer));
  CRC := $FFFF;
  for I := Low(Buffer) to High(Buffer) do
    begin
      CRC := CRC xor Buffer[i];
      for J := 1 to 8 do
        begin
          Mask := 0;
          if ((CRC / 2) <> (CRC div 2)) then
            begin
             Mask := $A001;
            end;
          CRC := (CRC div 2) and $7FFF;
          CRC := CRC xor Mask;
        end;
    end;
Result := ((CRC and $FF) shl 8) + (CRC shr 8);
end;
...
Рейтинг: 0 / 0
02.12.2020, 18:56
    #40024047
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Leonid KudryavtsevВроде данный стандарт про радиоканал, а не про API между считывателем и компьютером.

Может и так, но у меня опять же первая ссылка в гугле по "ISO18000-6C/6B protocols" ведёт
на "LinkSprite Long Distance RFID reader (ISO18000-6C EPC G2) Communication Protocol",
что, конечно, не та коробочка, но чиселки весьма похожи и самое ценное - процедура КС в
виде исходника.

PS: А, нет, присмотрелся - и в самом деле не та КС, процедура на один контрольный байт.
PPS: Зато на второй странице вот оно: https://stackoverflow.com/questions/149617/how-could-i-guess-a-checksum-algorithm

Hadroran
Подскажите, где ошибка?

Полиномиал у тебя не тот, см. ссылку выше.
...
Рейтинг: 0 / 0
02.12.2020, 19:18
    #40024050
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Dimitry Sibiryakov
Hadroran
Подскажите, где ошибка?

Полиномиал у тебя не тот, см. ссылку выше.

Кроме того вики говорит что начальное значение для BYPASS - 0.
...
Рейтинг: 0 / 0
02.12.2020, 20:26
    #40024057
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Ok. Исправляем для Bypass
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function GetCRC16_BYPASS(const HexData: string): UInt16;
var
  Buffer: Array of Byte;
  b:TArray<Byte>;
  CRC: UInt16;
  Mask: UInt16;
  I: Integer;
  J: Integer;
begin
  SetLength(Buffer, Length(HexData) div 2);
  HexToBin(PChar(HexData), Buffer, Length(Buffer));
  CRC := $0;  //   начальное значение для BYPASS
  for I := Low(Buffer) to High(Buffer) do
    begin
      CRC := CRC xor Buffer[i];
      for J := 1 to 8 do
        begin
          Mask := 0;     
          if ((CRC / 2) <> (CRC div 2)) then
            begin
             Mask := $8005;  //   Полином
            end;
          CRC := (CRC div 2) and $7FFF;
          CRC := CRC xor Mask;
        end;
    end;
Result := ((CRC and $FF) shl 8) + (CRC shr 8);
end;


Все одно - неверный результат...
...
Рейтинг: 0 / 0
02.12.2020, 20:58
    #40024062
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Hadroran
Ok. Исправляем для Bypass
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function GetCRC16_BYPASS(const HexData: string): UInt16;
var
  Buffer: Array of Byte;
  b:TArray<Byte>;
  CRC: UInt16;
  Mask: UInt16;
  I: Integer;
  J: Integer;
begin
  SetLength(Buffer, Length(HexData) div 2);
  HexToBin(PChar(HexData), Buffer, Length(Buffer));
  CRC := $0;  //   начальное значение для BYPASS
  for I := Low(Buffer) to High(Buffer) do
    begin
      CRC := CRC xor Buffer[i];
      for J := 1 to 8 do
        begin
          Mask := 0;     
          if ((CRC / 2) <> (CRC div 2)) then
            begin
             Mask := $8005;  //   Полином
            end;
          CRC := (CRC div 2) and $7FFF;
          CRC := CRC xor Mask;
        end;
    end;
Result := ((CRC and $FF) shl 8) + (CRC shr 8);
end;



Все одно - неверный результат...

Я так понимаю, что ты просто отсюда код утащил
https://stackoverflow.com/questions/38529075/how-usuage-crc16-modbus-in-delphi
...
Рейтинг: 0 / 0
02.12.2020, 21:14
    #40024063
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
defecator,
Да тут этих кодов, как фантиков... не писать же все которые испробовал.
...
Рейтинг: 0 / 0
02.12.2020, 21:41
    #40024068
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Hadroran,

На, алгоритм беззаботно спизаимствован отсюда :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
program crc16;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TCRC16Params = record
    Poly: Word;
    Init: Word;
    RefIn: Boolean;
    RefOut: Boolean;
    XorOut: Word;
    Check: Word;
    Name: string
  end;

  TCRC16 = class
  private
    FParams: TCRC16Params;
    FTable: array [Byte] of Word;
    FValue: PWord;
  protected
    procedure CheckInitialized;
    procedure UpdateLSB(Data: PByte; Count: Cardinal);
    procedure UpdateMSB(Data: PByte; Count: Cardinal);
  public
    constructor Create(const Params: TCRC16Params);
    function  CalcCRC16(Data: PByte; Count: Cardinal): Word;
    function  Complete: Word;
    procedure Initialize;
    procedure Update(Data: PByte; Count: Cardinal);
  end;

const
  CRC16BYPASS: TCrc16Params = (
    Poly: $8005;
    Init: $0000;
    RefIn: False;
    RefOut: False;
    XorOut: $0000;
    Check: $FEE8;
    Name: 'CRC-16/BUYPASS';
  );

{ TCRC16 }

function ReverseByte(b: Byte): Byte;
begin
  b := (b and $F0) shr 4 or (b and $0F) shl 4;
  b := (b and $CC) shr 2 or (b and $33) shl 2;
  Result := (b and $AA) shr 1 or (b and $55) shl 1;
end;

function ReverseWord(w: Word): Word;
begin
  w := (w and $FF00) shr 8 or (w and $00FF) shl 8;
  w := (w and $F0F0) shr 4 or (w and $0F0F) shl 4;
  w := (w and $CCCC) shr 2 or (w and $3333) shl 2;
  Result := (w and $AAAA) shr 1 or (w and $5555) shl 1;
end;

function TCRC16.CalcCRC16(Data: PByte; Count: Cardinal): Word;
begin
  Initialize;
  if FParams.RefIn then
    UpdateLSB(Data, Count)
  else
    UpdateMSB(Data, Count);
  Result := Complete;
end;

procedure TCRC16.CheckInitialized;
begin
  if FValue = nil then
    raise Exception.Create('You must call init first!');
end;

function TCRC16.Complete: Word;
begin
  CheckInitialized;
  if FParams.RefOut then
    Result := ReverseWord(FValue^) xor FParams.XorOut
  else
    Result := FValue^ xor FParams.XorOut;
  Dispose(FValue);
  FValue := nil;
end;

constructor TCRC16.Create(const Params: TCRC16Params);
const
  Test: AnsiString = '123456789';
var
  Check: Integer;
  Index: Byte;
  Value: Word;
  IsSet: Boolean;
begin
  FParams := Params;
	for Index := 0 to 255 do
  begin
    Value := Word(Index) shl 8;
    for Check := 0 to 7 do
    begin
      IsSet := Value and $8000 <> 0;
      Value := Value shl 1;
      if IsSet then
        Value := Value xor Params.Poly;
    end;
    FTable[Index] := Value;
  end;
  if CalcCRC16(PByte(Test), Length(Test)) <> FParams.Check then
    raise Exception.Create('Mismatch of the test value, possibly an error in the parameters.');
end;

procedure TCRC16.Initialize;
begin
  if FValue = nil then
    New(FValue);
  FValue^ := FParams.Init;
end;

procedure TCRC16.Update(Data: PByte; Count: Cardinal);
begin
  CheckInitialized;
  if FParams.RefIn then
    UpdateLSB(Data, Count)
  else
    UpdateMSB(Data, Count);
end;

procedure TCRC16.UpdateLSB(Data: PByte; Count: Cardinal);
var
  Index: NativeUInt;
begin
  for Index := NativeUInt(Data) to NativeUInt(Data) + Pred(Count) do
    FValue^ := FValue^ shl 8 xor FTable[Byte(FValue^ shr 8) xor ReverseByte(PByte(Index)^)];
end;

procedure TCRC16.UpdateMSB(Data: PByte; Count: Cardinal);
var
  Index: NativeUInt;
begin
  for Index := NativeUInt(Data) to NativeUInt(Data) + Pred(Count) do
    FValue^ := FValue^ shl 8 xor FTable[Byte(FValue^ shr 8) xor PByte(Index)^];
end;

const
  CRC16Test1: array of Byte = [$02, $01, $00, $02, $01, $14];
  CRC16Test2: array of Byte = [$02, $01, $00, $02, $01, $13];
 
begin
  try
    with TCRC16.Create(CRC16BYPASS) do
    try
      WriteLn('0x', CalcCRC16(PByte(CRC16Test1), Length(CRC16Test1)).ToHexString(4));
      WriteLn('0x', CalcCRC16(PByte(CRC16Test2), Length(CRC16Test2)).ToHexString(4));
    finally
      Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.


Параметры для других модификаций CRC16 (буде понадобятся) можно взять здесь .
...
Рейтинг: 0 / 0
02.12.2020, 21:46
    #40024070
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Вот эта функция гарантированно правильно считает CRC для ModBus

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function GetCrcModbus(const data : TBytes) : word;
var
   f : word;
   i, j : integer;
begin
     Result := $FFFF ;
     for i := 0 to Length(data)-1 do
      begin
           Result := Result xor data[i];
           for j := 1 to 8 do
            begin
                 f := Result and 1;
                 Result  := Result shr 1;
                 if f = 1 then  Result := Result xor $A001;
            end;
      end;
     f := Result shr 8;
     Result := ((Result shl 8) or f);
end;
...
Рейтинг: 0 / 0
02.12.2020, 21:48
    #40024071
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
defecator,

Это не BUYPASS.
...
Рейтинг: 0 / 0
02.12.2020, 21:51
    #40024072
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
alekcvp
defecator,

Это не BUYPASS.


я всё не дочитал, только досюда 22241575
...
Рейтинг: 0 / 0
02.12.2020, 21:58
    #40024077
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
alekcvp,

наворочено. но рабочий. Спасибо.
...
Рейтинг: 0 / 0
02.12.2020, 22:16
    #40024086
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет контрольной суммы (RS-232)
Hadroran
alekcvp,
наворочено. но рабочий. Спасибо.

Ну это универсальный алгоритм Crc16, который можно подогнать под любой параметрами.
Ничего не мешает вырезать из него только BUYPASS.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расчет контрольной суммы (RS-232) / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]