Благодаря пользователю
Валенок получилось вычислить КС. Немного поправил, как мог.
Код:
FUNCTION crc16Calc : WORD
VAR_INPUT
buffer : POINTER TO ARRAY[0..16] OF BYTE;
n : INT;
END_VAR
VAR
i : INT;
crc1, crc2, tmp : BYTE;
END_VAR
Код:
crc1 := crc2 := 16#FF;
i := 0;
WHILE i < n DO
crc2 := crc2 XOR buffer^[i];
tmp := ((ROL(crc2,4) OR ROR(crc2,4)) AND 16#0F) XOR crc2;
crc2 := crc1;
crc1 := tmp;
tmp := (ROL(tmp,4) OR ROR(tmp,4)) AND 16#F0;
crc2 := crc2 XOR tmp;
tmp := SHL(tmp,1) XOR crc1;
crc1 := SHR(crc1, 3);
crc2 := crc2 XOR crc1;
crc1 := tmp;
i := i + 1;
END_WHILE
crc16Calc := crc2 + SHL(BYTE_TO_WORD(crc1), 8);
Запрос/ответ
[22/05/2021 12:00:56] Written data (COM4)
03 00 02 03 49 1d ....I.
[22/05/2021 12:00:56] Read data (COM4)
03 00 02 6a b4 92 ...jґ’
1 байт - адрес устройства
2 байт - адрес устройства (пусто)
3 байт - регистр управления ключом
4 байт - регистр состояния 6 дискретных входов
5,6 КС
Из описания
4.jpg
Теперь надо осуществить процедуру обмена. Уф, это ещё неделю сидеть буду. А потом ещё циклический опрос 15 устройств.