search
menu
person

Расчет суммы crc16 modbus программа

sakkra › Блог › Простой расчет CRC для Modbus на C#. CRC16.
Ох и намаялся я с описаловкой метода расчета CRC для Mobus. Кучу алгоритмов перелопатил, описаний и т.д. А в итоге реально функция на 10 строк, только описать надо было верно.

Пользуйтесь, кто захочет, рассчитывает посылки правильно, оттестировал на промышленном контроллере. /* * Создано в SharpDevelop. * Пользователь: tihonov.an * Дата: 20.06.2019 * Время: 12:15 * */ using System; namespace CRCFUCK class Program /* Принцип расчета: * 1) задаем значение из единиц регистру Register = 0xFFFF, в этом значении будет сохраняться наш рассчитанный по каждому байту сообщения CRC. * 2) задаем нужный нам полином, в нашем случае это 0xA001 * 3) запускаем цикл, по количеству байт в сообщении(сообщение всегда идет без полученного CRC, потому что расчитывается заново всегда) * 3-1) В цикле 3: делим регистр через xor на выбранный байт сообщения(начиная с первого) * 3-2) В цикле 3: запускаем вложенный цикл на 8 шагов(по количеству бит в байте), * в котором узнаем, является ли старший бит единицей: * Если является — сдвигаем регистр вправо на один бит, и делим по xor на полином * Если не является единицей — просто сдвигаем регистр вправо. * * По окончанию вложенного цикла происходит возврат к основному циклу, в котором последовательность повторяется для следующего байта в сообщении. * * По окончанию основного цикла содержимое регистра присваивается массиву CRC младшим байтом вперед и выдается в виде результата функции */ public static byte[] ModbusCRC16Calc(byte[] Message) //выдаваемый массив CRC byte[] CRC = new byte[2]; ushort Register = 0xFFFF; // создаем регистр, в котором будем сохранять высчитанный CRC ushort Polynom = 0xA001; //Указываем полином, он может быть как 0xA001(старший бит справа), так и его реверс 0x8005(старший бит слева, здесь не рассматривается), при сдвиге вправо используется 0xA001. for (int i = 0; i > 1); //сдвигаем на один бит вправо Register = (ushort)(Register ^ Polynom); //делим регистр на полином по XOR > else //если старший бит равен 0 то Register = (ushort)(Register >> 1); // сдвигаем регистр вправо > > > CRC[1] = (byte)(Register >> 8); // присваеваем старший байт полученного регистра младшему байту результата CRC (CRClow) CRC[0] = (byte)(Register & 0x00FF); // присваеваем младший байт полученного регистра старшему байту результата CRC (CRCHi) это условность Modbus — обмен байтов местами. public static void Main(string[] args) //сообщение byte[] Message = new byte[] ;



Расчет суммы crc16 modbus программа
Расчет суммы crc16 modbus программа



С этим скачивают:
avatar