Komunikace pomocı seriove linky RS485 pod Windows 95/98/NT (obsluha komunikac nıch karet Tedia PCI585, PCI685 ve 32-bitovem prostredı) ZJISTE NI VOLNY CH PROSTR EDKU V PC 2 Windows 95/98 2 HARDWAROVA INSTALACE 2 INSTALACE OVLADAC E 2 Windows 95/98 2 ZA KLADNI PROCEDURY A FUNKCE PRO PRA CI SE SŽRIOVY M PORTEM RS485 V PROSTR EDI WIN32 3 CreateFile 4 CloseHandle 5 WriteFile 6 ReadFile 7 EscapeCommFunction 8 GetCommState / SetCommState 9 GetCommTimeouts / GetCommTimeouts 10 TVORBA APLIKACE VYUZIVAJICI RS485 11 KARTA PCI-685 11 KDE LZE KARTU PCI-685 OBJEDNAT 11 Adicom Praha, s.r.o. Strana 1 (celkem 11)
U vod Tento dokument je urc en vyvojovym pracovnıku m, kterı jsou postaveni pred š kol propojit zarızenı komunikujıcı s PC smyc kou RS485 s modernımi 32-bitovymi operac nımi systemy Windows 95/98/NT. Jeho š kolem je tento prechod zjednodusit co mozna nejvıce. Proto se zde krom deklaracı procedur a funkcı v jazyce C objevujı i deklarace a prıklady pro Borland Delphi. Jako hardwarovou platformu pro komunikaci predpoklada komunikac nı kartu Tedia PCI-685. Zjistenı volny ch prostredku v PC Pred vlastnı instalacı karty je nutno ujasnit si, kteresystemoveprostredky je moznekart priradit. Windows 95/98 Pravym tlacıtkem mysi klikneme na ikonu Tento pocıtac na pracovnı plose a vybereme polozku Vlastnosti. Zvolıme kartu Spravce zarızenı, ve stromu jednou klikneme na polozku Pocıtac (prvnı v poradı) a stiskneme tlacıtko Vlastnosti. Zde je treba vybrat volneirq a I/O adresu podle moznostı nastavenı karty. Zatımco IRQ muzeme zvolit takrka libovoln (pozor na IRQ9 Ř tam je mapovano IRQ2), bude vyhodnezvolit I/O adresu odpovıdajıcı b zneadrese pro COM3 (tj. 3E8h), popr. pro COM4 (tj. 2E8h). To vsak nenı podmınkou. Hardwarova instalace Podle navodu nastavıme na kart nasledujıcı parametry: I/O port a IRQ podle moznostı PC. Ty jsme zjistili v minulekapitole. Rızenı prenosu signalem DTR, resp. RTS, popr. automatickerızenı prenosu obvody ADFC (v zavislosti na konkretnı aplikaci Ř viz dale). Typ smyc ky RS422/485. Potezasuneme kartu do PC. Po ubezpec enı se, ze jsme zakrok provedli korektn, muzeme pustit PC. Instalace ovladace Komunikace s kartou PCI-685 bude probıhat pomocı standardnıho ovladac e serioveho portu. V dalsıch kapitolach si ukazeme, jak s tımto ovladac em pracovat a jakerozdıly se uplatn ujı pri praci s RS485. K tomu je nejprve potreba sd lit systemu, ze jsme nainstalovali novy port. Windows 95/98 Nenajde-li system Windows po spust nı port automaticky, je treba pridat jej ruc n volbou Pridat novy hardware v Ovladacıch panelech, ruc nı vyb r HW, komunikac nı zasuvka. Zm ny parametru (bazova adresa, IRQ) provedeme po instalaci ve Spravci zarızenı. Poklepeme na nov vytvoreny port a na kart Prostredky nastavıme patric nou konfiguraci. Zakladnı konfigurace 1..4 odpovıdajı b znym nastavenım pro COM1..COM4. Chceme-li vyuzıvat jineprostredky, je treba zvolit Zakladnı konfiguraci 8 a prostredky nadefinovat ruc n. Na zalozce nastavenı zasuvky pod tlacıtkem Upresnit zkontrolujeme, ze je zapnuto vyuzıvanı vyrovnavacı pam ti FIFO. Nasi volbu potvrdıme. Komunikac nı rychlost nebudeme nastavovat zde, provedeme to uvnitr aplikace. Adicom Praha, s.r.o. Strana 2 (celkem 11)
Zakladnı procedury a funkce pro praci se sžriovy m portem RS485 v prostredı Win32 Nejprve je treba podotknout, ze si tento dokument neklade v zadnem prıpad za cıl popsat do detailu nıze zmin ovanefunkce. Zde c tenare musım odkazat na referenc nı prıruc ky, bez kterych se pri hlubsım pronikanı do problematiky neobejde. Popis zde uvedeny se omezuje pouze na zakladnı obsluhu RS485 ve 32-bitovem operac nım systemu. Pro zkusen jsı vyvojare bych rad podotknul, ze prace s RS485 se pod 32-bitovymi Windows lisı jen nepatrn od prace s RS232 a dokonce se nemusı lisit vu bec. Definice procedur jsou uvedeny v jazyce C a Borland Delphi, prıklady jsou urc eny pro Borland Delphi (3.0 a vyssı). Adicom Praha, s.r.o. Strana 3 (celkem 11)
CreateFile HANDLE CreateFile( LPCTSTR lpfilename, // ukazatel na jm eno souboru DWORD dwdesiredaccess, // rezim prıstupu DWORD dwsharemode, // rezim sdılenı LPSECURITY_ATTRIBUTES lpsecurityattributes, // ukazatel na popisovac ochrany (security descriptor) DWORD dwcreationdistribution, // rezim vytvorenı DWORD dwflagsandattributes, // atributy souboru HANDLE htemplatefile // identifikator (handle) predlohy function CreateFile(lpFileName: PChar; dwdesiredaccess, dwsharemode: Integer; lpsecurityattributes: PSecurityAttributes; dwcreationdisposition, dwflagsandattributes: DWORD; htemplatefile: THandle): THandle; Otevıra prıstup k seriovemu portu. Pouzitı jednotlivych parametru : lpfilename Ř Ukazatel na jmeno portu (COM1, COM2, ť ). R et zec je ukonc en znakem nula (nullterminated string) dwdesiredaccess Ř Kombinace konstant GENERIC_READ a GENERIC_WRITE. dwsharemode Ř Vlozıme hodnotu 0. lpsecurityattributes Ř Vlozıme hodnotu NUL, resp. nil. dwcreationdistribution - Vlozıme hodnotu OPEN_EXISTING. dwflagsandattributes - Vlozıme hodnotu FILE_ATTRIBUTE_NORMAL + FILE_FLAG_WRITE_THROUGH. htemplatefile - Vlozıme hodnotu 0. Vracı identifikator (handle) na otevreny COM-port nebo hodnotu INVALID_HANDLE_VALUE. Na port se budeme nadale odvolavat pomocı teto hodnoty. Prıklad: Otevrenı portu COM3 pro c tenı i zapisř Borland Delphi 3.0 : var Soubor:THandle ; Soubor:=CreateFile( COM3ů,GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH, 0 Prestoze funkce ma relativn velky poc et parametru, nenıtreba se vsemi obsırn zabyvat. Je nutno mıt na zreteli, ze tato funkce slouzık otevıranımnoha typu komunikac nıch kanalu, aó to je soubor, seriovy kabel anebo vzdaleny pocıtac v Internetu. Pro nase šcely postacıpochopenı pouze prvnıho parametru, ve specifickych prıpadech i druheho. Adicom Praha, s.r.o. Strana 4 (celkem 11)
CloseHandle BOOL CloseHandle( HANDLE hobject // identifikator (handle) otev reneho portu function CloseHandle(hObject: THandle): BOOL; Uzavıra prıstup k portu, ktery byl otevren funkcı CreateFile. Pouzitı jednotlivych parametru : hobject Ř Identifikator (handle) otevreneho portu zıskany z funkce CreateFile. Prıklad: uzavrenı portu Ř Borland Delphi 3.0 : CloseHandle(Soubor V touto instrukcı jsme uzavreli port, ktery jsme otevreli v predchozım prıkladu. Adicom Praha, s.r.o. Strana 5 (celkem 11)
WriteFile BOOL WriteFile( HANDLE hfile, // identifikator (handle) portu LPCVOID lpbuffer, // adresa dat k odesl anı DWORD nnumberofbytestowrite, // pocet bytu k odeslanı LPDWORD lpnumberofbyteswritten, // adresa promýnne, do ktere se ulozı pocet odeslanych bitu LPOVERLAPPED lpoverlapped // ukazatel na strukturu pro overlapped I/O function WriteFile(hFile: THandle; const Buffer; nnumberofbytestowrite: DWORD; var lpnumberofbyteswritten: DWORD; lpoverlapped: POverlapped): BOOL; Provadı zapis dat na RS485. Pouzitı jednotlivych parametru : hfile Ř Identifikator (handle) otevreneho portu zıskany z funkce CreateFile. lpbuffer Ř Ukazatel na data, ktera majı byt odeslana. nnumberofbytestowrite Ř Poc et bytu, kteremajı byt odeslany. lpnumberofbyteswritten Ř Adresa prom nne(v Borland Delphi parametr volany odkazem), do kterebude ulozen poc et bytu, kterebyly odeslany. lpoverlapped Ř vlozıme hodnotu NUL, resp. nil. Prıklad: zapis ret zce Ř Borland Delphi 3.0 : function SendString(S:String):Boolean; var Pocet,Delka:Integer; Delka:=Length(S Result:=WriteFile(Soubor,S[1],Delka,Pocet, nil) and (Pocet=Delka end; Takto mu ze vypadat zapis na RS485, je-li tok dat rızen obvody ADFC integrovanymi na kart. Jak bude rutina vypadat, bude-li prenos rızen jednım ze signalu RTS/DTR, se dozvıme pozd ji. Poznamka: funkce WriteFile skoncı pote, co vysle kart poslednı znak. Znak se vsak teprve odesıla a z tohoto du vodu je seriovy port jest n jakou dobu zaneprazdn n a nelze na n j volat dalsı funkce. Adicom Praha, s.r.o. Strana 6 (celkem 11)
ReadFile BOOL ReadFile( HANDLE hfile, // identifikator (handle) portu LPVOID lpbuffer, // adresa pamýti pro prıjem dat DWORD nnumberofbytestoread, // pocet bytu k prectenı LPDWORD lpnumberofbytesre ad, // adresa promýnne, do nız se ulo zı pocet prectenych bytu LPOVERLAPPED lpoverlapped // adresa struktury pro overlapped I/O function ReadFile(hFile: THandle; var Buffer; NumberOfBytesToRead: DWORD; var lpnumberofbytesread: DWORD; lpoverlapped: POverlapped): BOOL; Provadı c tenı dat z RS485. Pouzitı jednotlivych parametru : hfile Ř Identifikator (handle) otevreneho portu zıskany z funkce CreateFile. lpbuffer Ř Ukazatel na vyrovnavacı pam ó, kam budou data zapsana. nnumberofbytestoread Ř Poc et bytu, kteremajı byt nac teny (popr. velikost vyrovnavacı pam ti). lpnumberofbytesread Ř Adresa prom nne(v Borland Delphi parametr volany odkazem Ř var), do kterebude ulozen poc et bytu, kterebyly nac teny. lpoverlapped Ř vlozıme hodnotu NUL, resp. nil. Prıklad: nac tenı kratkeret zcovezpravy z prıstroje Ř Borland Delphi 3.0 : function GetString:String; var Pocet:Integer; Buf:array[0..20] of Char; FillChar(Buf,SizeOf(Buf),#0 ReadFile(Soubor,Buf,SizeOf(Buf),Pocet, nil Result:=StrPas(@Buf end; Adicom Praha, s.r.o. Strana 7 (celkem 11)
EscapeCommFunction BOOL EscapeCommFunction( HANDLE hfile, // identifikator (handle) portu DWORD dwfunc // identifikace funkce function EscapeCommFunction(hFile: THandle; dwfunc: DWORD): BOOL; Zprostredkovava volanı specialnıch funkcı serioveho rozhranı. Umozn uje prımerızenı signalu DTR a RTS, coz lze pouzıt pro rızenı prenosu, nenı-li na kart nastaven automaticky rezim. Pouzitı jednotlivych parametru : hfile Ř Identifikator (handle) otevreneho portu zıskany z funkce CreateFile. dwfunc Ř Tento parametr urc uje, ktera funkce se ma provest. Obsahuje jednu z hodnot CLRDTR, CLRRTS, SETDTR, SETRTS, kterezpu sobı nastavenı, resp. vynulovanı prıznaku DTR (data-terminal-ready), resp. RTS (request-to send). Prıklad: vyslanı ret zce s vyuzitım ruc nıho ovladanı toku dat signalem DTR Ř Borland Delphi 3.0 : function SendString2(S:String):Boolean; var Pocet,Delka:Integer; { nazhavıme smycku } EscapeCommFunction(Soubor,SetDTR Sleep(10 { vyslanı dat } Delka:=Length(S Result:=WriteFile(Soubor,S[1],Delka,Pocet, nil) and (Delka=Pocet { uvolnıme smycku } Sleep(10 EscapeCommFunction(Soubor,ClrDTR end; U tohoto prıkladu si prosım vsimn te zpu sobu prace se signalem DTR, kterym je ovladan tok dat. Procedura Sleep pozastavuje proces na dobu specifikovanou jako parametr v milisekundach (obdoba funkce Delay z Borland Pascalu). Ostatnı procesy b zı nerusen dal. Moznostı se naskyta vıce, toto je vsak pro jednoduchou aplikaci zcela dostac ujıcı. Vzhledem k tomu, ze po ukonc enı funkce WriteFile port jest n jakou dobu pracuje, muze se zejmena na nizsıch rychlostech stat, ze 10 ms bude malo (problemy se zac nou objevovat pri komunikaci 1200 Bd a pomaleji) a c ekanı bude nutneprodlouzit. Naopak neš m rn dlouha doba muze ohrozit komunikaci s rychlejsı periferiı. Adicom Praha, s.r.o. Strana 8 (celkem 11)
GetCommState / SetCommState BOOL GetCommState( HANDLE hcommdev, // identifikator (handle) portu LPDCB lpdcb // adresa kontroln ıho bloku (device control block) BOOL SetCommState( HANDLE hcommdev, // identifikator (handle) portu LPDCB lpdcb // adresa kontroln ıho bloku (device control block) function GetCommState(hFile: THandle; var lpdcb: TDCB): BOOL; function SetCommState(hFile: THandle; const lpdcb: TDCB): BOOL; Umozn uje zjist nı, resp. nastavenı parametru serioveho rozhranı. Pouzitı jednotlivych parametru : hfile Ř Identifikator (handle) otevreneho portu zıskany z funkce CreateFile. lpdcb Ř adresa kontrolnıho bloku zarızenı (Borland Delphi - TDCB) Prıklad: Nastavenı parametru serioveho portu Ř Borland Delphi 3.0 : procedure SetupComm; var DCB:TDCB; GetCommState(Soubor,DCB DCB.BaudRate:=9600; DCB.ByteSize:=8; DCB.Parity:=NOPARITY; DCB.StopBits:=ONESTOPBIT; DCB.Flags:=1; SetCommState(Soubor,DCB end; Nejprve je tedy zjist no aktualnı nastavenı portu, ktereje nato zm n no podle potreby. Nastavene parametry zrejm nenı nutnepodrobn ji vysv tlovat. Za zmınku stojı snad pouze nastavenı parametru Flags Ř zde se volı binarnı (tedy nikoliv textovy) rezim prenosu, je vypnuto rızenı signalu DTR/RTS (ty mohou byt vyuzity pro rızenı toku dat) a je vypnut protokol Xon/Xoff. Struktura device control block (DCB) obsahuje jest mnoho dalsıch prıznaku, ty jsou vsak mimo ramec tohoto c lanku a jejich znalost nenı bezpodmınec n nutna. Potrebnekonstanty jsou k dispozici v helpech, popr. MSDN. Na tomto mıst bych rovn z rad zmınil jednu zkusenost: pouzitı teto funkce muze v n kterych prıpadech byt c asov naroc ne- pod Windows 95 nam reno v n kterych prıpadech az 200 ms (zm na prenosoverychlosti). Hodnoty b hem komunikace jsou sice radov mensı, mohou vsak presto prinest problemy. To muze pri praci s rychlejsımi periferiemi vest i ke ztrat casti prenasenych dat. Adicom Praha, s.r.o. Strana 9 (celkem 11)
GetCommTimeouts / GetCommTimeouts BOOL GetCommTimeouts( HANDLE hcommdev, // identifikator (handle) portu LPCOMMTIMEOUTS lpctmo // adresa struktury casovanı BOOL SetCommTimeouts( HANDLE hcommdev, // identifikator (handle) po rtu LPCOMMTIMEOUTS lpctmo // adresa struktury casovanı function GetCommTimeouts(hFile: THandle; var lpcommtimeouts: TCommTimeouts): BOOL; function SetCommTimeouts(hFile: THandle; const lpcommtimeouts: TCommTimeouts): BOOL; Umozn uje zjist nı, resp. nastavenı parametru c asovanı serioveho rozhranı. Pouzitı jednotlivych parametru : hfile Ř Identifikator (handle) otevreneho portu zıskany z funkce CreateFile. lpctmo Ř ukazatel na strukturu definujıcı c asovanı (Borland Delphi - TCommTimeouts) Prıklad: Vypnutı funkce timeout pro otevreny port Ř Borland Delphi 3.0 : procedure TurnOffTimeouts ; var Tim:TCommTimeouts; Tim.ReadIntervalTimeout:=MAXDWORD; Tim.ReadTotalTimeoutMultiplier:=0; Tim.ReadTotalTimeoutConstant:=0; Tim.WriteTotalTimeoutMultiplier:=0; Tim.WriteTotalTimeoutConstant:=0; SetCommTimeouts(Soubor,Tim end; Pro nejjednodussı zpu sob komunikace je moznehlıdanı c asovanı vypnout. Pri c tenı z portu funkcı ReadFile precte program prav tolik bytu, kolik jich vyslalo zarızenı. Neprovadı se kontrola vyslanı zpravy funkcı WriteFile. V opac nem prıpad c eka v zavislosti na nastavenych c asech na prıjem zadaneho mnozstvı dat. Pri nastavenı prılis dlouhec ekacı doby, resp. ponechanı na zakladnıch hodnotach, dojde v prıpad poruchy prenosu k zastavenı aplikace, aniz by to mohl programator jakkoliv ovlivnit. Proto je vyhodn jsı prıjem dat vlozit do procedury, ktera bude periodicky volana c asovac em Windows (funkce SetTimer, resp. komponenta Timer v Borland Delphi), bude obsahovat volanı funkce ReadFile (timeouty vypnuty funkcı SetCommTimeouts) a jez bude sama zajisóovat obsluhu kontroly prıjmu zpravy. Rovn z vysılanı zpravy je vhodneov rit podle poc tu odeslanych bytu. Podrobn jsı referenci najde c tenar v helpu k vyvojovym nastroju m, v MSDN a jinde. Adicom Praha, s.r.o. Strana 10 (celkem 11)
Tvorba aplikace vyuzıvajıcı RS485 Fragmentu kodu uvedenych jako prıklady k jednotlivym funkcım jiz lze vyuzıt pri tvorb konkretnı aplikace. Postup je nasledujıcı: 1. Otevrenı portu funkcı CreateFile. Test š sp snosti. 2. Nastavenı prenosovych parametru funkcı SetCommState 3. Zrusenı c ekanı na prıjem, resp. vyslanı znaku Ř funkce SetCommTimeouts 4. T lo programu 5. Uzavrenı portu funkcı CloseHandle Prestoze uvedenym prıkladu m je moznevytknout, ze postradajı moznost avıza o prıchozı zprav po seriovem portu a je tudız nutno vyuzıt poolingu, pro zakladnı seznamenı s moznostmi prechodu na 32bitovou platformu to, domnıvam se, pln postac uje. Karta PCI-685 PCI-685 je rozsirujıcı karta pro pocıtac e PC, ktera obsahuje dva porty seriovych komunikac nıch linek standardu RS422/485. Vyuzıva obvodu registrov kompatibilnıch se standardy 8250, resp. 16C550, jejichz podpora je zac len na do vsech b znych operac nıch systemu. Umozn uje vyuzitı men obsazenych kanalu prerusenı (IRQ) a v tsı vyb r adres I/O. S prıdavnych hodinovym generatorem je mozna komunikace na nestandardnıch rychlostech. Rezim prenosu je ovladatelny programov signaly DTR/RTS, nebo je rızen automaticky obvody ADFC. Svou koncepcı je karta urc ena zejmena pro: distribuovanesystemy rızenı procesu automatizac nı prostredky komunikace s m rıcımi systemy prenos dat mezi pocıtac i Kde lze kartu PCI-685 objednat Multifunkc nı komunikac nı kartu PCI-685 lze objednat na adrese: ADICOM Praha, spol. s r.o. Frantiska Kadlece 9 180 00 Praha 8 tel.: 02 / 83842047, 0603 / 475161, fax: 02 / 83841048 Internet: http://www.aditech.cz, email: info@aditech.cz Aktualnı ceny jsou k dispozici na nasich strankach WWW. Zde muzete zıskat i podrobn jsı informace o dalsıch m rıcıch zarızenıch a jejich podpore pro 32-bitoveoperac nı systemy. Mnoho š sp chu pri vyvoji 32-bitovych aplikacı preje Adicom Praha, s.r.o. V Praze 6. 2. 1999 Michal Bures Adicom Praha, s.r.o. Strana 11 (celkem 11)