реклама на сайте
подробности

 
 
> CRC16 для modbus, не повторяйте ошибок
demiurg_spb
сообщение Oct 9 2008, 17:05
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Я наткнулся недавно на очередные грабли.
Суть такая:
Есть алгоритм для подсчёта CRC16 для Modbus:
Цитата
1. Load a 16–bit register with FFFF hex (all 1’s). Call this the CRC register.
2. Exclusive OR the first 8–bit byte of the message with the low–order byte of the 16–bit CRC register, putting the result in the
CRC register.
3. Shift the CRC register one bit to the right (toward the LSB), zero–filling the MSB. Extract and examine the LSB.
4. (If the LSB was 0): Repeat Step 3 (another shift).
(If the LSB was 1): Exclusive OR the CRC register with the polynomial value 0xA001 (1010 0000 0000 0001).
5. Repeat Steps 3 and 4 until 8 shifts have been performed. When this is done, a complete 8–bit byte will have been
processed.
6. Repeat Steps 2 through 5 for the next 8–bit byte of the message. Continue doing this until all bytes have been processed.
7. The final content of the CRC register is the CRC value.
8. When the CRC is placed into the message, its upper and lower bytes must be swapped as described below.


И есть алгоритм для подсчёта CRC16 из WinAvr <util/crc16.h> написанный на ASM и оптимизированный.
Код
    Optimized CRC-16 calculation.

    Polynomial: x^16 + x^15 + x^2 + 1 (0xa001)<br>
    Initial value: 0xffff

    This CRC is normally used in disk-drive controllers.

    The following is the equivalent functionality written in C.

    \code
    uint16_t
    crc16_update(uint16_t crc, uint8_t a)
    {
    int i;

    crc ^= a;
    for (i = 0; i < 8; ++i)
    {
        if (crc & 1)
        crc = (crc >> 1) ^ 0xA001;
        else
        crc = (crc >> 1);
    }

    return crc;
    }

Вроде как одно и тоже, а нет!
По доке на modbus сдвиг нужно делать до анализа младшего бита crc,
а в приведённой цитате из WinAvr <util/crc16.h> это не так.

Я 3 часа долбался - почему это вдруг у моих приборов RS-485 перестал работать.
А это я перед отпуском решил "улучшить" CRC модуль и забыл об этом.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Николай Иванович...
сообщение Oct 10 2008, 20:57
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Не забудьте, Господа, что CRC имеет "слепые пятна"

"Начальные и конечные значения
В довершение ко всему нами виденному, CRC алгоритмы различаются еще по моментам: по начальному значению регистра; по значению, которое комбинируется по XOR с окончательным содержимым регистра. Например, алгоритм "CRC " инициализирует регистр значением 0xFFFFFFFF и выполняют операцию XOR окончательного значения также с величиной 0xFFFFFFFF. Большинство CRC алгоритмов инициализируют регистр нулевым значением, однако некоторые предпочитают ненулевое. Теоретически (когда не делается ни каких предположений относительно содержания сообщения) начальной значение не влияет на стойкость CRC, оно лишь является точкой отсчета, с которой алгоритм начинает работать. Однако, на практике некоторые сообщения более вероятны, чем другие, поэтому разумнее будет выбрать такое начальное значение регистра, которое бы не имело "слепых пятен". Под "слепым пятном" мы подразумеваем такую последовательность байтов сообщения, которые не приводят к изменению со держимого регистра. В частности, любые CRC алгоритмы, которые инициализи руют свой регистр нулевым значением, будут иметь "слепое пятно" в отношении нулевых байтов в начале сообщения и не смогут оценить их количество. А так как в начале сообщения нулевые байты встречаются достаточно часто, разумнее ини циализировать регистр значением, отличным от нуля.
©Ross N. Williams

Сам как-то наткнулся на эти грабли, когда использовал CRC для контроля целостности программы во FLASH

Цитата(singlskv @ Oct 11 2008, 00:44) *
Очень хотелось бы хоть кому-нить оторвать голову , за модбас...

Мне тоже. Уж больно "кривой" и запутанный протокол.

Сообщение отредактировал Николай Иванович Приходько - Oct 10 2008, 20:58
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Oct 10 2008, 21:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



Цитата
...Уж больно "кривой" и запутанный протокол.

Назовите ровнее...
Давайте уважать пенсионеров - это все-таки 1979 год. И жив он до сих пор, думаю, потому, что он как раз очень простой, даже примитивный.
http://www.modbus.org/tech.php
http://freemodbus.berlios.de/
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Oct 11 2008, 17:16
Сообщение #4


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Andrew2000 @ Oct 11 2008, 01:22) *
Давайте уважать пенсионеров - это все-таки 1979 год. И жив он до сих пор, думаю, потому, что он как раз очень простой, даже примитивный.

