Promotic
WikipediaLinkedInYoutubeTwitterFacebook

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

Před použitím tohoto ovladače v aplikaci PROMOTIC je vhodné přečíst kapitolu: Komunikace pomocí PROMOTIC ovladačů.
 
Základní vlastnosti ovladače:
- Použití tohoto ovladače je vázáno na zakoupení licence: PmChar. S freeeware verzí PmFree nebo při vývoji aplikace (s vývojovou licencí pro testovací účely) je tato komponenta funkční vždy.
- Komunikace je přes Ethernet nebo přes standardní sériovou linku (COM1, COM2 ...).
- Ovladač je začleněn do systému PROMOTIC pomocí objektu PmComm.

Ovladač podporuje použití objektu PmCommMsg. Objekt PmCommData nelze používat.

Pro snadné přidání tohoto ovladače do aplikace je vhodné použít: Předkonfigurace ve skupině "PmChar konfigurovatelný protokol"

 
Tento 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žití 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, 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 CALOR 20,30 nebo 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 je daný protokol možno realizovat pomocí PmChar ovladače, Vám rádi poradíme; kontaktujte nás! (sw-support@microsys.cz).
 

Doporučené hodnoty parametrů:

Popis a doporučené hodnoty pro Parametry protokolu:
Timeout příjmu odpovědiJen pro seriovou linku. Má význam 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ěď, přenos zprávy se ukončí (vyvolá se událost onEndOfTransfer s chybou 24 nebo 66).
Používat STX Urč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, 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í. V případě, že tomu tak není, komunikační zpráva končí s chybou.
Hodnota STXUrčuje ASCII hodnotu 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, 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í. V případě, že tomu tak není, komunikační zpráva končí s chybou. Použití znaku ETX optimalizuje rychlost příjmu v případě, že přijímáme zprávu proměnné délky (přijímáme do datového 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í sumy) a rychle ukončí příjem místo, aby čekal na timeout mezi příjmem dvou znaků.
Hodnota ETXUrčuje ASCII hodnotu znaku konce vysílání (znak konce vysílání má obvykle hodnotu 3).
Kontrolní sumaUrčuje způsob výpočtu kontrolní sumy:
- žádná: komunikace bez kontrolní sumy.
- XOR 1 byte: Je použita kontrolní suma typu XOR (jedná se o tzv. vertikální paritu). Má velikost 1 byte a matematicky je to XOR všech bytu, které jsou do kontroly zahrnuty.
- SUM 1 byte: Je použita kontrolní suma typu součet. Má velikost 1 byte a matematicky je to aritmetický součet všech bytů, které jsou do kotroly zahrnuty (ořezáno na 1 byte).
- SUM 2 byte: stejně jako "SUM 1 byte" ale má velikost 2 byte (ořezáno na 2 byte).
- CRC 2 byte CCITT [polynom 0x1021 = x16+x12+x5+1, use SBUS]: (Cyclical Redundancy Check) - Speciální kontrolní výpoč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í výpoč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í výpočet, který používá například komunikace PmABradleyDF1.
 
Lze zadat, kde bude kontrolní suma umístěna:
- na konec zprávy (za ETX)
- před ETX
 
Lze zadat, která data zprávy se mají do kontrolní sumy zahrnout:
- Všechna data před kontrolní sumou
- Všechna data před kontrolní sumou mimo první znak (mimo STX)
- Všechna data před kontrolní sumou mimo poslední znak (mimo ETX)
- Všechna data před kontrolní sumou mimo první a poslední znak (mimo STX a ETX)
 
Pokud je kontrolní součet využíván, 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í suma. V případě, že tomu tak není, komunikační zpráva končí s chybou.

Výpočet kontrolní sumy lze provést také pomocí metody Pm.ArrayOper.

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ý. Nejčastěji se používá v případě, kdy chceme přijatá data ukládat do datového typu String ale v přijatých datech se přitom může objevit znak 00hex (binární nula). V tomto případě musíme znak 00hex zaměnit za jiný, neboť 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í objektů PmCommMsg

