Knihovna SBUS Implementace neúplných protokolů S-BUS pro stanici server, paritní a datový mód Verze 3.07/2007
Změny ve verzích Verze 3.05-9.10.2006 Doplnění timeoutu při vysílání na sériovém kanálu. Mohlo dojít k zatuhnutí komunikace při ztraceném přerušení od vysílání znaku z řadiče sériového portu. Verze 3.06-19.6.2007 Lineární vyhledávání v modulu RegSBUS nahrazeno binárním s konstrukcí se AVL-strom z důvodu rychlosti vyhledávání. Verze 3.07-13.8.2007 Nové moduly SBusDat a SBusPar s možností zadávat adresu sbus stanice v proměnné Původní moduly SrvSBUS a S1SBUS přejmenovány na _X_SrvSBUS a _X_S1SBUS a je doporučeno je nahradit nově vzniklými. Modul SrvSBUS je nahrazen modulem SBusPar a modul S1SBUS je nahrazen modulem SBusDat. 2 Knihovna SBUS
SBusPar Server protokolu SBUS - paritní mód Popis Upozornění Parametry Modul implementuje paritní mód protokolu SBUS server. Modul implementuje pouze neúplný protokol SBUS. Je doporučeno umístit modul do procesu INIT. Paritní mód je funkční pouze na kanálu 0 (RS232), na kanálech RS485 stejně jako na dodatečných kanálech RS232 (např. AD-UART) je nutné použít datový mód. U paritního módu se používá k identifikaci začátku rámce 9-bit ve slově (odtud paritní mód), a tento mechanismus lze implementovat pouze na některých řadičích sériového kanálu. SrvAdr IN Konst Síťová adresa serveru. IN I Síťová adresa serveru zadaná proměnnou. IN MI Síťová adresa serveru zadaná buňkou matice. Port IN Konst Sériový kanál RS232. Baud IN Konst Baudová rychlost komunikace. LastError OUT NONE I Kód poslední chyby. Ovládání Server odpovídá na dotazy klienta. Modul zpracovává pouze neúplný protokol SBUS, což je následující repertoár telegramů: Čtecí požadavky Zápisové požadavky RF Read flag WF Write flag RI Read input RK Read clock WK Write clock RO Read output RR Read register WR Write register Interpretace jednotlivých příkazů závisí na jejich mapování do prostoru proměnných řídicího systému. Mapování se provádí prostřednictvím modul RegSBUS. Chybové kódy Po každém vykomunikování rámce je nastavena proměnná LastError. Pokud byla komunikace úspěšná, je proměnná nulována, v opačném případě je do proměnné zapsán jeden z následujících chybových kódů. Výjimečné jsou hodnoty 100 a 101, které signalizují fatální chybu. Kód Význam 100 Je použit neexistující sériový kanál. Signalizuje fatální stav, modul neběží. Knihovna SBUS 3
101 Vyčerpání přidělení vnitřních zdrojů systému. Fatální stav, modul neběží. 32 Chyba CRC v telegramu. 33 Nepodporovaný příkaz. Příkaz v telegramu neumí modul zpracovat. 34 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není rozměru 7 2. Chyba při čtení (telegram RR). 35 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není matice. Chyba při čtení (telegram RR). 36 V příkazu RI nebo RO nebyla nalezena adresa 37 V příkazu RF nebyla nalezena adresa RTC_IOF 38 V příkazu RR, RC, RT nebo RD nebyla nalezena adresa 39 Byl přijat příkaz RK ale nebyla nalezena odpovídající vazba. V aplikaci není nikde použit modul RegSBUS s nastavením Clock v parametru Binding. 40 V příkazu RR, RC, RT nebo RD nebyla nalezena adresa 41 Počet požadovaných bajtů v při čtení proměnné v rámci vazby Plan7 2 není 14. Touto vazbou lze číst pouze matici ML[7, 2] telegramem RR s počtem vyčítaných dat rovno 14. 42 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není rozměru 7 2. Chyba při zápisu (telegram WR). 43 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není matice ML. Chyba při čtení (telegram WR). 44 V příkazu WR, WC nebo WT nebyla nalezena adresa 45 V příkazu WF nebyla nalezena adresa RTC_IOF 46 Byl přijat příkaz WK ale nebylo nalezeno odpovídající vazba. V aplikaci není nikde použit modul RegSBUS s nastavením Clock v parametru Binding. 47 V příkazu WR, WC nebo WT nebyla nalezena adresa 48 Počet požadovaných bajtů v při zápisu proměnné v rámci vazby Plan7 2 není 14. Touto vazbou lze zapisovat pouze matici ML[7, 2] telegramem WR s počtem zápisových dat rovno 14. 49 V příkazu WF nebyla nalezena adresa RTC_IOF 4 Knihovna SBUS
SbusDat Server protokolu SBUS - datový mód Popis Parametry Modul implementuje datový mód protokolu SBUS server. Modul implementuje pouze neúplný protokol SBUS. Je doporučeno umístit modul do procesu INIT. Datový mód je funkční na jakémkoliv sériovém kanálu. SrvAdr IN Konst Síťová adresa serveru. IN I Síťová adresa serveru zadaná proměnnou. IN MI Síťová adresa serveru zadaná buňkou matice. Port IN Konst Sériový kanál RS 232 nebo RS 485. Baud IN Konst Baudová rychlost komunikace. LastError OUT NONE I Kód poslední chyby. Ovládání Server odpovídá na dotazy klienta. Modul zpracovává pouze neúplný protokol SBUS, což je následující repertoár telegramů: Čtecí požadavky Zápisové požadavky RF Read flag WF Write flag RI Read input RK Read clock WK Write clock RO Read output RR Read register WR Write register Interpretace jednotlivých příkazů závisí na jejich mapování do prostoru proměnných řídicího systému. Mapování se provádí prostřednictvím modul RegSBUS. Chybové kódy Po každém vykomunikování rámce je nastavena proměnná LastError. Pokud byla komunikace úspěšná, je proměnná nulována, v opačném případě je do proměnné zapsán jeden z následujících chybových kódů. Výjimečné jsou hodnoty 100 a 101, které signalizují fatální chybu. Kód Význam 100 Je použit neexistující sériový kanál. Signalizuje fatální stav, modul neběží. 101 Vyčerpání přidělení vnitřních zdrojů systému. Fatální stav, modul neběží. 32 Chyba CRC v telegramu. 33 Nepodporovaný příkaz. Příkaz v telegramu neumí modul zpracovat. Knihovna SBUS 5
34 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není rozměru 7 2. Chyba při čtení (telegram RR). 35 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není matice. Chyba při čtení (telegram RR). 36 V příkazu RI nebo RO nebyla nalezena adresa 37 V příkazu RF nebyla nalezena adresa RTC_IOF 38 V příkazu RR, RC, RT nebo RD nebyla nalezena adresa 39 Byl přijat příkaz RK ale nebylo nalezeno odpovídající vazba. V aplikaci není nikde použit modul RegSBUS s nastavením Clock v parametru Binding. 40 V příkazu RR, RC, RT nebo RD nebyla nalezena adresa 41 Počet požadovaných bajtů v při čtení proměnné v rámci vazby Plan7 2 není 14. Touto vazbou lze číst pouze matici ML[7, 2] telegramem RR s počtem vyčítaných dat rovno 14. 42 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není rozměru 7 2. Chyba při zápisu (telegram WR). 43 Proměnná v modulu RegSBUS spojená s významem Plan7 2 není matice ML. Chyba při čtení (telegram WR). 44 V příkazu WR, WC nebo WT nebyla nalezena adresa 45 V příkazu WF nebyla nalezena adresa RTC_IOF 46 Byl přijat příkaz WK ale nebylo nalezeno odpovídající vazba. V aplikaci není nikde použit modul RegSBUS s nastavením Clock v parametru Binding. 47 V příkazu WR, WC nebo WT nebyla nalezena adresa 48 Počet požadovaných bajtů v při zápisu proměnné v rámci vazby Plan7 2 není 14. Touto vazbou lze zapisovat pouze matici ML[7, 2] telegramem WR s počtem zápisových dat rovno 14. 49 V příkazu WF nebyla nalezena adresa RTC_IOF 6 Knihovna SBUS
RegSBUS Mapování adres protokolu SBUS do prostoru databáze řídicího systému. Popis Modul mapuje adresy protokolu SBUS do prostoru databáze řídicího systému a vytváří logické vazby mezi adresami. Je doporučeno umístit modul do procesu INIT. Parametry RTC_IOF IN Konst Adresa v protokolu SBUS. Variable IN I, MI L, ML F, MF Odkaz na proměnnou ve stanici. V některých případech může být NONE. Binding IN Konst Typ vazby. Je popsáno dále. SrvSBUS IN Module Odkaz na modul SrvSBUS nebo S1SBUS. Hits OUT NONE I Vždy když dojde k zápisovému nebo čtecímu požadavku, je tato proměnná inkrementována. A IN Konst Konstanta pro lineární přepočet hodnoty. Uplatňuje se pouze u čtení nebo zápisu do registru (příkazy RR nebo WR). B IN Konst Konstanta pro lineární přepočet hodnoty. Uplatňuje se pouze u čtení nebo zápisu do registru (příkazy RR nebo WR). Vazba Neexistující adresy Modulem RegSBUS se vytváří vazba mezi adresou v telegramu SBUS a proměnnou v databázi řídicího systému. Vazbu tvoří trojice parametrů RTC_IOF (adresa zdroje v telegramu), Variable (odkaz na proměnnou v PSE) a Binding (typ nebo interpretace vazby). Vazba 100, MyVar, Register znamená, že telegram s adresou 100 a s příkazem RR nebo WR (Read/Write Register) se bude odkazovat na proměnnou MyVar. Předpokládejme, že server obdrží od klienta žádost o čtení registru s adresou 100 a následujících 16 registrů (tedy registry s adresami 101, 102 až 115). Pokud existuje vazba adresy 100 na proměnnou, je tato hodnota vrácena. Dále probíhá vyhledávání vazby adresy 101 na proměnnou. Pokud je tato vazba nalezena, je vrácena příslušná hodnota. Pokud vazba není nalezena je vrácena hodnota nula. Pokud ovšem neexistuje vazba adresy 100 na proměnnou, vrací server Knihovna SBUS 7
odpověď NAK, což znamená chybný dotaz. Jinými slovy řečeno, server odpovídá telegramem NAK pouze v případě, že není vytvořena vazba na adresu uvedenou v telegramu. Pokud není vytvořena vazba na další adresy vyplývající z počtu dat v telegramu, jsou v případě čtecího požadavku vraceny nuly, v případě zápisového požadavku jsou zápisy ignorovány. Významy pole Binding Register Vytvoření vazby Register-proměnná. Například pokud bude pole RTC_IOF obsahovat číslo 20 a Variable bude odkazovat na proměnnou MyFloat (typu F), bude při čtecím požadavku RR na adrese 20 vyslána hodnota, kterou má proměnná MyFloat. Protože je proměnná MyFloat typu F, bude vnitřní interpretace v telegramu zaslána také jako typ F. Pokud by se daná adresa RTC_IOF odkazovala na proměnnou MyInt typu I, bude vnitřní reprezentace v telegramu odpovídat typu I (resp. L). Stejně se chová i zápisový požadavek tj. pokud je proměnná typu F, je hodnota přenášená v telegramu interpretována jako typ F, v opačném případě jako typ L (typ I je telegramech přenášen také jako typ L). Pokud je třeba přenášet v telegramech hodnotu striktně ve formátu L, je třeba použít hodnotu CastLong v poli Binding. V tomto případě jsou všechny hodnoty ukládané do telegramu převáděny na typ L. Pokud je třeba přenášet hodnotu striktně ve formátu F, je třeba použít hodnotu CastFloat v poli Binding. Obě dvě nastavení se vztahují pouze ke čtení nebo zápisu registrů (příkazu RR nebo WR), u ostatních příkazů nelze přetypování použít. Často jsou hodnoty typu L přenášené v telegramech používány pro přenos hodnot v plovoucí řádové čárce (typ F). Například hodnota 350 přenášená telegramem je pak ve stanici interpretována jako 35.0. Pro tento účel jsou v modulu RegSBUS dva parametry, které umožňují lineární přepočet podle vztahu přenášená_hodnota = A proměnná + B. Celý mechanismus přepočtu a přetypování je znázorněn blokově pro čtecí požadavky: Přetypování na hodnotu v telegramu Lineární přepočet T = A Var + B Proměnná Var v databázi PSE 8 Knihovna SBUS
Pro zápisové požadavky je blokové schéma obdobné: Přetypování z hodnoty v telegramu Lineární přepočet Var = (T - B) / A Proměnná v databázi PSE V kombinaci přetypování s lineárním přepočtem lze pak vyřešit situaci, kdy klient používá hodnotu typu I pro komunikaci s registrem, který obsahuje hodnotu typu F. Tedy například klient chce nastavit žádanou teplotu vratné vody na 50.7 C, ale používá k tomu integerovou interpretaci 507 (tedy A = 10, B = 0). V programu PSE je tato hodnota typu F (tak, jak to odpovídá přirozenému stavu) a jmenuje se TVratna. Pokud je adresa registru 100, pak modul RegSBUS bude mít následující parametry: RegBus 100, TVratna, CastLong, :0001, NONE, 10.0, 0.0 Toto nastavení zajistí to, že v telegramu zaslaná hodnota 507 změní proměnnou TVratna na 50.7 a naopak vyčtení této proměnné zajistí vyslání hodnoty 507. Flag Vazbou typu F se dociluje čtení či zápis bitových proměnných. Adresa v poli RTC_IOF je vždy zarovnána na násobek osmi, ale zarovnávání probíhá interně v modulu, tzn. že adresa 2 bude vnitřně zarovnána na hodnotu 0, nicméně vstupní parametr do modulu RegSBUS bude stále 2. Jako proměnná do parametru Variable může jít jakákoliv proměnná, smysl má však použití proměnné typu I nebo L (nebo prvků matice MI nebo ML). Z proměnné je využita pouze hodnota na nižších osmi bitech, tzn. že proměnná je využívána jako typ bajt. V telegramu může být uvedena jakákoliv adresa (nemusí být tedy zarovnána na násobek osmi), neexistující adresy flagů vrací hodnotu nula nebo ignorují zápisové požadavky (pokud neexistující adresa není uvedena přímo v telegramu viz předchozí část Neexistující adresy). Pokud tedy budeme mít vazbu 24, Flag, MyInt, kde MyInt je typu I, pak dotaz RF na adresu 24 s délkou 16 (2 bajty) vrátí nižších osm bitů z proměnné MyInt a dále nižších osm bitů z přiřazení s adresou 32 pokud existuje nebo 8 nulových bitů pokud takové přiřazení neexistuje. Dotaz RF na adresu 28 vrátí hodnoty bitů z druhého nibblu proměnné MyInt (MyInt.4 až MyInt.7), 8 bitů z přiřazení s adresou 32 a první nibble z přiřazení s adresou 40 (pokud samozřejmě tyto přiřazení existují). Příklad rozložení bitových adres pro následující vazby ukazuje obrázek RegSBUS 24, Int24, Flag,. RegSBUS 40, Int40, Flag,. Knihovna SBUS 9
Bity 0..7 proměnné Int24 Bity neexistují Bity 0..7 proměnné Int40 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 Input, Output Clock Tato vazba zprostředkovává přímý přístup k logickým DI a DO kanálům řídicího systému. Nejedná se tedy o přístup k fyzickým kanálům řídicího systému. Proto, aby čtená hodnota odpovídala fyzickému stavu na vstupech, je třeba vykonat modul DigIn s parametrem příslušného logického kanálu. Modul SrvSBUS čte z datových struktur, které jsou plněny nebo čteny moduly DigIn nebo DigOut. Protože jsou všechny binární kanály 16-ti bitové, musí být adresy RTC_IOF v modulu RegSBUS násobkem šestnácti. Příkaz RI s adresou 0 znamená, že bude přečtena spodní osmice bitů na logickém kanálu 0. Tato vazba umožňuje zpracovat čtení nebo zápis datumu. Adresa RTC_IOF není použita. Pokud je parametr Variable NONE, příkazy pracují s reálným časem stanice. Pokud je parametr typu L, je jeho hodnota interpretována jako datum a čas (DbNet time). Parametry typu I a F nejsou povoleny, při čtení v tomto případě modul vrací reálný čas stanice a zápis je ignorován, i když je klientovi potvrzen. V aplikaci může být použita pouze jedna tato vazba, resp. bude zpracovávána pouze první nalezená. 10 Knihovna SBUS