Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вычисление контрольной суммы !!!  (Прочитано 14664 раз)
0 Пользователей и 1 Гость смотрят эту тему.
.:DUS:.
Гость
« : 31-08-2006 07:31 » 

Здрасти всем. Есть устройство, работающее по протоколу MODBUS. Для него есть команда #АААПППППD, где
# - Признак индивид. запроса для прибора
AAA - сетевой номер прибора
ППППП - Пароль
D - Команда Чтения даты с прибора
Из описания устройства:
Для подсчета контрольной суммы суммируют по модулю два двоичные представления символов команды, начиная с маркера и до последнего символа параметра команды dm. Полученный в результате двоичный байт разбивают на две тетрады, каждую из которых представляют в виде ASCII-символа [‘0’…’9’,’A’…’F’].

Помогите разобраться пожалуйста с контрольной суммой
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 31-08-2006 07:36 » 

а ф чём проблем? Улыбаюсь

кстати - не совсем ясно ты описал действия свои, на пальцах покажи (на примере)
Записан

.:DUS:.
Гость
« Ответ #2 : 31-08-2006 07:52 » 

Есть команда - Прочитать текущие день недели, дату и время:
Команда:
#AAAПППППD<CC><CR>
Ответ:
~AAADдччммссДДММГГ<CC><CR>
"D" - код команды (латиница)
ААА - адрес прибора
ППППП - пароль прибора
д - день недели от 0 (воскресенье) до 6 (суббота)
чч - часы от 00 до 23
мм - минуты от 00 до 59
ДД - число от 01 до 31
ММ - месяц от 01 до 12
ГГ - от 00 до 99
<CC> - Контрольная сумма
<CR> - перевод корретки

В принципе вот и все чем я распологаю, плюс описание которое я уже кидал. У меня затруднение с подсчетом CRC. Мне этим ранее заниматься не приходилось.
Заранее благодарен !

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 31-08-2006 12:37 » 

Есть очень много способов просчета контрольной суммы. От простого сложения всех чисел, и до хитрого сложения полиномов. CRC32 я видел несколько алгоритмов просчета. Без конкретных нескольких примеров трудно что либо предположить в плане применяемого алгоритма.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
.:DUS:.
Гость
« Ответ #4 : 31-08-2006 14:17 » 

Пример: Запрос даты времени
Запрос:
#43400000DF2 , где F2=CRC
Ответ:
~434D3135838300806FD , где FD = CRC
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 31-08-2006 14:20 » 

1. Это не MODBUS
протокол MODBUS подразумевает совсем другой формат посылок
2.
Цитата
Для подсчета контрольной суммы суммируют по модулю два двоичные представления символов команды, начиная с маркера и до последнего символа параметра команды dm. Полученный в результате двоичный байт разбивают на две тетрады, каждую из которых представляют в виде ASCII-символа [‘0’…’9’,’A’…’F’].
Цитата
#AAAПППППD<CC><CR>
Что из этого следует?
#A +2 AA +2 ПП +2 ПП +2 ПD = СС
+2 -суммирование по модулю два


3. Убить разаработчиков, которые сказали что это MODBUS. Им в облом разобраться с протоколом и потому "город городят"
Попробуй установить этот чудо-девайс в модбасовскую сетку - поимеешь массу проблем Жаль
« Последнее редактирование: 31-08-2006 14:22 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 31-08-2006 19:28 » 

Чуть чуть порыскав в нете Нашел такую ссылку http://www.geocities.com/pbmcrae42/index2.html
В частности там есть программа написанная на С++, для обслуживания MODBUS устройств. Вот код подсчета crc
Код:
/*****************************************************************************/
/***************** [ BEGIN: crc ] ********************************************/
/*****************************************************************************/
/*
INPUTS:
buf   -> Array containing message to be sent to controller.
   start -> Start of loop in crc counter, usually 0.
   cnt   -> Amount of bytes in message being sent to controller.
OUTPUTS:
temp  -> Return crc byte for message.
COMMENTS:
This routine receives the data message to be sent down to the controller
*/

unsigned int crc(unsigned char buf[], int start, int cnt)
{
int i,j;
   unsigned temp, temp2, flag;

   temp=0xFFFF;

   for (i=start; i<cnt; i++){
    temp=temp ^ buf[i];

      for (j=1; j<=8; j++){
      flag=temp & 0x0001;
         temp=temp >> 1;
         if (flag) temp=temp ^ 0xA001;
         }
      }
   /*** Reverse byte order. ***/
   temp2=temp >> 8;
   temp= (temp << 8) | temp2;
   return(temp);
}

Это ссылка на википедию с описанием MODBUS http://ru.wikipedia.org/wiki/Modbus
« Последнее редактирование: 31-08-2006 19:30 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 01-09-2006 07:17 » 

Вот тута https://forum.shelek.ru/index.php/topic,3531.msg66001.html#msg66001
Мы чего-то обсуждали по CRC

ps Вижу разработчиков девайса, которые не сильно заморачиваются на соблюдении стандартов, на надежности, на скорости.
Зачем использовать такую сложную посылку из 12 байт, когда можно передать 3
Кроме того, на девайсе нужно предусмотреть функцию ввода пароля. а потом предусмотреть возможность сброса пароля. так и хочется сказать "ну тупыыыые...."
« Последнее редактирование: 01-09-2006 07:28 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
.:DUS:.
Гость
« Ответ #8 : 01-09-2006 07:42 » 

***Sla***
Используя алгоритм предложенный тобой выше #43400000D<>F2
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 01-09-2006 08:24 » 

алгоритм предложен не мною, я его описал из приведенного тобой описания. что вижу, о том пою

2334 xor 3334 xor 3030 xor 3030 <> 3044
чем я моогу в данном случае помочь? общайся с разработчиками Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
.:DUS:.
Гость
« Ответ #10 : 03-09-2006 05:07 » new

***SLA***
Это будет выглядеть следующим образом:
wCRC:Word;
bCRC:Byte;
wCRC:=ord('#')+Ord('4')+ord('3')+...400000...+Ord('D')
bCRC:=LO(wCRC);
Result:=IntToHEX((bCRC SHR 4) AND $0F,1)+IntToHEX(bCRC AND $0F,1);
« Последнее редактирование: 18-12-2007 21:56 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines