Священный алгоритм вычисления CRC16, описанный в литературе и связанный со сдвигом битов, плохо вписывается в формат вычислительных возможностей ПЛК и МК.
Во-первых, поскольку его реализация занимает изрядное количество вычислительных ресурсов вышеназванных устройств, а во-вторых, потому, что при таком расчете время сканирования программы существенно увеличивается.
Рост развертки программы обусловлен тем, что за счет словной или байтовой организации аккумулятора арифметико-логического устройства результирующие битовые операции со словами/байтами в нем выполняются значительно дольше, чем операции с целыми словами/байтами.
В некоторых устройствах операции сдвига битов вообще не поддерживаются, при этом алгоритм предполагает выполнение восьми тактов с такими операциями.
Чтобы уменьшить объем вычислений и, как следствие, время сканирования при обработке CRC, часто используют другой алгоритм – табличный, когда таблица масок рассчитывается и заполняется один раз при первом сканировании программы.
Однако этот метод не лишен недостатков, поскольку он также потребляет ресурсы.
512 байт (или 256 двухбайтовых слов) иногда совсем не лишние.
Можно ли изменить алгоритм расчета CRC таким образом, чтобы исключить использование побитовых сдвигов и таблиц? Абсолютно да.
Вам просто нужно присмотреться к алгоритму побитового сдвига.
Напомню его суть:
- следующий байт отправляющего массива добавляется по модулю 2 к младшему байту двухбайтовой CRC;
- CRC ациклически сдвигается на один бит от старшего 15-го бита к младшему, нулю, при этом младший бит перемещается вперед, а самый старший бит сбрасывается в ноль;
- если значение расширенного бита равно единице, CRC добавляется по модулю 2 к полиному 16#A001.
- Шаги 2 и 3 повторяются еще 7 раз.
Внимательно взглянув на этот алгоритм, нетрудно обнаружить, что на самом деле мы имеем дело с циклическим поразрядным сдвигом слова.
Старший бит полинома отвечает за его цикличность.
В результате значение старшего бита CRC после каждого сдвига идентично значению старшего младшего бита.
Таким образом, при выполнении циклического поразрядного сдвига полином, с которым затем необходимо сложить по модулю 2, преобразуется в 16#2001. Таких сдвигов выполняется восемь.
Проще говоря, в глобальном плане речь идет о замене младшего байта CRC на его старший байт. А это говорит о том, что после сложения по модулю 2 очередного байта массива посылки с младшим байтом CRC достаточно поменять местами младший и старший байт CRC, а затем, последовательно анализируя восемь бит его старшего байта, байта, начиная с его младшего бита, восьмого, выполняют сложение CRC по модулю 2 с известными константами, заранее заданными значением многочлена, значение которого для Modbus CRC16, как указано выше, эквивалентно 16#2001. Итоговый алгоритм учета следующего байта массива посылок в CRC следующий: Следующий байт отправляющего массива добавляется по модулю 2 к младшему байту двухбайтовой CRC, после чего младший и старший байты CRC меняются местами;
- Если значение 8-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#0240;
- Если значение 9-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#0480;
- Если значение 10-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#0900;
- Если значение 11-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#1200;
- Если значение 12-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#2400;
- Если значение 13-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#4800;
- Если значение 14-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#9000;
- Если значение 15-го бита CRC равно единице, оно добавляется по модулю 2 с константой 16#2001, расчет завершается.
Теги: #Modbus CRC16 #программирование #Алгоритмы #Промышленное программирование #Программирование микроконтроллеров
-
Обзор 3D-Принтера Hercules От 3Dtool
19 Oct, 24 -
Кэширование В Spring Framework 3.1
19 Oct, 24