5.2.2025

Komunikácia - nie je Modbus ako Modbus

Komunikácia - nie je Modbus ako Modbus

Dnešný blog bude o jednom z najrozšírenejších a zdanlivo najjednoduchších protokoloch – o protokole Modbus. Ale je aj jeho implementácia taká triviálna?

Prednedávno som sa zúčastnil na upgrade SCADA aplikácie, ktorá má už vyše 20 rokov. Neimplementovali ju moji kolegovia z Ipesoftu, ale jeden z našich OEM partnerov – s použitím technológie Ipesoft D2000. Ako viem, koľko má rokov? Na aplikačnom serveri som našiel viaceré zálohy konfiguračnej databázy – najstaršia bola z januára 2001.

Súčasťou upgradu bolo aj nahradenie niekoľkých protokolov. Na novom aplikačnom server už nie je RSLinx OPC server, ale komunikáciu s CompactLogix zabezpečuje D2000 implementácia Ethernet/IP protokolu.

A OEM implementáciu Modbus protokolu sme nahradili protokolom D2000 Modbus Client. A pri tomto protokole sa chcem pristaviť a porovnať OEM a našu implementáciu.

Identifikácia

Na identifikáciu postačilo zapnúť logovanie na linke a pozrieť sa na logy, ktoré D2000 KomAPI (rozhranie D2000 Kom procesu pre tvorbu vlastných komunikačných ovládačov) poskytuje.

Obrázok 1 - Vyčítanie hodnôt jednej stanice s OEM Modbus protokolom.

Na obrázku vyššie vidieť vyčítanie bodov jednej komunikačnej stanice. Logy obsahujú vždy výzvu a odpoveď. Jedná sa jednoznačne o Modbus protokol. Môžeme si rozparsovať napríklad prvú výzvu:

<02><04><00><23><00><01><C0><33>

<02> - číslo stanice

<04> - funkcia Modbus protokolu (Read Input Registers)

<00><23> - adresa registra (0023 tj. dekadicky 35)

<00><01> - počet registrov (0001 tj. 1 register)

<C0><33> - kontrolná suma (CRC)

Všimnite si, že na obrázku sa na čítanie používajú funkcie 3 a 4 (Read Holding/Input Registers) a čítaný je vždy jeden register.

Parsovanie odpovede:

<02><04><02><00><21><3D><28>

<02> - číslo stanice

<04> - funkcia Modbus protokolu (Read Input Registers)

<02> - počet dátových bajtov v odpovedi

<00><21> - dáta registra (0021 tj. dekadicky 33)

<3D><28> - kontrolná suma (CRC)

Ako vyzerala adresácia meraných bodov, ukazuje nasledovný obrázok:

Obrázok 2 - Konfigurácia 40 meraných bodov na stanici s OEM Modbus protokolom.

Implementátori si zvolili formát adresy 0xAABBCCDD. Pri porovnaní adries meraných bodov s logmi komunikácie sme rýchlo prišli na to, že posledné štyri cifry (CCDD) udávajú Modbus adresu bodu (desiaty bod odspodu má adresu 0023 a zodpovedá výzve a odpovedi, ktorú sme analyzovali). Prvé dve cifry (AA) určujú funkciu Modbus protokolu:

  • 01 zodpovedá funkcii 3 (Read Holding Registers)
  • 02 zodpovedá funkcii 4 (Read Input Registers)

A čo cifry BB? Pri binárnych premenných určujú číslo bitu v registri (00-0F).

Všimnime si ale ešte niečo iné: na vyčítanie hodnôt 40 bodov je potrebných 40 výziev a 40 odpovedí. A dokonca niektoré výzvy a odpovede sú úplne identické – nasledujúci obrázok zvýrazňuje 3 sekcie s opakovanými identickými výzvami a odpoveďami. Prečo je to tak? Viaceré merané body majú tie isté adresy (napr. 0034) a líšia sa iba číslom bitu. OEM implementácia tento fakt ignoruje a nesnaží sa o žiadnu optimalizáciu – pre každý meraný bod sa robí samostatné čítanie hodnoty.

Obrázok 3 - Sekcie s identickými výzvami a odpoveďami (čítanie adries 0x34, 0x33 a 0x32).

Konverzia adries

Po upgrade a konverzii adries na D2000 Modbus Client protokol (na konverziu sme použili jednoduchý Excel) vyzerajú merané body nasledovne:

Obrázok 4 - Merané body na stanici s D2000 Modbus Client protokolom.

Prvé písmeno v adrese (U) udáva interpretáciu registra ako Unsigned čísla. Nasledovné číslo (3 alebo 4) priamo určuje Modbus funkciu. V prípade výstupných bodov ešte nasleduje pomlčka a číslo zapisovacej funkcie (6=Write Single Register). Za bodkou nasleduje znak mriežky – udáva, že adresa je v hexadecimálnom formáte (bez mriežky by bola dekadická). Adresu sme naschvál ponechali hexadecimálnu kvôli ľahšej orientácii užívateľov. A v prípade binárnych premenných je za adresou aj bodka a číslo bitu (0-15).

Porovnanie komunikácií

A teraz tá najzaujímavejšia časť: ako vyzerajú logy Modbus Client protokolu? Naschvál som zapol parameter stanice Full Debug, ktorý spôsobí, že sa vypisujú aj hodnoty jednotlivých meraných bodov. Riadky začínajúce RQ> sú výzvy (odoslané dáta), riadky začínajúce IN> sú prijaté odpovede. Ostatné riadky sú pomocné ladiace výpisy.

Obrázok 5 - Logy čítania 40 meraných bodov na stanici s D2000 Modbus Client protokolom.

Môžeme si všimnúť, že na načítanie 40 meraných bodov sa vykonávajú iba dva dotazy. Prvý z nich (3. riadok logu) číta 16 registrov od adresy 20 (tj. adresy 20-35) s použitím Modbus funkcie 4 (Read Input Registers). Toto čítanie naplní 12 celočíselných meraných bodov (každý je plnený iba z jedného registra), tj. boli načítané aj 4 registre, ktoré neboli použité.

Druhá výzva číta 3 registre od adresy 50 (tj. adresy 50-52) s použitím Modbus funkcie 3 (Read Holding Registers). Toto čítanie naplní 28 binárnych bodov.

Tak si to zrekapitulujme – dve čítania našej implementácie verzus 40 čítaní OEM Modbus protokolu. Je vidieť, že naša implementácia robí optimalizácie a združuje čítanie viacerých registrov do jedného dotazu. Tým efektívnejšie využíva sériovú linku, takže registre sú prečítané rýchlejšie. U tejto konkrétnej aplikácie čítanie prebieha s periódou 5 minút (takže rýchlosť nie je rozhodujúca). Čo je ale dôležité – komunikácia prebieha cez GPRS sieť (Modbus over TCP), pričom platby závisia od preneseného množstva dát. Takže ich niekoľkonásobné zníženie znamená nižšie mesačné platby za každú takúto Modbus komunikáciu. Táto konkrétna aplikácia obsahovala 7 identických staníc, ktoré sa líšili iba IP adresou koncového zariadenia.

Dá sa správanie Ipesoft implementácie Modbus protokolu nejak ovplyvňovať? Parameter Max. Registers udáva, koľko registrov sa bude maximálne čítať v jednej výzve. Ak by sme prednastavenú hodnotu 100 zmenšili na 1, dostaneme správanie podobné OEM protokolu (ale aj v tom prípade by sa vykonalo iba jedno čítanie pre všetky binárne premenné s tou istou adresou registra).

Ďalší užitočný parameter je Skip Unconfigured. Ten umožňuje nečítať adresy, ktoré nie sú v D2000 konfigurácii definované. Ak by teda existovali merané body s adresami 2,3,5,6,7 ale nie s adresou 4, vykonali by sa dve čítania: z adries 2-3 a 5-7. Načo je tento parameter dobrý? Niektoré zariadenia odpovedajú chybovým kódom na požiadavku čítania, ktorá obsahuje adresy, ktoré nemajú definované (v našom prípade adresa 4). A teda namiesto dát vrátia chybový kód (exception). Implementácia Ipesoft Modbus Server takúto vlastnosť nemá – pre nedefinované adresy vracia nuly.

Záver

Vidieť, že nie je Modbus ako Modbus. Niektoré implementácie môžu byť funkčné, korektné – ale v konkrétnom nasadení neoptimálne. Aj toto je príklad toho, ako sa pri vývoji D2000 optimalizuje na rôznych úrovniach – aj pri implementácii komunikačných protokolov – aby bol výsledkom funkčný a vyladený systém. Ideálne aj s komfortnými debugovacími možnosťami.

23.12.2024, Ing. Peter Humaj, www.ipesoft.com

Iné blogy