Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 21 по 30 из 47

Тема: Modbus RTU CRC16 полином A001h

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Exclamation

    Здравствуйте, товарищи специалисты!
    Требуется помощь по подключению устройства Modbus с проверкой контрольной суммы.
    Находимся в командировке на второй ветке БАМа, Новый Ургал.
    Имеется система водоподготовки с экипировочными колонками на тепловозы.
    В данных колонках имеются платы ввода/вывода на микроконтроллере STM (вх.-пуск/стоп, вых.-индикация).
    Общаться с платами нужно запросом с контрольной суммой. Ранее с формированием такой связи не сталкивался. (Привычно конечно стандартным решением задания адреса и регистра)
    Нужен пример для ПЛК110.60М v2 (или др.) Испробовал на примерах с форума, не выходит. Не всё значит понятно.
    Понятен принцип, следующий:
    1. Используем библиотеку работы с портом.
    2. Составляем запрос в байтах
    3. Открываем порт
    4. Посылаем байтовый запрос
    5. Закрываемся и слушаем ответ
    6. Принимаем данные и оцениваем значение.
    Производитель описывает запрос из 6 байт.
    За основу брал пример с форума, где описан опрос МВВ аналоговых сигналов из 8 байтов.
    Из примера снимал 2 байта, указал адрес, запрос состояний, контрольную сумм, порт(1 или 2 пробовал), скорость 19200.
    Смущает длина запроса 8 байт, в описании ведь 6, поменял на 6. Ошибка отсутствия связи №81 так и не уходит не уходит.
    ST код смотрел, в основном всё понятно
    Кто может откликнуться, навести на цель?
    Мне бы зацепиться по адресу с платой, а дальше сам.
    Вложения Вложения

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,373

    По умолчанию

    Павел_Хабаровск после формирования запроса нужно посчитать CRC, прилепить ее к запросу и отправить. Не смотрел по коду, что там за CRC, если строго такая же как у Modbus, то при приеме ответа кидаем его целиком в расчет CRC и должны получить 0, если другой расчет, то посылать только ответ, вычислять CRC и сравнивать с полученной.

  3. #3

    Exclamation

    Сейчас проблема что в ответе ничего нет, всё по 0. Порт правильный на контрольном 485 преобразователе индикатор мигает.
    Проверил полярность, перебирал адреса и регистры, ответа в буфере нет. Единственное что смущает в описании протокола 6 байт а в примере 8. И ещё в описании посылки адрес состоит из 2 байт. Не пойму, ведь его можно задать одним байтом.
    Программа без расчёта CRC.
    Устройство просто не отвечает. Преобразователем на шине через Serial Port Monitor отправил число, Codesys увидел.

    По CRC начинаю что-то подозревать. Получается производитель зашил программную обработку контрольной суммы в МК. Алгоритм вычисления по своему коду. Достаточно лишь раз её вычислить и вставлять в код запроса.

    #define __swap_nibbles(x) ((x>>4)|(x<<4))
    unsigned short crc16Calc(unsigned char *buffer, int n)
    {
    unsigned int i;
    unsigned char crc1,crc2,tmp;
    crc1 = crc2 = 0xff;
    for(i = 0;i < n;i++)
    {
    crc2^=buffer[i];

    tmp = __swap_nibbles(crc2)&0x0f^crc2;
    crc2 = crc1;
    crc1 = tmp;
    tmp = __swap_nibbles(tmp)&0xf0;
    crc2 ^= tmp;
    tmp = (tmp<<1)^crc1;
    crc1 >>= 3;
    crc2 = crc2^crc1;
    crc1 = tmp;
    }
    return crc2+(crc1<<8);
    }

    Так вот эта CRC вычисляется от всего пакета? всегда будет разной? Или постоянные числа на последних двух байтах можно вставить и при ответе CRC будет постоянной?
    Смотрю в код, кто-то же писал со знанием дела. Сам не пойму как его интерпретировать. Вставляю в онлайн компилятор C, ошибки есть.
    https://www.onlinegdb.com/online_csharp_compiler

    main.cs(10,0): error CS1525: Unexpected symbol `unsigned' (какой-то неожиданный символ)
    Compilation failed: 2 error(s), 0 warnings
    Вложения Вложения
    Последний раз редактировалось Павел_Хабаровск; 20.05.2021 в 07:30.

  4. #4

    По умолчанию

    Товарищи! Стеснюсь просить.
    Может есть у кого конфигурация посылки с проверкой контроля чётности.
    Пару примеров нашёл. В одном известная CRC без контроля (МВА8 работает), во втором многочленные связи - перетягиваю пример, не растёт кокос. И всё на ST.
    А командировочка тикает, тут делом заниматься надо. Короче завис до востребования. Дома папку встретят с бородой.

  5. #5

    По умолчанию

    Цитата Сообщение от Павел_Хабаровск Посмотреть сообщение
    Товарищи! Стеснюсь просить.
    Может есть у кого конфигурация посылки с проверкой контроля чётности.
    Пару примеров нашёл. В одном известная CRC без контроля (МВА8 работает), во втором многочленные связи - перетягиваю пример, не растёт кокос. И всё на ST.
    А командировочка тикает, тут делом заниматься надо. Короче завис до востребования. Дома папку встретят с бородой.
    Протокол Modbus RTU ? Надо попробовать опросить это устройство посредством OPC - сервера, тогда появится ясность с протоколом обмена.
    Последний раз редактировалось Newcomer; 20.05.2021 в 12:32.

  6. #6

    По умолчанию

    Послал в личку пример.

  7. #7
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,373

    По умолчанию

    Судя по коду расчета там CRC не Modbus

  8. #8

    По умолчанию

    У этого устройства нестандартный протокол. modbus.lib тут не поможет. Надо пользоваться SysLibCom.
    Последний раз редактировалось Newcomer; 20.05.2021 в 13:41.

  9. #9
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,373

    По умолчанию

    Вот на C# код для расчета CRC Modbus, видно что хоть и на C или на чем там у вас, отличается

    Код:
    public static ushort CRC16_Modbus(byte[] msg)
            {
                const ushort polinom = 0xa001;
                ushort code = 0xffff;
    
                for (int i = 0, size = msg.Length; i < size; ++i)
                {
                    code ^= (ushort)(msg[i] << 8);
    
                    for (uint j = 0; j < 8; ++j)
                    {
                        code >>= 1;
                        if ((code & 0x01) != 0) code ^= polinom;
                    }
                }
                return code;
            }

  10. #10
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,373

    По умолчанию

    Павел_Хабаровск, если полный ответ вместе с CRC при проверке не получает 0 то это не Modbus, это только фишка CRC именно Modbus протокола, пока мне не попадались другие протоколы, где был бы ноль при расчете с учетом CRC

    Напишите строку в HEX при ответе прибора, любую, интересно посмотреть что там за контрольная сумма.

    capzap на счет документа не скажу. Но сам расчет CRC Modbus имеет данную фишку. Если в расчет CRC закинуть весь ответ вместе с полученной CRC то новая CRC будет равна 0. Всегда.

    то есть посылаем 8 байт, посчитали и прилепили согласно протокола еще 2 байта и потом в расчет кинем все 10 байт то получим новую CRC=0

    А, про 0 указано в документе на протокол, который выкладывал Павел. Но по коду там не похоже на расчет Modbus.

    И кстати >> это не ROR а SHIFT, выталкиваемые биты замещаются нулями. А, или я не понял, вот эта конструкция ROL ? ((x>>4)|(x<<4))
    Последний раз редактировалось melky; 21.05.2021 в 13:37.

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •