Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/859: Рейтинг темы: голосов - 859, средняя оценка - 4.60
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
1

Modbus на AVR

27.12.2010, 14:34. Просмотров 155099. Ответов 172
Метки нет (Все метки)

Любі друзі!

Ой, что это я? Опять скажут, что бывшего украинского Президента цицирую. Хотя это чистой воды брехня. Это он меня повторял :)

Итак, хотел было разместить свое сообщение в разделе "Я сделал", ибо вопросов я не задаю и никакого обсуждения не намечается. Разве что, Учитель Антон ткнет пару раз носом в нюансы...
Но, с другой стороны, какое нахер "сделал"? Я взял готовое, да и то с помощью товарищей.

Так что размещаю здесь по принципу "кому-то может понадобиться".

Итак, ежели кого заинтересует возможность создания девайса на АВР, работающего слейвом по протоколу Модбас - вам сюды.
Уважаемый венский гер Кристиан Вальтер реализовал этот протокол на многих платформах и найти это все богатство можно тутечки.
Среди них есть и родиния АВР, да еще и созданная изначально прямо на меге168, еще более мною любимой (да простит меня друг okotimiv).
Там не все доработано, в частности по TCP/IP, но режимы RTU (обязательный по стандарту) и ASCII (любимый пользователями дохлых МК) - есть в полной красе.
И система команд Модбаса очень внушительная. Как на меня, то можно и выбросить кое-что. Но это легко решается до компиляции.
Так что, по сути, берите и пользуйтесь. Лучше сделать можно, но трудно.

А при чем же здесь я? Ну, во-первых, поговорить, это ж интересно :)
Во-вторых, я сделал усеченную версию этого богатства и предлагаю ее уважаемой публике для юзания или осмеяния.
В чем усечение и зачем?

Там из периферии МК используется только UART и один таймер. Но занял наш дорогой любитель Штрауса именно самый жирный таймер - номер 1. Он единственный 16-разрядный у мег 48-88-168-328.
И меня лично жаба задавила юзать его исключительно для генерации таймаута размером в 2 и более миллисекунд. Но, при принятой автором на себя епитимье (разрашающая способность на уровне 100 мкс) иначе нельзя, ибо в режиме ASCII таймауты много больше 25 мс, на которые хватило бы 1-байтного таймера.
Так и хер с ним, с тем ASCII, вот что я вам скажу, братцы! Выбросил я возможность реализации этого режима и появилась возможность обойтись 1-байтным таймером (жертвой стал таймер0, как менее одаренный, чем таймер2).

Вот и прилагаю весь этот гамуз в виде рабочего проекта (проверено в студии, а затем на живом 168, прямо в составе Ардуины).
Могу много чего про это сейчас рассказать. так что пытайте, ежли чего. А то я блондин (бывший), через пару месяцев не вспомню многого.
Пока читайте, я соберу чего-нить на стол проект в приложение :)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2010, 14:34
Ответы с готовыми решениями:

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик:...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....

172
propor
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 19
10.04.2011, 10:26 41
Здравствуйте, уважаемые гуру!
Я только пару недель назад начал осваивать МК и программирование под них.
Сейчас делаю стенд по автоматичекому регулированию. Задача в том, чтобы сростить его (стенд) с компом, чтобы все управлялось из SCADA TrosiMode. TrosiMode поддерживает Modbus, поэтому я выбрал его, как самый простой. Реализацию взял отсюда http://robot-divelop.org/orshives/125 это, фактически, то же, что и на http://freemodbus.berlios.de
В том, как получать данные из регистров ввода (input rikystir) и регистров хранения (holding rikystir) я разобрался худо-бедно, данные в TrosiMode от АЦП предаются и в OCR2 записываются, а вот подучать данные dissrete и coils что-то не получается, чего-то не хватает или в реализации или у меня в ДНК, не понял какие функции нужно вызвать, что бы получать значения dissrete и coils. Может кто чего подскажет?
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
10.04.2011, 23:08 42
Привет, уважаемый!

Для пары недель у тебя неплохо получается.

Цитата Сообщение от propor
Реализацию взял отсюда http://robot-divelop.org/orshives/125 это, фактически, то же, что и на http://freemodbus.berlios.de
Я не сравнивал. Но могу сказать, что в библиотеке berlios.de я дописывал кое-что. Там и не было реализовано обращение к битовым данным. Так что ты проверь, есть ли соответствующие функции у тебя в программе.
Цитата Сообщение от propor
какие функции нужно вызвать, что бы получать значения dissrete и coils
Ну, так ты про Модбас скачал инфо? Там видно, что 02, 01, 05 и 15 - как раз функции обращения к битам.
Конечно, если пишешь сам с обеих сторон, то можно плюнуть на такую ерунду, как обращение к битам. Я в таком случае пакую все флаги в слова (регистры), а потом распаковую. И значительно экономлю на траффике. Таким образом, достаточно только функций 03 и 16. Они как раз в библиотеке австрийца есть.

