Профиль должен быть заполнен на русском языке кириллицей. Заполнение профиля заведомо ложными или некорректными данными - причина возможного отказа в регистрации на форуме.

Как правильно составить запрос ModBus ASCII?

RS-485, ProfiBUS, 4-20 mA, Wi-Fi, GSM и так далее

Автор темы
GrukhvinEV
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 10 дек 2012, 10:16
Ф.И.О.: Грухвин Евгений Вячеславович

Как правильно составить запрос ModBus ASCII?

Сообщение GrukhvinEV » 10 дек 2012, 10:50

Вот есть прибор RMT69L в тех.поддержке выпросил протокол обмена. Вопрос как составить запрос что бы получить значения с 6 каналов одновременно (параметр выделен в экселе красным, в приложенном архиве)? Я так понял вот так 3А 31 3В 37 3В 01 00 0D 3B <контрольная сумма> 0D; Вот как только рассчитать контрольную сумму ума не приложу. Анализировал обмен сниффером через заводскую программку, но она читает по одному каналу вот что получилось:

Запрос:09.12.2012 14:39:02.88964 (+0.0000 seconds)
3A 31 3B 31 3B 31 3B 33 36 32 39 38 0D :1;1;1;36298.

Где 3A<:> 31<адрес 1> 3В<;>31<команда cmd1>3В<;> 31<номер канала т.е.2, счет от 0 до 5>3В<;> 33 36 32 39 38<контрольная сумма> 0D<CR>

Ответ:09.12.2012 14:39:02.88964 (+0.0000 seconds)
FF 21 31 3B 30 2E 34 33 35 30 3B 35 35 30 30 34 ÿ!1;0.4350;55004
0D .

Запрос:09.12.2012 14:39:02.88964 (+0.0000 seconds)
3A 31 3B 31 3B 32 3B 33 32 32 30 32 0D :1;1;2;32202.
Где 3A<:> 31<адрес 1> 3В<;>31<команда cmd1>3В<;> 31<номер канала т.е.3, счет от 0 до 5>3В<;> 33 32 32 30 32<контрольная сумма> 0D<CR>

Ответ:09.12.2012 14:39:02.90564 (+0.0156 seconds)
FF 21 31 3B 30 2E 34 35 30 30 3B 32 34 35 32 34 ÿ!1;0.4500;24524
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Livsc
здесь недавно
здесь недавно
Сообщения: 22
Зарегистрирован: 14 янв 2009, 09:13
Ф.И.О.: Лившиц Аркадий Соломонович

Re: Как правильно составить запрос ModBus ASCII?

Сообщение Livsc » 10 дек 2012, 13:00

Попробуйте воспользоваться программой Моdbus Poll. Я скачал ее с сайта http://www.modbustools.com/. Она сама считает контрольную сумму. Разобраться в приложенном описании с ходу не смог - нет времени.


Автор темы
GrukhvinEV
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 10 дек 2012, 10:16
Ф.И.О.: Грухвин Евгений Вячеславович

Re: Как правильно составить запрос ModBus ASCII?

Сообщение GrukhvinEV » 11 дек 2012, 05:51

Все равно не могу разобраться..... вообще разве может быть контрольная сумма такой длины 33 32 32 30 32 ?


Автор темы
GrukhvinEV
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 10 дек 2012, 10:16
Ф.И.О.: Грухвин Евгений Вячеславович

Re: Как правильно составить запрос ModBus ASCII?

Сообщение GrukhvinEV » 11 дек 2012, 06:02

Вот запросы на которые отвечает прибор, где 30-35 это каналы с 1 по 6. А я хочу всю информацию за раз с 6 каналов...после последней ;(3B) идет контрольная сумма по документации, но как ее прочитать хз. У меня опыта для анализа не хватает...
3A 31 3B 31 3B 30 3B 37 36 32 37 0D
3A 31 3B 31 3B 31 3B 33 36 32 39 38 0D
3A 31 3B 31 3B 32 3B 33 32 32 30 32 0D
3A 31 3B 31 3B 33 3B 36 30 38 37 35 0D
3A 31 3B 31 3B 34 3B 35 36 37 37 37 0D
3A 31 3B 31 3B 35 3B 31 39 39 31 32 0D


Автор темы
GrukhvinEV
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 10 дек 2012, 10:16
Ф.И.О.: Грухвин Евгений Вячеславович

Re: Как правильно составить запрос ModBus ASCII?

Сообщение GrukhvinEV » 11 дек 2012, 06:56

А вот если с помощью modbus poll отправить запрос 004-Tx:3A 31 3B 31 3B 31 3B 33 36 32 39 38 0D
ответ приходит формата 005-Rx:FF FF 01 13 27 53 53 6A
чет я вообще запутался как че тут работает...


DeepWaterOne
новенький
новенький
Сообщения: 1
Зарегистрирован: 02 янв 2013, 13:00
Ф.И.О.: Ляшкевич Константин Владимирович

Re: Как правильно составить запрос ModBus ASCII?

Сообщение DeepWaterOne » 02 янв 2013, 13:11

вот работающий код моей программы на Qt и инструкция к прибору "Элемер" "ИКСУ-2000". В инструкции ошибка ;)

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

const QByteArray Crc16(QByteArray data)
{
    unsigned short crc = 0xFFFF;
    for(int i = 1;  i < data.length();  i++)
    {
        crc = crc ^ (char)data.at(i);
        for (int j = 1; j <= 8; j++)
            if(((crc / 2) * 2) != crc)
                crc = (crc / 2) ^ 40961;
            else
                crc = crc / 2;
    }
    data += QByteArray::number(crc);
    data.push_back(13);
    return data;
}

bool checkCrc16(const QByteArray &data)
{
    unsigned short crc = 0xFFFF;
    int len = data.lastIndexOf(';') + 1;
    for(int i = 1;  i < len;  i++)
    {
        crc = crc ^ (char)data.at(i);
        for (int j = 1; j <= 8; j++)
            if(((crc / 2) * 2) != crc)
                crc = (crc / 2) ^ 40961;
            else
                crc = crc / 2;
    }
    return data.mid(len, data.lastIndexOf(0x0D) - len).toUShort() == crc;
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Naitek
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 25 мар 2013, 13:41
Ф.И.О.: Исламбек Нуржан Нуржанович

Re: Как правильно составить запрос ModBus ASCII?

Сообщение Naitek » 26 мар 2013, 10:40

DeepWaterOne у вас пример подсчета контрольной суммы CRC, которая используется в ModBus RTU, а в ModBus ASCII вообще-то используется LRC.


Вернуться в «Интерфейсы, протоколы, связь»



Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 0 гостей