Команды для modbus

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Команды для modbus

Сообщение Sergey Puzanov »

Добрый день. Впервые дошли руки до протокола modbus. Имеется библиотека от NI и частотный преобразователь. Вопрос в том, как правильно подавать команду из мануала? К примеру, на странице 352 есть команда запроса версии ПО, как правильно прочитать эту строку для формирования команды и отправки в нужные регистры с помощью функций библиотеки? Спасибо.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3498
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 54 раза
Поблагодарили: 185 раз
Контактная информация:

Re: Команды для modbus

Сообщение Artem.spb »

С чего вы решили, что на стр 352 про Modbus?
mb.PNG
mb.PNG (6.42 КБ) 5621 просмотр
Про модбас идёт раньше. Адреса немного запутанно записаны, но суть вот тут.
mb2.PNG
Возьмите для начала какой-нибудь mb pool и проверьте, что адреса правильно трактуете.
Потом откройте примеры из этой самой библиотеки :labview: и просто подставьте найденные номера регистров, чтобы убедиться, что всё работает.
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Re: Команды для modbus

Сообщение Sergey Puzanov »

Правильно ли я понял:
1. Для задания, например, сигнала крутящего момента нужно задать адрес 1D01(Hex) = 7425(Dec), и просто подать нужное значение момента.
изображение_2023-06-27_145328653.png
изображение_2023-06-27_150149956.png
изображение_2023-06-27_150149956.png (2.22 КБ) 5614 просмотров
2. Для функции F01.07 (или любой другой) перевести в 0107(Hex) = 263(Dec), и задать значение в диапазоне.
изображение_2023-06-27_150750017.png
3. Для чтения использовать функцию чтения и те же адреса, только указать сколько регистров нужно считать. Правильно ли понимаю, что 1 адрес - это 1 регистр?
ujin1
adviser
adviser
Сообщения: 239
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 19 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Команды для modbus

Сообщение ujin1 »

Sergey Puzanov писал(а): 27 июн 2023, 15:14 Правильно ли я понял:
1. Для задания, например, сигнала крутящего момента нужно задать адрес 1D01(Hex) = 7425(Dec), и просто подать нужное значение момента.
изображение_2023-06-27_145328653.png
изображение_2023-06-27_150149956.png
2. Для функции F01.07 (или любой другой) перевести в 0107(Hex) = 263(Dec), и задать значение в диапазоне.
изображение_2023-06-27_150750017.png
3. Для чтения использовать функцию чтения и те же адреса, только указать сколько регистров нужно считать. Правильно ли понимаю, что 1 адрес - это 1 регистр?
Все правильно. Адресацию они указали, что начинается с 0. 1 адрес = 1 регистр. В инструкции записывать в регистры можно как командой 06 - один регистр так и 10H (16) несколько регистров. Должно работать если подключение +- , настройки портов, скорости, и т.д. не перепутать.
С подключением вопрос отдельный. Кто-то пишет + -. Кто-то Data+ Data-. Кто-то A, B. Кто-то A+ B-. Кто-то A(-) B(+).
Изображение
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Re: Команды для modbus

Сообщение Sergey Puzanov »

Понял, спасибо большое, буду пробовать.
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Re: Команды для modbus

Сообщение Sergey Puzanov »

Добраться до самого частотника пока не получилось, но потестировать саму программу хотелось бы. Существует ли утилита, имитирующая подключенное к com порту устройство? Для которого можно те же команды чтения/записи использовать. Спасибо.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3498
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 54 раза
Поблагодарили: 185 раз
Контактная информация:

Re: Команды для modbus

Сообщение Artem.spb »

Sergey Puzanov писал(а): 31 июл 2023, 18:38 Добраться до самого частотника пока не получилось, но потестировать саму программу хотелось бы. Существует ли утилита, имитирующая подключенное к com порту устройство? Для которого можно те же команды чтения/записи использовать. Спасибо.
Ну как вам сказать, имитировать вообще любое устройство - это что-то из разряда утопии. А просто увидеть манипуляции с регистрами - много вариантов. Но все они сводятся к "написать простейшую программулину"
С ходу.
Вариант 1 (попроще). Поменять на Modbus TCP и написать простейшую программулину, которая будет читать/писать желаемое. В подключении задать localhost и можно всё отладить на одной машине. Хочется разнообразить - можно и по сети гонять.

Вариант 2 (кому как). В Virtual box есть опция имитации com-порта, когда данные перенаправляются по TCP.
com-tcp.PNG
Ну а дальше, как говорится, "см п.1", понадобится всё та же простейшая программулина, которая же будет Modbus TCP обслуживать.

Из минусов - вам нужно будет дублировать поведение имитируемого устройства, или руками вбивать значения регистров. Но для базовой отладки я такое много раз использовал, всё реально.

Есть ещё всякие modbus pull, но они позволяют увидеть, что на ваш комп сыпется, а не имитировать что-то внешнее.
ujin1
adviser
adviser
Сообщения: 239
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 19 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Команды для modbus

Сообщение ujin1 »

Sergey Puzanov писал(а): 31 июл 2023, 18:38 Добраться до самого частотника пока не получилось, но потестировать саму программу хотелось бы. Существует ли утилита, имитирующая подключенное к com порту устройство? Для которого можно те же команды чтения/записи использовать. Спасибо.
По утилите не подскажу, но есть вариант купить пару преобразователей интерфейсов USB-RS485 + Slave на LabVIEW из той же библиотеки. Российского производства полно разных. Болид например по 2500 руб. На Алиэкспрессе по 20-25 $ с гальванической изоляцией Waveshare.
Или преобразователь Ethernet to RS485 от того же Waveshare. Потренироваться и, учитывая любовь наших и китайских производителей к 485 интерфейсу, где-нибудь пригодится.
У нас очень давно приобретены MOXA 1130i и 1150. Соединяю их между собой и тестирую. Вариант приближен к рабочим условиям. И сейчас дешевле есть преобразователи.
Изображение
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Re: Команды для modbus