Иное дело, когда у тебя с одной стороны твой МК, а с другой дурная машина с трейс-модом. Тут уж, ежели она хочет битов - биты ей и подавай. Я для работы с чужим мастером дописал битовые команды (обошелся только 01 и 15, дискретные входы это вообще изврат).

А чтобы точнее понимать, что у тебя творися, очень полезно завести какой-нить сниффер. Чисто модбасовские обычно проприетарные (жлобы!), поэтому или ограничивают функционал, или каждые 10 минут перезапускать приходится. Поэтому я обычно пользуюсь COMPump - вещь не специально для модбаса, но позволяет просматривать траффик очень удобно. Записываю потом в текстовый файл и анализирую все на ура.

Ну, будет чего не ясно - пиши. Сам недавно прошел сим путем, рад буду помочь. Главное - не стой на месте, как в том анекдоте:

Стоит Ивинушка перед камнем, а на нем написано:
Налево пойдешь - по шее получишь, направо пойдешь - по шее получишь, прямо пойдешь - по шее получишь.
Призадумался Ивинушка, а сверху ему голос:
А стоять будешь - прямо здесь по шее получишь!

Удачи!
0
propor
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 19
12.04.2011, 23:11 43
Цитата Сообщение от drvtos
Привет, уважаемый!
Для пары недель у тебя неплохо получается.
Спасибо!
Цитата Сообщение от drvtos
Цитата Сообщение от propor
Реализацию взял отсюда http://robot-divelop.org/orshives/125 это, фактически, то же, что и на http://freemodbus.berlios.de
Я не сравнивал. Но могу сказать, что в библиотеке berlios.de я дописывал кое-что. Там и не было реализовано обращение к битовым данным. Так что ты проверь, есть ли соответствующие функции у тебя в программе.

В программе для МК есть callback-функции для работы с dissrete и coils, но это заглушки, тело уних пустое. Так что облом получается.
Цитата Сообщение от drvtos
Цитата Сообщение от propor
какие функции нужно вызвать, что бы получать значения dissrete и coils
Ну, так ты про Модбас скачал инфо? Там видно, что 02, 01, 05 и 15 - как раз функции обращения к битам.
Конечно, если пишешь сам с обеих сторон, то можно плюнуть на такую ерунду, как обращение к битам. Я в таком случае пакую все флаги в слова (регистры), а потом распаковую. И значительно экономлю на траффике. Таким образом, достаточно только функций 03 и 16. Они как раз в библиотеке австрийца есть.

Да, про функции самого модбаса я доки кое-какие уже покурил. Пока что задача не требует работы именно с битовыми данными, так что их отсутствие не критично. Я уже и сам склоняюсь к Вашему методу - паковать все слова, благо проект в TrosiMode тоже сам ваяю. Вообще, стенд достаточно тупой - один датчик температуры и нагреватель с вентилятором, управляемыми ШИМ.
drvtos"]Иное дело, когда у тебя с одной стороны твой МК, а с другой дурная машина с трейс-модом. Тут уж, ежели она хочет битов - биты ей и подавай. Я для работы с чужим мастером дописал битовые команды (обошелся только 01 и 15, дискретные входы это вообще изврат).

А чтобы точнее понимать, что у тебя творися, очень полезно завести какой-нить сниффер. Чисто модбасовские обычно проприетарные (жлобы!), поэтому или ограничивают функционал, или каждые 10 минут перезапускать приходится. Поэтому я обычно пользуюсь COMPump - вещь не специально для модбаса, но позволяет просматривать траффик очень удобно. Записываю потом в текстовый файл и анализирую все на ура.[/QUOTE]
Сниффером я пользовался в начале, когда разбирался с адресацией регстров модбаса.
drvtos"]Ну, будет чего не ясно - пиши. Сам недавно прошел сим путем, рад буду помочь. Главное - не стой на месте, как в том анекдоте:

Стоит Ивинушка перед камнем, а на нем написано:
Налево пойдешь - по шее получишь, направо пойдешь - по шее получишь, прямо пойдешь - по шее получишь.
Призадумался Ивинушка, а сверху ему голос:
А стоять будешь - прямо здесь по шее получишь!

Удачи![/QUOTE]
Спасибо!

На PinBoard все готово в минимальной конфигурации, послезавтра еду заказывать детали - MOSFETы для ШИМ, оперционник и датчик температуры.

