Можем ли мы сопоставить один и тот же адрес регистра нескольким ведомым в MODBUS TCP IP?
Я работаю на сервере 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 ответ
Теоретически протокол 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. Это может быть лучше подходит для больших структур данных.
У меня нет примера кода.