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 prostr edku 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 mu zeme zvolit takrka libovoln– (pozor na IRQ9 Ř tam je mapovano IRQ2), bude vyhodne zvolit I/O adresu odpovıdajıcı b–zne adrese 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–, mu zeme 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 prostr edı 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 // identifik ator (handle) p redlohy ); 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 ; begin 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 š c ely 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. VracıTRUE pri š sp–chu operace, FALSE v opac nem prıpad–. 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, // identifik ator (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 . VracıTRUE pri š sp–chu operace, FALSE v opac nem prıpad–. Prıklad: zapis ret–zce Ř Borland Delphi 3.0 : function SendString(S: String):Boolean; var Pocet,Delka:Integer; begin 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, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRe ad, LPOVERLAPPED
lpOverlapped
identifik ator (handle) portu adresa pam ýti pro prıjem dat pocet bytu k prectenı adresa prom ýnne, do nız se ulo zı pocet prectenych bytu // 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 . VracıTRUE pri š sp–chu operace, FALSE v opac nem prıpad–. Prıklad: nac tenıkratkeret–zcovezpravy z prıstroje Ř Borland Delphi 3.0 : function GetString:String; var Pocet:Intege r; Buf:array[0..20] of Char; begin 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, // identifik ator (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). VracıTRUE pri š sp–chu operace, FALSE v opac nem prıpad–. 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; begin { ”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, mu ze 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 nutne prodlouzit. Naopak neš m–rn– dlouha doba mu ze ohrozit komunikaci s rychlejsıperiferiı.
Adicom Praha, s.r.o.
Strana 8 (celkem 11)
GetCommState / SetCommState BOOL GetCommState( HANDLE hCommDev, // identifik ator (handle) portu LPDCB lpdcb // adresa kontroln ıho bloku (device control block) ); BOOL SetCommState( HANDLE hCommDev, // identifik ator (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) VracıTRUE pri š sp–chu operace, FALSE v opac nem prıpad–. Prıklad: Nastavenıparametru serioveho portu Ř Borland Delphi 3.0 : procedure SetupComm; var DCB:TDCB; begin GetCommState(Soubor,DCB); DCB.BaudRate:=9600; DCB.ByteSize:=8; DCB.Parity:=NOPARITY; DCB.StopBi ts:=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. Potrebne konstanty jsou k dispozici v helpech, popr. MSDN. Na tomto mıst– bych rovn–z rad zmınil jednu zkusenost: pouzitı teto funkce mu ze 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 mu ze pri praci s rychlejsımi periferiemi vest i ke ztrat– c asti prenasenych dat.
Adicom Praha, s.r.o.
Strana 9 (celkem 11)
GetCommTimeouts / GetCommTimeouts BOOL GetCommTimeouts( HANDLE hCommDev, // identifik ator (handle) portu LPCOMMTIMEOUTS lpctmo // adresa struktury casovanı ); BOOL SetCommTimeouts( HANDLE hCommDev, // identifik ator (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) VracıTRUE pri š sp–chu operace, FALSE v opac nem prıpad–. Prıklad: Vypnutıfunkce timeout pro otevreny port Ř Borland Delphi 3.0 : procedure TurnOffTimeouts ; var Tim:TCommTimeouts; begin 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 prec te 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:
[email protected] Aktualnı ceny jsou k dispozici na nasich strankach WWW. Zde mu zete 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)