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

 
 
> Свойства CRC16(Modbus), почему так?
AlexOr
сообщение Jul 20 2010, 05:07
Сообщение #1


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

Группа: Свой
Сообщений: 89
Регистрация: 30-12-04
Из: Санкт-Петербург
Пользователь №: 1 754



Введение
1. Рассчитаем CRC16(Modbus) (см. тут On-line CRC calculation http://www.lammertbies.nl/comm/info/crc-calculation.html) от двух байт 0x01, 0х02. Получаем значение 0xE181.
2. А теперь рассчитаем CRC16(Modbus) от четырех байт 0x01, 0х02, 0x81, 0xE1 (добавили младший и старший от ранее рассчитанного CRC). Получаем значение 0x0000.
ДА именно 0x0000 и байты 0x01, 0х02 можно заменить на любые (при выполнении 1 и 2). Все равно будет 0x0000.
Что это за свойство и неужели все про него знают? Я не знал.
Как называется это свойство и вообще подобные свойства? Есть ли подобные свойства при другом полиноме? А у CRC32?


Итог
История применения CRC16(Modbus)
Был на скорую руку сделан протокол с разделением пакетов по специальному символу. Соответственно был применен байт-стаффинг. В общем, длина пакета определяется по количеству байт до специального символа и далее сразу рассчитывается CRC для проверки пакета. Было выявлено, что при наличии интенсивных помех в канале связи, происходит добавление нулей в принимаемую последовательность и иногда вместо приема 0x01, 0х02, 0x81, 0xE1 получатся прием 0x01, 0х02, 0x81, 0xE1, 0х00 , 0х00.
!!!!!!!!!!!!!!!!!!!!!!!!!!!
А так как мы считаем два последних байта значением CRC, то такой неверный пакет проходит как правильный.
!!!!!!!!!!!!!!!!!!!!!!!!!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Jul 20 2010, 05:18
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(AlexOr @ Jul 20 2010, 09:07) *
А теперь рассчитаем CRC16(Modbus) от четырех байт 0x01, 0х02, 0x81, 0xE1 (добавили младший и старший от ранее рассчитанного CRC). Получаем значение 0x0000.
ДА именно 0x0000 и байты 0x01, 0х02 можно заменить на любые. Все равно будет 0x0000.

Вот это место осветите подробнее.
Что-то у вас в консерватории не то.
Если вы измените байты, изменится и ЦРЦ.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
AlexOr
сообщение Jul 20 2010, 05:38
Сообщение #3


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

Группа: Свой
Сообщений: 89
Регистрация: 30-12-04
Из: Санкт-Петербург
Пользователь №: 1 754



Цитата(MrYuran @ Jul 20 2010, 09:18) *
Вот это место осветите подробнее.

Дабавил пункты 1 и 2.

Цитата(alexander55 @ Jul 20 2010, 09:28) *
ТС, Вы неправильно считаете CRC. Советую, взять контрольные примеры и отладить свой алгоритм.

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

Цитата(MrYuran @ Jul 20 2010, 09:18) *
Если вы измените байты, изменится и ЦРЦ.

0х03, 0х04 CRC(Modbus) равна 0x8300
0х03, 0х04, 0х00, 0х83 CRC(Modbus) равна 0х0000 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Jul 20 2010, 05:39
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(AlexOr @ Jul 20 2010, 09:32) *

Нашел примеры от Шнайдера (считайте, законодателя модбаса - модикона).
Проверяйте реализацию алгоритма.
01 03 0C00 0002 (C75B)
01 03 04 0000 0000 (FA33)
01 03 02 1234 (B533)
Хватит для тестирования.
Go to the top of the page
 
+Quote Post
AlexOr
сообщение Jul 20 2010, 05:53
Сообщение #5


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

Группа: Свой
Сообщений: 89
Регистрация: 30-12-04
Из: Санкт-Петербург
Пользователь №: 1 754



Цитата(alexander55 @ Jul 20 2010, 09:39) *
Проверяйте реализацию алгоритма.
01 03 0C00 0002 (C75B)

Согласно онлайн калькулятору
0x01, 0x03, 0x0c, 0x00, 0x00, 0x02 имеет CRC(Modbus) 0x5BC7
т.е. все правильно
и не надо разводить не по существу.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Jul 20 2010, 06:03
Сообщение #6


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(AlexOr @ Jul 20 2010, 09:53) *
Согласно онлайн калькулятору
0x01, 0x03, 0x0c, 0x00, 0x00, 0x02 имеет CRC(Modbus) 0x5BC7
т.е. все правильно

Ясно, без этой проверки говорить было бы бессмысленно.
Теперь по существу вопроса.
КС находится в конце пакета принятого. А новый пакет пока не пошел. Адрес 00 не рекомендуется использовать (если Вы внимательно почитаете мануалы). Проблем нет.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 16:16
Рейтинг@Mail.ru


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