Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум Picbasic.ru » Электроника » Идеи » MODBUS (заставить пик общаться по этому протоколу)
MODBUS
demanik Дата: Пн, 29.03.2010, 23:15  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (DAlexV)
Вопрос назрел, думаю писать все таки про 485 статью или нет ???

Если надумал то писать обязательно нужно. Думаю она многим пригодится.

За прогу спасибо, буду потихонько разбираться. cool


Попробуй всё и вся... может быть пол...

demanik Дата: Вт, 30.03.2010, 17:22  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (DAlexV)
Ну вот, вроде бы все правильно обрезал.

Немного поразбирался, но возкикает проблема: в MODBUS RTU признаком конца передачи является пауза не менее 3.5 символов вот ее отловить никак не получается. Правда нашел полностью рабочую прогу на ПБП и никак не могу ее переделать на рыбу. cool
Может поможете?

Прикрепления: MODBUS.pbp (6.6 Kb)


Попробуй всё и вся... может быть пол...

DAlexV Дата: Ср, 31.03.2010, 21:46  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (demanik)
признаком конца передачи является пауза не менее 3.5 символов вот ее отловить никак не получается.

Если имеется ввиду что нужно ловить паузу на принимающей стороне, то она уже есть.

' Прием данных
While ISRRX.DataAvailable
Res_On=true
RES(Num_R)=ISRRX.ReadByte
Inc(Num_R)
DelayMS(10)
Wend

Данный цикл как раз и ловит данные из приемного буфера пока не переместит все в RES. Запутсти прогу в шпротеусе и сам все увидишь.
единственное что можно еще добавить это проверку на окончание приема.

if Res_On=true And Num_R>1 then ' Проверка на окнчание приема если флаг начала приема истина и длинна буфера больше 1
Res_Complite=true ' Флаг окончания приема
Res_On=false ' сброс флага начала приема
end if

надеюсь развеил сомнения ????


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
demanik Дата: Ср, 31.03.2010, 22:22  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (DAlexV)
Если имеется ввиду что нужно ловить паузу на принимающей стороне, то она уже есть

Это не та пауза. В выложеном мною коде она реализована через таймер2.

Немного о MODBUS RTU:
Информация передается пачками разной длинны(с разным колличеством байт). Мастер только после передачи всей пачки выдерживает паузу по времени не менее (3.5*время передачи байта) это и есть конец передачи. И только тогда можно проверять пачку на целостность сверяя контрольную сумму.


Попробуй всё и вся... может быть пол...


Сообщение отредактировал demanik - Ср, 31.03.2010, 22:23
DAlexV Дата: Ср, 31.03.2010, 22:32  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Опять запутал !!!!!

Quote (demanik)
Мастер только после передачи всей пачки выдерживает паузу по времени не менее (3.5*время передачи байта) это и есть конец передачи

Quote (demanik)
И только тогда можно проверять пачку на целостность сверяя контрольную сумму.

Это как понять ???? Мастер отправил пачку подождал, и потом начал проверять чего отправил ??? smile
Может имелось ввиду про прием. У меня PBP не стоит уже давно.
Или после передачи у мастера строго лимитированное время на ожидание приема ??? 3.5*время на отправку посылки???


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
demanik Дата: Ср, 31.03.2010, 22:42  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (DAlexV)
Может имелось ввиду про прием

Мы устройство "Slave". Имеется ввиду прием. Мы узнаем что пачка принята вся по этой паузе. Да и ответ можем отправлять только после этой паузы.


Попробуй всё и вся... может быть пол...

ЯНДЕКС Дата: 31.03.2010
demanik Дата: Ср, 31.03.2010, 22:55  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (DAlexV)
У меня PBP не стоит уже давно

Там алгоритм очень простой:

пришел первый байт - сохраняем его в буфер, запускаем таймер и обнуляем счетчик паузы
пришел следующий байт - сохраняем его в буфер и обнуляем счетчик паузы
и т.д.
наступила пауза - переполнился счетчик паузы, остановили таймер, установили флаг сообщение принято.

но я никак не могу припасовать его к вашему примеру. bash


Попробуй всё и вся... может быть пол...

DAlexV Дата: Ср, 31.03.2010, 22:58  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Так в чем тогда проблема. Допустим мы знаем что на отправку 1 символа уходит например 7 мс. число принятых символов нам известно. Выставляем любой из таймеров на тиканье с периодом в 7 мс. в прерывании плюсуем к какой нибудь переменной 1. При приходе первого символа в буфер обнуляем переменную и дожидаемся пока все прием. Как все приняли Считываем значение переменной, умножаем ее на 3.5 и ждем пока значение таймера дотикает до полученного значения. Далее начинаем отправку. Пока ждет выполняет проверку crc и положенные для нее действия.

Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
DAlexV Дата: Чт, 01.04.2010, 00:36  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (demanik)
установили флаг сообщение принято.

