RFC2217

Z onlinetechnology.cz

Přejít na: navigace, hledání

Obsah

Převodník Ethernet - Serial

Pomocí modulů SDS MICRO nebo SDS MICRO DIN lze jednoduše realizovat převodník mezi rozhraním Ethernet a sériovým CMOS 3V3 UART nebo RS232 nebo RS485 rozhraním (záleží na tom, který konkrétní HW jste zakoupili).

Firmware musí být novější než 26.7.2010 (dřívejší verze neměly tuto funkci ve FW).

Virtuální sériový port

Pomocí vhodného driveru lze v operačním systému (Windows®, Linux) realizovat tzv. virtuální sériový port (VCP). Znamená to, že v operačním systému se vytvoří COMx port (např. COM34), který ovšem není fyzicky na PC přítomen. Programy jej však vidí a mohou s ním pracovat bez problému, aniž by tušily, že fyzicky je konektor tohoto rozhraní až na elektronice modulu SDS MICRO.

Díky tomu lze mít konektor pro sériové rozhraní (COM port) např. na "druhé straně světa" než je aktuálně dané PC. Propojení je provedeno pomocí Ethernetu (Internetu), stačí znát IP adresu příslušného modulu SDS MICRO a nainstalovat a nastavit vhodný driver do systému.

Vzhledem k tomu, že je přesně definováno chování firmware v modulech SDS MICRO, můžete si funkci virtuálního sériového portu doplnit do vlastních programů i bez zmíněného driveru. Stačí vytvořit přímé TCP/IP spojení na SDS MICRO, který má být převodníkem Ethernet/Serial a komunikovat přímo s ním. Komunikace probíhá dle standardu RFC2217.

Virtuální sériový port ve Windows®: nainstalujte si ovladače, a to: com0com a com0tcp, viz tento odkaz. Samozřejmě lze použít i jiné, tyto jsou však zadarmo.

Pozor! V HW jsou k dispozici pouze komunikační linky RxD a TxD (jak u RS232, tak pro UART). Další signály už k dispozici nejsou (modem state/flow control/line state).

Výchozí konfigurace sériového portu je 9600bps, 8n1 (odpovídá základnímu nastavení konzole Mikrotiku). Lze to kdykoliv změnit pomocí vhodných příkazů.

Princip funkce převodníku Ethernet/Serial - v zařízení je Telnet server, který předává svůj obsah na sériový port. Doplňkem je RFC2217, kterým se nastavují HW parametry sériového rozhraní (UART control).

Soubor:And_sds_VCP_1.gif‎


Pro programátory: Java komponenta, pro komunikaci se zařízením (vzdáleným sériovým portem přes TCP), je ke stažení zde.

RFC2217

Tento protokol definuje způsob konfigurace vzdáleného sériového portu. Při požadavku na spojení (tj. vytvoření virtuálního sériového portu), se driver nebo aplikace připojí pomocí TCP/IP k zařízení SDS MICRO, prostřednictvím Telnet RFC854 protokolu, a pak pomocí posílání příkazů definovaných v RFC2217 nakonfiguruje fyzické parametry sériového rozhraní (rychlost, parita, počty bitů a tak dále). Tato funkce je někdy označována taky jako NVT.

Po dokončení konfigurace se přejde k přímé duplexní komunikaci, kdy vše co je na sériovém rozhraní je předáno prostřednictvím TCP/IP paketů, a vše co přijde ze sítě je předáno zase na sériové rozhraní. Vytvoří se tak transparentní most mezi komunikující aplikací na jedné straně a fyzickým sériovým rozhraním na straně SDS MICRO.

Konkrétní příkazy (co a jak poslat) jsou detailně popsány v RFC2217, který je volně k dispozici.

název                dec   počet datových bajtů   poznámka                               
OPT_RFC2217          44    x                      použito jako option pro pro IAC SB 

SIGNATURE            0     0                      vrací textový popis zařízení (info od výrobce, v tuto chvíli ale prázdné).
SET_BAUDRATE         1     4                      změna baudové rychlosti sériového portu, data: přímo zapsat rychlost
SET_DATASIZE         2     1                      změna velikosti datového bajtu (default 8 bitů)
SET_PARITY           3     1                      změna parity, popř. ruční ovládání 9 bitu (pro adresaci)
SET_STOPSIZE         4     1                      změna nastavení stop-bitu
SET_CONTROL          5     1                      nepoužito (nejsou vyvedene HW linky)
NOTIFY_LINESTATE     6     1                      nepoužito (nejsou vyvedene HW linky)
NOTIFY_MODEMSTATE    7     1                      nepoužito (nejsou vyvedene HW linky)
FLOWCONTROL_SUSPEND  8     0                      nepoužito (nejsou vyvedene HW linky)
FLOWCONTROL_RESUME   9     0                      nepoužito (nejsou vyvedene HW linky)
SET_LINESTATE_MASK   10    1                      nepoužito (nejsou vyvedene HW linky)
SET_MODEMSTATE_MASK  11    1                      nepoužito (nejsou vyvedene HW linky)
PURGE_DATA           12    0                      smazaní obsahu všech FIFO (zahození dosud přijatých a neodeslaných dat)

Každý příkaz odesílá odpověď, ve které je číslo příkazu zvýšeno o 100 (příklad: pošlete <SET_BAUDRATE> xxx, odpověď je <SET_BAUDRATE+100> xxx, kde xxx jsou konkrétní data).

Nepoužité příkazy nejsou vykonány, ale interní stav je uchován a odpěď je odeslána.

Příkaz (bajt cmd, viz výpis) pošle klient do telnet serveru následovně:

IAC SB OPT_RFC2217 cmd data[0/1/4B] IAC SE

Odpověď (telnet server do klienta) vypadá takto (bajt po bajtu):

IAC SB OPT_RFC2217 cmd+100 data[0/1/4B] IAC SE

Pozor i v rámci datových bajtů (jak v příkazu, tak v odpovědi) se každý bajt o hodnotě 0xFF (mimo IAC) kóduje pomocí IAC 0xFF. Datové bajty jsou v délkovém rozmezí 0 Byte až 4 Byte. Počet datových bajtů musí být dodržen, viz tabulka výše.

Příklad změny počtu bitů v datovém bajtu na 7 bitů: 0xFF 0xFA 0x2C 0x02 0x07 0xFF 0xF0

Vzhledem k tomu, že zde uvedené postupy a hodnoty jsou obecně považovány za standard, bude zařízení komunikovat s celou řadou aplikací a driverů, i od jiných výrobců (kteří dodržují RFC).

RFC854

Komunikace s SDS MICRO probíhá prostřednictvím Telnet protokolu, popsaném v RFC854. Při požadavku na vytvoření spojení pro virtuální sériový port, se vnějši aplikace připojí právě k Telnetovému rozhraní SDS MICRO, pak provede konfiguraci a hned následuje samotná požadovaná komunikace.

Bližší informace zde budou doplněny.

Speciální příkazy pro Telnet jsou předávány prostřednictvím "IAC", tj. bajtem "0xFF" (255dec). To vyžaduje, aby při odesílání byly všechny bajty "0xFF", které nejsou příkazem ale jsou to datové bajty, byly poslány jako "0xFF 0xFF" (dvakrát "0xFF"). To v praxi odpovídá speciálnímu příkazu "IAC 0xFF", čili do datového výstupu (na sériový port) je zapsáno jednou "0xFF".

Podobně je provedeno zpracování při příjmu ze sériového rozhraní, při příjmu bajtu "0xFF" jsou odeslány "0xFF 0xFF" (tj. jsou odeslány dva stejné bajty "0xFF" hned za sebou).

Výhodou použití Telnet na straně SDS MICRO je i to, že se můžete připojit libovolným Telnet klientem a snadno přejít přímo na sériové rozhraní na SDS MICRO. Toto se dá využít např. u Mikrotiku tak, že se propojí kabelem COM port na SDS MICRO s konzolovým portem na desce Mikrotiku. Pak lze snadno přistupovat na konzolový port ze vzdáleného počítače tak, jako by jste byli přímo u daného Mikrotiku, stačí si pustit Telnet, připojit se k SDS MICRO, nakonfigurovat příkazy sériové rozhraní a pak je přímo přenášeno vše, co je nakonzolovém portu (a naopak, vše co napíšete do Telnet klientu se přenese na Mk).

Otestování funkčnosti

Lze provést jednoduchý rychlý test. Spojte na RS232 konektoru piny TxD a RxD dohromady, tím se odeslané data vrátí na příjem (tj. co se pošle ven se hned přijme). Pak se připojte prostřednictvím telnetového klienta a odešlete nějaký text. Co napíšete, se musí zpětně vrátit (zobrazit se). Současně lze otevřít webové rozhraní, a na stránce Serial con zkontrolovat stav připojení, a statistiku přijatých a odeslaných bajtů dat.

