Страница 1 из 3
ModBus и AVR
Добавлено: Вс авг 17, 2008 17:01:02
delta777
ПОдскажите начинающему, как подключить AVR к сети MOdBUs(Rs-485 2-х провод)??
НИгде не могу найти инфу по этой теме

Добавлено: Вс авг 17, 2008 17:13:58
Пухич
Давайте вот с чего начнем - что вы вообще знаете о сети Modbus?
Просто дело в том, что особых аппаратных проблем с подключением нет, но чтобы работать в сети Modbus, нужно ПО для МК писать нехилое, если конечно вы хотите как-то обмениваться с кем-то в сети. Да и потом, чтобы в этой сети с кем-то чем-то обмениваться, надо знать свойства этого чего-то, адреса и параметры поддерживаемых этим чем-то функций, вообще что это что-то может. Короче, когда у меня дипломник работал с сетью Modbus (правда у него был не МК, а ПК, но это особой роли не играет), то он долго копался в описании тех контроллеров, которые были в его сети, чтобы понять. что и куда ему посылать. Причем, что интересно, у его контроллеров принцип формирования CRC не совпадал с тем, который установлен стандартом на Modbus.
Так что там много моментов, мало связанных с электроникой. Из электроники нужен UART и преобразователь RS-232-RS-485.
Добавлено: Вс авг 17, 2008 17:22:14
delta777
ModBus RTU протокол.
В сети Modbus комп и собственно AVR, комп выдает задание и читает состояние...
МК только отвечает на запросы компа и получает от него задание, сам МК ни кем и ничем не управляет...
Добавлено: Вс авг 17, 2008 21:43:48
Пухич
Ну тогда нет никаких проблем. UART у МК есть. Нужен драйвер RS-485. Все.
Добавлено: Вс авг 17, 2008 22:32:38
delta777
мне бы схемку, аль чертеж....
и листинг примера бы.....
Добавлено: Пн авг 18, 2008 01:07:21
Пухич
Схемку чего??? Драйвер для RS-485 - это микросхема, включаемая согласно даташиту. Там и схема есть. Вот ее и подключаете к атмеловскому UARTу.Листингов тоже никаких не вижу смысла приводить, ибо работа с UARTом атмеловским у нас на сайте описана многократно, со стороны компа тоже ничего сложного. Ну а дальше - чисто заморочки с формированием сообщений для сети Modbus, причем на МК это будет непросто, на компе проще. Самое главное - а зачем вы комп и МК через такую шину связываете? У вас она уже есть и ее надо использовать, или почему?
Добавлено: Пн авг 18, 2008 01:50:59
KT315B
Тут -
http://masters.donntu.edu.ua/2004/fema/ ... /art7.html неплохое описание аппаратной части RS-485 со всеми ньюансами типа согласования и т.п. Из микросхем могу навскидку посоветовать MAX487 - полудуплекс и MAX489 - полный дуплекс. В даташитах есть и схемы включения и исчерпывающе описание. Не пытайтесь получить ответ "на блюдечке с голубой каемочкой", ищите и обращете =)
Добавлено: Пн авг 18, 2008 07:37:30
BerZerK-ku
Данных по протоколу достаточно в Modbus_rus.doc, находится любым поисковиком.
Добавлено: Пн авг 18, 2008 11:11:23
delta777
Пухич писал(а):Ну а дальше - чисто заморочки с формированием сообщений для сети Modbus, причем на МК это будет непросто, на компе проще. Самое главное - а зачем вы комп и МК через такую шину связываете? У вас она уже есть и ее надо использовать, или почему?
Да, шина и ПО уже есть, нужно добавить устройство.
С аппаратным подключением вроде разобрался (оказывается все просто), а вот как МК будет отрабатывать запросы, пока нет.... Где-то можно посмотреть готовую схемку (хотя бы моргающий светодиод:)) с программой обмена по ModBUs?
Добавлено: Пн авг 18, 2008 14:32:06
Пухич
Примеров для МК я не видел, но в конечном итоге МК должен принимать байты по UARTу, затем дешифровать адрес устройства (т.е. к нему ли идет обращение), ну а дальше адрес функции и данные по вашему усмотрению, в зависимости от того, что послал комп.
Добавлено: Пн авг 18, 2008 15:10:22
BerZerK-ku
Вот пример программы для ATmega128, под IAR.
Исползуются 2 команды ModBus 0х03 - чтение регистров, 0x06 - запись в регистр. С помощью них происходит чтение/запись порта F.
Работоспособность проверял ModiconOPC Server.
Добавлено: Пт авг 22, 2008 13:06:50
delta777
спасибо, разбираюсь потихоньку....
Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 09:26:38
Hold[On]
кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 10:27:19
krant
Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
У тебя есть великолепный шанс это сделать

Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 10:27:24
krant
Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
У тебя есть великолепный шанс это сделать

Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 10:32:18
BerZerK-ku
Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
Проблема с разными названиями регистров? дак там в 99% случаев достаточно убрать 0 из имени.
Во вложении тот же файл, работоспособность не проверял, но по крайней мере компилируется )
Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 11:58:03
Hold[On]
пока ждал ответ - сам решил переписать) пока что результаты не увенчались успехом- да, при запуске МК 8 светодиодов горят, использую программу Modbus Poll - задаю скорость 19200, все остальное без изменений. Slave ID - 32 (это 0x20) адрес регистра - 1, длина - 8. коннекта нету. сижу думаю что делать
Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 12:49:48
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. с утра сижу
Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 12:50:28
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. с утра сижу
Re: ModBus и AVR
Добавлено: Вт июн 22, 2010 13:24:59
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]