Сообщение Sergey Puzanov »

Спасибо вышеотписавшимся. Продолжу эту тему, хотя следующий вопрос скорее к организации относится.

Нужно реализовать классическую модель, в которой на панели одновременно будет и отображение текущих значений путём опроса устройств, и возможность изменения некоторых параметров через элементы управления. В большинстве видео это реализовано в одном цикле, где постоянно идёт сначала запись значений, затем чтение. У меня же проект сделан с помощью Workers, где есть UI для всего и наследуемый Acquisition для чтения. Пока вижу два варианта:
1) В UI запустить вызов событий, которые с заданной периодичностью будут посылать значения контролов в Acquisition, а он в свою очередь внесёт эти данные, считает нужные и вернёт обратно в UI;
2) В Acquisition запустить вызов событий, которые будут только возвращать в UI считанные значения. В UI же сделать отдельные эвенты на изменение ползунков и, соответственно, на посылку отдельного события в Acquisition для их внесения.
Собственно вопрос - есть ли из этих подходов более правильный, или оба неправильные и нужно действовать иначе? Спасибо
Artem.spb

Activity Автор
professor
professor
Сообщения: 3498
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 54 раза
Поблагодарили: 185 раз
Контактная информация:

Re: Команды для modbus

Сообщение Artem.spb »

Sergey Puzanov писал(а): 08 авг 2023, 10:42 Собственно вопрос - есть ли из этих подходов более правильный, или оба неправильные и нужно действовать иначе? Спасибо
Я предпочитаю гонять данные только по факту изменения.
Но надо не забыть проинициализировать при запуске. А заодно учесть все варианты, когда по какой-то причине значения на экране могут измениться "сами собой" без уведомления контроллера. По сути эта та же инициализация.
По этой причине кто-то предпочитает первый подход, тогда значения будут всегда актуальными.
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Re: Команды для modbus

Сообщение Sergey Puzanov »

Добрался до самого устройства. Подключение вроде успешно, то есть оно отвечает, но на любую команду выдаёт ошибку 538181 (illegal function). С чем это может быть связано? Спасибо.
Screenshot_2.png
Artem.spb

Activity Автор
professor
professor
Сообщения: 3498
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 54 раза
Поблагодарили: 185 раз
Контактная информация:

Re: Команды для modbus

Сообщение Artem.spb »

Sergey Puzanov писал(а): 22 авг 2023, 14:07 Добрался до самого устройства. Подключение вроде успешно, то есть оно отвечает, но на любую команду выдаёт ошибку 538181 (illegal function). С чем это может быть связано? Спасибо.Screenshot_2.png
не те регистры, holding/input и т.п.
Sergey Puzanov
assistant
assistant
Сообщения: 143
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 26 раз
Поблагодарили: 4 раза
Контактная информация:

Re: Команды для modbus

Сообщение Sergey Puzanov »

Artem.spb писал(а): 22 авг 2023, 21:10 не те регистры, holding/input и т.п.
А определить из мануала можно это? Например, по скриншоту в посте viewtopic.php?p=89782#p89782 , в пункте 1 я всё же должен holding или всё таки input использовать?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3498
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 54 раза
Поблагодарили: 185 раз
Контактная информация:

Re: Команды для modbus

Сообщение Artem.spb »

Sergey Puzanov писал(а): 22 авг 2023, 21:26 А определить из мануала можно это? Например, по скриншоту в посте viewtopic.php?p=89782#p89782 , в пункте 1 я всё же должен holding или всё таки input использовать?
не можно, а нужно.
Но не из того скриншота, а раньше.
с 324:
Код команды связи
03H: считывание параметра ведомого устройства
06H: запись параметра ведомого устройства
10H: запись нескольких параметров

Открываем описание протокола, например, тут
01 (0x01) Чтение DO Read Coil Status Дискретное Чтение
02 (0x02) Чтение DI Read Input Status Дискретное Чтение
03 (0x03) Чтение AO Read Holding Registers 16 битное Чтение
04 (0x04) Чтение AI Read Input Registers 16 битное Чтение
05 (0x05) Запись одного DO Force Single Coil Дискретное Запись
06 (0x06) Запись одного AO Preset Single Register 16 битное Запись
15 (0x0F) Запись нескольких DO Force Multiple Coils Дискретное Запись
16 (0x10) Запись нескольких AO Preset Multiple Registers 16 битное Запись

Т.е. у вас получаются Holding, Так что странно, что у вас эта ошибка.
Ещё адрес проверьте, хотя в этом случае ошибка другая должна быть.
Поверьте всё же modbus pool-ом или чем-то подобным. Там проще типы регистров перебирать.
ujin1
adviser
adviser
Сообщения: 239
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 19 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Команды для modbus

Сообщение ujin1 »

Sergey Puzanov писал(а): 22 авг 2023, 14:07 Добрался до самого устройства. Подключение вроде успешно, то есть оно отвечает, но на любую команду выдаёт ошибку 538181 (illegal function). С чем это может быть связано? Спасибо.Screenshot_2.png
Можно проверить параметр F05.00, что выставлен Modbus. Попробовать записать параметр функцией 06, 16 (10H). Запись нельзя перепутать так как идет только в holding register.
Проверить настройки связи скорость и т.д., подключение, поменять провода A, B. Хотя если что либо из этого перепутать должна быть ошибка 56.
Изображение
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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