Promotic

PmChar - Ovladač pro komunikaci uživatelsky konfigurovatelným ASCII/BIN protokolem

Před použitím tohoto ovladače v aplikaci PROMOTIC je vhodné shlédnout "PROMOTIC video kurz 4 - Komunikační ovladače".

Základní vlastnosti ovladače:
- Použití tohoto ovladače vyžaduje zakoupení licence PmChar. Při vývoji aplikace ve freeware módu PmFree nebo s vývojovou licencí a při jejím testování v runtime je tato komponenta vždy funkční.
- Komunikace je pro Ethernet (aplikace PROMOTIC je klient) nebo pro sériovou linku (COM1, COM2 ...) (pro Ethernet-server je určen komunikační ovladač PmCharServer).
- Ovladač je začleněn do systému PROMOTIC pomocí objektu PmaComm.
Ovladač podporuje použití objektu PmaCommMsg. Objekt PmaCommGroup nelze použít.
Pro snadné přidání tohoto ovladače do aplikace je vhodné použít: Předkonfigurace ve skupině "PmChar konfigurovatelný protokol"


Ovladač je jednoduchý ale mocný nástroj pro komunikaci uživatelsky konfigurovaným protokolem. Je určen především pro komunikace, u kterých se nevyplatí používat specializovaný komunikační protokol.
Použití ovladače je zvláště výhodné pro:
- komunikace jednoduchými protokoly.
- textově i binárně orientované komunikace.
- testovací účely.


Ovladač umožňuje použít jak zpráv typu Master, tak zpráv typu Slave.
Slave zprávy pro Ethernet:
- Fungují pouze pro nastavení "Typ Ethernet přenosu = TCP".
- Ovladač i v tomto případě navazuje spojení (tzn. je klient). Slave zprávy začnou čekat na příjem až po navázání spojení se serverem.


Pomocí PmChar ovladače lze komunikovat s celou řadou zařízení a PLC automatů, jejichž protokol je jednoduchý a popis je znám, například:
- Dataloggery firmy OMEGA, ESC, ..
- Landis&Gyr typ PRV1 a PRV2
- ABB CS31
- Měřiče tepla INMAT 64,65
- a mnoho dalších


Ovladač PmChar není určen pro emulaci složitějších protokolů (vyžadující například dodržování přesných časových poměrů na komunikační lince, průběžné nestandardní ovládání modemových signálů, atd.).
Při rozhodování, zda daný protokol lze realizovat pomocí PmChar ovladače, Vám rádi poradíme; kontaktujte nás! (sw-support@microsys.cz).

Doporučené hodnoty parametrů objektu PmaComm:

Popis a doporučené hodnoty pro Parametry protokolu:
Timeout příjmu odpovědiJen pro sériovou linku. Má smysl pouze pro zprávy typu Master. Čas (v milisekundách) po který bude ovladač čekat na odpověď při vyslání zprávy.
Pokud do této doby nepřijde vyžádaná odpověď, pak se přenos zprávy ukončí (je vyvolána událost onEndOfTransfer s chybou 24 nebo 66).
Přijímaná data budou vždy jen v jednom paketuJen pro Ethernet.
Pokud je zatrženo, pak se předpokládá, že celý obsah přijaté zprávy se vždy vejde do jednoho IP paketu.
Toto nastavení má vliv na optimalizaci rychlosti příjmu pokud nelze používat ETX:
Po příjmu jednoho paketu se vždy ukončí příjem a nečeká se na timeout (zadaný v konfigurátoru "Timeout přenosu jednoho paketu [ms]").
Velikost paketu je určena danou sítí. Může to být např. 521 bajtů, 1024 bajtů atd.
Používat STXUrčuje, zda daný protokol používá speciální znak pro začátek vysílání. Pokud je používání znaku začátku vysílání povoleno, pak je před uživatelem definovanými daty pro vysílání automaticky vysílán znak začátku vysílání. Naopak při každém příjmu dat se testuje, zda je na začátku znak začátku vysílání. Pokud tomu tak není, komunikační zpráva končí s chybou.
Hodnota STXUrčuje hodnotu ASCII znaku začátku vysílání (znak začátku vysílání má obvykle hodnotu 2).
Používat ETXUrčuje, zda daný protokol používá speciální znak pro konec vysílání. Pokud je používání znaku konce vysílání povoleno, pak je za uživatelem definovanými daty pro vysílání automaticky vysílán znak konce vysílání. Naopak při každém příjmu dat se testuje, zda je na konci znak konce vysílání. Pokud tomu tak není, komunikační zpráva končí s chybou. Použití znaku ETX optimalizuje rychlost příjmu pokud přijímáme zprávu proměnné délky (přijímáme do hodnoty typu String). Systém okamžitě po příjmu znaku ETX považuje zprávu za ukončenou (případně očekává již jen znaky kontrolního součtu) a rychle ukončí příjem, místo aby čekal na timeout mezi příjmem dvou znaků.
Hodnota ETXUrčuje hodnotu ASCII znaku konce vysílání (znak konce vysílání má obvykle hodnotu 3).
Kontrolní součetUrčuje způsob výpočtu kontrolního součtu:
- žádná: komunikace bez kontrolního součtu.
- XOR 1 byte: Je použit kontrolní součet typu XOR (jedná se o tzv. vertikální paritu). Má velikost 1 bajt a matematicky je to XOR všech bajtů, které jsou do kontroly zahrnuty.
- SUM 1 byte: Je použit kontrolní součet typu součet. Má velikost 1 bajt a matematicky je to aritmetický součet všech bajtů, které jsou do kotroly zahrnuty (ořezáno na 1 bajt).
- SUM 2 byte: stejně jako "SUM 1 byte" ale má velikost 2 bajtů (ořezáno na 2 bajty).
- CRC 2 byte CCITT [polynom 0x1021 = x16+x12+x5+1, use SBUS]: (Cyclical Redundancy Check) - Speciální kontrolní součet, který používá například komunikace PmSBUS.
- CRC 2 byte IBM [polynom 0xA001 = x16+x15+x2+1, use Modbus]: (Cyclical Redundancy Check) - Speciální kontrolní součet, který používá například protokol Modbus.
- CRC 2 byte IBM [polynom 0x8005 = x16+x15+x2+1, use DF1]: (Cyclical Redundancy Check) - Speciální kontrolní součet, který používá například komunikace PmABradleyDF1.


Lze zadat, kde bude kontrolní součet umístěn:
- na konec zprávy (za ETX)
- před ETX


Lze zadat, která data zprávy se mají do kontrolního součtu zahrnout:
- Všechna data před kontrolním součtem
- Všechna data před kontrolním součtem mimo první znak (mimo STX)
- Všechna data před kontrolním součtem mimo poslední znak (mimo ETX)
- Všechna data před kontrolním součtem mimo první a poslední znak (mimo STX a ETX)


Pokud kontrolní součet je využíván, pak je automaticky vysílán. Naopak při každém příjmu dat se kontroluje, zda je na konci umístěna správná kontrolní součet. Pokud tomu tak není, komunikační zpráva končí s chybou.
Výpočet kontrolního součtu lze provést také metodou PmBuffer.CalcCheckSum.
Používat záměnu znaků v přijatých datechlze povolit, pokud v přijatých datech chceme zaměnit skutečně přijatý znak za nějaký jiný. Slouží nejčastěji v případě, kdy chceme přijatá data ukládat do hodnoty typu String ale v přijatých datech se přitom může objevit znak 00hex (binární nula). V tom případě je nutno zaměnit znak 00hex za jiný, protože znak 00hex se považuje za konec textu. Viz popis dále.
Hodnota znaku se zadává decimálně, viz ASCII tabulka.

Popis komunikace pomocí objektu PmaCommMsg

Parametry zprávy:
V 'Data-zaslání' je pouze HexaStringPokud je zatrženo, pak se předpokládá že v kartě "Data-zaslání" je pouze jedna proměnná typu String. Obsah této proměnné je tzv. HexaString, pomocí kterého lze v typu String přenášet libovolné binární hodnoty následujícím způsobem:
Například, pokud se mají zaslat 4 bajty s binárními hodnotami 01 A0 00 B3 (v hexadecimálním tvaru), pak je nutno nastavit do proměnné typu String hodnotu "01A000B3" - tzn. text délky 2*4=8 znaků. Takto lze jednoduše zasílat data obsahující i binární nuly, které v hodnotě typu String nesmějí být.
Pro přípravu vysílaných dat lze použít metodu Pm.TransformValue(240).
V 'Data-příjem' je pouze HexaStringStejné jako předchozí konfigurátor, pouze pro kartu Data-příjem.
Pro zpracování přijatých dat lze použít metoda Pm.TransformValue(241).
Tato zpráva bude používat následující parametry (místo těch, které jsou definovány v parametrech protokolu)(pouze pro zprávy typu Master) Pokud je zatrženo, pak se zobrazí stejné konfigurátory jako v parametrech protokolu (zda používat znaky STX, ETX a zda použita kontrolní součet). Tyto parametry po dobu přenosu této zprávy "přebijí" parametry protokolu.


Skutečně přijímaná/vysílaná data mají například tvar:
[STX] "užitečná data" [ETX] [kontrolní součet]

Poznámka: Části v hranatých závorkách jsou volitelné pomocí výše uvedených parametrů. Projektant přitom v kartách Data-zaslání a Data-příjem konfiguruje pouze část zde označenou jako "užitečná data".

Objekt PmaCommMsg lze nastavit pro zprávy typu Master nebo Slave (viz konfigurátor "PmaCommMsg > Parametry > Typ zprávy"). Postup přenosu pro tyto dva typy zpráv je následující:
- Typ Master:
- Přenos objektu se spustí buď automaticky (podle konfigurátoru "Automaticky přenášet") nebo metodou Run.
- Objekt se postaví do vnitřní fronty čekajících Master objektů (více objektů PmaCommMsg může chtít v jednom okamžiku přenášet data současně).
- Až na objekt dojde řada, je vyvolána událost onBeginOfTransfer. Zde například může projektant nastavit data v kartě "Data-zaslání" (ale nemusí, pokud jsou data již nastavena).
- Data v kartě "Data-zaslání" se upraví (např. se provede konverze z HexaString do binárního tvaru, přidají se znaky STX, ETX nebo kontrolní součet).
- Upravená data se zašlou přes Ethernet nebo přes sériový port počítače.
- Pokud v kartě "Data-příjem" nejsou žádné proměnné, pak se přenos ukončí (je vyvolána událost onEndOfTransfer). Využívá se pokud druhá strana neposílá odpověď.
- Pokud v jsou v kartě "Data-příjem" definované proměnné, pak objekt čeká na příjem zprávy z druhé strany.
- Po příjmu zprávy se zkontrolují a upraví přijatá data (zkontroluje se například zda je znak STX, ETX, správná kontrolní součet. Pokud je nastaveno, pak se provede konverze do HexaString), upravená data se uloží do karty "Data-příjem" a je vyvolána událost onDataReceive.
- je vyvolána událost onEndOfTransfer.
- Typ Slave:
- Objekt čeká na příjem dat z druhé strany. V době přenosu Master zpráv se příjem Slave zpráv "zablokuje", tzn. Master zprávy mají přednost.
- Po příjmu zprávy z druhé strany se určí, kterému objektu typu Slave tyto data patří. Pokud je jen jeden objekt typu Slave, pak se přijatá data předají jemu, v jiném případě se rozhoduje následovně:
Zjistí se délka přijaté zprávy a zjistí se délka požadovaných dat v objektech (zadaná v kartě "Data-příjem"). Přijatá zpráva se přidělí objektu, jehož požadovaná délka je rovna (nebo nejblíže větší) než délka přijaté zprávy. Pokud jsou dva objekty se stejnou délkou požadovaných dat, pak se přidělí prvnímu objektu - tento objekt se ale posune na konec a příště se pak stejná zpráva přidělí druhému objektu, atd.
- Po uložení přijatých dat do karty "Data-příjem" příslušného objektu je vyvolána událost onDataReceive. Zde může projektant na základě přijatých dat nastavit data pro vyslání v kartě "Data-zaslání".
- Pokud v kartě "Data-zaslání" nejsou žádné proměnné, pak se přenos ukončí (je vyvolána událost onEndOfTransfer). Využívá se pokud PROMOTIC nemá poslat odpověď druhé straně.
- Pokud v kartě "Data-zaslání" jsou definované proměnné, pak objekt upraví data z této kartě (např. se provede konverze z HexaString do binárního tvaru, přidají se znaky STX, ETX nebo kontrolní součet) a upravená data se zašlou druhé straně.
- Po vyslání je vyvolána událost onEndOfTransfer.


Přenos textových dat:
- Pokud umístíte do karty "Data-zaslání" položku typu String, pak lze délku zprávy dynamicky měnit (do hodnoty typu String lze přiřadit text proměnné délky).
- Pokud je nastaven konfigurátor "V 'Data-zaslání' je pouze HexaString", pak se text při vysílání převede na binarní data, která budou mít poloviční velikost (v bajtech) než je délka textu. Vhodné pro binárně orientované komunikace. Pro snadné vytvoření HexaString hodnoty lze použít metodu Pm.TransformValue(240) (např. v události onBeginOfTransfer).
- Pokud není nastaveno, pak se vyšle text bez konverze. Vhodné pro textově orientované komunikace.
Pro snadné vytvoření formátovaného textu lze použít objekt PmFormat (např. v události onBeginOfTransfer).
- Pokud umístíte do karty "Data-příjem" položku typu String, pak lze přijímat proměnlivou délku zprávy.
- Pokud je nastaven konfigurátor "V 'Data-příjem' je pouze HexaString", pak se přijatá binarní data převedou na HexaString (bude mít dvakrát větší velikost než je délka přijatých binarních dat v bajtech). Vhodné pro binárně orientované komunikace. Pro snadné zpracování HexaString hodnoty lze použít metodu Pm.TransformValue(241) (např. v události onEndOfTransfer).
- Pokud není nastaveno, pak se uloží přijatý text bez konverze. Vhodné pro textově orientované komunikace. Pro snadné zpracování textu lze použít metodu Pm.StringScan (např. v události onEndOfTransfer).

Pro položku typu String v kartě "Data-příjem" je nutno nastavit délku (aby ovladač při příjmu poznal na maximálně kolik znaků má čekat). To lze udělat dvěma způsoby:
- v kartě vyplněním konfigurátoru "Délka"
- lze nechat toto políčko nevyplněné a potom metodou PmaCommMsg.ReadVars před spuštěním zprávy nastavit do položky typu String řetězec požadované délky.

Pokud položka typu String je poslední položkou v kartě, pak se přijímá proměnný počet znaků až do výše uvedeným způsobem stanovené délky textového řetězce.
Pokud položka typu String není poslední položkou v kartě, pak se přijímá do této položky počet znaků přesně odpovídající výše uvedeným způsobem stanovené délce řetězce.


Přenos binárních dat:
Častý problém je příjem dat, kde se objevuje i binární hodnota 0 (dále 00hex). Přímý příjem takových dat do hodnoty typu String nefunguje dobře, protože String je vždy interpretován jako text ukončený znakem 00hex. Data se tehdy přijmou ale přístupné budou jen znaky do hodnoty 00hex. Jsou následující řešení:
- Přijímat binární data z konverzí na HexaString (viz konfigurátory V 'Data-zaslání' je pouze HexaString a V 'Data-příjem' je pouze HexaString). Je to nejobecnější způsob a lze takto dynamicky pomocí textu přenášet libovolná binarní data. Viz popis výše.
- nebo do karet Data-zaslání nebo Data-příjem nedávat proměnné typu String ale dát přímo proměnné typu Byte, Integer, atd. Tento způsob však neumožňuje dynamicky měnit velikost vysílaných nebo přijímaných dat.
- nebo použít konfigurátor "Používat záměnu znaků v přijatých datech" a v něm lze nastavit, že přijatý znak 00hex se má přepsat například znakem "#" - pokud víte že znak "#" se v datech neobjevuje (znak "#" má hodnotu 35, viz ASCII tabulka). Pak můžete přijímat data pouze do jedné datové položky typu String a v ní se objeví text, kde občas bude znak "#" (místo 00hex). Takový text pak můžete zpravovat (např. v události onEndOfTransfer) například VBScript funkcí Split, která daný text rozdělí podle rozdělovacího znaku "#".

Historie:
Pm9.00.02: Opravená chyba: Při zavření portu nebyla správně dokončena zpráva typu Slave.
Pm8.03.27: Opravená chyba: Pro Etnernet TCP nefungovaly zprávy typu Slave.
Pm8.03.24: Opravená chyba: Pokud se někdy při vysílání přerušilo Ethernet spojení, pak ovladač přestal pracovat.
Pm8.03.22: Zobecnění parametrů protokolu pro Ethernet o konfigurátor "Přijímaná data budou vždy jen v jednom paketu", pomocí kterého lze optimalizovat rychlost příjmu pro krátké zprávy.
Pm8.03.13: Zobecnění pro Ethernet Slave zprávy.
Pm8.01.02: Zobecnění o možnost přijímat binární data do hodnoty typu HexaString (je to String s obsahem binárních dat - například 3 bajty s hodnotami (v hexadecimálním tvaru) A1, 00, 4B se uloží do textu s 2*3 znaky "A1004B"). Lze tak nyní velmi lehce a obecně vysílat a přijímat jakékoli binární data.
Viz nové konfigurátory V 'Data-zaslání' je pouze HexaString a V 'Data-příjem' je pouze HexaString.
Pm8.00.02: Opravená chyba: kontrolní součet se v některých případech počítala špatně
© MICROSYS, spol. s r.o.