cmd.exe

telnet

> o 192.168.1.250

Použití jako převodník na RS422

RS422 je diferenciální duplexní sběrnice (dvakrát dva dráty). Připojení k SDS MICRO je možné snadno provést - potřebujete připojit externí chip pro převod úrovní.

Výhodou RS422 je úplné oddělení komunikačních směrů (tj. samotné vedení pro vysílací směr, samotné vedení pro přijímací směr), takže není potřeba doplňkový signál pro řízení směru.

SDS MICRO se zapojuje jako MASTER - řídí vysílací směr, přijímá z přijímacího směru.

Použití jako převodník na RS485

RS485 je oblíbená, výhodná, snadno použitelná diferenciální simplexní komunikační sběrnice. Komunikační linka je sdílená pro oba směry, což vyžaduje řízení přístupu (vysílat může jen jeden z připojených zařízení, jinak vznikne kolize). Realizace je opět snadná, je potřeba využít externí chip pro převod úrovní (UART/RS485 nebo RS232/RS485).

Z důvodu řízení směru je potřeba získat řidící signal pro přepínání směru, tento signál musí generovat MASTER. Vždy, když přijde po TCP/IP datový bajt(y), je bez ohledu na stav sběrnice RS485 tato zabrána pro MASTER a ten začne vysílat. Tato informace se musí předat převodníkovému chipu (obvykle je signál pojmenován jako DE, tj. "driver enable"). Z tohoto pohledu je SDS MICRO vždy MASTER. Takže v konečném důsledku by jsme z SDS MICRO potřebovali vyvést signály RxD, TxD a třetí signál pro řízení směru, a tyto signály se připojí na převodník 232/485.

Základní varianta realizace převodníku, kdy však není potřeba zmíněný doplňkový signál řízení směru, využívá následující zapojení převodníku (schéma bude zde zveřejněno), kdy přepínání směru je "automatické" (vždy při vysílání znaků z Master). Jde o to, že datový pin pro vysílaní, na budiči linky RS485, se připojí na logickou nulu (GND), a piny RE/DE se spojí dohromady a připojí se na TxD pin (který byl původně právě na tom datovém pinu).

Pokud přesto bude potřeba vyvést z SDS MICRO samostatný signál pro řízení směru, lze k tomu využít např. pin "D0", dostupný na systémovém konektoru (SDS MICRO light) nebo na pájecí plošce na desce (SDS MICRO DIN). Dále je samozřejmě potřeba správný firmware, který tento pin správně obsluhuje.

SDS MACRO

SDS MACRO umožňuje použít doplňkový modul, díky kterému získáte přímo výstup sběrnice RS485. Tento modul se chová jako sběrnicový master. Navíc je zde doplňující možnost, kromě výchozí kdy se jedná o převodník Ethernet/RS485, použít tento převodník pro ovládání externích speciálních vstupně/výstupních modulů, které nabízíme. Ovládání se pak provádí konkrétními funkcemi SDS-C programu.

Adresace na sériové lince pomocí 9. bitu

Pomocí jednoduché funkce lze ovládat 9. bit v každém odeslaném bajtu v sériovém rozhraní. Využívá se RFC2217, konkrétně ručního řízení parity (SET_PARITY). Pokaždé, když chcete změnit hodnotu 9. bitu, pošlete tento příkaz s novou hodnotou. Pak zůstane (až do další změny) tento bit nastavený. Tato funkce se využívá zejména u RS485, kdy se posílají data v blocích, a kde první odeslaný bajt má právě nastavený 9. bit. Tím se označí jako adresa, a přijímače to tak vyhodnotí a data jsou zpracována jen právě v tom zařízení, které má nastavenou adresu shodnou. Tato funkce je přímo hardwarově implementována ve většině mikroprocesorů, a proto je velmi často využívána, a proto je taky podpora implementována v našich výrobcích.

Použití jako převodník na CAN

Je potřebné použit externí hardware, který má vlastní inteligenci, a který má na výstupu sériové rozhraní (UART nebo RS232). Pak se SDS MICRO použije jen jako běžný virtuální sériový port, zpracování základních úrovní CAN sběrnice se ponechá na externím připojeném hardware (převodníku CAN/serial).

Využití sériové linky v SDS-C programu

Od verze SDS-C č. 03 je možné z vlastního SDS-C programu na sériovou linku libovolně cokoliv zapisovat.

