Autoři modbusových tabulek často používají šestnáctibitové registry nejen pro přenos analogových hodnot, ale i pro přenos binárních signálů, jako jsou informace o stavu zařízení (chod / stop), poruchách (OK / alarm) a podobně. Při integraci těchto signálů do PLC máme několik možností, jak data číst, zapisovat a zpracovávat. Vždy bychom měli vybrat tu nejjednodušší a nejsrozumitelnější, a to i s ohledem například na ty, kdo budou s naším programem pracovat za několik let v roli servisních techniků.
Modbusový registr, který tedy neobsahuje analogovou hodnotu (teplotu, tlak), ale soubor bitů, obvykle přenášíme do PLC jako datový typ word. To by mělo signalizovat, že se nejedná o nějaké celé číslo s vlastním významem, ale kombinaci bitů – i když samozřejmě v modbusovém klientu vidíme hodnotu jako číslo v podobě integeru nebo integeru bez znaménka.
Jako příklad vezměme VZT jednotku Remak s řídicím systémem VCS. V jeho modbusové tabulce zjistíme mj. toto:
Znamená to, že v registru 13 vyčteme na jednotlivých bitech alarmové stavy periferií, např. bit 2 (třetí bit) ve stavu True znamená poruchu hořáku. Jak tyto informace dostat do softwaru tak, abychom se v tom vyznali my sami, ale i servisní technici, kteří budou s aplikačním softwarem pracovat i po několika letech od uvedení zařízení do provozu?
Existuje několik možností:
Modbusová tabulka musí umožňovat přístup více modbusovými funkcemi na stejná data:
Například první bit registru 4 tedy můžeme vyčíst buď načtením celého registru 4 a „vyseparováním“ prvního bitu, nebo bitově orientovaným dotazem přímo na tento bit. V případě VCS tento překryv podle dokumentace neexistuje, neboť bitové funkce jako Read coils (F01) a Read Discrete Input (F02) slouží k přenosu zcela jiných hodnot.
Proč při čtení jednotlivého bitu funkcí F01 se zadává číslo (bitově orientovaného) registru 49? V případě vyčítání stejných dat různými funkcemi se bity číslují od začátku tabulky, takže první (wordový) registr obsahuje (zprava doleva, od nejméně významného bitu) bity 1...16, druhý 17...32, třetí 33...48 a první bit čtvrtého registru je tedy 49.
Takto můžeme pracovat například s change-over bitem u regulátoru FCR010:
Bity v registru jsou v této dokumentaci číslovány od 0, tj. bit 5 je šestý bit v registru.
Číslo (bitově orientovaného) registru bude 150:
9 * 16 = 144 (počet bitů v předchozích 9 registrech)
144 + 6 = 150 (bit 5 je 6. bit v registru 10)
V Merbon IDE vytvoříme skupinu pro čtení:
Datový bod se signálem change over pak vypadá takto:
Signál můžeme zapisovat bitovou funkcí F15 Write Multiple Coils. Nastavení skupiny pro zápis pak bude následující:
a datový bod vypadá takto:
Na rozdíl od vyčtení celého registru a rozebrání v komunikačním driveru (viz dále) se u zápisu a čtení bitově orientovanými funkcemi nemusíme starat o bitové ofsety. Multibyte length je vždy 1, menší datovou jednotku než 1 byte nelze poslat.
Bitově orientované zápisy mají tu výhodu, že ostatní bity v šestnáctibitovém registru zůstávají nezměněné.
Tento způsob je příjemný v tom, že proměnné jsou do programu přivedeny již upravené a není nutno je v aplikaci dále zpracovávat. Pokud programovací software umožňuje tvorbu „hardwarových prototypů“, předdefinovaných zařízení, která je možné vkládat z knihovny, je dobré mít v prototypu už připravené konkrétní signály, odpovídající bitům či jejich kombinacím.
Vyčteme tedy pomocí funkce F03 celý registr
a vytvoříme proměnnou, která z něj „vyzobne“ bit 5. Proměnná je samozřejmě typu bool.
Nejobtížnější zde je správně spočítat pořadí bitů. Musíme si uvědomit, v jakém pořadí přicházejí registry a bajty v modbusovém telegramu:
Data Offset je nastaven na hodnotu 1, protože musíme přeskočit první bajt zleva (1 MSB). Bitový ofset je 5, protože musíme přeskočit prvních 5 bitů (bráno v rámci bajtu od nejméně významného k nejvíce významnému, tedy zprava doleva). Proměnné pro další bity by se lišily pouze hodnotou bitového ofsetu, případně data ofsetu – ten by byl 0, pokud by se bity nacházely v MSB bajtu.
Lze samozřejmě i načíst více 16bitových registrů najednou (na obrázku jsou v telegramu čtyři) a pomocí ofsetů vybrat jakýkoli bit v rámci celého telegramu.
Pokud bychom chtěli zmíněnou funkci change-over – bit 5 – aktivovat pomocí zápisu celého registru (funkcí F16, Write Multiple Registers), byly by přepsány i ostatní bity, zde konkrétně ty, které přepínají výstupy na manuální režim. To by v určitých situacích mohl být problém.
Pro modbusovou tabulku VCS by proměnná Porucha hořáku měla tyto parametry:
Počáteční prvek: 13
Funkce: F04 (poznáme to podle notace 3x000...)
Počet prvků: 1
a proměnná by se nastavila takto:
Mezera ofsetu pro zápis: 0 (nezapisujeme)
Data offset: 1 (přeskočíme MSB bajt)
Bitový offset: 2 (přeskočíme bity 0 a 1)
Délka multibyte: 1
Pořadí multibyte: 12345678 (výchozí pořadí neměníme)
Některé programy nabízejí možnost maskování registru (čímž odfiltrujeme nežádoucí bity) a následný bitový posun (aby proměnná nabývala hodnot 0, 1, 2...), což je pro tento účel elegantní a rychlá cesta.
Někdy je ale nejjednodušší vyčíst celý registr jako word a rozebrat ho na jednotlivé bity až v aplikaci. Je to zároveň asi i nejčitelnější pro ty, kteří budou s programem pracovat po nás. Vyčítá se celý registr funkcí F03 nebo F04 do proměnné typu word a tato proměnná se přivede na funkci bitového rozkladu.
V případě dieselgenerátoru Datakom D-300 můžeme vyčítat stavy jednotlivých indikačních LED diod:
V aplikačním programu bychom pak rozebraný registr opět poskládali po dvou bitech pro každou LED do proměnné, indikující stav příslušné LED jako celé číslo v intervalu 0...3:
Tento přístup je vhodný zejména v případě, že hodnota, která nás zajímá, je bitově vyjádřena někde „uprostřed“ registru, obklopená dalšími bity, jejichž stavy pro tuto proměnnou nejsou důležité. Autoři modbusových tabulek ale obvykle vyhrazují pro vícestavovou proměnnou celý word (16bitový registr) nebo aspoň bajt, takže hodnotu můžeme získat už v komunikačním driveru.
Opět platí, že zejména při programování v jazyce ST (strukturovaný text) je nejrychlejší – byť ne tak pěkně na první pohled čitelnou – operací vymaskování a bitový posun.