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 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:
- Ovladač i v tom 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, ..
- 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:
Timeout příjmu odpovědi | Pouze 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řijatá data budou vždy pouze v jednom paketu | Pouze 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 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, 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 STX | Určuje hodnotu ASCII znaku začátku vysílání (znak začátku vysílání má obvykle hodnotu 2). |
Používat ETX | Urč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ž pouze znaky kontrolního součtu) a rychle ukončí příjem, místo aby čekal na timeout mezi příjmem dvou znaků. |
Hodnota ETX | Určuje hodnotu ASCII znaku konce vysílání (znak konce vysílání má obvykle hodnotu 3). |
Kontrolní součet | Urč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 datech | Lze 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 HexaString | Pokud 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ásledovně:
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 HexaString | Stejné 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:
- 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.
-
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 pouze 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 zaslá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ě.
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ěnlivé délky).
- 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 zprávy proměnlivé délky.
- 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:
- buď v kartě vyplněním konfigurátoru "
Délka"
- nebo 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 pouze znaky do hodnoty
00hex. Jsou následující řešení:
- 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řijatý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 funkce
Split, která daný text rozdělí podle rozdělovacího znaku
"#".