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é:

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_104IEC 104.

Sériový capture, rámce 10 … 16 alebo 68 … 16, prípadne log (ELVAC) R_101 / S_101IEC 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:

  1. Otvor stránku nástroja.
  2. 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.
  3. 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:

  1. Otvor nástroj.
  2. 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
  1. 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:

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.

TheOldOne · Miroslav Gensor ·