Угу вот давайте теперь уважать идиотов только за то что они пенсионеры. RTU-modbus на мыло! Единственный бинарный протокол имеющий право на жизнь - это slip(и подобные), остальное в помойку. И почему так мало кроликов пользует ASCII вариант modbus?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- demiurg_spb   CRC16 для modbus   Oct 9 2008, 17:05
- - Rst7   ЦитатаПо доке на modbus сдвиг нужно делать до анал...   Oct 9 2008, 17:50
|- - singlskv   Цитата(Rst7 @ Oct 9 2008, 21:50) PS - леч...   Oct 9 2008, 17:57
|- - demiurg_spb   Цитата(singlskv @ Oct 9 2008, 21:57) +1 п...   Oct 10 2008, 08:09
|- - demiurg_spb   Кодstatic const unsigned char PROGMEM auchCRCHi...   Oct 10 2008, 12:09
|- - defunct   Цитата(demiurg_spb @ Oct 10 2008, 15:09) ...   Oct 10 2008, 14:11
|- - singlskv   Цитата(demiurg_spb @ Oct 10 2008, 16:09) ...   Oct 10 2008, 14:18
|- - demiurg_spb   Цитата(singlskv @ Oct 10 2008, 18:18) Сам...   Oct 10 2008, 19:58
|- - Сергей Борщ   Цитата(demiurg_spb @ Oct 10 2008, 22:58) ...   Oct 10 2008, 20:04
|- - singlskv   Цитата(demiurg_spb @ Oct 10 2008, 23:58) ...   Oct 10 2008, 20:08
||- - demiurg_spb   Цитата(singlskv @ Oct 11 2008, 00:08) CRC...   Oct 10 2008, 20:16
||- - singlskv   Цитата(demiurg_spb @ Oct 11 2008, 00:16) ...   Oct 10 2008, 20:44
||- - Николай Иванович Приходько   Цитата(singlskv @ Oct 11 2008, 00:44) Оче...   Oct 10 2008, 21:22
|- - ReAl   Цитата(demiurg_spb @ Oct 10 2008, 22:58) ...   Oct 17 2008, 21:33
||- - demiurg_spb   crc16_1 - "неправильная" функция из доки...   Oct 18 2008, 05:48
||- - ReAl   Цитата(demiurg_spb @ Oct 18 2008, 08:48) ...   Oct 18 2008, 07:22
||- - demiurg_spb   Цитата(ReAl @ Oct 18 2008, 11:22) Но это ...   Oct 18 2008, 07:33
||- - Сергей Борщ   Цитата(demiurg_spb @ Oct 18 2008, 10:33) ...   Oct 18 2008, 10:40
|- - singlskv   Цитата(demiurg_spb @ Oct 10 2008, 23:58) ...   Oct 18 2008, 20:02
|- - demiurg_spb   Цитата(singlskv @ Oct 19 2008, 00:02) Чег...   Oct 19 2008, 09:39
- - aaarrr   Писателям modbus следовало бы оторвать руки за кри...   Oct 10 2008, 20:09
|- - singlskv   Позже попробую   Oct 10 2008, 21:04
|- - Andrew2000   ЦитатаУгу вот давайте теперь уважать идиотов ... 0...   Oct 11 2008, 19:09
|- - rezident   Цитата(SpiritDance @ Oct 11 2008, 23:16) ...   Oct 11 2008, 23:44
- - sensor_ua   ЦитатаА вообще я полностью согласен, что реализовы...   Oct 12 2008, 06:27
|- - demiurg_spb   Цитата(sensor_ua @ Oct 12 2008, 10:27) Мн...   Oct 12 2008, 10:20
- - sensor_ua   Цитатапроблема выбора протокола перестала существо...   Oct 12 2008, 16:50
|- - demiurg_spb   Цитата(sensor_ua @ Oct 12 2008, 20:50) Пр...   Oct 13 2008, 09:30
- - rezident   demiurg_spb в общем-то правильно заметил. SCADA си...   Oct 12 2008, 20:48
- - sensor_ua   ЦитатаSCADA система не работает напрямую с протоко...   Oct 12 2008, 21:37
- - rezident   sensor_ua, вы меня видимо не понимаете. Я не прот...   Oct 12 2008, 21:47
- - sensor_ua   ЦитатаЯ лишь за то, чтобы не ограничиваться только...   Oct 13 2008, 04:02
- - one_man_show   Цитата(sensor_ua @ Oct 13 2008, 01:37) Ес...   Oct 13 2008, 10:17
- - sensor_ua   Цитатао протоколе ПИРАМИДА Знаем и по-чуть-чуть пр...   Oct 13 2008, 10:21


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 02:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016