manual ------------------------------------------------------------------------------------------------***** M o d b . d c u ***** ------------------------------------------------------------------------------------------------- Knihovna je určena výhradně pro použití s protokolem Modbus RTU (16-bit) - Vysokoúrovňové příkazy pracují pouze s přístroji Mikrotherm(r) MT600, MT825A a MT825C V Y S O K O Ú R O V Ň O V É P Ř Í K A Z Y ------------------------------------------ podporují načítání/zápis dat s přístroji Mikrotherm(r) (MT600, MT825A a MT825C) - příkaz pro detekci typu přístroje - automatický převod výsledků do podoby s plovoucí desetinnou čárkou - optimalizace rychlosti vlákna, minimální spotřeba výkonu CPU - automatické použití packetového čtení, pokud jej přístroj podporuje. (pokud má být packetové čtení použito, musí být registry do bufferu vkládány ve vzestupném pořadí za sebou! - pomocí příkazu AddRegister, např. 1410,1411,1412 - pak tyto příkazy budou přečteny jednorázově) - buffer o velikosti 32 registrů Typy a proměnné: ---------------MaxOfDevices : Integer; - tato proměnná musí být naplněna po inicializaci komunikace, určuje maximální funkční adresu přístroje (max 255) TData = record Adr : integer; - adresa přístroje Reg : integer; - zpracovávaný registr dir : integer; - směr toku dat (3=čtení; 6=zápis) data : real; - načtená/zapisovaná data v podobě s plovoucí čárkou dot : integer; - automaticky zjištěný počet desetinných míst (dle inisouboru, buď pevně nebo konfiguračním registrem) dot_ofset : integer; - posunutí počtu desetinných míst dle vzorce dot_ofset+dot (dot_ofset je pouze číslo, dot může být celé číslo nebo číslo přečtené z konfiguračního registru) text : string[10]; - textová podoba načtené hodnoty (1, 2, .., oFF,....) DataReaded : boolean; - příznak dokončení čtení dat patřičného registru DotReaded : boolean; - příznak dokončení čtení počtu desetiných míst patřičného registru PacketReadSupport : boolean; - příznak, jestli registr podporuje packetové čtení - unita volí automaticky Result : shortint; - stav načtených dat end; - struktura dat vztažená k jednomu čtenému/zapisovanému registru - je použita pouze při čtení/zápisu dat přes buffer (velikost bufferu je 32 rozdílných registrů) - Chybové hlášení Result: =0 - bez chyby =1 - chyba CRC =2 - chyba dle manuálu přístroje =3 - data mimo rozsah =4 - timeout (fatální chyba komunikace) Idle.data[integer] : TData - proměnná, ve které jsou uložena veškerá komunikační data při použití vysokoúrovňových příkazů TDeviceType = record Adr device_id firmware
: integer; : integer; : integer; Stránka 1
manual inifile : string; description : string; end; - návratový typ při použití rutiny DetectDevice proměnná Idle.EndReadingTime : TDateTime vrací čas, ve kterém bylo dokončeno čtení posledního registru proměnná Idle.TransferTimE : TDateTime vrací dobu trvání celého přenosu proměnná Idle.BufferReading indikuje probíhající Bufferové čtení/zápis proměnná Idle.BufferGlobalResult navrací číslo poslední vzniklé chyby během Bufferové operace. Pokud k žádné chybě nedošlo, je vrácena 0. -Chybové kódy jsou popsány výše Metody: ------AddRegister(Adr,Reg:integer; Dir:integer; Data:real; InifileName:string); ------------------------------------------------------------------------Adr = adresa přístroje Reg = zpracovávaný registr (dle manuálu přístroje) dir = směr toku dat (3=čtení, 6=zápis) Data= načtená data v plovoucí čárce, zapisovaná data v plovoucí čárce InifileName = cesta k inicializačnímu souboru danného přístroje, vhodný typ inisouboru lze automaticky zjistit použitím procedury DeviceDetect() - tento příkaz vloží do bufferu zadané údaje - automaticky zjistí počet desetinných míst - pokud registr byl již použit dříve, počet desetinných míst se znovu nenačítá, pouze se generuje požadavek na refresh dat - příkaz lze použít opakovaně (maximální počet rozdílných registrů, ev. shodných na různých adresách činí 32) - Čtení dat je zahájeno příkazem StartCommToBuffer, data jsou čtena paralelním vláknem na pozadí StartCommToBuffer; -------------------------------------------------------------------------- pokud je buffer naplněn pomocí příkazu AddRegister(); je pouřitím tohoto příkazu zahájeno čtení/zápis dat na pozadí (paralelním vláknem) - načtená data jsou navrácena v proměnné Idle.Data[i], kde i je celé číslo 1-32. Idle.Data[i] je typu TData GetIndexOfRegister(Adr,Reg:integer; txt:boolean; InifileName:string):integer; ----------------------------------------------------------------------------Adr = Adresa přístroje Reg = Požadovaný zpracovaný registr (dle manuálu přístroje) txt = false - nezajímá nás textová podoba hodnoty; true = je vyžadována textová podoba hodnoty - např. "23.1", "oFF",..(nepatrně zpomaluje) InifileName = cesta k inicializačnímu souboru danného přístroje, vhodný typ inisouboru lze automaticky zjistit použitím procedury DeviceDetect() - zjistí index, pod kterým se v proměnné Idle.Data[index] nachází data žádaného registru na žádané adrese. - pokud nejsou žádaná data v bufferu nalezena, navrátí hodnotu -1 ClearBuffer; ----------------------------------------------------------------------------Vyprázdní buffer a připraví jej pro použití s novou sadou registrů (max 32) GetDescription(Reg:integer; InifileName:string):string; ----------------------------------------------------------------------------Reg = Zpracovávaný registr InifileName = cesta k inisouboru přístroje - Zjistí popis funkce registru dle inisouboru (např. "Měřená hodnota 1") DetectDevice(Adr:integer):TDeviceType; ----------------------------------------------------------------------------Adr = testovaná adresa - navrací strukturu dle TDeviceType Stránka 2
manual - otestuje, zda-li se na zadané adrese nevyskytuje nějaký přístroj - pokud adresa není obsazena, navrátí TDeviceType.device_id=-1; TDeviceType.firmware=-1 - pokud je adresa obsazena, je detekován typ přístroje, jsou navráceny následující hodnoty: - firmware - číslo firmware přístroje - inifile - název inisouboru, který je vhodný ke komunikaci s tímto přístrojem - description - popis přístroje v textové podobě (např. "MT600-TC/RTD") - device_id - pořadové číslo, pod kterým lze nalézt informace o přístroji v souboru devicelist.ini Procedure RefreshAllReadedRegisters; ----------------------------------------------------------------------------- Procedura, která všechny registry v bufferu, které již byly přečteny určí k obnově dat. - Pro dokončení obnovy dat je nutné volat proceduru StartCommToBuffer Procedure GetRegister(index:integer; txt:boolean; InifileName:string); ----------------------------------------------------------------------------- Procedura vypočte hodnoty a textovou podobu dat u registru, který se nachází v bufferu pod indexem "index". - index vrací např. funkce AddRegister
N Í Z K O Ú R O V Ň O V Ý O V L A D A Č Modb.dcu v.1.0 ---------------------------------------------------------Tento ovladač je určen pro komunikaci přístrojů řady MIKROTHERM, jiných zařízení se systémem Control Web. K A N Á L Y
WATLOW nebo
O V L A D A Č E:
1 2 3 4 7
longcard output longcard output longcard output longcard output boolean output
adresa prikaz adresa registru počet čtených registrů reset
8 9 10
longcard input longcard input longcard input
stav linky chyba pri komunikaci chyba odeslana přístrojem
16
integer output
výstupní data
48-79
integer input
vstupní data 1 - 32
Kanál č.1: Udává adresu přístroje. Pokud je adresa = 0, driver neočekává odpověď od přístroje. Může být využito pro hromadné zadávání údajů. Kanál č.2: Udává typ příkazu: - 3, 4 ... čtení dat (1 až 32 registrů) - 6 ... zápis dat (1 registr) - 8 ... zpětný dotaz Kanál č.3: Udává číslo počátečního registru, ze kterého se budou čtena data nebo číslo registru, do kterého budou zapisována data. Kanál č.4: Počet registrů, které jsou čteny jedním příkazem (1 - 32). První registr je definován kanálem č.3. Kanál č.7: Zápisem hodnoty TRUE do tohoto kanálu je proveden reset driveru. Stránka 3
manual Kanál č.8: Udává stav ovladače: - 0 ... Ovladač je v klidu (po inicializaci nebo resetu) - 1 ... Probíhá komunikace - 2 ... Data jsou připravena, může být zaslán další příkaz Kanál č.9: Chyba při komunikaci: - 0 ... přenos dat je bez chyby - 1 ... chyba crc (přijatých dat) - 2 ... chyba odeslaná přístrojem, je popsána v příručce přístroje. Typ chyby je indikován kanálem č.10. - 3 ... chyba výstupních dat. Data na některém výstupním kanálu jsou mimo rozsah (např. adresa přístroje > 255). - 4 ... timeout Kanál č.10: Chyba odeslaná přístrojem. Při zápisu do registru přístroje je kontrolován rozsah zapisované hodnoty, číslo registru, ... . Pokud některý údaj není v pořádku, přístroj požadavek na zápis neakceptuje a odešle chybové hlášení. Kanál č.9 = 2, kanál č.10 udává typ chyby. Popis chyb je uveden v příručce popisující komunikační linku přístroje. Kanál č.16: Výstupní data. Udává hodnotu, která je zapisována do požadovaného registru. Kanál č. 48 - 79: Vstupní data. Udávají data přečtená v přístroji. Č T E N Í D A T , příkaz č.3 nebo č.4 --------------------------------------Pokud je stav ovladače (kanál č.8) <> 1, můžete zapsat požadavek na zápis dat: - zapište adresu přístroje (kanál č.1), adresu prvního čteného registru (kanál č.3) a počet čtených registrů (kanál č.4) - komunikaci spusťte nastavením: příkaz = 0 a následně příkaz = 3 (kanál č.2) - pokud probíhá komunikace, je stav linky = 1 (kanál č.8) - ukončení komunikace je indikováno stavem linky = 2 a vyvoláním výjimky ovladače - chybové hlášení čtěte na kanále č.9 - přenesená data jsou na kanálech č.48 až 79 Z Á P I S D A T , příkaz č.6 -----------------------------Pokud je stav ovladače (kanál č.8) <> 1, můžete zapsat požadavek na čtení dat: - zapište adresu přístroje (kanál č.1) a výstupní data (kanál č.16) - komunikaci spusťte nastavením: příkaz = 0 a následně příkaz = 6 (kanál č.2) - pokud probíhá komunikace, je stav linky = 1 (kanál č.8) - ukončení komunikace je indikováno stavem linky = 2 a vyvoláním výjimky ovladače - chybové hlášení zápisu čtěte na kanále č.9 a č.10 Z P Ě T N Ý D O T A Z, příkaz č.8 ----------------------------------Pomocí zpětného dotazu můžete zjistit, je-li přístroj dané adresy na lince. Pokud je stav ovladače (kanál č.8) <> 1, můžete zapsat požadavek na čtení dat: - zapište adresu přístroje (kanál č.1) - komunikaci spusťte nastavením: příkaz = 0 a následně příkaz = 8 (kanál č.2) - pokud probíhá komunikace, je stav linky = 1 (kanál č.8) - ukončení komunikace je indikováno stavem linky = 2 a vyvoláním výjimky ovladače - pokud je indikován na kanále č.9 timeout, není přístroj na dané adrese přítomen Stránka 4
manual S O U B O R P A R A M E T R U ------------------------------Soubor parametrů slouží ke konfiguraci ovladače a zadává se při definici ovladače. Jde o textový soubor, který je možno upravovat běžným textovým editorem. Standardně má jméno comm.ini, ale je možné zvolit jakékoliv jiné jméno. [COMM] commPort = COM1 baudrate = 9600 parity = no databits = 8 stopbits = 1 rbuffer = 1024 wbuffer = 1024 cts_flow = false dsr_flow = false dtr_control = disable rts_control = toggle timeout_repeat = 3 com_repeat = 3 com_interval = 50 timeout = 1000 pre_key = 2 hold_key = 2 Význam jednotlivých parametrů: - commPort používaný komunikační port (COM1, COM2, COM3, ...) - baudrate komunikační rychlost (4800, 9600, 19200, ...) - parity parita (no, even, mark, odd, space) - databits počet data bitů (5, 6, 7, 8) - stopbits počet stop bitů (1, 1.5, 2) - rbuffer velikost bufferu pro vstup - wbuffer velikost bufferu pro výstup - cts_flow povoluje CTS řízení (false, true) - dsr_flow povoluje DSR řízení (false, true) - dtr_control chování DTR (disable, enable, handshake) - rts_control chování RTS (disable, enable, handshake, toggle, toggle_neg) - timeout_repeat počet opakování při timeoutu (kanál č.9 = 4) - com_repeat počet opakování při chybě komunikace (kanál č.9 = 1, 2, 3) - com_interval doba v [ms] od přijetí požadavku na komunikaci do vyslání dat na přístroj. Tato doba je důležitá z důvodu možnosti kolize dat na lince a je uvedena v příručce přístroje. - timeout nastavení timeoutu v [ms]. Tento údaj musí být vždy větší, než com_interval - pre_key prodleva v [ms] od prepnutí signálu RTS do zacátku prenosu (v modu toggle, toggle_neg) - hold_key prodleva v [ms] od ukoncení prenosu do prepnutí signálu RTS (v modu toggle, toggle_neg)
Z Á V Ě R E Č N É U J E D N Á N Í ----------------------------------Tento program je licenční a může být používán pouze na jednom počítači. Dodavatel v žádném případě nepřebírá odpovědnost za použití tohoto programu.
Stránka 5