Помогите чайнику, плиз

Обычно - нет, никакой паузы, цель - максимально утилизировать шину.

Подскажите, по опыту, как лучше мониторить шину ведомым устройством. Я ведомый. Как определить конец сессии ведущего с другим ведомым? Как определить начало следующего запроса ведущего, который может быть адресован мне. Ведь таймаута нет.

Даже 3,5 байта нет?

Только то, что нужно по стандарту.
Разумеется, тишина в 3.5 символа там есть.

Вы пишете свой стек modbus?

[quote=“Alexander_Rakhman, post:12, topic:14786”]
Вы пишете свой стек modbus?
[/quote]Я делаю софт modbus для небольшого устройства. На слабеньком микроконтроллере, да еще и на ассемблере. Мне надо как то оптимизировать код, поэтому хотел мониторить шину так: идет запрос, адрес не мой, жду таймаут перед следующим запросом, адрес мой - обрабатываю.

Хм. Идея не очень. Например - запросы от мастера могут быть разной длины, напрмиер. Да, 99.9% - это чтение одного -двух регистров, но возможна и запись нескольких, да и ответы от устройств точно будет разной длины.Надо ориентироваться именно на тишину в шине, так вернее.

Спасибо.
“Надо ориентироваться именно на тишину в шине, так вернее.”

Именно это я и имел ввиду, просто некорректно выразился. Я жду таймаут не команды, а тишины. Не мой адрес - жду паузу (тишину). Просто я спросил Вас раньше, делает ли паузу мастер, Вы написали, что нет. “Обычно - нет, никакой паузы”, что меня поставило в ступор, как отслеживать обмен с другими ведомыми.

Пауза определяемая стандартом - да, я имел в виду что драйвер опрашивает регистры устройств шины без(если специально не настроить иное поведение) задержек.

Подскажите, пожалуйста, или дайте ссылку, где то читал не могу найти. Modbus - команда изменения адреса ведомого. Делает ли ведомый ответ? Если делает, какой адрес в ответе, старый или новый? Спасибо.

И если команда записи нового адреса ведомому идет с широковещательным адресом 00? Она выполняется? Какой ответ?

тут все в зависимости от того где в ведомом хранится адрес. Это не определено протоколом, у устройств производства Wirenboard значение адреса хранится/меняется в 0x80, у устройств других производителей, если изменение адреса предусмотрено то может происходить через другой регистр.

“Общие” регистры для устройств нашего производства тут: Таблица общих регистров — Wiren Board

Выполняется, для широковещательной ответа не предусмотрено.

Я не то имел ввиду. Не адрес регистра, а адрес ведомого. Вот мы меняем адрес устройства командой записи: 0х1А 0х06 0х00 0х80 0х00 0х1В CRC, меняем адрес устройства с 1А на 1В. Ответ ведомого 0х?? 0х06 0х00 0х80 0х00 0х1В CRC, какой адрес в начале ответа, старый 1А? или новый 1В?

На любые широковещательные команды ответ не нужен?

Чтение нескольких дискретных входов. Допустим диапазон адресов 01-03. На выходе байт данных, где младшие 3 бита означают состояния адресов 01-03. Как должны быть сформированы эти биты, бит 0 это состояние регистра 01 или 03?

Да, старый. Но это, опять же именно стандартом не определено.Видел устройства которые при записи любого нового параметра относящегося к параметрам просто перезапускались для применения.

Да. Широковещаение подразумевает несколько устройств на шине, если хотя бы два ответят - уже возникнет коллизия.

Нулевой бит данных - это состояние младшего из запрошенных. То есть состояние 01.

Большое спасибо. :handshake:

Вообще советую для проверки взять готовую реализацию, например испольовать ардуинку так: Дружим WirenBoard с Arduino (slave) по ModBus
Для протитипирования - совершенно незаменимо.
Могу дать скетч с реализованными регистрами установки параметров связи.

При соединении WB с устройством по 485 кабелем метров 5, надо терминатор ставить?

Если на пяти метрах не работает без терминатора, значит что-то с шиной или устройством не так)

Всем спасибо. С Вашей помощью все заработало. :star_struck:

3 лайка