Можем ли мы сопоставить один и тот же адрес регистра нескольким ведомым в MODBUS TCP IP? - PullRequest
0 голосов
/ 31 января 2019

Я работаю на сервере MODBUS TCP / IP в c.Для этой разработки я использую библиотеку libmodbus (stephane).Как настроить один и тот же адрес регистра для нескольких ведомых устройств.

По сути, я разрабатываю один шлюз MODBUS TCP / IP.К этому шлюзу подключено 10 датчиков такого же типа.После настройки этого шлюза с клиентом MODBUS TCP / IP (программное обеспечение для ПК).Я хочу прочитать параметр всех этих параметров через один и тот же адрес регистра, как 10000 для параметра-1, 10001 для параметра-2 всех датчиков.Можем ли мы сделать это или нам нужно назначить другой регистр для всех параметров датчика?

Объяснение: В основном, поддержка У меня есть один ПК, на котором мы установили программное обеспечение kepware (клиент MODBUS-TCP).Теперь мы подключаем одно шлюзное устройство (сервер MODBUS-TCP).Мы подключили 10 устройств к этому шлюзу через проводное соединение.Теперь, насколько я понимаю, если я хочу настроить клиент, тогда можно просто выделить 10 регистровых адресов для каждого параметра устройства, например, 10000 для устройства-1, 10001 для устройства-2 и так далее.Но если все устройства относятся к одной категории, то я думаю, что это неправильный путь для развития.Таким образом, можем ли мы как-то распределить каждое устройство по одному уникальному номеру и получить значение его параметра для устройства через адрес регистра 10000. Если это возможно, вы можете объяснить мне, как этого добиться.

[Устройства подключаются к серверу через UART, I2C и т. Д. Но параметр всех устройств такой же, как напряжение и ток.Итак, могу ли я использовать только 2 регистра для напряжения и тока?Если да, то есть ли у вас какие-либо ссылки, как это использовать?]

Если есть какая-либо ссылка или пример кода, то это полезно для меня.

1 Ответ

0 голосов
/ 01 февраля 2019

Теоретически протокол Modbus / TCP содержит байт адреса ведомого.Это предназначено для шлюзов, которые пересылают связь между Modbus / TCP и Modbus / RTU.Он также может использоваться для реализации некоторых виртуальных ведомых устройств или различных отображений регистров в одном ведомом устройстве Modbus / TCP.Таким образом, вы можете, например, использовать адрес подчиненного устройства 1 с адресом регистра 10000 для считывания напряжения с устройства 1, адрес подчиненного устройства 2 с адресом регистра 10000 для считывания напряжения с устройства 2 и т. Д.

Я думаю, что master версия ветки libmodbus не дает вам доступа к байту подчиненного адреса для ваших собственных целей, поэтому вам, возможно, придется изменить библиотеку для реализации этого.

Этопочему может быть лучше определить блоки адресов регистров для ваших устройств, например, использовать адреса 10000 и 10001 для напряжения и тока устройства 1, 10002 и 10003 для напряжения и тока устройства 2 и т. д. (илизарезервируйте некоторое пространство для устройств и используйте что-то вроде 10000 / 10001 для устройства 1, 10010 / 10011 для устройства 2 и т. д.)

С версией master для ветви libmodbus вы можете определить структуру отображения и запустить циклическую функцию, которая считывает значения и помещает их в память отображения регистров.Если у вас уже есть структура с отображением в памяти со всеми значениями, вы можете использовать эту существующую память для отображения регистров.В этом случае макет регистра будет соответствовать существующей структуре данных.

Циклический опрос ваших устройств для копирования всех значений в структуру регистра в памяти может быть достаточным для небольшого объема данных.

Если вы используете запрос извлечения, который добавляет поддержку обратного вызова, вы можете реализовать функции обратного вызова, которые читают или записывают значения с / на устройство только при ответе на определенный запрос Modbus.Это может быть лучше подходит для больших структур данных.

У меня нет примера кода.

...