Страница 1 из 2

Протокол MODBUS

Добавлено: Сб ноя 08, 2014 20:21:19
evgeni-sur
Нужна помощь спецов.
Мне не понятно как организовать чтение памяти, если адресное пространство более 64 кБ? На адрес отвели только 2 бйта.

Re: Протокол MODBUS

Добавлено: Сб ноя 08, 2014 20:40:26
GARMIN
Страничная организация. Сколько хочешь памяти.
Контроллер ОЗУ имеет управляющий регистр, например по адресу 0x001F. По значению этого регистра в область страницы отображается доступная память.
Например, страница имеет размер 32к и располагается по адресам 0x8000 - 0xFFFF. А общий объём памяти 256К, или 8 страниц. Вот и значения управляющего регистра равны старшим трём адресам памяти. 0x00 - первая страница, 0x01 - вторая страница и т.д. При размере страницы 16к будет 16 страниц. Дальше по аналогии.

Re: Протокол MODBUS

Добавлено: Сб ноя 08, 2014 21:00:46
evgeni-sur
GARMIN писал(а):Страничная организация. Сколько хочешь памяти.
Контроллер ОЗУ имеет управляющий регистр, например по адресу 0x001F. По значению этого регистра в область страницы отображается доступная память.
Например, страница имеет размер 32к и располагается по адресам 0x8000 - 0xFFFF. А общий объём памяти 256К, или 8 страниц. Вот и значения управляющего регистра равны старшим трём адресам памяти. 0x00 - первая страница, 0x01 - вторая страница и т.д. При размере страницы 16к будет 16 страниц. Дальше по аналогии.
Пока яснее не стало.
Что за управляющий регистр и для чего там отображается доступная память?
Количество читаемой информации до 256 байт, т.е. вся область м.б. 64Кх256? В общем я совсем ничего не понял.

Re: Протокол MODBUS

Добавлено: Вс ноя 09, 2014 11:20:32
Jack_A
Непонятна постановка задачи. Проектируется устройство, имеющее >64к памяти, которую нужно считать, и надо разработать для него интерфейс ? Или нужно считывать инфу с уже готового устройства ( промышленного ) ? Во втором случае думать не надо вообще, а тупо реализовывать протокол в соответствии с ТО на это устройства. Значит, речь не о нем. Для вновь проектируемого - предусмотреть в нем адресный регистр, содержащий старший разряд адреса начальной ячейки, откуда будет считывание. При приеме предварительно закинуть в него значение ( командой 5 или 6, если тупо придерживаться разблюдовки модбасовских команд ). И затем командой 21 или 23 считывать. Например, если читать с адреса 0х30000, то закидываем в адресный регистр 3 и считываем из страницы 3.
Если не молиться на набор команд MODBUS, а брать из нее только структуру пакета, то можно еще проще:командой 20, к примеру, считываем из 0-й страницы, 21 - с 1-й и т.д.
Кстати, а какую версию MODBUS собираетесь принять ? Если ASCII, там понятно, а если RTU -- конец сообщения будете ожидать по тайм-ауту ? Мы в своей реализации в структуру пакета добавили байт ДЛИНА ПАКЕТА . Скажете - это уже не чистый MODBUS. Да. Но вам надо шашечки -- или ехать?
Но не буду агитировать за отход от стандартов, джабы не вносить анархию. Стандарт -- он стандарт и есть. Хоть и тупой, на мой взгляд.

Re: Протокол MODBUS

Добавлено: Вс ноя 09, 2014 18:00:11
GARMIN
Извини, спросонья спутал страничную организацию памяти микропроцессора и адресацию в протоколе модбас.

Re: Протокол MODBUS

