Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2020, 08:00

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Реализация хранения и доступа регистров в MODBUS RTU
СообщениеДобавлено: 05 ноя 2018, 12:00 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1554
Привет!
Наверное кто хоть раз в жизни сталкивался с MODBUS RTU на производстве, не раз "добрым" словом вспоминал разработчиков того или иного изделия.

Пытаюсь сейчас для себя выработать тактику построения доступа к регистрам, чтобы с одной стороны минимизировать время отклика контроллера, с другой стороны, чтобы не было проблема с логикой работы.

В общем суть вопроса:

Стандартная посылка чтения данных выглядит как то так (запись в HEX):
01 03 00 01 00 02 04 XX XX (считать данные с из 2х регистров начиная с 1го) - 04 тут указывает на количество байт которое будет прочитано)

Записи в регистры так:
01 10 00 01 00 02 04 AA BB CC DD XX XX (AA BB CC DD - данные которые записываюстя в регистры с 1го по 2й) XX XX - СRC

При изготовлении устройств на микроконтроллерах дабы не городить буфер хранения очень часто поступают следующим образом -
в описании устройства жестко прописывают стартовые адреса регистров к которым можно обращаться.

к примеру:
0x05 - стартовый регистр конфигурации, длинна его 4 байта (2 регистра)
0x10 - стартовый регистр модуля дисплея, длинна 8 байт (4 регистра)

В чем преимущество такой схемы:
Простота реализации, очень быстрый ответ на запрос (на практике приходится на всякий случай после окончания цикла паузы в 4ms добавить задержку в 1 ms и потом стрелять ответом в мастер)

Недостатки:
При попытке обратится напрямую не к первому 0x05 a ко второму 0x06 регистру конфигурации:
01 03 00 06 00 01 02 XX XX - получим ответ неправильный адрес в запросе или 01 83 02 XX XX (ошибка адреса)


Ну так вот хотел узнать кто какой принцип использует ?

У меня встречаются разные устройства в работе, к примеру у контроллеров LS регистры прописаны жестко и вычитывать их можно только от и до... т. е. если прописано, что регистр конфигурации скорости имеет стартовый адрес 0x04 и занимает 4 байта (2 регистра) то при попытке считать 1 регистр в ответе мы все равно получаем 4 байта т .е. по сути любая из команд от мастер
01 03 00 04 00 01 02 XX XX --> ответ ---> 01 03 00 04 00 01 ZZ ZZ ZZ ZZ XX XX
01 03 00 04 00 02 04 XX XX --> ответ --> 01 03 00 04 00 02 ZZ ZZ ZZ ZZ YY YY

По итогу получим одно и тоже число ZZ ZZ ZZ ZZ

P\S когда начинаешь копать глубже понимаешь, что даже в промышленном протоколе каждый производитель делает все как ему удобно и это немного сбивает с толку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Реализация хранения и доступа регистров в MODBUS RTU
СообщениеДобавлено: 05 ноя 2018, 12:15 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Ну как раз тут то всё очень даже логично. Если хранится 4-байтное число, то и логично его читать именно четырьмя байтами с самого начала числа, а не два байта из середины числа. Тут то как раз "защита от дурака" работает.
Протокол Модбас не распространяется на конструкцию устройств. Он лишь определяет общую концепцию обмена инфой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Реализация хранения и доступа регистров в MODBUS RTU
СообщениеДобавлено: 05 ноя 2018, 12:46 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2880
А насколько критично время отклика? Делайте согласно "MODBUS APPLICATION PROTOCOL SPECIFICATION" и не будет никаких проблем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Реализация хранения и доступа регистров в MODBUS RTU
СообщениеДобавлено: 05 ноя 2018, 14:45 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1554
Время отклика - в идеале не должно быть более 50..100 мСек (это в настройках мастера прописывается) допускается увеличение если слэйв ответит специальной посылкой мастеру (типа занят обработкой запроса жди...) но опять же он должен послать это в течении времени отведенного на ответ.

В общем скорее всего придется мне делать поддержку обоих режимов работы, в новых устройствах через ENUM прописывая массив адресных регистров к которым можно обращаться раздельно (благо их не более 20..30 штук, а к каким то только полностью), и в случае если как BusMaster написал происходит запрос половины цифры - выдавать ошибку адреса, если же идет запрос режима конфигурации и можно считывать инфу побайтно - давать такую возможность...

P\S Тут загвоздка в ответе, мастер может сходить с ума если дает запрос на чтение одного регистра (2 байта), а в ответ ему прилетает 4.
Если в обработчике ответа мастера программеры набыдлокодили и не сделали проверку (отнять 4 байта CRC затем посчитать и сравнить сколько регистров должно быть в ответе и сколько прилетело в приемный буфер) то может произойти что угодно...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB