| Author |
Message
|
Ciupaska Poziom 2

Joined: 16 Jul 2009 Posts: 3 Location: Bielsko-Biała
|
#1
08 Mar 2010 09:19 Komunikacja z portem COM - opóźnienia |
|
|
|
Witam!
Nie wiem czy to pytanie nie jest do działu Automatyka, ale niech tam...
Napisałem aplikację, która ma - między innymi - być jednym ze slave'ów w protokole Modbus.
Połączenie z linią RS485 odbywa się poprzez przejściówkę USB-RS485.
Aplikacja napisana jest w Delphi, z użyciem komponentu TComPort.
Ustawienia portu COM: overlapped, BaudRate - 19200, SyncMethod - smNone;
Komunikacja jest oprogramowana w osobnym wątku z priorytetem tpTimeCritical (najwyższy dostępny). Wątek zajmuje się tylko komunikacją - czeka na ramki i najszybciej jak się da odpowiada na nie.
Komunikuje się z wątkiem głównym programu za pomocą messages (PostMessage).
Urządzenie będące masterem oczekuje na odpowiedzi Modbus czasie 100ms.
Master 10 razy na sekundę odpytuje wszystkie slave'y i otrzymanie odpowiedzi oznacza, że to urządzenie działa. Przy okazji jest tam też status i jakieś żądanie.
Czasy odpowiedzi z komputera/aplikacji mierzone w masterze są dość nieregularne - przeważnie od 10ms do 80ms. Niestety czasem jest to ponad 100ms i wtedy urządzenie slave jest uznawane jako wyłączone, co powoduje problemy merytoryczne - przerwanie rozpoczętych operacji itp.
Komputer zachowuje się tak, jakby zawieszał się na pewne okresy czasu (rzędu kilkaset ms) i potem nagle gdy się odwiesi - wysyła naraz odpowiedzi na wszystkie zapytania, które nadeszły w czasie gdy był zawieszony.
To powoduje problemy w komunikacji na całej linii.
W czym może tkwić problem?
1) w ustawieniach portu COM?
2) w przejściówce USB-RS485?
3) w czymś jeszcze innym?
Problem powtarza się na różnych komputerach, w różnych konfiguracjach urządzeń Modbus, ale w części zestawów (nawet w większości) opóźnienia mieszczą się w wymaganym czasie i nie ma problemów...
Czy mogę prosić mądre głowy o zdanie? :)
|
|
| Back to top |
|
 |
Google

|
#
08 Mar 2010 09:19 |
|
|
|
|
|
| Back to top |
|
 |
oloam Poziom 17

Joined: 08 May 2005 Posts: 386 Location: poza granicami Polski
|
#2
08 Mar 2010 18:53 Re: Komunikacja z portem COM - opóźnienia |
|
|
|
Probowales zmienic sposob odbierania danych ? http://www.elektroda.pl/rtvforum/topic1424319.html <--tu masz waitforevent i tam mozesz ustawic milisekundy , wiec wydaje mi sie ,ze cos masz skopane odbieraniem danych
|
|
| Back to top |
|
 |
ostrytomasz Poziom 15

Joined: 11 Mar 2004 Posts: 256
|
#3
08 Mar 2010 23:20 Re: Komunikacja z portem COM - opóźnienia |
|
|
|
Przejściówki wnoszą opóźnienie, w pewnych warunkach absurdalnie duże. Dane na UART przychodzą bajt po bajcie, ale nie można ich bajt po bajcie wysyłać przez USB - maksymalna przepustowość USB wyniosłaby wtedy 1000 B/s. Przejściówka ma bufor danych od kilkudziesięciu B do kilku kB i czeka z przesłaniem danych na jego wypełnienie lub inne kryterium, np. odstępu między odbieranymi z UART bajtami.
Jeżeli przypadkiem masz przejściówkę z układem CP210x, to przeczytaj
http://www.silabs.com/Support%20Documents/TechnicalDocs/an205.pdf
Opisane jest tam też narzędzie do zmiany wartości timeoutu odbioru.
FTDI też pisze, że ten parametr pozwala programować:
http://www.ftdichip.com/Documents/DataSheets/DS_FT232BM.pdf
|
|
| Back to top |
|
 |
Google

|
#
08 Mar 2010 23:20 |
|
|
|
|
|
| Back to top |
|
 |
Ciupaska Poziom 2

Joined: 16 Jul 2009 Posts: 3 Location: Bielsko-Biała
|
#4
09 Mar 2010 01:07 Re: Komunikacja z portem COM - opóźnienia |
|
|
|
oloam, nie ukrywam że używając komponentu TComPort nie zagłębiałem się w tajniki odbioru danych - we wszystkich dotychczasowych sytuacjach jego domyślne ustawienia sprawowały się zadowalająco.
Dopiero teraz - przy reżimie czasowym na odpowiedź - pojawiły się problemy.
Idąc Twoim tropem sprawdziłem ustawienie SetCommMask - w komponencie widoczne jako Events: domyślnie maska jest pełna - wszystkie zdarzenia są ustawione. Czy to może być źródło problemów?
Bo w sumie interesuje mnie chyba tylko EV_RXCHAR. Z tym że niedokładnie wiem po co są te maski i czy ustawienie ich wszystkich może przeszkadzać... A nie mam jak sprawdzić organoleptycznie, bo u mnie na maszynie developerskiej nie mam opóźnień. :(
ostrytomasz, dzięki za info, dowiem się z czego ta moja przejściówka jest zrobiona. :)
|
|
| Back to top |
|
 |
Google

|
#
09 Mar 2010 01:07 |
|
|
|
|
|
| Back to top |
|
 |
oloam Poziom 17

Joined: 08 May 2005 Posts: 386 Location: poza granicami Polski
|
#5
09 Mar 2010 18:36 Re: Komunikacja z portem COM - opóźnienia |
|
|
|
Ten urywek kodu ktory widziales w poscie z tematu z linka,pochodzi z mojego programu gdzie komunikowalem sie z urzadzeniem zewnetrznym (nie robionym przeze mnie), w komunikacji musialy nastepowac natychmiastowe odpowiedzi dla urzadzenia ,w przeciwnym wypadku urzadzenie zrywalo komunikacje. o dziwo poprzez standardowa procedure on rxchar udalo sie nawiazywac komunikacje plus odebrac od jednego do kilku pakietow, przy sprawdzaniu flagi komunikacja jest prawidlowa
|
|
| Back to top |
|
 |
Ciupaska Poziom 2

Joined: 16 Jul 2009 Posts: 3 Location: Bielsko-Biała
|
#6
11 Mar 2010 20:53 Re: Komunikacja z portem COM - opóźnienia |
|
|
|
ostrytomasz, moja przejściówka oparta jest o układ FTDI - w opcjach zaawansowanych portu COM można zmieniać opóźnienie i zmniejszenie go spowodowało znaczne ustabilizowanie komunikacji oraz skrócenie czasów odpowiedzi do ok. 8ms. Choć i tak zdarzają się wyskoki do kilkudziesięciu ms. Ale to już - jak rozumiem - uroki Windows? :)
oloam, ja mam podobną sytuację - też muszę szybko odpowiedzieć. Używam komponentu TComPort, ale myślałem że jest jakiś problem z ustawianiem maski zdarzeń. Tymczasem - jw. - problem był w czym innym.
|
|
| Back to top |
|
 |