В планах еще три стенда, там предполагается контроль более одного аналогового параметра, там помощь точно понадобится, бо сейчас работа с АЦП у меня сделана очень тупо
0
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
05.02.2012, 12:21 44
пытаюсь вместо самопального протокола использовать MODBUS-RTU (пока нет работы=есть время). Вопросы всем:
1) какой Формат передачи символов используете - 1а) с контролем четности и какой паритет 1б) без контроля четности
2) какая реакция на ошибку- Если подчиненный обнаружил ошибку, то
2а) он не формирует ответ главному- главный по тайм-ауту решает- время транзакции растет
2б) он формирует ответ главному- - время транзакции минимально
СПАСИБО ВСЕМ!
0
05.02.2012, 12:21
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
05.02.2012, 17:23 45
1) EVEN PORITY

2) Ошибку какого рода?
0
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
05.02.2012, 21:17 46
Цитата Сообщение от drvtos
2) Ошибку какого рода?
CRC или паритета
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
05.02.2012, 21:26 47
Ничего не делать. Пусть Мастер сам разбирается.

А вообще, посмотри вот это, там на странице 10 есть рис.8 - очень хорошо описано. Если будут непонятки - можем здесь обсудить.
0
krymmym
0 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 3
21.02.2012, 13:43 48
День добрый.

У меня возникла проблема, а конкретнее - в demo.c файле указана 38400 скорость, а в portserial.c - 9600, как это понимать? :) Закачал скомпилированый Вами hex файл в АТмегу168 (16МГц кварц) и подключил к компу через FTDI232 преобразователь. Постоянно появляется МБ таймаут. Мнения? :)
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
21.02.2012, 14:30 49
Цитата Сообщение от grymmin
в demo.c файле указана 38400 скорость, а в portserial.c - 9600, как это понимать?
Цитирую себя из первого поста:

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

Написано давненько :)

Поэтому с ходу и не скажу. То есть. правильный ответ был бы - сказать, с какой же скоростью реально мой МК общался с компом. Вот этого теперь не вспомню даже после литры выпитой.
А предположить могу, что одно из определений не используется реально. Скорее всего, то, что в demo. Вот эти передачи

Код
eStatus = eMBInit( MB_RTU, 0x01, 0, 19200, MB_POR_EVEN );
по-моему, игнорируют бодрейт. А то, что в portserial - оно ж в регистр управления записывается. Этого не проигнорируешь :) Вот ему я бы и верил.

Цитата Сообщение от grymmin
Закачал скомпилированый Вами hex файл в АТмегу168 (16МГц кварц) и подключил к компу через FTDI232 преобразователь. Постоянно появляется МБ таймаут. Мнения? :)
Мнение, что тебе нужно вникать. Пробовать, смотреть осциллом, что же имеется. Мож у тебя проводок разорван, а мы тут ЩАС кинемся в Вену письма писать :) Он, кстати, не отзывается на мои письма.
0
krymmym
0 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 3
21.02.2012, 14:59 50
Хорошо, двигаемся дальше. Во время idle на Tx должна быть логическая единица? (неважно идёт ли обращение к АТмеге или нет, всегда стоит 1).
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
21.02.2012, 15:03 51
Цитата Сообщение от grymmin
Хорошо, двигаемся дальше. Во время idle на Tx должна быть логическая единица? (неважно идёт ли обращение к АТмеге или нет, всегда стоит 1).
Ну да... Если нет запроса, то нет и ответа. Сам Слейв ведь не дергается.
А вот если идут запросы, а там "1" - значит, запрос наш МК не понял. Потому и не отвечает. Обычная история. Значит, в этом направлении и копай. На приеме посылки видишь? Есть чем их расшифровать?
0
krymmym
0 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 3
21.02.2012, 17:44 52
Хотел бы уточнить, точно ли, как вы раньше упоминали, этот код работает на 485? Если да, то моя проблема должна быть в том что я подключаю к АТмеге к Tx и Rx - FTDI232 Rx Tx, который является 232. Уже запутался, не нахожу проблемы. Проверяю приходящие и исходящие биты у UDR регистров и они совершенно не совпадают с тем что я посылаю через терминал. Могли бы вы поделиться принципиальной схемой? Спасибо за потраченное время :)
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
21.02.2012, 18:05 53
Да не имеет значения в МК, каков способ доставки посылок - 232 или 485. У меня тот пример работал с компом через китайский перобразователь ЮСБ в 485. На плате стоял обычный драйвер типа ADM485 и с него на МК идут 3 линии:

1) RX
2) TX
3) DIR (RTS)

Возможно, ты не выделил порт для управления направлением передачи драйвера. Посмотри файл port.h, там есть на строке 123 такая фигня: RS485 specifics
Нужно, чтобы драйвер управлялся.

А если действительно на плату приходит 2 линии от FTDI232 и ничем не надо управлять, тады ой. Никакого порта тогда не надо. Я так не запускал.

