Протокол MODBUS

Обсуждаем цифровые устройства...
Ответить
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вт ноя 04, 2014 18:38:57

Сообщение evgeni-sur »

Нужна помощь спецов.
Мне не понятно как организовать чтение памяти, если адресное пространство более 64 кБ? На адрес отвели только 2 бйта.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

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

Сообщение evgeni-sur »

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

Сообщение Jack_A »

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

Сообщение GARMIN »

Извини, спросонья спутал страничную организацию памяти микропроцессора и адресацию в протоколе модбас.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вт ноя 04, 2014 18:38:57

Сообщение 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-х байтове слова, отправить, а в ПК сделать все наоборот, ну не геморой? Я уже склоняюсь отказаться от этого и убедить заказчика, что мой протокол гораздо удобнее, не вызывает затруднений у программиста. Ну в общем мне пока ни кто не доказал прелести модбас. Может я не прав и чего то не понимаю, но чего не понимаю, я не понимаю.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6328
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение orinoko »

Я, конечно, прошу прощения, но мне страшно представить самодельное устройство, у которого данных для обмена по модбасу более 64К. Имеется в виду тех, которые нужны пользователю.
Друг Кота
Аватара пользователя
Сообщения: 6328
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение evgeni-sur »

orinoko писал(а):Я, конечно, прошу прощения, но мне страшно представить самодельное устройство, у которого данных для обмена по модбасу более 64К. Имеется в виду тех, которые нужны пользователю.
В самодельном может быть. Но это не тот случай.
Друг Кота
Аватара пользователя
Сообщения: 6328
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Тогда тем боле непонятно. Если готовое промышленное изделие необходимо опрашитвать , то протокол у него определен в документации. Если в собственном проектируемом изделии, то в определении "самодельное" ничего оскорбительного нет, даже если предполагается, что оно будет выпускаться мелкосерийно на [полу]промышленной основе.
orinoko

Сообщение orinoko »

А никто не оскорбляет. Мне реально интересно, какие данные в таких количествах хранится в контроллере и откуда он эти данные берёт?
Друг Кота
Аватара пользователя
Сообщения: 6328
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение orinoko »

ну можно ведь и оптимизировать. Например, запрос журнала в небольшой группе регистров, например, для последнего события. Один регистр определяет, сколько новых событий. Один - перебор (0 - самый новый). Ограничение уже на количество событий.
Друг Кота
Аватара пользователя
Сообщения: 6328
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Реализаций может быть столько, сколько и разработчиков . В одном я твердо убежден: протокол должен содержать то, что нужно, а не тупо следовать букварю. Всякие Read/Write coils -- фтопку. Это мое мнение, и я целиком с ним согласенн. :)
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вт ноя 04, 2014 18:38:57

Сообщение evgeni-sur »

В моём случае - это прибор, который измеряет несколько параметров, делает вычисления и все это кладет в архив суточный и часовой. Емкость суточного 5 лет, часового 6 месяцев. Вариации на тему хранить данные на компе (сбрасывать периодически) не пойдут, хотя комп есть по определению. Все это сделано, согласно ТЗ. Емкость флеш-памяти 4 Мб не считая озу и есть еще FRAM 32 кб.
Так может кто подскажет как организовать чтение данных?
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

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

evgeni-sur, можно передавать в устройство индекс архива, например, дату. Потом читать данные для выбранной даты. Затем передаем новую дату, снова читаем. И так далее.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6328
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Л.И. : Пожалуй, это единственный разумный вариант. Потому что каждый раз тягать весь архив -- это уж чересчур через#опно.
А вообще-то "Протокол MODBUS" -- это вроде бы в "Интеграция с ПК". Но мое дело маленькое, я не модер.
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вт ноя 04, 2014 18:38:57

Сообщение evgeni-sur »

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

Сообщение orinoko »

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

Вернуться в «Цифровая техника»