Показано с 1 по 10 из 47

Тема: Modbus RTU CRC16 полином A001h

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    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

  2. #2

    По умолчанию

    Спасибо всем за помощь! В первом примере удалось немного понять нюансы между Си и ST но полностю работоспособность этого примера я так и не проверил. А второй пример Jecka мне кажется проще и практически работает без проблем, вычисленная контрольная сума совпадает с примерами посылок в тех.док. Правда CRC16 выводится в виде десятичного значения и я калькуляторм перевел в шестнадцатиричный, а фактически мне нужно выделить младший и старший байт и прикрепить в конце посылки младшим байтом вперед. Пока есть другое задание и не хватает времени, но завершить эту задачу обязательно надо.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •