IEC 101/104 decoder
V práci deň čo deň pracujeme s protokolmi IEC 60870-5-101 a IEC 60870-5-104. RTU, master stanice, linky cez sériovku aj TCP — to je bežná realita. A často sa stretávame s problémami, kde nestačí vedieť, že „niečo nefunguje“. Treba rozobrať konkrétny rámec, pozrieť sa na Type ID, COT, IOA, sekvencie, checksum — a presne zistiť, čo sa deje počas komunikácie medzi zariadeniami.
Wireshark alebo log z master stanice ti ukáže hex. Norma IEC 60870 je na to super referencia, len v praxi nemáš vždy čas listovať stovky strán, keď master neodpovedá, RTU posiela divné hodnoty alebo sa spojenie po STARTDT správa inak, než čakáš. Chceš rýchlo vedieť, či ide o otvorenie dátového kanála, potvrdenie, interrogation, alebo spontánnu hodnotu z konkrétneho bodu.
Preto som na webe pridal dva nástroje do sekcie Tools — hlavne pre seba, ale nech sú dostupné aj ostatným, ktorí riešia to isté:
- **IEC 104 decoder** — TCP traffic, typicky port 2404
- **IEC 101 decoder** — sériová linka, FT 1.2 rámce
Oba bežia celé v prehliadači. Hex nikam neposielam — skopíruješ bajty z capture alebo logu, klikneš Dekódovať a máš rozbalený výsledok. Tento článok nie je rozbor protokolu od nuly; ak ťa zaujíma teória, na konci sú odkazy, kde sa o 101 a 104 dočítaš viac.
Automatické rozpoznanie veľkostí polí
Selecty hore (COT, CA, IOA a pri 101 ešte Link addr) nemusíš pred dekódovaním ručne ladiť. Sú tam ako predvolený profil — typicky COT 2 B, CA 2 B, IOA 3 B — ale dekodér pri rozbaľovaní ASDU sám skúša kombinácie a vyberie tú, ktorá najlepšie sedí na obsah rámcu.
Vo výsledku uvidíš sekciu Zistený profil. Ak sa automaticky zistené veľkosti zhodujú s tým, čo máš v selecte, napíše to priamo. Ak nie — ukáže, čo našiel, a doplní poznámku, že sa to líši od nastavenia hore. Selecty teda meníš len vtedy, keď chceš vynútiť konkrétny profil projektu, alebo keď auto-detekcia pri poškodenom / nejednoznačnom hex-e trafí vedľa.
Ako to funguje (zjednodušene):
Pri IEC 104 a IEC 101 (variable rámec s ASDU) dekodér prejde všetky rozumné kombinácie dĺžok polí ASDU — COT 1 alebo 2 bajty, CA 1 alebo 2 bajty, IOA 1 až 3 bajty (spolu 12 variantov). Pre každú skúsi ASDU rozparsovať a ohodnotí, či výsledok dáva zmysel:
- sedí dĺžka — ASDU presne vyplní rámec, nič nezostane navyše ani nechýba
- pozná Type ID a COT (cause of transmission)
- Common address a IOA vyzerajú rozumne (nie absurdne veľké čísla)
- pri typických rámcoch (napr. interrogation s IOA = 0) dostane kombinácia bonus
Vyhrá kombinácia s najlepším skóre. Hodnoty v selecte hore sú len preferencia — ak viac variantov sedí podobne, mierne uprednostní tú, ktorú máš nastavenú.
Pri IEC 101 navyše rieši dĺžku link adresy (1 alebo 2 bajty):
- pri fixed rámci (
10 … 16) ju určí z celkovej dĺžky rámca a overí checksum - pri variable rámci skúsi obe možnosti a vyberie tú, kde sedí checksum a za adresou začína zmysluplné ASDU
Pri rámcoch bez ASDU (napr. IEC 104 STARTDT / TESTFR, IEC 101 fixed link alebo ACK E5) sa auto-detekcia aplikačných polí nespúšťa — tam nič nastavovať netreba, ide čisto o link / APCI vrstvu.
Balanced vs unbalanced — ako to dekodér odhaduje
Na 101ke okrem dĺžok polí vie dekodér pri link vrstve odhadnúť, či komunikácia vyzerá skôr ako unbalanced (klasický master/slave — master pýta, slave odpovedá), alebo balanced (obe stanice môžu iniciovať prenos). Nie je to magická detekcia z konfigurácie RTU — ide o odhad z control poľa FT 1.2 rámca a prípadne z celého logu.
Vo výsledku to uvidíš v Zistenom profile ako Režim link vrstvy.
Z jedného rámca sa pozerá na bit PRM (či ide o primárnu alebo sekundárnu stanicu) a function code (FC):
Unbalanced — typické znaky:
- PRM = 1 a FC 9, 10 alebo 11 → primárny poll (request link status, request class 1/2) — klasický master ťahá dáta
- PRM = 0 a FC 0, 8, 9 alebo 11 → odpoveď sekundárnej stanice (ACK, user data response, link status…)
Neurčené — user data s PRM = 1 (FC 3 alebo 4) môže byť v oboch režimoch; z jedného rámca to nepoznáš.
Z viacerých riadkov logu to funguje lepšie:
- ak sa v logu opakujú typické polly a odpovede, pridá body pre Unbalanced
- ak sú user data s PRM = 1 v oboch smeroch (prijaté aj odoslané) a žiadny typický unbalanced vzor, označí to ako Pravdepodobne balanced — obe strany niečo iniciujú
Čo z toho brať: pri jednom capture to ber ako nápovedu, nie ako záver z konfigurácie. Definitívne vieš, čo máš nastavené na RTU a v master stanici — dekodér len porovná, či správanie na linke tomu sedí. Ak riešiš „prečo neposiela spontánne“, balanced vs unbalanced často vysvetlí, kto smie začať prenos.
Ktorý nástroj kedy
Jednoducho: vidíš tcp.port == 2404, dissector iec60870_asdu, alebo v logu (ELVAC) R_104 / S_104 → IEC 104.
Sériový capture, rámce 10 … 16 alebo 68 … 16, prípadne log (ELVAC) R_101 / S_101 → IEC 101.
V našej praxi 101 používame na SCADA — komunikácia master ↔ RTU po sériovej linke (RS-232/485), typicky FT 1.2 rámce. 104 používame s externými zariadeniami a perifériami cez TCP/IP. Dobrá správa je, že aplikačná časť (ASDU) je si príbuzná — oba dekodéry ukážu podobné veci: Type ID, COT, IOA, hodnoty bodov. Rozdiel je hlavne v tom, ako sú bajty zabalené po ceste — pri 101 ešte link layer a checksum, pri 104 APCI a I/S/U formáty.
IEC 104 decoder
Odkaz: theoldone.sk/tools/iec104-decoder/
Tento nástroj rozbalí jeden APDU — APCI (či je to I, S alebo U rámec) a ak tam ASDU je, tak Type ID, Cause of Transmission, Common Address a IOA. Presne to, čo potrebuješ, keď debuguješ, prečo master neposiela dáta, alebo či RTU odpovedá správnym COT.
Ako na to:
- Otvor stránku nástroja.
- Do textového poľa vlož hex — čistý reťazec typu
68 04 07 00 00 00, alebo celý riadok z logu. Dekodér si hex sám vytiahne. - Klikni Dekódovať.
Selecty COT / CA / IOA hore môžeš nechať na predvolených hodnotách — pri rámcoch s ASDU ich dekodér sám rozpozná a ukáže v Zistenom profile. Ručne ich meníš len keď potrebuješ vynútiť profil stanice alebo keď auto-detekcia nesedí.
Na stránke sú ukážky ako chips — STARTDT act, TESTFR act, M_ME_NC ×2 a pod. Hodí sa to na rýchly test, alebo keď si chceš porovnať výstup s vlastným capture.
Ak vložíš viac riadkov naraz (jeden APDU na riadok), zobrazí sa tabuľka logu. Klikneš na riadok a prepneš detail — užitočné pri dlhšom exporte z master stanice, keď riešiš celú sekvenciu komunikácie.
Typický postup z Wiresharku: filter tcp.port == 2404, v pakete nájdeš payload (často začína 68), skopíruješ hex a vložíš do dekodéra. Viac filtrov mám vo Wireshark cheatsheet.
IEC 101 decoder
Odkaz: theoldone.sk/tools/iec101-decoder/
Tu ide o FT 1.2 — link layer, checksum — a ak je v rámci ASDU, to isté čo pri 104. Pri sériovke je to ešte o krok navyše: fixed rámce na riadenie linku, variable rámce na dáta.
Ako na to:
- Otvor nástroj.
- Vlož hex alebo riadok logu.
- Fixed rámec
10 … 16— reset linku, request class 1/2, link status… - Variable rámec
68 L L 68 … 16— nesie ASDU - Jednobajtový ACK
E5
- Dekódovať.
Rovnako ako pri 104 — selecty hore (Link addr, COT, CA, IOA) sú predvolený profil. Link adresu aj veľkosti ASDU polí dekodér pri variable rámci rozpozná sám; vo výsledku to uvidíš v Zistenom profile. Ručne ich nastavíš len keď auto-detekcia trafí vedľa alebo chceš vynútiť konkrétny projekt.
Fixed rámce často ASDU vôbec nemajú — uvidíš len link vrstvu a to je v poriadku. Pri problémoch so spojením sa práve tu začína: reset linku, request class 1, link status. Variable rámce už nesú dáta a výstup je podobný ako pri 104.
Keď checksum nesedí, skontroluj, či hex nie je orezaný, alebo či link adresa nie je 2-bajtová — na tom som už párkrát zostarol.
Pár spoločných tipov z praxe
Jeden rámec = jeden riadok. Hex môže byť s medzerami, bez medzier, s 0x — dekodér to znormalizuje.
Ak výsledok nesedí (divné IOA, zvyšok ASDU, zlý checksum), skontroluj, či hex nie je orezaný. Potom skús ručne prepnúť selecty hore — vynútiš profil stanice, ktorý auto-detekcia mohla minúť. Každý projekt má trochu iné dĺžky polí a pri nejednoznačnom capture sa občas trafí iná kombinácia.
Pod každým nástrojom je krátky slovníček a tipy — keď niečo zabudneš, nemusíš hľadať normu.
Kde to nájdeš
Všetky utility sú pod Tools.
Chceš ísť hlbšie do protokolov?
Tu som zámerne nerozbíjal normu. To je na dlhší príbeh — na to sú lepšie zdroje:
- Wikipedia — IEC 60870-5 — prehľad celej rodiny
- IEC webshop — oficiálne normy 101/104 (platené)
- Wireshark — polia dissectora iec60870_asdu — ASDU (Type ID, COT, adresa stanice, IOA…)
- Wireshark — polia dissectora iec60870_104 — APCI, I/S/U rámce na TCP
Záver
Dva dekodéry vznikli z každodennej práce s 101 a 104 — keď treba rýchlo rozobrať rámec a pochopiť, čo sa medzi zariadeniami deje. Bez inštalácie, bez odosielania dát na server. Skopíruješ bajty, dekodér sám rozpozná veľkosti polí a za pár sekúnd vieš, čo v tom rámci je.