26.3.2024

Komunikácia - HART, Modbus a papagáj

Sotva som v pondelok ráno zavesil na blog prvú časť článku o komunikačnom protokole Modbus a naplánoval uverejnenie druhej (už napísanej) časti o týždeň, prišiel kolega s tým, že u zákazníka je potrebné sfunkčniť komunikáciu s prietokomerom Endress+Hauser Proline t-mass A 150. A že komunikuje cez HART protokol a je tam nejaký HART/Modbus prevodník. Tento článok popisuje skúsenosti s rozbehávaním komunikácie v tejto konfigurácii.

Komponenty a konfigurácia

 U zákazníka sa nacházal prevodník HART na Modbus TCP (HART ETH) od firmy Papouch. Na jednej strane pripojený k ethernet sieti (inštaláciu, konfiguráciu a nastavenie IP adresy realizoval zákazník), na druhej strane 4-20 mA prúdovou slučkou k prietokomeru E+H.

 

Hart_1.jpg
Obr. 1: Prevodník HART ETH od firmy Papouch ..

Hart_2.jpg
Obr. 2: .. a prietokomer Endress+Hauser Proline t-mass A 150

O HART protokole

Protokol HART (Highway Addressable Remote Transducer) je digitálny protokol, ktorý na prenos digitálnych údajov využíva existujúcu 4-20mA prúdovú slučku. Digitálne dáta sú modulované s amplitúdou 0,5 mA pomocou frekvenčnej modulácie FSK (frequency shift keyed). Binárna nula zodpovedá 2200 Hz, binárna jednotka 1200 Hz. Zariadenia, ktoré podporujú iba čítanie analógového 4-20mA signálu, vnímajú HART komunikáciu iba ako drobné rušenie.

Hart_3.gif
Obr 3: HART komunikácia na 4-20mA prúdovej slučke

HART protokol vyvinula v 80. rokoch firma Rosemount ako proprietárny protokol pre ich inteligentné zariadenia. V roku 1986 sa vo verzii 2.1 stal otvoreným protokolom. V súčasnosti väčšina zariadení podporuje verziu 5 (štandard z roku 1989), menej novšiu 6 (rok 2001 - podporovanie dlhých identifikátorov) a aktuálnu 7 (rok 2007 - Wireless HART).

