|
CRC16 для modbus, не повторяйте ошибок |
|
|
|
Oct 9 2008, 17:05
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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 модуль и забыл об этом.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
 |
Ответов
|
Oct 13 2008, 10:17
|

Помогу, чем смогу
     
Группа: Админы
Сообщений: 2 786
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25

|
Цитата(sensor_ua @ Oct 13 2008, 01:37)  Если на вопрос "какая у вас SCADA?" в ответ получается вопрос "а какой у вас протокол?", то проще сказать "отвечающему" известное для него слово  Пока слово "Modbus" срабатывает  Именно по этой причине продолжаю в ряде железок использовать Modbus, так как это для Заказчика понятная (известная) вещь. Иных протоколов он может и не знать))) Переубеждение не всегда на руку всему проекту в целом, так как используемый протокол не есть самая важная его деталь. Использую оба варианта протокола, то есть и ASC тоже, а именно, для отладки, так как на стадии отладки всё, что творится в канале можно увидеть "глазами" без специального софта, подключив параллельно дополнительный преобразователь 232-485 и ноутбук с обычным терминалом. Кроме того, когда у тебя есть реализованные и проверенные годами библиотеки для различных аппаратных платформ, конечно не заморачиваешься, а начинаешь именно со стандарта дефакто. И еще, когда используешь самодельный протокол и одновременно с этим приходится использовать самодельный софт верхнего уровня, то когда начинают вылезать косяки, да еще на территории заказчика, да еще через через какое-то время после запуска.....куча вопросов тогда возникает. И хотя авторы протокола в таком случае под рукой, от этого не легче. В случае применения известного протокола, чем он более "засижен", тем лучше, так как многие косяки его реализации выгребли еще лет 10-20 назад. И использовать самодельный софт верхнего уровня не приходится, берешь любую СКАДу, даже без лицензии, в демо-режиме, и спокойно и быстро делаешь тестовый софт (канальную часть) - имитатор софта Заказчика, так как в любой СКАДе всегда есть Модбас ))) Пока есть)))
--------------------
|
|
|
|
Сообщений в этой теме
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 Николай Иванович Приходько Не забудьте, Господа, что CRC имеет "слепые п... Oct 10 2008, 20:57 singlskv Позже попробую Oct 10 2008, 21:04 Andrew2000 Цитата...Уж больно "кривой" и запутанный... Oct 10 2008, 21:22  SpiritDance Цитата(Andrew2000 @ Oct 11 2008, 01:22) Д... Oct 11 2008, 17:16   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 sensor_ua Цитатао протоколе ПИРАМИДА
Знаем и по-чуть-чуть пр... Oct 13 2008, 10:21
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|