Но читаю твои симптомчики:
Цитата Сообщение от grymmin
Проверяю приходящие и исходящие биты у UDR регистров и они совершенно не совпадают с тем что я посылаю через терминал
Я выделил жирным самое важное (кстати, говорил об этом раньше, когда советовал взять осцилл в руки): проверить, а что же доходит до МК. Если приходящие посылки не те, что ты ожидаешь, то при чем тут Берлиозо? То есть, пока не увидишь прямо на ноге (а еще лучше - в регистрах) МК правильную посылку от компа - нечего искать в программе.
0
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
22.02.2012, 11:00 54
Цитата Сообщение от drvtos
А вообще, посмотри вот это, там на странице 10 есть рис.8 - очень хорошо описано.
СПАСИБЩЕ! Щ выскочила сама- латинское О! Советую смотреть всем!
0
topor123
0 / 0 / 0
Регистрация: 24.03.2011
Сообщений: 86
24.01.2013, 21:43 55
а mostir в freemodbus не реализован что-ли?
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
25.01.2013, 01:26 56
Цитата Сообщение от topor123
а mostir в freemodbus не реализован что-ли?
Думаю, что нет. Тот проект тихо спит, ИМХО.
0
Moksoff
0 / 0 / 0
Регистрация: 29.05.2010
Сообщений: 191
25.01.2013, 01:47 57
Насколько я знаю, Wolti предлагает mostir в своём FriiModbus уже за деньги. Ну и поддержку всего этого, тоже, за копеечку. Ему же тоже хочется венский шницель с картофельным салатом есть :)
Ну а вообще, вернётся он с отпуска, спрошу, почему у него всякие ToDo к библиотеке уже три года висят.
0
sohbtixhuk
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 799
25.01.2013, 02:43 58
А чо так сразу уперлись в фримодбас? Вон, есть libmodbus, проект на сях, все работает на ура, под свою платформу только бэкенд перепилить надо. Сам использую, в роли мастера и слейва. Правда со слейвом есть маленький косяк, который проявился после пересадки с RS232 на RS485, но я пока 15 минут просто ковырял эту ботву.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
25.01.2013, 12:10 59
Цитата Сообщение от sohbtixhuk
А чо так сразу уперлись в фримодбас? Вон, есть libmodbus, проект на сях, все работает на ура, под свою платформу только бэкенд перепилить надо. Сам использую, в роли мастера и слейва.
На МК или на компе?

А вообще, мой тусклый моск по-прежнему отказывается понимать чужое. Уже сильно чешутся руки перейти на соПЦтвенную билиотеку. Смотрю дату создания топика. Прошло 2 года с момента моего знакомства с Модбасом. Тогда я только-только входил в мир эмбеддерства (или возвращалсмя после 15-летнего перерыва - но это почти одно и то же в наше стремительное время). По некоторым признакам смею утверждать, что многому научился за этот период. И теперь задача написать свой стек модбаса... как-то не пугает, найти бы время. Конечно, понимаю, что сделать такую универсальную красоту, как подарил миру уважаемый австрияка Кристиан - не мой уровень. Но и нафига мне это? Думаю даже не о библиотеке в чистом виде, хотя да, оформить именно как библиотеку было бы неплохо. Думаю о некроссплатформенном наборе функций, позволяющих работать с модбасом с меги168. Возможно, мне будет по силам сделать этот набор хотя бы с приглядкой к использованию с СТМ32, ибо туда направлены мои дальнейшие планы. Так, чтобы потом не заняло много труда сделать форк.
Что видится как оправдание такого онанизма? Ну... х.з. :) Такое, знаете ли, пигмалионское чуЙсвто "это мойо". Такой самопал будет мне более понятен, а я люблю ясность. Или такая библиотека будет чуток покороче, что для атмеги168 не лишнее. Или можно строить и Мастера.

Ну, вы же такие умные - подскажите мне, нафига я это хочу :) Видите ли вы смысл?
0
Sym
1 / 1 / 0
Регистрация: 16.12.2016
Сообщений: 1
25.01.2013, 14:22 60
Цитата Сообщение от drvtos
Ну, вы же такие умные - подскажите мне, нафига я это хочу :) Видите ли вы смысл?
Если не заморачиваться со стандартом Modbus, то стек пишется за один вечер. Обычно под модбасом понимают Modbus RTU 9600, только команды 3 и 6, переменные с адресом выше 40 000 типа integer 16 бит и ftoot 32 бит. Команды группового чтения, групповой записи, формирование всех ошибок это уже тонкости, которые редко нужны.
CRC считается сложно, но уже всё написанно ))
0
25.01.2013, 14:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2013, 14:22

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master ->...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

Ошибка в CodeVisionAVR по #include<avr/io.h> #include<avr/interrupt.h>
Библиотеки #include&lt;avr/io.h&gt; и #include&lt;avr/interrupt.h&gt; - они вообще из какой IDE? Нашел код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.