Простой И Эффективный Расчет Modbus Crc16 В Плк И Микроконтроллерах Без Смещения Битов И Таблиц.

Священный алгоритм вычисления CRC16, описанный в литературе и связанный со сдвигом битов, плохо вписывается в формат вычислительных возможностей ПЛК и МК.

Во-первых, поскольку его реализация занимает изрядное количество вычислительных ресурсов вышеназванных устройств, а во-вторых, потому, что при таком расчете время сканирования программы существенно увеличивается.

Рост развертки программы обусловлен тем, что за счет словной или байтовой организации аккумулятора арифметико-логического устройства результирующие битовые операции со словами/байтами в нем выполняются значительно дольше, чем операции с целыми словами/байтами.

В некоторых устройствах операции сдвига битов вообще не поддерживаются, при этом алгоритм предполагает выполнение восьми тактов с такими операциями.

Чтобы уменьшить объем вычислений и, как следствие, время сканирования при обработке CRC, часто используют другой алгоритм – табличный, когда таблица масок рассчитывается и заполняется один раз при первом сканировании программы.

Однако этот метод не лишен недостатков, поскольку он также потребляет ресурсы.

512 байт (или 256 двухбайтовых слов) иногда совсем не лишние.

Можно ли изменить алгоритм расчета CRC таким образом, чтобы исключить использование побитовых сдвигов и таблиц? Абсолютно да.

Вам просто нужно присмотреться к алгоритму побитового сдвига.

Напомню его суть:

  1. следующий байт отправляющего массива добавляется по модулю 2 к младшему байту двухбайтовой CRC;
  2. CRC ациклически сдвигается на один бит от старшего 15-го бита к младшему, нулю, при этом младший бит перемещается вперед, а самый старший бит сбрасывается в ноль;
  3. если значение расширенного бита равно единице, CRC добавляется по модулю 2 к полиному 16#A001.
  4. Шаги 2 и 3 повторяются еще 7 раз.

Почему реализовано именно так, а не иначе? Да, потому что такая алгоритмизация показалась наиболее подходящей для реализации с использованием аппаратной логики.

Внимательно взглянув на этот алгоритм, нетрудно обнаружить, что на самом деле мы имеем дело с циклическим поразрядным сдвигом слова.

Старший бит полинома отвечает за его цикличность.

В результате значение старшего бита CRC после каждого сдвига идентично значению старшего младшего бита.

Таким образом, при выполнении циклического поразрядного сдвига полином, с которым затем необходимо сложить по модулю 2, преобразуется в 16#2001. Таких сдвигов выполняется восемь.

Проще говоря, в глобальном плане речь идет о замене младшего байта CRC на его старший байт. А это говорит о том, что после сложения по модулю 2 очередного байта массива посылки с младшим байтом CRC достаточно поменять местами младший и старший байт CRC, а затем, последовательно анализируя восемь бит его старшего байта, байта, начиная с его младшего бита, восьмого, выполняют сложение CRC по модулю 2 с известными константами, заранее заданными значением многочлена, значение которого для Modbus CRC16, как указано выше, эквивалентно 16#2001. Итоговый алгоритм учета следующего байта массива посылок в CRC следующий: Следующий байт отправляющего массива добавляется по модулю 2 к младшему байту двухбайтовой CRC, после чего младший и старший байты CRC меняются местами;

  1. Если значение 8-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#0240;
  2. Если значение 9-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#0480;
  3. Если значение 10-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#0900;
  4. Если значение 11-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#1200;
  5. Если значение 12-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#2400;
  6. Если значение 13-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#4800;
  7. Если значение 14-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#9000;
  8. Если значение 15-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#2001, расчет завершается.

Плюсы данного метода расчета: 1) По сравнению с алгоритмом битового сдвига: а) предложенный алгоритм позволяет избавиться от команд вложенного цикла FOR-NEXT и команд побитового сдвига в таком цикле, при этом количество исполняемых команд сложения по модулю 2 остается неизменным; б) в контроллерах, поддерживающих команду SWAP, восьмикратный сдвиг битов CRC заменяется одной командой, а в контроллерах, не поддерживающих такую команду, - одной или двумя командами передачи, которые входят в состав основных команд контроллеру и занимать минимальное время; 2) По сравнению с табличным методом расчета, этот метод не требует выделения места в памяти данных для таблицы, предварительного ее заполнения, выбора соответствующей маски из таблицы и последующего применения ее к байту CRC. Разработка предлагаемого алгоритма расчета CRC16 изначально велась для моделей ПЛК Mitsubishi FX3S/3G, которые не поддерживают инструкции расчета CRC и перестановки байтов в слове, при этом максимальное общее время расчета CRC с использованием указанного алгоритма для массив посылок, состоящий из 128 байт, не превышает 2,4 мс.

Теги: #Modbus CRC16 #программирование #Алгоритмы #Промышленное программирование #Программирование микроконтроллеров

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.