Можем ли мы сопоставить один и тот же адрес регистра с несколькими ведомыми устройствами в 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 регистра для напряжения и тока? Если да, то есть ли у вас какие-нибудь рекомендации, как это использовать?]

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


person harshal bhavsar    schedule 31.01.2019    source источник
comment
Вы должны сделать свой вопрос более ясным. Вы имеете в виду, что когда клиент подключается к серверной части вашего шлюза и запрашивает чтение адреса регистра 10000, ваш шлюз должен запросить у всех устройств параметр param-1 и объединить это с результатом, который будет отправлен клиенту? Возможно, вам стоит описать коммуникационный поток запросами, адресами и ответами на примере 2 или 3 устройств. что-то вроде этого: cliend отправляет запрос чтения 1 для регистра 10000 на шлюз, шлюз что-то делает (что?) с запросом и связывается (как?) с устройствами, шлюз отправляет ответ на запрос 1.   -  person Bodo    schedule 31.01.2019
comment
Привет, Бодо, я добавил рассматриваемое объяснение.   -  person harshal bhavsar    schedule 31.01.2019
comment
Что вы имеете в виду под проводным подключением? Последовательное соединение? Сколько регистров у каждого ведомого устройства? Вы хотите адресовать все регистры на всех подчиненных устройствах? Modbus / TCP содержит байт адреса, возможно, вы можете использовать его для адресации одного из ваших 10 ведомых устройств.   -  person Bodo    schedule 31.01.2019
comment
Последовательный, а также I2C. Но параметр такой же, как напряжение, ток. @ 2 регистр. @Да. Как?   -  person harshal bhavsar    schedule 01.02.2019
comment
То, что вы ответили в комментарии, нужно добавить к вопросу. Дополнительный вопрос для уточнения: Обмениваются ли устройства протоколом Modbus? В этом случае вы можете перенаправить связь между клиентом Modbus и вашими устройствами. Если устройства используют другие протоколы, вы в основном реализуете подчиненное устройство Modbus, и ваше решение, использовать ли вы адрес подчиненного устройства Modbus или регистрировать блоки адресов для выбора конкретного устройства.   -  person Bodo    schedule 01.02.2019
comment
Обмениваются ли устройства протоколом Modbus? : НЕТ. Устройства подключаются к серверу через UART, I2C и т. Д. Но параметр у всех устройств такой же, как напряжение и ток. Итак, могу ли я использовать только 2 регистра для напряжения и тока? Если да, то есть ли у вас какие-нибудь рекомендации, как это использовать?   -  person harshal bhavsar    schedule 01.02.2019
comment
Пожалуйста, отредактируйте свой вопрос, чтобы добавить всю дополнительную информацию, вместо того, чтобы отвечать на вопросы в дополнительных комментариях.   -  person Bodo    schedule 01.02.2019
comment
Ты понял мой вопрос?   -  person harshal bhavsar    schedule 01.02.2019


Ответы (1)


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

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

Вот почему может быть лучше определить блоки адресов регистров для ваших устройств, например используйте адреса 10000 и 10001 для напряжения и тока устройства 1, 10002 и 10003 для напряжения и тока устройства 2 и т. д. (Или зарезервируйте место для устройств и используйте что-то вроде _11 _ / _ 12_ для устройства 1, _13 _ / _ 14_ для устройства 2 так далее.)

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

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

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

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

person Bodo    schedule 01.02.2019
comment
Спасибо, Бодо, знаете ли вы какую-либо ссылку для MODBUS TCP / IP - person harshal bhavsar; 11.02.2019
comment
@harshalbhavsar Спросите свою любимую поисковую систему. Примеры: simplemodbus.ca/TCP.htm prosoft-technology.com/kb/assets/intro_modbustcp.pdf - person Bodo; 11.02.2019