Parametry zprávy:
V 'Data-zaslání' je pouze HexaStringPokud zatrženo, pak se předpokládá že v záložce Data-zaslání je pouze jedna proměnná typu String. Obsahem této proměnné je tzv. HexaString pomocí něhož lze v typy 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 (hexadecimálně), pak do této proměnné typu String je nutno nastavit 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, jen pro záložku Data-příjem.

Pro zpracování přijatých dat lze pak použít metodu Pm.TransformValue(241).

Tato zpráva bude používat následující parametry (místo těch, které jsou definovány v parametrech protokolu)(jen pro zprávy typu Master) Pokud zatrženo, pak se zobrazí stejné konfigurátory jako v parametrech protokolu, (zda používat znaky STX, ETX a zda používat kontrolní sumu). 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í suma]

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

 
Objekt PmCommMsg lze nastavit pro zprávy typu Master nebo Slave (viz konfigurátor "PmCommMsg > 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ů PmCommMsg může chtít v jednom okamžiku přenášet data).
- Až na objekt dojde řada, vyvolá se událost onBeginOfTransfer. Zde například může projektant nastavit data v záložce Data-zaslání (nemusí když jsou data již nastavena).
- Data ze záložky Data-zaslání se upraví (např. se provede převod z HexaString do binárního tvaru, přidají se znaky STX, ETX nebo kontrolní suma)
- Upravená data se zašlou po seriové lince nebo Ethernetu
- Pokud v záložce Data-příjem nejsou žádné proměnné pak se přenos ukončí (vyvolá se událost onEndOfTransfer). Využívá se když druhá strana neposílá odpověď.
- Pokud v jsou v záložce 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ávnost kontrolní sumy, pokud je nastaven tak se provede převod do HexaString), upravená data se uloží do záložky Data-příjem a vyvolá se událost onDataReceive.
- Vyvolá se 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, tak se přijatá data předají jemu, jinak se rozhoduje následovně:

Zjistí se délka přijaté zprávy a zjistí se délka požadovaných dat v objektech v záložkách Data-příjem. Přijatá zpráva se přiděli 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ěli 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 záložky Data-příjem příslušného objektu se vyvolá událost onDataReceive. Zde může projektant na základě přijatých dat nastavit data pro vyslání v záložce Data-zaslání.
- Pokud v záložce Data-zaslání nejsou žádné proměnné pak se přenos ukončí (vyvolá se událost onEndOfTransfer). Využívá se když PROMOTIC nemá poslat odpověď druhé straně.
- Pokud v jsou v záložce Data-zaslání definované proměnné, pak objekt upraví data z této záložky (např. se provede převod z HexaString do binárního tvaru, přidají se znaky STX, ETX nebo kontrolní suma) a upravená data se zašlou druhé straně.
- Po vyslání se vyvolá událost onEndOfTransfer.
 
Přenos textových dat:
- Pokud umístíte do záložky Data-zaslání položku datového typu String, pak lze délku zprávy dynamicky měnit (do 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 využít metody Pm.TransformValue(240) (např. v události onBeginOfTransfer).
- Pokud není nastaven, vyšle se text bez konverze. Vhodné pro textově orientované komunikace. Pro snadné vytvoření formátovaného textu lze využít metody Pm.StringFormat (např. v události onBeginOfTransfer).
- Pokud umístíte do záložky Data-příjem položku datového 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í nastaven, uloží se přijatý text bez konverze. Vhodné pro textově orientované komunikace. Pro snadné zpracování textu lze využít metody Pm.StringScan (např. v události onEndOfTransfer).

Pro položku typu String v záložce 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 záložce vyplněním konfigurátoru Délka
- je možno nechat toto políčko nevyplněné a potom pomocí vlastnosti PmCommMsg.ReadVars před spuštěním zprávy nastavit do položky typu String řetězec požadované délky.

Pokud je položka typu String poslední položkou v záložce, přijímá se proměnný počet znaků až do výše uvedeným způsobem stanovené délky řetězce. Pokud položka typu String není poslední položkou v záložce, přijímá se 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řijem dat, kde se objevuje i binární hodnota 0 (dále 00hex). Přímý příjem takových dat do datového typu String nefunguje dobře, neboť 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 záložek 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 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 "#".
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice