Теоретически протокол 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.Это может быть лучше подходит для больших структур данных.
У меня нет примера кода.