Protokol MiniNet je používán v zařízeních rakouské firmy Bernecker & Rainer. Komunikace v sítích s těmito zařízeními je vždy typu Master – Slave.
Důležité | |
---|---|
Od verze Setru 9.0.17.0 je názvosloví sjednoceno podle schématu: PLC Master - CU RADIOSLAVE ... CU RADIOMASTER - Slave PLC CU (radiomodem) připojený přes SCC k PLC Master je nazýván
RADIOSLAVE (RS), Starší Setr používá opačné označení, tedy: ( PLC Master - CU RADIOMASTER ... CU RADIOSLAVE - Slave PLC ) |
Většina zpráv protokolu MiniNet se dá charakterizovat touto strukturou:
| STX/8 | LEN/8 | NODE/8 | INDEX/8 | DATA/8*N | CHK/8 |
kde:
STX | začátek rámce 02h. Vyskytne-li se 02h v datech, musí následovat 00h. Tzn. 02h je vysíláno jako 0200h |
LEN | délka (od STX do CHK včetně), doplněné 00h v datech (za 02h) se nezapočítávají. LEN může nabývat hodnot od 05h do FFh. |
NODE | adresa, viz také parametr |
INDEX | identifikace rámce pro soulad dotazů a odpovědí u mastera (číslování, opakování, chyby apod.) |
DATA | řada bytů vlastních dat |
CHK | kontrolní byte (výpočet uveden dále) |
Výjimku z výše uvedené struktury tvoří jednobytová zpráva ACK (06h), kterou vysílá pouze slave jako odpověď na některé požadavky mastera.
Protokol MININET-MORSE vybírá výše uvedenou strukturu dat z jakéhokoliv došlého rámce. V praxi většina PLC vysílá před STX a za CHK různý počet synchronizačních bytů FFh.
Adresace:
CU (MR400) RS odesílá data vždy na adresu, která se vytvoří tak, že nejnižší byte vlastní adresy (na příslušném Node) se přepíše bytem NODE, viz Formát dat. V případě, že NODE je 10h (broadcast) paket je zahozen. MR400 RM odesílá data vždy na adresu, ze které přišel dotaz.
a) PLC ->
MR400
V případě stanice RM kontrola, zda jsou očekávána data. RM smí vyslat data jen jako odpověď na žádost – neočekávaná data jsou zahozena.
Kontrola, zda přijatý rámec má velikost min. 5 byte (výjimka pouze u stanice RM na ACK). Kratší rámce zahozeny.
V přijatém rámci vyhledáno STX, tzn. rámec nemusí začínat STX. Není-li v rámci STX (nenásledováno 00h) je rámec zahozen.
Kontrola délky LEN. Je-li větší než velikost přijatého rámce, je rámec zahozen.
Dle udané délky LEN vyhledáno CHK, tzn. rámec nemusí končit CHK.
Kontrola CHK.
MORSE kanálem se přenáší jen INDEX a DATA (viz. Formát dat). (STX, LEN, NODE, CHK se nepřenáší) Zprávy jsou v kanálu MORSE přenášeny typem paketu USER DATA. V případě ACK se přenáší paket USER DATA s nulovou délkou dat.
b) MR400 ->
PLC
K přijatým datům z MORSE kanálu doplněno na příslušné pozice STX, LEN, NODE, CHK (dopočítáno).
Jen RS smí přijmout paket s nulovou délkou. V tomto případě vytvořen jednobytový paket 06h.
Rámec odeslán do SC kanálu.
Z uvedeného je zřejmé, že MORSE kanálem jsou přenášena pouze užitečná data a Index zabezpečená algoritmy systému Morse. Na drátové lince (SC kanálu) jsou data zabezpečena algoritmy protokolu MiniNet.
Na lince CU-PLC není používán žádný handshake – ani sw (pomocí ACK či jiných znaků v linkové vrstvě protokolu) ani hw (je používáno pouze 3 vodičové propojení – RXD, TXD, GND). V případě přeplnění fronty paketů na odeslání do MORSE kanálu (4 pakety) není jak informovat PLC, a proto jsou případné další přicházející pakety zahozeny.
PLC Master - RADIOSLAVE ...... RADIOMASTER - PLC Slave MiniNet 690F0011 690F0022 MiniNet PLC Master ----> RS 11 (RADIOSLAVE 690F0011) FFFFFF 02 07 22 40 1B52 4B FFFF dotaz RS 11 ----> RM 22 40 1B52 adresa source 11 se uloží v CU RM 22 RM 22 ----> PLC Slave 02 07 22 40 1B52 4B PLC Slave ----> RM 22 FF 02 06 22 C080 DA FFFFFF odpověď RM 22 ----> RS 11 C0 80 RM 22 odešle paket na adresu 11 RS 11 ----> PLC Master 02 06 22 C0 80 DA
MININET parameters: PLC Master - CU RADIOSLAVE ... CU RADIOMASTER - Slave PLC (m)ode :RADIOSLAVE (wired to master) (s)lave adr :FFFF (q)uit
(m) |
POZOR – Setr starší než 9.0.17.0 používá opačné označení ! |
(s) | Pouze pro CU RADIOSLAVE:
|
Byte Minet::calc_chk(Byte *pb, Word size) { Word chk, i; chk = 0; i = 0; while (i < size) { if ((*(pb - 1) == (Byte)STX) && (*pb == 0) && (i>4)) { //4=STX|LEN|NODE|INDEX i++; //supplementary 00 after STX in data area is not included pb++; } else { chk <<= 1; if ((chk & 0x100) == 0x100) { chk += 1; chk &= 0xFF; } chk += *pb++; if ((chk & 0x100) == 0x100) { chk += 1; chk &= 0xFF; } i++; } } if ((Byte)chk == (Byte)STX) chk = ~chk; return((Byte)chk); }//Minet::calc_chk