|
Вопросы о SMH4 Работа и применение контроллеров с сенсорной панелью SMH4. |
|
Опции темы | Поиск в этой теме |
28.04.2021, 06:22 | #1 |
Новичок
Регистрация: Sep 2020
Сообщения: 18
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Замедление при работе с неправильным modbus tcp slave (решено)
При распределении переменных mbtcp slave по запросам SMLogix назначил в один запрос на запись (код функции 0x16) 124 переменных за раз. libmodbus с такой постановкой вопроса не согласен, ссылаясь на спецификацию протокола - там 123. На запрос записи 124 регистров тестовый сервер из состава libmodus пишет в лог ошибку и разрывает tcp соединение. Соответственно, эта процедура повторяется очень часто, что вызывает загрузку ПЛК процессом mbs до 65% и торможение визуализации.
Пока вылечил увеличением максимального количества регистров в пакете при записи до 125 и modbus_max_adu_length выдержка из modbus.h в libmodbus /* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 3 page 15) * Quantity of Registers to read (2 bytes): 1 to 125 (0x7D) * (chapter 6 section 12 page 31) * Quantity of Registers to write (2 bytes) 1 to 123 (0x7B) * (chapter 6 section 17 page 38) * Quantity of Registers to write in R/W registers (2 bytes) 1 to 121 (0x79) */ |
28.04.2021, 10:43 | #2 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 159
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Замедление при работе с неправильным modbus tcp slave
Цитата:
Также я рекомендую заглянуть в указанные в скобочках чаптеры и ознакомиться с происхождением ограничения на длину пакета. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
28.04.2021, 10:47 | #3 |
Senior Member
Регистрация: May 2010
Адрес: Москва
Сообщения: 864
Благодарил(а): 4 раз(а)
Поблагодарили:
87 раз(а) в 68 сообщениях
|
Ответ: Замедление при работе с неправильным modbus tcp slave
В документации на контроллеры есть сведения об этих ограничениях?
|
29.04.2021, 06:48 | #4 |
Новичок
Регистрация: Sep 2020
Сообщения: 18
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: Замедление при работе с неправильным modbus tcp slave
Просто чтобы показать другим пользователям возможность проявления проблемы: SMlogix может автоматически распределять некорректно. И необходимость, в таком случае, корректирования карты запросов вручную.
|
29.04.2021, 10:29 | #5 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 159
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Замедление при работе с неправильным modbus tcp slave
Все ограничения пакетов унаследованы от даташитов на протокол modbus. Мы работаем по старому, в котором макс размер PDU для TCP равен 260 байтов.
Добавлено через 50 секунд Ага, увидел неувиденное - сам лоджик сделал большой пакет. Подрежем, т.к. не принципиально. В аппендиксе b3 действительно указано 123 регистра. Причина ограничения непонятна, т.к. все служебные поля позволяют до 128. Возможно это ограничение конкретно для модиконовских контроллеров, типа чтобы буфер не превышал 256 байтов, а не был предельным по протоколу. В аппендиксах много подобных приколюх, которые разработчиками воспринимаются слишком буквально. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 29.04.2021 в 11:10 |
29.04.2021, 13:06 | #6 | ||
Senior Member
Регистрация: Aug 2013
Сообщения: 3 791
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: Замедление при работе с неправильным modbus tcp slave
Цитата:
RS232 / RS485 ADU = 253 bytes + Server address (1 byte) + CRC (2 bytes) = 256bytes. TCP MODBUS ADU = 253 bytes + MBAP (7 bytes) = 260 bytes. Цитата:
А причина тут просто в арифметике Код:
16 (0x10) Write Multiple registers Function code 1 Byte 0x10 Starting Address 2 Bytes 0x0000 to 0xFFFF Quantity of Registers 2 Bytes 0x0001 to 0x007B Byte Count 1 Byte 2 x N* Registers Value N* x 2 Bytes value |
||