Od verze SDS-C č. 04 je možné z vlastního SDS-C programu ze sériové linky číst data (přes buffer), a tak plnohodnotně obousměrně komunikovat s připojenými zařízeními na sériové lince (obzvlášť výhodné pro automatizaci přes RS485, kdy je řídící program přímo v zařízení SDS).

Sériová linka je trvale přístupná (pro čtení a zápis) SDS-C programu. Připojení Ethernetového klienta k převodníku Eth/UART tuto funkci nenaruší - pouze dojde ke smazání čtecího bufferu (v okamžiku připojení je zahozeno vše co bylo přečteno ze sériové linky a nebylo dosud odebráno programem).

Kdokoliv, tzn. Ethernetový klient, nebo SDS-C program, může kdykoliv změnit parametry sériové linky. Proto si dávejte pozor a předejdete případným překvapením. Program v SDS-C nemá jak zjistit, že došlo ke změně. Ethernetový klient ale díky telnetové komunikaci, která si udržuje informace o stavu, se dozví nové hodnoty nastavení, pokud se na ně kdykoliv zeptá.

Nastavení sériové linky viz funkce serial_set() (informace na stránce o SDS-C funkcích).

Zápis na sériovou linku ze strany SDS-C se provádí pomocí funkce serial_text_out(). Všechny parametry, předané při volání této funkci, jsou přeneseny "najednou" (postupně za sebou bajt po bajtu).

Informace o přenosu "najednou" (tzn. v jednom nepřerušeném bloku) je důležitá pokud používáte RS485, kdy po dobu přenosu musí být aktivní RS485 master (Driver Enable signál), o což se zařízení SDS MACRO postará samo automaticky (pokud máte náš RS485 rozšiřující modul, nebo pokud používáte svůj, ale správně připojený na příslušný konektor). V případe SDS MICRO se o řízení DE signálu musíte starat sami (např. ručním řízením některého z výstupu, ideálně pin D0).

Pokud je výstup na linku RS422 nebo RS232 (tj. oddělené RX a TX trasy), pak vás signál DE nezajímá a předchozí odstavec je pro takový případ nepodstatný.

Čtení ze sériové linky - všechny přijaté znaky z linky jsou vkládány postupně za sebou do vyrovnávacího bufferu. Velikost bufferu je 768 bajtů (pozor, toto se mění s různými verzemi firmware, starší verze měli jen 512 bajtů atd.). Z jedné strany je buffer plněn ze strany hardware (přijaté znaky z linky), z druhé strany je vyprazdňován dle potřeby převodníkem (je-li připojen klient, jsou mu data ihned předána) nebo postupným čtení ve vašem SDS-C programu. Pokud se buffer naplní (není dostatečně rychle vyprazdňován), jsou nejstarší přijaté znaky zahazovány - dojde tak sice ke ztrátám, ale ne těch nejnovějších informací, což je výhodnější.

Pozor, pokud je připojen klient k Ethernetovému převodníku Eth/UART (Virtual COM port), jsou data předávána prioritně převodníku a na program v SDS-C se nedostane (z bufferu lze odebrat každý znak jen jednou, logicky).

Čtení v SDS-C programu se provede čtením hodnoty sys[48] resp. sys[48], viz popis jejich funkce na této stránce. Každe jednotlivé přečtení sys[49] vyjme znak z bufferu (takže při dalším čtení už tam ten znak není), proto musíte umět správně napsat svůj SDS-C program = vložit obsah sys[49] do uživatelské proměnné, a dále pak pracovat s touto proměnnou. Jakmile znak zpracujete, a chcete další, opět jen jednou přečtete sys[49].

Hodnota v sys[48] se může číst libovolně mnohokrát, nemá na obsah bufferu vliv. Pouze informuje o jeho naplnění (je-li v bufferu něco ke čtení nebo je-li prázdný).

Konfiguace sériové linky při startu zařízení

Často je požadavkem nastavit parametry sériové linky při startu zařízení SDS, aby pak nebylo potřeba měnit konfiguraci později (např. při připojení telnet klienta).

Příklad nastavení 9600 bps, 8 datových bitů, 1 stop bit, žádná parita:

main
{
 // nastav 9600 8n1
 serial_set(9600, 8, 1, 0);
 
 // a zustan zde, po SDS-C ted uz nic vice nechceme
endloop:
 goto endloop;
}

Tento jednoduchý SDS-C program nahrajte do svého zařízení a je to. Samozřejmě je možnost funkci serial_set() (více zde)použít i v rámci složitějšího programu.

Osobní nástroje
Translate