MODBUS
|
|
demanik |
Дата: Пн, 29.03.2010, 23:15 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (DAlexV) Вопрос назрел, думаю писать все таки про 485 статью или нет ??? Если надумал то писать обязательно нужно. Думаю она многим пригодится. За прогу спасибо, буду потихонько разбираться.
Попробуй всё и вся... может быть пол...
|
|
|
|
demanik |
Дата: Вт, 30.03.2010, 17:22 | Сообщение # 17 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (DAlexV) Ну вот, вроде бы все правильно обрезал. Немного поразбирался, но возкикает проблема: в MODBUS RTU признаком конца передачи является пауза не менее 3.5 символов вот ее отловить никак не получается. Правда нашел полностью рабочую прогу на ПБП и никак не могу ее переделать на рыбу. Может поможете?
Попробуй всё и вся... может быть пол...
|
|
|
|
DAlexV |
Дата: Ср, 31.03.2010, 21:46 | Сообщение # 18 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Опять запутал !!!!! Quote (demanik) Мастер только после передачи всей пачки выдерживает паузу по времени не менее (3.5*время передачи байта) это и есть конец передачи Quote (demanik) И только тогда можно проверять пачку на целостность сверяя контрольную сумму. Это как понять ???? Мастер отправил пачку подождал, и потом начал проверять чего отправил ??? Может имелось ввиду про прием. У меня PBP не стоит уже давно. Или после передачи у мастера строго лимитированное время на ожидание приема ??? 3.5*время на отправку посылки???
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
demanik |
Дата: Ср, 31.03.2010, 22:42 | Сообщение # 21 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (DAlexV) Может имелось ввиду про прием Мы устройство "Slave". Имеется ввиду прием. Мы узнаем что пачка принята вся по этой паузе. Да и ответ можем отправлять только после этой паузы.
Попробуй всё и вся... может быть пол...
|
|
|
|
demanik |
Дата: Ср, 31.03.2010, 22:55 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (DAlexV) У меня PBP не стоит уже давно Там алгоритм очень простой: пришел первый байт - сохраняем его в буфер, запускаем таймер и обнуляем счетчик паузы пришел следующий байт - сохраняем его в буфер и обнуляем счетчик паузы и т.д. наступила пауза - переполнился счетчик паузы, остановили таймер, установили флаг сообщение принято. но я никак не могу припасовать его к вашему примеру.
Попробуй всё и вся... может быть пол...
|
|
|
|
DAlexV |
Дата: Ср, 31.03.2010, 22:58 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Так в чем тогда проблема. Допустим мы знаем что на отправку 1 символа уходит например 7 мс. число принятых символов нам известно. Выставляем любой из таймеров на тиканье с периодом в 7 мс. в прерывании плюсуем к какой нибудь переменной 1. При приходе первого символа в буфер обнуляем переменную и дожидаемся пока все прием. Как все приняли Считываем значение переменной, умножаем ее на 3.5 и ждем пока значение таймера дотикает до полученного значения. Далее начинаем отправку. Пока ждет выполняет проверку crc и положенные для нее действия.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
DAlexV |
Дата: Чт, 01.04.2010, 00:36 | Сообщение # 24 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Программу запустил. добавил в прерывание модуля "ISRRX" прерывания по таймеру2 и все заработало. Но возникла новая проблема: прерывания по таймеру2 работают только когда они добавлены в модуль "ISRRX" в существующее прерывание. Когда я прерывания по таймеру2 выношу в основную программу делая там еще один обработчик прерываний с низким приоритетом там они перестают работать. Как я понял из описани можно иметь два обработчика прерывани с низким и высоким приоритетом. Тут у меня возникает непонятка. Уже заработало. нехватало строчки: IPR1.1 = 0 ' низкий приоритет TMR2
Попробуй всё и вся... может быть пол...
Сообщение отредактировал
demanik - Чт, 01.04.2010, 13:43
|
|
|
|
DAlexV |
Дата: Пт, 02.04.2010, 10:07 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (DAlexV) По поводу приоритетов даю подсказку из HELPа на Рыбу Я по хелпу и делал. Но как я понял самому нужно выставить приоритеты через регистры.
Попробуй всё и вся... может быть пол...
|
|
|
|
DAlexV |
Дата: Пт, 02.04.2010, 23:32 | Сообщение # 28 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (demanik) Я по хелпу и делал. Но как я понял самому нужно выставить приоритеты через регистры. Да я верю. У Рыбы есть проблема про которую разработчики либо забыли, либо не хотят придавать значение. Это структура написания листинга. Проще говоря достаточно поставить строчку с оператором или условием или настройками не на свое место, сразу начинаются проблемы. Либо прога не компилится(килограмм ошибок) Либо некорректно работает на девайсе. Оставим это на совести разработчиков. Добавлю прикольно было бы позаимствовать интерфейс редактирования у VB6(комбинация CTRL + Space подбор переменных или операторов) или хотя бы у MicroBasic. Надеюсь до этого все равно когда нибудь дойдет. А так язык очень неплохо продуман. При написании статьи про 485 попробую учесть и Ваши резюме по MODBUS, а так же можно добавить и готовые разработки с указанием автора естественно. Удачи Николай !!!!!!
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
hitman |
Дата: Пн, 28.06.2010, 10:26 | Сообщение # 29 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
14
Замечания:
±
На сайте с 24.05.2010
Статус:
Offline
|
Здравствуйте! А не могли бы показать результат вашей работы? Программа заработала или нет?
|
|
|
|
MiXaS |
Дата: Вс, 07.04.2013, 19:31 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 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
|
|
|
|