-
FUNCTION_BLOCK CRC
(*Процедура подсчета CRC*)
(*
(C) by Jeck 2009
*)
VAR_INPUT
INPUT:ARRAY [0..1023] OF BYTE; (*входной буфер*)
sz: DWORD;(*длина буфера*)
END_VAR
VAR_OUTPUT
CRC16: WORD;
END_VAR
VAR
B: INT;
N: INT;
C: BOOL;
END_VAR
________________________________
CRC16:=16#FFFF;
B:=0;
N:=0;
REPEAT
CRC16:= CRC16 XOR BYTE_TO_WORD(INPUT[B]);
N:=0;
REPEAT
C:=CRC16.0;
CRC16:=SHR(CRC16,1);
IF C THEN
CRC16:= CRC16 XOR 16#A001;
END_IF
N:=N+1;
UNTIL
N>7
END_REPEAT
B:=B+1;
UNTIL
B>sz
END_REPEAT
-
Спасибо всем за помощь! В первом примере удалось немного понять нюансы между Си и ST но полностю работоспособность этого примера я так и не проверил. А второй пример Jecka мне кажется проще и практически работает без проблем, вычисленная контрольная сума совпадает с примерами посылок в тех.док. Правда CRC16 выводится в виде десятичного значения и я калькуляторм перевел в шестнадцатиричный, а фактически мне нужно выделить младший и старший байт и прикрепить в конце посылки младшим байтом вперед. Пока есть другое задание и не хватает времени, но завершить эту задачу обязательно надо.
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
-
Правила форума