Modbus, mierzenie odstępu między znakami i paczkami

Apr 06, 2014 5 Replies

Witam uprzejmie,



Tworzę bibliotekę Modbus/RTU w języku C, łącze szeregowe, slave, która będzie działać na mikrokontrolerze ATmega. Korzystam ze sprzętowego USART-a w ATmega. Zgodnie ze standardem Modbus dla łącza szeregowego, odstęp między znakami w pojedynczej paczce nie może być większy niż 1,5 * czas_przesyłania_pojedynczego_znaku. Natomiast odstęp między paczkami powinien być większy niż 3,5 * czas_przesyłania_pojedynczego_znaku. Jest to pokazane na stronie nr 13 tego dokumentu:

formatting link
Żeby dokonywać pomiarów zgodnie z tym, jako pokazano to w standardzie, powinienem wiedzieć, kiedy kończy się transmisja znaku i kiedy zaczyna się transmisja kolejnego znaku. Ponieważ korzystam ze sprzętowego USART-a i przerwania SIG_UART_RECV, to wiem tylko, kiedy kończy się transmisja znaku. Wstępnie postanowiłem korzystać z SIG_UART_RECV (informacja w momencie zakończenia przesyłania znaku) i mierzyć czas między znakami jako 2,5 * czas_przesyłania_pojedynczego_znaku oraz czas między paczkami jako 4,5 * czas_przesyłania_pojedynczego_znaku. Chciałem zapytać, czy takie podejście do tematu będzie prawidłowe?



Przygotowałem ilustrację graficzną:

formatting link
Pozdrawiam, Robbo


Jeżeli chcesz być pewny zależności czasowych, to pomiar robisz oscyloskopem albo analizatorem cyfrowym. Mikrokontrolery mogą mieć bufory sprzętowe i zmienić zależności czasowe między wysyłanymi znakami. K.

Nie mam pewnosci, ale we Freemodbus wyglada troche tak, jakby nie przejmowali sie odleglosciami miedzy znakami (1,5 * T), a jedynie odleglosciami miedzy ramkami (3,5 * T). Bazuja zdaje sie na SIG_UART_RECV tak, jak ja to chcialem zrobic. Przy czym takze wyglada na to, ze licza czas

3,5 * T, a nie 4,5 * T jak to chyba powinno byc, gdy mamy pomiar tylko po przeslaniu znaku, a nie po przeslaniu znaku i na poczatku przesylania.

Nie za bardzo rozumiem zadnie (plik mbrtu.c we Freemodbus), a moze jest ono istotne: "* The reload for t3.5 is 1.5 times this value and similary * for t3.5."

Pozdrawiam, Robbo

Użytkownik "Robbo" snipped-for-privacy@gmail.com napisał w wiadomości news:5341b961$0$2228$ snipped-for-privacy@news.neostrada.pl...

czesc. w mojej opinii (niekoniecznie prawidlowej) najprosciej zrobić to za pomocą timera uruchamianego właśnie w obsłudze SIG_UART_RECEIVE uruchamiasz timer i kolejne przerwanie SIG_UART_RECEIVE kasuje timer a jak nie zdąży to w przerwaniu timera musisz ocenić czy błąd transmisji czy koniec ramki przy czym ja zrobiłbym tylko warunek na koniec ramki (by nie mieć kłopotów z tym że komuś uart/(program właściwie) w drugim urządzeniu nie wyrabia - gdy transmisja błędna to i tak wyjdzie za pomocą crc - format ramki jest dość sztywny) tym ze przeranie jest na końcu a nie na początku znaku przejmowałbym się najmniej, uart jak zacznie odbierać to musi odebrać do konca. pozdrawiam. michal

To rozwiązanie nie uwzględnia buforowania sprzętowego w uC, obsługi przerwań, itp. K.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required