Ну вот опять запутал. Вернемся к посту № 18
Quote (DAlexV)
Если имеется ввиду что нужно ловить паузу на принимающей стороне, то она уже есть

Quote (DAlexV)
Данный цикл как раз и ловит данные из приемного буфера пока не переместит все в RES. Запутсти прогу в шпротеусе и сам все увидишь. единственное что можно еще добавить это проверку на окончание приема.

И далее вариант кода.
Quote (demanik)
пришел первый байт - сохраняем его в буфер,

Quote (demanik)
установили флаг сообщение принято.



Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
demanik Дата: Чт, 01.04.2010, 13:11  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Программу запустил. happy добавил в прерывание модуля "ISRRX" прерывания по таймеру2 и все заработало.
Но возникла новая проблема: прерывания по таймеру2 работают только когда они добавлены в модуль "ISRRX" в существующее прерывание. Когда я прерывания по таймеру2 выношу в основную программу делая там еще один обработчик прерываний с низким приоритетом там они перестают работать. Как я понял из описани можно иметь два обработчика прерывани с низким и высоким приоритетом.
Тут у меня возникает непонятка. cool

Уже заработало. happy
нехватало строчки: IPR1.1 = 0 ' низкий приоритет TMR2


Попробуй всё и вся... может быть пол...


Сообщение отредактировал demanik - Чт, 01.04.2010, 13:43
DAlexV Дата: Пт, 02.04.2010, 10:07  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Ну вот и хорошо.
По поводу приоритетов даю подсказку из HELPа на Рыбу:

const
ipLow = 1,
ipHigh = 2

interrupt OnTimer1(ipLow)
// code statements here…
end interrupt

interrupt OnTimer3(ipHigh)
// code statements here…
end interrupt


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
demanik Дата: Пт, 02.04.2010, 10:48  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (DAlexV)
По поводу приоритетов даю подсказку из HELPа на Рыбу

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


Попробуй всё и вся... может быть пол...

DAlexV Дата: Пт, 02.04.2010, 23:32  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (demanik)
Я по хелпу и делал. Но как я понял самому нужно выставить приоритеты через регистры.

Да я верю. У Рыбы есть проблема про которую разработчики либо забыли, либо не хотят придавать значение. Это структура написания листинга. Проще говоря достаточно поставить строчку с оператором или условием или настройками не на свое место, сразу начинаются проблемы. Либо прога не компилится(килограмм ошибок) Либо некорректно работает на девайсе. Оставим это на совести разработчиков. Добавлю прикольно было бы позаимствовать интерфейс редактирования у VB6(комбинация CTRL + Space подбор переменных или операторов) или хотя бы у MicroBasic. Надеюсь до этого все равно когда нибудь дойдет. А так язык очень неплохо продуман.
При написании статьи про 485 попробую учесть и Ваши резюме по MODBUS, а так же можно добавить и готовые разработки с указанием автора естественно.
Удачи Николай !!!!!! wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
hitman Дата: Пн, 28.06.2010, 10:26  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Новенький
Сообщений: 14
Репутация: 0   ±
Замечания:   ±
На сайте с 24.05.2010

Статус: Offline

Здравствуйте!
А не могли бы показать результат вашей работы? Программа заработала или нет?
MiXaS Дата: Вс, 07.04.2013, 19:31  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Приятного времени суток всем! Господа, что-то я совсем запутался. Исходя из описания протокола:

Цитата
Цитата
В RTU режиме сообщение начинается с интервала тишины равноговремени передачи 3.5 символов при данной скорости передачи в сети. Первым полем
затем передается адрес устройства.

Вслед за последним передаваемым символом также следуетинтервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может
начинаться после этого интервала.Начало и конец сообщения сопровождается молчанием 3,5 символа.
Теперь сам вопрос. Сообщение это 1 символ, например адрес, или набор символов: Адрес, функция, адрес регистра, CRC?
Как правильно???

Запрос мастера.
3.5 Адрес; 3.5 функция; 3.5 адрес регистра; 3.5 СRC-MSB; 3.5 CRC-LSB; 3.5. потом слушаю ответ

или

3.5 адрес, функция, адрес регистра, crc?

Под понятием сообщение, что имеется введу? 1 байт или набор данных??

Спасибо!

Сообщение отредактировал MiXaS - Вс, 07.04.2013, 19:32
Форум Picbasic.ru » Электроника » Идеи » MODBUS (заставить пик общаться по этому протоколу)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: