ModBus и AVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
delta777
Родился
Сообщения: 5
Зарегистрирован: Вс авг 17, 2008 16:41:04
Контактная информация:

ModBus и AVR

Сообщение delta777 »

ПОдскажите начинающему, как подключить AVR к сети MOdBUs(Rs-485 2-х провод)??
НИгде не могу найти инфу по этой теме :(
Последний раз редактировалось delta777 Вс авг 17, 2008 17:23:03, всего редактировалось 1 раз.
Аватара пользователя
Пухич
Модератор
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Давайте вот с чего начнем - что вы вообще знаете о сети Modbus?

Просто дело в том, что особых аппаратных проблем с подключением нет, но чтобы работать в сети Modbus, нужно ПО для МК писать нехилое, если конечно вы хотите как-то обмениваться с кем-то в сети. Да и потом, чтобы в этой сети с кем-то чем-то обмениваться, надо знать свойства этого чего-то, адреса и параметры поддерживаемых этим чем-то функций, вообще что это что-то может. Короче, когда у меня дипломник работал с сетью Modbus (правда у него был не МК, а ПК, но это особой роли не играет), то он долго копался в описании тех контроллеров, которые были в его сети, чтобы понять. что и куда ему посылать. Причем, что интересно, у его контроллеров принцип формирования CRC не совпадал с тем, который установлен стандартом на Modbus. :) :)

Так что там много моментов, мало связанных с электроникой. Из электроники нужен UART и преобразователь RS-232-RS-485.
Знание - сила!
delta777
Родился
Сообщения: 5
Зарегистрирован: Вс авг 17, 2008 16:41:04
Контактная информация:

Сообщение delta777 »

ModBus RTU протокол.
В сети Modbus комп и собственно AVR, комп выдает задание и читает состояние...

МК только отвечает на запросы компа и получает от него задание, сам МК ни кем и ничем не управляет...
Аватара пользователя
Пухич
Модератор
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Ну тогда нет никаких проблем. UART у МК есть. Нужен драйвер RS-485. Все.
Знание - сила!
delta777
Родился
Сообщения: 5
Зарегистрирован: Вс авг 17, 2008 16:41:04
Контактная информация:

Сообщение delta777 »

мне бы схемку, аль чертеж....
и листинг примера бы.....
Аватара пользователя
Пухич
Модератор
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Схемку чего??? Драйвер для RS-485 - это микросхема, включаемая согласно даташиту. Там и схема есть. Вот ее и подключаете к атмеловскому UARTу.Листингов тоже никаких не вижу смысла приводить, ибо работа с UARTом атмеловским у нас на сайте описана многократно, со стороны компа тоже ничего сложного. Ну а дальше - чисто заморочки с формированием сообщений для сети Modbus, причем на МК это будет непросто, на компе проще. Самое главное - а зачем вы комп и МК через такую шину связываете? У вас она уже есть и ее надо использовать, или почему?
Знание - сила!
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Сообщение KT315B »

Тут - http://masters.donntu.edu.ua/2004/fema/ ... /art7.html неплохое описание аппаратной части RS-485 со всеми ньюансами типа согласования и т.п. Из микросхем могу навскидку посоветовать MAX487 - полудуплекс и MAX489 - полный дуплекс. В даташитах есть и схемы включения и исчерпывающе описание. Не пытайтесь получить ответ "на блюдечке с голубой каемочкой", ищите и обращете =)
R2AIV 73!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Данных по протоколу достаточно в Modbus_rus.doc, находится любым поисковиком.
Вложения
485-1.jpg
Пример подключения МК по 485.
(43.01 КБ) 4083 скачивания
DataCenter1.txt
Пример вычисления CRC-16
(4.79 КБ) 2089 скачиваний
delta777
Родился
Сообщения: 5
Зарегистрирован: Вс авг 17, 2008 16:41:04
Контактная информация:

Сообщение delta777 »

Пухич писал(а):Ну а дальше - чисто заморочки с формированием сообщений для сети Modbus, причем на МК это будет непросто, на компе проще. Самое главное - а зачем вы комп и МК через такую шину связываете? У вас она уже есть и ее надо использовать, или почему?


Да, шина и ПО уже есть, нужно добавить устройство.
С аппаратным подключением вроде разобрался (оказывается все просто), а вот как МК будет отрабатывать запросы, пока нет.... Где-то можно посмотреть готовую схемку (хотя бы моргающий светодиод:)) с программой обмена по ModBUs?
Аватара пользователя
Пухич
Модератор
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Примеров для МК я не видел, но в конечном итоге МК должен принимать байты по UARTу, затем дешифровать адрес устройства (т.е. к нему ли идет обращение), ну а дальше адрес функции и данные по вашему усмотрению, в зависимости от того, что послал комп.
Знание - сила!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Вот пример программы для ATmega128, под IAR.
Исползуются 2 команды ModBus 0х03 - чтение регистров, 0x06 - запись в регистр. С помощью них происходит чтение/запись порта F.
Работоспособность проверял ModiconOPC Server.
Вложения
main.rar
(3.25 КБ) 3511 скачиваний
delta777
Родился
Сообщения: 5
Зарегистрирован: Вс авг 17, 2008 16:41:04
Контактная информация:

Сообщение delta777 »

спасибо, разбираюсь потихоньку....
Hold[On]
Родился
Сообщения: 12
Зарегистрирован: Вт дек 01, 2009 04:46:17

Re: ModBus и AVR

Сообщение Hold[On] »

кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
krant
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт окт 25, 2007 11:00:10
Откуда: Russland

Re: ModBus и AVR

Сообщение krant »

Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.

У тебя есть великолепный шанс это сделать 8)
krant
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт окт 25, 2007 11:00:10
Откуда: Russland

Re: ModBus и AVR

Сообщение krant »

Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.

У тебя есть великолепный шанс это сделать 8)
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: ModBus и AVR

Сообщение BerZerK-ku »

Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.

Проблема с разными названиями регистров? дак там в 99% случаев достаточно убрать 0 из имени.
Во вложении тот же файл, работоспособность не проверял, но по крайней мере компилируется )
Вложения
main_mega16.rar
(3.14 КБ) 1380 скачиваний
Hold[On]
Родился
Сообщения: 12
Зарегистрирован: Вт дек 01, 2009 04:46:17

Re: ModBus и AVR

Сообщение Hold[On] »

пока ждал ответ - сам решил переписать) пока что результаты не увенчались успехом- да, при запуске МК 8 светодиодов горят, использую программу Modbus Poll - задаю скорость 19200, все остальное без изменений. Slave ID - 32 (это 0x20) адрес регистра - 1, длина - 8. коннекта нету. сижу думаю что делать
Hold[On]
Родился
Сообщения: 12
Зарегистрирован: Вт дек 01, 2009 04:46:17

Re: ModBus и AVR

Сообщение Hold[On] »

И еще раз. выкладываю свою переделанную. В чем проверять протокол? Ставлю скорость 19200, Com1, 8 бит данных, без паритета, 1 стоп бит, режим - RTU, таймайт - 1000мс, DSR, CTS, RTS - галочки не стоят. Затем захожу Setup - > Poll definition. Там -
Slave ID - 32
Function - 03 HOLDING REGISTER
Address - 1
Lenght - 8
Scan Rate - 1000
где ошибка? завтра сдавать научную работу, срочно потребовали в цифровой регулятор запихать MODBUS. с утра сижу
Hold[On]
Родился
Сообщения: 12
Зарегистрирован: Вт дек 01, 2009 04:46:17

Re: ModBus и AVR

Сообщение Hold[On] »

И еще раз. выкладываю свою переделанную. В чем проверять протокол? Ставлю скорость 19200, Com1, 8 бит данных, без паритета, 1 стоп бит, режим - RTU, таймайт - 1000мс, DSR, CTS, RTS - галочки не стоят. Затем захожу Setup - > Poll definition. Там -
Slave ID - 32
Function - 03 HOLDING REGISTER
Address - 1
Lenght - 8
Scan Rate - 1000
где ошибка? завтра сдавать научную работу, срочно потребовали в цифровой регулятор запихать MODBUS. с утра сижу
Вложения
main.c
(11 КБ) 795 скачиваний
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: ModBus и AVR

Сообщение BerZerK-ku »

Hold[On] писал(а):И еще раз. выкладываю свою переделанную. В чем проверять протокол? Ставлю скорость 19200, Com1, 8 бит данных, без паритета, 1 стоп бит, режим - RTU, таймайт - 1000мс, DSR, CTS, RTS - галочки не стоят. Затем захожу Setup - > Poll definition. Там -
Slave ID - 32
Function - 03 HOLDING REGISTER
Address - 1
Lenght - 8
Scan Rate - 1000
где ошибка? завтра сдавать научную работу, срочно потребовали в цифровой регулятор запихать MODBUS. с утра сижу

Исправляя программу под мега16 еще надо было поправить настройки таймера:
#define StartTimer0 TCNT0=dTCNT0;TCCR0=0x03; //запуск таймера 0
Но вот могло ли это повлиять... щас поставлю используемое вами ПО и посмотрю че да как. Кстати, МК вообще отвечает?

Lenght - 8 - если это количество считываемых регистров, то ответа вы и не дождетесь ) Видимо в этом и дело, для того чтобы заработал данный мейн, поставте 1. Для того чтобы считать 8 адресов, нужно подправить этот кусок программы

Код: Выделить всё

[code]
case 0x03:{//чтение регистров
      TempI=(int) (cmRcBuf0[2]<<8) + cmRcBuf0[3];
      if (TempI!=1){ //првоерка номера регистра, есть только 1 регистр
        return ErrorMessage(0x02); //данный адрес не может быть обработан
      }
      TempI=(int) (cmRcBuf0[4]<<8) + cmRcBuf0[5];
      if (TempI>8){//проверка кол-ва запрашиваемых регистров, не больше 8
         return ErrorMessage(0x02); //данный адрес не может быть обработан
      }
      cmTrBuf0[1]=0x03;//команда
      cmTrBuf0[2]=0x02;//кол-во байт данных
      cmTrBuf0[3]=0x00;//старший байт
      TempI=PINB;
      for (unsigned char i = 0; i < 8; i++)
       cmTrBuf0[4+i] = (TempI >> i) & 0x01;
      TempI=GetCRC16(cmTrBuf0,12);//подсчет КС посылки
      cmTrBuf0[12]=Low(TempI);
      cmTrBuf0[13]=Hi(TempI);
      return 14;
    }
[/code]
Последний раз редактировалось BerZerK-ku Вт июн 22, 2010 13:37:58, всего редактировалось 3 раза.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»