Добавлено: Вс ноя 09, 2014 20:17:56
evgeni-sur
Jack_A писал(а):Непонятна постановка задачи. Проектируется устройство, имеющее >64к памяти, которую нужно считать, и надо разработать для него интерфейс ? Или нужно считывать инфу с уже готового устройства ( промышленного ) ? Во втором случае думать не надо вообще, а тупо реализовывать протокол в соответствии с ТО на это устройства. Значит, речь не о нем. Для вновь проектируемого - предусмотреть в нем адресный регистр, содержащий старший разряд адреса начальной ячейки, откуда будет считывание. При приеме предварительно закинуть в него значение ( командой 5 или 6, если тупо придерживаться разблюдовки модбасовских команд ). И затем командой 21 или 23 считывать. Например, если читать с адреса 0х30000, то закидываем в адресный регистр 3 и считываем из страницы 3.
Если не молиться на набор команд MODBUS, а брать из нее только структуру пакета, то можно еще проще:командой 20, к примеру, считываем из 0-й страницы, 21 - с 1-й и т.д.
Кстати, а какую версию MODBUS собираетесь принять ? Если ASCII, там понятно, а если RTU -- конец сообщения будете ожидать по тайм-ауту ? Мы в своей реализации в структуру пакета добавили байт ДЛИНА ПАКЕТА . Скажете - это уже не чистый MODBUS. Да. Но вам надо шашечки -- или ехать?
Но не буду агитировать за отход от стандартов, джабы не вносить анархию. Стандарт -- он стандарт и есть. Хоть и тупой, на мой взгляд.
Я не могу найти спеца, который бы мне объяснил и разложил всё по полочкам. Я разрабатываю прибор и не новичёк в этом деле. До сих пор избегал модбас, но на этот раз похоже не обойтись. Много темных пятен.
Однажды мне позвонил клиент и спросил: А на сколько у вас честный модбас... Из вопроса уже следует, что его не все понимают однозначно и анархия уже существует.
Мой конкретный пример. В моём приборе есть данные которые лежат в МС флеш, фрам, озу, часах (RTC) , да бог знает где они могут лежать завтра. Да я понимаю, что я могу всем сделать смещение и выстроить адреса в линейку, но адресное пространство превышает 16 бит! Более того если у меня есть структура данных в приборе, я на компе делаю такую же структуру, читаю область памяти с нужного адреса и тупо копирую в память компа, безо всяких преобразований в не зависимости от формата данных. Главное что бы они совпадали в МК и ПК и всё. А в модбасе передаются 2-х байтовые регистры и 1-м должен быть срарший. Получается я в МК должен перевернуть все 2-х байтове слова, отправить, а в ПК сделать все наоборот, ну не геморой? Я уже склоняюсь отказаться от этого и убедить заказчика, что мой протокол гораздо удобнее, не вызывает затруднений у программиста. Ну в общем мне пока ни кто не доказал прелести модбас. Может я не прав и чего то не понимаю, но чего не понимаю, я не понимаю.

Re: Протокол MODBUS

Добавлено: Вс ноя 09, 2014 21:13:50
Jack_A
Не надо полностью цитировать сообщение. Если ответ сразу после него, можно вообще не цитировать.
Заказчик всегда прав. Разве что сказать ему: " Я могу сделать, как вы считаете нужным. Это будет в 2 раза медленнее, на 50% глючнее и на четверть дороже. Зато - полностью по букварю. " Но если в сети есть еще устройства, работающие по стандартному протоколу, то вариантов нет -- надо блюсти стандарт.
СпойлерЕсли бы это происходило в Минске, я был бы готов спорить, что это мой бывший заказчик. Он тоже "шаг вправо, шаг влево от букваря -- расстрел без права переписки." :) А я рассматривал Модбас как определение структуры пакета, а не его наполнения конкретикой. Ну нет у меня никаких coils, registers, files, есть конкретные уставки , токи, мощности, запрятанные в недрах ОЗУ МК, причем в разных форматах -- так как это удобно программе функционирования устройства. Надо вам их получить или наоборот -- записать -- пожалуйста, вот будет такой поток байт такого-то формата.
Как вспомню -- жуть.

Re: Протокол MODBUS

Добавлено: Пн ноя 10, 2014 11:25:32
orinoko
Я, конечно, прошу прощения, но мне страшно представить самодельное устройство, у которого данных для обмена по модбасу более 64К. Имеется в виду тех, которые нужны пользователю.

Re: Протокол MODBUS

Добавлено: Пн ноя 10, 2014 17:10:42
Jack_A
Всяко бывает. Но если бы нужда была в самом деле, я бы эти данные упаковал, закодировал кодом хотя бы с исправлением единичной ошибки, чтобы при сбое одного-единственного бита тупо не перезапрашивать : "Ошибка. Повторите сообщение". В общем, совсем не Read/Write coil ( убей меня кошка лапой если и понимаю, что в данном контексте значит "coil" - "катушка" ) из мудрых фолиантов Modbus'а .
СпойлерА то, что устройство самодельное - это его не дискредитирует. Если бы промышленность выпускала устройства на все-все случаи жизни, то мы, embedder'ы и схемопаятели, заплакали бы и пошли в дворники.

Re: Протокол MODBUS

Добавлено: Ср ноя 12, 2014 18:35:36
evgeni-sur
orinoko писал(а):Я, конечно, прошу прощения, но мне страшно представить самодельное устройство, у которого данных для обмена по модбасу более 64К. Имеется в виду тех, которые нужны пользователю.
В самодельном может быть. Но это не тот случай.

Re: Протокол MODBUS

Добавлено: Сб ноя 15, 2014 12:12:30
Jack_A
Тогда тем боле непонятно. Если готовое промышленное изделие необходимо опрашитвать , то протокол у него определен в документации. Если в собственном проектируемом изделии, то в определении "самодельное" ничего оскорбительного нет, даже если предполагается, что оно будет выпускаться мелкосерийно на [полу]промышленной основе.

