Checksum, CRC8 и CRC16

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

Коротенко Алексей писал(а):
Nemo писал(а):зачем нежен 1DBody? зачем на выходе получать crc в виде булеановского массива ?
как видишь у меня это просто под :vi: , у меня посылка обрабатывается в виде булеановского массива
Nemo писал(а):где входные 8 (16) байтов?
можешь поставить нумерик контрол, в его свойствах укажи HEX формат, потом соедини контрол через @number to boolean array@ к входу вместо 1dbody, на выходе в нумерик индикаторе укажи показывать в виде HEX

булеан индикатор на выходе и 1dbody можешь убрать
есть вопросы - спрашивай :bye:
В общем, я разобрался как на С вычислять. Могу ли я С код вставить в MathScript

Код: Выделить всё

unsigned char calc_crc (unsigned char *mas)  //функция вычисления crc 
{ 
 unsigned char i, data, crc, fb, st_byt; 
 
 st_byt = 0; 
 crc = 0; 
 
 do{ 
    data = mas[st_byt]; 
     
	for (i=0; i<8; i++)// счетчик битов в байте 
        { 
         fb = crc  ^ data; 
         
		 fb &= 1; //fb = fb & 1; 
         
		 crc >>= 1;      
         
		 data >>= 1; //data = data >> 1;
		 
         if (fb == 1)
		    {
		     crc ^= 0x8c; //crc = crc ^ 0x8c; // полином
             };			 
        }; 
     
	 st_byt++;
	 } while (st_byt != 8);// счетчик байтов в массиве (!(st_byt == 8))
	 
 return crc; 
}
Аватара пользователя
Korotenko

Activity
developer
developer
Сообщения: 286
Зарегистрирован: 25 июл 2008, 10:43
Награды: 1
Версия LabVIEW: 2009
Откуда: Россия, Владивосток
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Korotenko »

ГЫГЫГЫГЫ :D по моему :vi: есть готовый сишный код на форуме www.owen.ru (поищи там по моей фамилии :rtfm: ), или поищи "описание протокола ОВЕН"
я на С не пишу, поэтому не подскажу, но знаю что :labview: С понимает, зайди на нашем форуме в раздел учебники, посмотри там или спроси отдельной темой как вставить С-код в :labview: :super:
I work in LabVIEW 2009 !
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

В общем, решение найдено :super: сделал по сишному коду - работает :wink:
Вложения
crc_d.vi
(17.12 КБ) 473 скачивания
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

А это - дополненный: можно задать длину входного массива, т. е. при 7 можно вычислить crc в примере
0x 10 91 2d 60 01 08 00 24
получится 0x24
Вложения
crc_d.vi
(17.56 КБ) 387 скачиваний
Аватара пользователя
Korotenko

Activity
developer
developer
Сообщения: 286
Зарегистрирован: 25 июл 2008, 10:43
Награды: 1
Версия LabVIEW: 2009
Откуда: Россия, Владивосток
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Korotenko »

даю совет - вынеси входной массив из сиквенса, и сделай автоподсчёт размера массива

PS во всех :vi: по расчёту CRC в общем случае есть:
1. вход - входная поледовательность
2. выход - CRC
3. выход - входная поледовательность+CRC
I work in LabVIEW 2009 !
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Eugen Graf »

И постарайся не пользоваться локальными переменными. Используй вместо этого сдвиговый регистр, тогда тебе и сиквенс структура непонадобится. Код будет намного меньше и понятнее.
Аватара пользователя
Korotenko

Activity
developer
developer
Сообщения: 286
Зарегистрирован: 25 июл 2008, 10:43
Награды: 1
Версия LabVIEW: 2009
Откуда: Россия, Владивосток
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Korotenko »

согласен с EG, если будет как здесь /download/file.php?id=979 , то всё будет понятно, компактно и наглядно :super:
I work in LabVIEW 2009 !
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

Коротенко Алексей писал(а):даю совет - вынеси входной массив из сиквенса, и сделай автоподсчёт размера массива

PS во всех :vi: по расчёту CRC в общем случае есть:
1. вход - входная поледовательность
2. выход - CRC
3. выход - входная поледовательность+CRC

