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

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

Reply to
Robbo
Loading thread data ...

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.

Reply to
John Smith

Zobacz tutaj:

formatting link
pytajacy

Reply to
pytajacy

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

Reply to
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

Reply to
michal

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

Reply to
John Smith

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.