Re: Протокол MODBUS

Добавлено: Вс ноя 16, 2014 12:59:31
orinoko
А никто не оскорбляет. Мне реально интересно, какие данные в таких количествах хранится в контроллере и откуда он эти данные берёт?

Re: Протокол MODBUS

Добавлено: Вс ноя 16, 2014 15:10:01
Jack_A
Ну это как раз не вопрос. Вот из жизни: регулятор реактивной мощности. Компенсирует индуктивный ток, подключая емкости. Попутно ведет журнал : какие емкости подключал, почему недокомпенсировал или того хуже - перекомпенсировал, какие были параметры сети и пр. Утром приходит диспетчер, включает комп, а РРМ ему все и задоложит.

Re: Протокол MODBUS

Добавлено: Пн ноя 17, 2014 13:15:48
orinoko
ну можно ведь и оптимизировать. Например, запрос журнала в небольшой группе регистров, например, для последнего события. Один регистр определяет, сколько новых событий. Один - перебор (0 - самый новый). Ограничение уже на количество событий.

Re: Протокол MODBUS

Добавлено: Пн ноя 17, 2014 13:42:58
Jack_A
Реализаций может быть столько, сколько и разработчиков . В одном я твердо убежден: протокол должен содержать то, что нужно, а не тупо следовать букварю. Всякие Read/Write coils -- фтопку. Это мое мнение, и я целиком с ним согласенн. :)

Re: Протокол MODBUS

Добавлено: Сб ноя 22, 2014 15:34:12
evgeni-sur
В моём случае - это прибор, который измеряет несколько параметров, делает вычисления и все это кладет в архив суточный и часовой. Емкость суточного 5 лет, часового 6 месяцев. Вариации на тему хранить данные на компе (сбрасывать периодически) не пойдут, хотя комп есть по определению. Все это сделано, согласно ТЗ. Емкость флеш-памяти 4 Мб не считая озу и есть еще FRAM 32 кб.
Так может кто подскажет как организовать чтение данных?

Re: Протокол MODBUS

Добавлено: Сб ноя 22, 2014 16:10:12
Леонид Иванович
Jack_A, в данном случае под coils подразумеваются катушки реле. В те далекие времена, когда проектировался Modbus, автоматика широко использовала реле. Впрочем, и сейчас широко использует. Я тоже всегда избегал Modbus, вместо него применял свой Wake. Но недавно пришлось делать заказ, где модули должны работать в одной сети с другими Modbus-устройствами, причем, с чужим софтом. Поэтому нужно было реализовать все эти coils, inputs, holding registers и т.д. Реализация протокола действительно сложная и неоднозначная. У меня тоже не получилось сделать"честный" Modbus. Например, подчиненное устройство в ответ на пакет большей длины, чем оно готово принять, должно отвечать кодом ошибки ILLEGAL_DATA_VALUE (0x03). Ответ можно передавать только в том случае, если пакет был принят верно и CRC совпадает. Но пакет большой длины просто не умещается в буфер, поэтому проверить его нет возможности (или надо делать это "на лету", что не совсем удобно). Поэтому я просто ничего не передаю в такой ситуации.

evgeni-sur, можно передавать в устройство индекс архива, например, дату. Потом читать данные для выбранной даты. Затем передаем новую дату, снова читаем. И так далее.

Re: Протокол MODBUS

Добавлено: Сб ноя 22, 2014 23:29:54
Jack_A
Л.И. : Пожалуй, это единственный разумный вариант. Потому что каждый раз тягать весь архив -- это уж чересчур через#опно.
А вообще-то "Протокол MODBUS" -- это вроде бы в "Интеграция с ПК". Но мое дело маленькое, я не модер.

Re: Протокол MODBUS

Добавлено: Вт ноя 25, 2014 18:47:48
evgeni-sur
Странно, что не вижу своего сообщения, и так, что писал вкратце.
Прибор создает архив в собственной памяти. Память 4 Мб + еще другая память (ОЗУ, FRAM, RTC) . Вот откуда набегает более 16 бит адресов. Как Модбасом прочитать нужную область памяти??? Есть Мысли???

Re: Протокол MODBUS

Добавлено: Ср ноя 26, 2014 08:34:12
orinoko
Для начала попробуйте воспользоваться советом Леонида Ивановича. А если всё же вам ну просто необходимо читать всю память с произвольным доступом, то можно сделать так:
1. Заводится два 16-битных регистра, в который вы записываете адрес начала (указатель) для чтения из вашей памяти.
2. Заводится 16 (как пример) регистра, в которых вы читаете данные блоком, начиная с адреса, который предварительно устанавливается в (1).
Можно придумать какую то оптимизацию, но тут как вам удобнее.