реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> контроллер Modbus
juvf
сообщение Oct 4 2012, 05:14
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Довелось мне Modbus реализовывать в синтезируемом процессоре в плис. Думаю.... да зачем мне проц грузить модбасом? Считать там интервалы в 1,5 и в 3,5 символов. Сделал контроллер Modbus аппаратный. Т.е. приходит пакет, контроллер принимает, проц вообще не участвует в приеме. после пакета прошло времени в 3,5 символа и если между байтами внутри пакета не было пауз в 1,5 символа и если совпал crc и если адрес "мой", то контроллер выставляет прерывание процессору. процессор знает в каком месте его озу лежит готовый принятый пакет. Проц парсит пакет, обрабатывает, записывает в определённое место озу ответ и дает контроллеру "старт". Контроллер выплёвывает ответ в уарт, сам считает и отправляет crc. Контроллер сам управляет ногами DE/RE драйвера RS485. С таким контроллером работать с модбасом - ну просто красота. Доставляет.

Протокол не новый и достаточно распространённый, не менее чем CAN. Но если нету плис - то и нету контроллера. вот и возник вопрос - не придумали ли ещё готовый, законченный контроллер MODBUS в каком нить SOIC-8? Или может существует какой-нибудь АРМ в котором есть аппаратный контроллер modbus?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 4 2012, 05:22
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(juvf @ Oct 4 2012, 09:14) *
Протокол не новый и достаточно распространённый, не менее чем CAN. Но если нету плис - то и нету контроллера. вот и возник вопрос - не придумали ли ещё готовый, законченный контроллер MODBUS в каком нить SOIC-8? Или может существует какой-нибудь АРМ в котором есть аппаратный контроллер modbus?

Протокол, в общем-то, и заточен под аппаратную реализацию.
Целиком готовых контроллеров не встречал, в некоторых (msp430) есть аппаратный кодек CRC.
В общем-то, протокол достаточно примитивный, ресурсов отнимает минимум, программные реализации давно устоялись, поэтому нет запроса на реализацию в железе, в отличие от того же CAN

А как использовать "законченный контроллер MODBUS в каком нить SOIC-8", что-то даже в голову не приходит..
Разве что как контроллер пары светодиодов


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 4 2012, 15:11
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MrYuran @ Oct 4 2012, 08:22) *
А как использовать "законченный контроллер MODBUS в каком нить SOIC-8", что-то даже в голову не приходит..
Разве что как контроллер пары светодиодов

А чё? Два уарта, пять ног всего нада+питание.
уарт на хост как мона быстрее sm.gif Тут проблема не в 8ног, а в том, что у этого 8-ногого зоопарка не найдешь озу нужного размера. Не, ну если забить на это, то у меня ascii в тиньке 2313 не сильно тяжелый. Правда, я потом его подпилил все-таки для своих сугубо внутренних нужд- endianness поменял, забадали перестановки.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 4 2012, 18:28
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(juvf @ Oct 4 2012, 08:14) *
после пакета прошло времени в 3,5 символа
Ну так чтобы «нажал на кнопку - чик - и все уже готово», то не знаю. А так у LPC17xx (ну и у 2xxx, видимо, UART-ты то оттуда перекочевали) есть прерывание по паузе поступления байтов в приёмное FIFO
Код
Minimum of one character in the RX FIFO and no character input or removed during a time period depending on how many characters are in FIFO and what the trigger level is set at (3.5 to 4.5 character times).

И аппаратное управление передатчиком RS485 у UART1.

Хотя паузы на каком-нибудь свободном OUTPUT COMPARE не проблема сделать. Скажем, у AVR
OCR1A = TCNT1 + TICKS_FOR_3_5_BYTE;
в каждом прерывании UART и прерывание OCF1 даст конец пакета.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 4 2012, 18:32
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ReAl @ Oct 4 2012, 21:28) *
А так у LPC17xx (ну и у 2xxx, видимо, UART-ты то оттуда перекочевали) есть прерывание по паузе поступления байтов в приёмное FIFO

Трудно сказать, у кого такого нету. У AT91Sam7S и выше/шире(новее) - тоже есть.

Сообщение отредактировал _Pasha - Oct 4 2012, 18:32
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 4 2012, 18:46
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ну, значит, это скорее норма для всего потолще 8-битников.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
juvf
сообщение Oct 5 2012, 03:52
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(_Pasha @ Oct 4 2012, 21:11) *
А чё? Два уарта, пять ног всего нада+питание.
уарт на хост как мона быстрее sm.gif Тут проблема не в 8ног, а в том, что у этого 8-ногого зоопарка не найдешь озу нужного размера. Не, ну если забить на это, то у меня ascii в тиньке 2313 не сильно тяжелый. Правда, я потом его подпилил все-таки для своих сугубо внутренних нужд- endianness поменял, забадали перестановки.

O!!!! А запилить контроллер в отдельном 8-ми ногом МК - что-то не догадался. Действиетльно... там даже не 2 уарта нада.... можно уарт + и2ц или спи. Спасибо за подсказку.

Цитата
Хотя паузы на каком-нибудь свободном OUTPUT COMPARE не проблема сделать. Скажем, у AVR
OCR1A = TCNT1 + TICKS_FOR_3_5_BYTE;
в каждом прерывании UART и прерывание OCF1 даст конец пакета.
дак так и делал. причем контролировал 2 интервала, ещё и 1,5 символов между байтами
OCR1B = TCNT1 + TICKS_FOR_1_5_BYTE;

Но когда много этих модбасов стекается в 1 устройство.... тут уже возникают трудности.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 5 2012, 04:54
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(juvf @ Oct 5 2012, 06:52) *
НO!!!! А запилить контроллер в отдельном 8-ми ногом МК - что-то не догадался. Действиетльно... там даже не 2 уарта нада.... можно уарт + и2ц или спи. Спасибо за подсказку.

дак так и делал. причем контролировал 2 интервала, ещё и 1,5 символов между байтами
OCR1B = TCNT1 + TICKS_FOR_1_5_BYTE;
но когда много этих модбасов стекается в 1 устройство.... тут уже возникают трудности.

Вот это тот случай, который я пытался объяснить в безжалостно закрытой фекальной ветке про ОС РВ.
А если пофантазировать, есть одно оченно частное решение - когда вообще деваться некуда. Если бы не ограничение на тайм-ауты по минимальному значению, оно бы было популярно.
Пожертвовать 0.5 символа.
При приеме пакета (для RS485) использовать передачу при выключенном передатчике, засылать что нить при приеме каждого байта и получается, что на втором фиктивно переданном символе программа спотыкается о Т15, а на 4-м - Т35.
Изврат? sm.gif

Сообщение отредактировал _Pasha - Oct 5 2012, 04:56
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 5 2012, 05:13
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(_Pasha @ Oct 5 2012, 08:54) *
Изврат? sm.gif
Нет. Вполне нормально для гражданского времени:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
juvf
сообщение Oct 5 2012, 05:31
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(_Pasha @ Oct 5 2012, 10:54) *
Пожертвовать 0.5 символа.
При приеме пакета (для RS485) использовать передачу при выключенном передатчике, засылать что нить при приеме каждого байта и получается, что на втором фиктивно переданном символе программа спотыкается о Т15, а на 4-м - Т35.
Изврат? sm.gif

При приеме пакета (для RS485) использовать передачу при выключенном передатчике, - что то я фокуса не понял laughing.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 5 2012, 07:25
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(juvf @ Oct 5 2012, 08:31) *
При приеме пакета (для RS485) использовать передачу при выключенном передатчике, - что то я фокуса не понял laughing.gif

Для AVR
Код
volatile char dummy_count;
ISR(USART_RXC_ISR)
{
  char status = USCRA;
  char data = UDR;
  UDR=dummy_count =0;
  modbus_emit_char(data,status);
}
ISR(USART_TXC_ISR)
{
  set_RTS485(0);//пересекается с посылкой последнего байта и с dummy writes
  if(UCSRB &(1<<RXCIE))
{
    UDR = 0;
    switch(dummy_count)
    {
      case 2:
         modbus_emit_msg(T15_msg);
      break;
      case 4:
         modbus_emit_msg(T35_msg);
      break;
      default:
      break;
    }
}
    else
{
      UCSRB &= ~(1<<TXCIE);// pack sent
  }
}


Сообщение отредактировал _Pasha - Oct 5 2012, 07:28
Go to the top of the page
 
+Quote Post
juvf
сообщение Oct 5 2012, 07:35
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



понял..... мне кажется изврат. можно таблом прощёлкать свою посылку. если между 2-мя пакетами будет пауза меньше 4-х символов, то пакеты склеются. нужно тогда запрос давать не раньше чем через 5 символов после предыдущей транзакции.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01496 секунд с 7
ELECTRONIX ©2004-2016