1-й я сделал, 2-й - есть, а 3-й - несовсем обязательно
Вложения
crc_d.vi
(18.38 КБ) 355 скачиваний
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

eg писал(а):И постарайся не пользоваться локальными переменными. Используй вместо этого сдвиговый регистр, тогда тебе и сиквенс структура непонадобится. Код будет намного меньше и понятнее.
А можно пример на этом же коде?
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

Коротенко Алексей писал(а):согласен с EG, если будет как здесь /download/file.php?id=979 , то всё будет понятно, компактно и наглядно :super:
Опять 8.6 :evil: :dntknw:
Аватара пользователя
Korotenko

Activity
developer
developer
Сообщения: 286
Зарегистрирован: 25 июл 2008, 10:43
Награды: 1
Версия LabVIEW: 2009
Откуда: Россия, Владивосток
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Korotenko »

Nemo писал(а):Опять 8.6 :evil: :dntknw:
ПОСМОТРИ ВОТ ЗДЕСЬ /viewtopic.php?f=22&t=263&st=0&sk=t&sd=a СООБЩЕНИЕ ЗА Пт сен 12, 2008 3:40 pm , ЧЕТВЁРТОЕ СНИЗУ
I work in LabVIEW 2009 !
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

Ну вот, все, упростил :)
Вложения
crc_d.vi
(15.02 КБ) 411 скачиваний
Alhen
interested
interested
Сообщения: 9
Зарегистрирован: 05 янв 2009, 07:11
Версия LabVIEW: 8.5
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Alhen »

При передачи команд на пульт DK-8070, потребовался CRC8
(хотя в мануале есть упоминание только о контрольной сумме по модулю 256),
ни один из приведенных примеров не сработал
(такое часто случается с начинающими к коим я отношусь)
Хорошо что случайно нашел пример реализации табличного CRC8 на Дельфях.
Все получилось, даже самому понравилось. (все больше и больше нравится :labview: :super:)
Но встали вопросы:
- есть ли в таблице ошибки и вообще откуда она взялась?
- по какому полиному была расчитана таблица.
(опять-таки в мануале на DK-8070 нет ничего про полином)

Пришлось взять за основу строку сообщения которая 100% проходила
"$01OHELLO" с полученным crc из таблицы 0x0C
потом взял пример из данного топика CRC8.vi и тупо в цикле перебирал полином
пока не обнаружил нужный
0x8C
:drink:

ну а потом придумал как проверить таблицу на опечатки,
а за одно и как генерить такие таблицы для произвольных полиномов
Вложения
CRC8_table.vi
(8.89 КБ) 340 скачиваний
CRC8_tab.jpg
Аватара пользователя
Nemo
user
user
Сообщения: 97
Зарегистрирован: 26 июн 2008, 11:48
Версия LabVIEW: 8
Откуда: Россия
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Nemo »

Интересно, а что такое DK-8070?
Аватара пользователя
Viktor

Activity Professionalism Tutorials Black
expert
expert
Сообщения: 1408
Зарегистрирован: 23 мар 2008, 10:56
Награды: 4
Версия LabVIEW: 2020
Откуда: Санкт-Петербург
Благодарил (а): 17 раз
Поблагодарили: 3 раза
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Viktor »

Здравствуйте, коллеги!
Прошу помощи по переводу СИ кода в :labview:
Этот код вычисляет CRC16 для посылки на весоизмерительный прибор (терминал ТСК-5)
Связь по RS485. Посылаются 4 байта: адрес терминала, байт запроса веса (всегда 055h) и два байта CRC16.
Тех поддержка прислала пример на СИ :think: для меня это :suicide:
Цитирую письмо:
В архиве 3 файла
ClassCrc.Cpp - модуль вычисляющий CRC16
MainProg.Cpp - пример использования модуля ClassCrc
CRC16TCK.Exe - работающая программа
Для вычисления запроса для сетевого адреса 1 выполните команду(в коммандной строке): CRC16TCK.Exe 1
на экране должны появиться 4 байта пакета запроса и его контрольная сумма
1h 55h 24h 6eh Testing: CRC16 = 0

Т.е. для 0155 CRC= 246E (hex)
CRC15TSK.zip
(28.29 КБ) 329 скачиваний
Ответить

Вернуться в «Коммуникация с приборами»