Функция crc16 по полиному 0x1021 в CoDeSys на ST:
-------------------------------
FUNCTION crc16_1021 : WORD
VAR_INPUT
pcBlock: POINTER TO BYTE;
len: WORD;
END_VAR
VAR
crc, i, w: WORD;
END_VAR
-------------------------------
crc := 16#FFFF;
WHILE (LEN > 0) DO
w := pcBlock^;
pcBlock := pcBlock + 1;
w := SHL(w,8);
crc := crc XOR w;
FOR i := 0 TO 7 DO
IF ((crc AND 16#8000) <> 0) THEN
crc := SHL(crc,1) XOR 16#1021;
ELSE
crc := SHL(crc,1);
END_IF
END_FOR
LEN := LEN - 1;
END_WHILE
crc16_1021 := crc;
RETURN;