Od marca 2011 platí, že všetky nové zariadenia musia podporovať verziu protokolu 6 alebo 7 a byť zaregistrované u HART Communications Foundation (http://www.hartcomm2.org).

 Nakomunikovaný prietokomer podporuje podľa dokumentácie verziu protokolu 6.

Hart_4.png
Obr 4: Štruktúra a elementy HART telegramu

Ako na papagája?

 Prevodník HART ETH  od firmy Papouch funguje zaujímavým spôsobom:

  • Pomocou MODBUS protokolu je možné do prevodníka zapísať HART paket, ktorý chceme vyslať (do registrov od adresy 52). Zápis môže byť realizovaný jedným alebo viacerými Modbus zápisovými operáciami funkciou 16 - Write Multiple Registers. Podľa dokumentácie výrobcu sa paket začína štartovacím bajtom a neobsahuje teda úvodnú preambulu (3 alebo viac znakov 0xFF synchronizujúcich signál účastníkov).
  • Následne sa zápisom hodnoty 0x0100 do registra 50 prevodníka spustí HART komunikácia. Prevodník vyšle HART paket a čaká na odpoveď.
  • Je nutné čítať register 50, až kým sa hodnota nezmení z 0x0100 na 0x0200 (úspešná HART komunikácia) alebo na 0x0000 (chyba/timeout).
  • Ak bola komunikácia úspešná, z registrov na adrese 308 a vyšších je možné vyčítať odpoveď HART zariadenia. Túto je nutné následne parsovať a interpretovať.

Ako na HART?

Takže už vieme, ako presvedčiť papagája, aby vyslal a prijal HART paket, ale ešte netušíme, ako taký paket vyzerá a čo vlastne HART vie. Týmto chcem pochváliť pánov (či dámy?) z firmy Papouch - ich návod obsahuje aj príklady pre dva dôležité HART príkazy:

 HART príkaz 0 - čítanie unikátneho identifikátora -  je jednoduchý 5-znakový príkaz, ktorého jediným parametrom je krátky identifikátor zariadenia (0-15). Odpoveď zariadenia obsahuje okrem iného údaje o podporovanej verzii HART protokolu, ID výrobcu (Manufacturer ID), typ zariadenia (Manufacturer Device Type) a trojbajtové ID zariadenia (Device Identification Number). Kombináciou ID výrobcu + typ zariadenia + ID zariadenia vznikne 5-bajtový unikátny identifikátor (Unique Identifier), ktorý sa vo verzii protokolu 5 a vyššej používa pri všetkých ostatných príkazoch. Použitie unikátneho identifikátora chráni voči chybe komunikácie z nesprávnym zariadením (čo môže nastať pri prepájaní a reťazení HART slučiek).

 

Hart_5.png
Obr 5: Príklad príkazu 0 z dokumentácie prevodníka. Dolné 4 bity druhého bajtu udávajú krátky identifikátor  HART zariadenia (0-15, v príklade 1).

HART príkaz 1 - čítanie primárnej premennej - vyčíta zo zariadenia jednu hodnotu (reálne číslo). Na adresáciu zariadenia je nutné použiť unikátny identifikátor získaný v predchádzajúcom bode. Tu síce Papouch takisto udáva príklad príkazu aj odpovede, ale už nerozoberá vnútornú štruktúru 7-bajtovej odpovede. Zrejme predpokladajú, že čitateľ má tieto informácie k dispozícii - čo nebol môj prípad. Takže nejaký čas padol na zisťovanie štruktúry dát (čítaním neoficiálnych zdrojov a analýzou dát prijatých od zariadenia).

Hart_6.png
Obr 6: Príklad príkazu 1 z dokumentácie prevodníka HART ETH. Štruktúra HART dát nie je popísaná.

Nakoniec pomohla kombinácia dvoch informačných zdrojov. Prvým bol dokument s HART príkazmi, z ktorého je nasledovná tabuľka:

Hart_7.png
Obr 7: Tabuľka príkazov a odpovedí s popisom dát. V poslednom stĺpci je typ hodnoty: 32-bitový Float (F), Bitové (B) , interpretácia 8 bitov ako 5-bitový a 3-bitový integer (H).

Druhým zdrojom bol iný dokument udávajúci, že v odpoveď vždy obsahuje na začiatku dvojbajtový Response code. Takže výsledný tvar odpovede na príkaz 1 je tento:

 

Hart_8.png
Obr 8: parsovanie konkrétnej odpovede na HART príkaz 1. 

Vo finále sme u zákazníka nepoužili HART príkaz 1 ale HART príkaz 3, ktorý umožňuje vyčítať 4 hodnoty ako aj hodnotu prúdu v prúdovej slučke. Príkaz vyzerá prakticky rovnako ako príkaz 1 (líši sa iba bajtom udávajúcim číslo príkazu), odpoveď je rozsiahlejšia:

Hart_9.png
Obr 9: Tabuľka s popisom odpovede na príkaz 3.

Tento príkaz má podobné parsovanie odpovede ako HART príkaz 1:

 

Hart_10.png
Obr 10: parsovanie odpovede na HART príkaz 3.

Polia 1u .. 4u sú jednotky (units code) pre premenné 1 až 4.

Ako na D2000?

Na nakomunikovanie HART ETH prevodníka bola použitá  jedna linka (typu TCP/IP) a tri stanice. Prečo až tri?

Prvá stanica (B.HART_ETH_Write) obsahuje tri výstupné body na zápis príkazov 0, 3 a spustenie komunikácie - na obrázku nižšie  M.HART_Write52_6B, M.HART_Write52_10B a M.HART_Write50. Prvé dva body sú textové a líšia iba dĺžkou zapisovaného reťazca - 6 bajtov pre príkaz 0, 10 bajtov pre príkaz 3 (alternatívou by bolo vytvorenie 5 jednoregistrových premenných a zapisovanie do nich, ale jeden textový zápis je elegantnejšie riešenie). Tretí bod je celočíselný a zápis hodnoty 0x0100 doň spôsobí spustenie HART komunikácie a odoslanie výzvy z HART ETH prevodníka HART zariadeniu.

Druhá stanica (B.HART_ETH_ReadStatus) obsahuje bod M.HART_Read50 slúžiaci na zistenie, či HART komunikácia už skončila a s akým výsledkom. Štandardne má stanica vypnutý stav (StOff) a zapína sa až po spustení komunikácie. Akonáhle je načítaná hodnota bodu M.HART_Read5 rovná 0x0200 (OK) alebo 0x0000 (chyba/timeout), stanica je znovu vypnutá, aby periodické vyčítavanie bodu nespomaľovalo ostatnú komunikáciu.

Tretia stanica (B.HART_ETH_ReadReplyValue) obsahuje bod M.HART_Read308 na vyčítanie HART odpovede z prevodníka. Tento textový meraný bod má špecifikovanú dĺžku 18 registrov (36 znakov), čo stačí na načítanie odpovede na HART príkaz 0 aj príkaz 3 (viď Obr 10). Stanica je podobne ako druhá stanica stále vypnutá a zapína sa iba na načítanie odpovede.

Hart_11.png
Obr 11: merané body použité na HART komunikáciu.  Posledný stĺpec ukazuje konfiguráciu Modbus adresy.

Skladanie HART príkazov aj parsovanie HART odpovedí bolo robené v ESL skripte. V priebehu implementácie som zistil, že potrebujem funkciu %XOR na implementáciu CRC ako aj funkciu %B4ToReal32, ktorá skonvertuje štyri bajty na 32-bitové reálne číslo. Tu sa prejavila výhoda, keď používate softvérovú technológiu reálneho času D2000 - v pondelok podvečer som poprosil šéfa vývoja o funkciu  %XOR a druhý deň o trištvrte na deväť som mal k dispozícii patche pre verziu 11!

Implementácia funkcie %B4ToReal32 bola komplikovanejšia (požiadavka išla v utorok poobede a patche boli “až” v stredu 10:10) ale treba uznať vyššiu náročnosť implementácie aj vzhľadom na potrebu otestovania na neplatné vstupy. Navyše prebehla na vývoji intenzívna diskusia o názve požadovanej funkcie :)
Boris, vďaka .. a otázka na čitateľa - skúste porozmýšľať, ako dlho by trvalo splnenie podobnej požiadavky pri použití nejakého konkurenčného softvéru? 

Hart_12.png
Obr 12: časť ESL skriptu ukazujúca vyskladanie a poslanie HART príkazu 3

Záver

Komunikácia s prietokomerom E+H je už od včera funkčná a bezproblémová (včítane odolnosti voči reštartom KOM procesu). Na základe informácií pozháňaných od pána Gúgla sme doplnili aj identifikáciu kódu jednotiek meraných veličín.

Hart_13.png
Obr 13: Prúd a štyri veličiny s jednotkami načítané do užívateľských premenných D2000

Tento príklad z reálneho života ukazuje, ako obľúbený a rozšírený je Modbus protokol a na čo všetko sa dá v praxi použiť. Záleží samozrejme aj od konkrétneho aplikačného servera (a jeho komunikačného, prípadne skriptovacieho subsystému), či a s akou prácnosťou si dokáže poradiť aj s takýmto neštandardným využitím protokolu Modbus.

Hart_14.png
Obr. 14: Na záver graf priebehu nameraných dát za dnešný deň.

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

Iné blogy