Futásidejű DALI világításvezérlés a RESI-DALI-SIO és RESI-DALI-ETH Modbus-DALI átjáróhoz. Gear-enkénti tompítás akár 64 vezérlőkészülékhez (gears), 16 broadcast csoport és gear-enkénti DALI 1.0 állapot, lámpa/tápellátási hiba és min/max szint diagnosztika Modbus RTU-n keresztül.
ResiModbus RTU80 eszközRevízió 1.3Utoljára frissítve: 2026. november 15.
Importálás a TapHome alkalmazásbaHardver › Modbus › Hozzáadás sablonból
A Resi DALI sablon a Resi Dali - Konfiguráció üzembe helyezési eszköz futásidejű üzemeltetési párja. A RESI-DALI-SIO vagy RESI-DALI-ETH Modbus-DALI átjárón keresztül kapcsolja össze a TapHome-ot egy teljesen címzett DALI világítási busszal, és napi vezérlést biztosít akár 64 egyénileg címzett DALI vezérlőkészülékhez (gears) (rövid címek 0–63) és 16 DALI broadcast csoporthoz (0–15), valamint gear-enkénti DALI állapotot, vezérlőkészülék- és lámpahiba diagnosztikát.
Az átjáróval való kommunikáció Modbus RTU-t használ 9600 baud 8N1-en. A fényerő-írások a H:510 LAMP LEVEL (gear-enkénti) és a H:520 GROUP LEVEL (csoportonkénti) regiszterekbe mennek; a gear-enkénti konfigurációs parancsok és lekérdezések a H:511 LAMP COMMAND / H:512 LAMP COMMAND + REPEAT regisztereken keresztül vannak alagutazva, miközben az átjáró H:550 DALI STATUS regisztere a válasz készenlétére van pollozva.
Ez a sablon feltételezi, hogy a DALI rövid címek már be vannak programozva a buszon. Ha a gear-ek még nincsenek címezve, először használja a Resi Dali - Konfiguráció sablont (vagy a gyártó ingyenes MODBUSConfigurator / DCA eszközét) a DALI 2.0 véletlenszerű címzési varázsló futtatásához — lásd a Kapcsolat a konfigurációs sablonnal szakaszt alább.
A RESI-DALI-SIO (RS-485) és a RESI-DALI-ETH (Ethernet) DIN sínre szerelhető master átjárók, amelyek egy soros/Ethernet host és egy DALI világítási busz között helyezkednek el. A SIO CEM17 házban (17,5 × 90 × 56,4 mm), az ETH pedig szélesebb CEM35 házban (35,8 × 90 × 56,4 mm) érkezik az RJ45 csatlakozó befogadásához. Egyik átjáró sem táplálja önállóan a DALI buszt — egy kísérő DALI bus tápegység (RESI-DALI-PS vagy bármely kompatibilis 200 mA DALI PSU) kötelező.
A RESI-DALI-SIO csatlakoztatása (RS-485)
A RESI-DALI-SIO bal oldalán lévő sorkapcsok (felülről → lefelé): GND, +12..48V=, RS485 DATA+ (A+), RS485 DATA- (B-), RS485 GND, RS232 TX, RS232 RX, RS232 GND. A DALI busz sorkapcsok az ellentétes oldalon D+ / N/C / D- (3-tűs USLIM blokk, a középső N/C tű csatlakoztatás nélkül marad).
TapHome telepítéshez használja az RS-485 interfészt:
RS485 DATA+ (A+) → A+/D+ a TapHome RS-485 buszon
RS485 DATA- (B-) → B-/D- a TapHome RS-485 buszon
RS485 GND → GND a TapHome tápegységen (ajánlott a stabil kommunikációhoz)
+12..48V= / GND → 12–48 V DC primer tápellátás
A RESI-DALI-ETH csatlakoztatása (Ethernet)
Az Ethernet változat ugyanazokkal a DALI busz sorkapcsokkal (D+ / N/C / D-) és primer tápbemenetekkel (GND, +12..48V=) rendelkezik, plusz egy RJ45 csatlakozóval 10/100 Mbit Ethernethez. A gyári IP beállítások: 192.168.0.191 / 255.255.255.0 / 192.168.0.1 Modbus Unit ID 255-tel; a beágyazott web UI a RESI / RESI belépési adatokat használja.
Mivel ez egy Modbus RTU sablon, a TapHome nem natív Modbus/TCP-n keresztül kommunikál a RESI-DALI-ETH-vel. Ehelyett használja transzparens RTU-over-Ethernet módban, vagy helyezze a SIO-t egy soros-IP híd mögé (Moxa NPort, USR-TCP232) — lásd Konfiguráció → RTU-over-TCP beállítás alább.
DALI bus tápegység (RESI-DALI-PS)
A RESI-DALI-PS akár 200 mA-t biztosít a DALI buszra (zárlati áram ~225 mA, busz feszültsége tipikusan 14–18 V), és egyetlen vonalon legfeljebb 64 DALI 1.0 előtétet vagy DALI 2.0 vezérlőkészüléket támogat. A primer oldal ugyanazt a 12–48 V DC tápellátást fogadja, mint a SIO/ETH egység. Az átjáró és a PSU ugyanarra a D+ / D- párra csatlakozik — a PSU táplálja a buszt, miközben az átjáró DALI kereteket olvas és ír.
Három LED a PSU-n segít a hibadiagnosztikában: POWER (primer 12–48 V OK, normál működés alatt mindig világít), DALI (röviden villog DALI busz forgalomnál), ERR (folyamatosan világít PSU hiba, DALI zárlat vagy busz túlterhelés esetén — normál működésnél kikapcsolva kell lennie).
DALI busz topológia
A DALI vonalnak van néhány szigorú megkötése, amelyek közvetlenül befolyásolják a futásidejű stabilitást:
Vezetékkeresztmetszet
Max DALI kábelhossz
1,5 mm²
300 m
1,0 mm²
238 m
0,75 mm²
174 m
0,5 mm²
116 m
A korlát a DALI kábelen maximálisan megengedett 2 V feszültségesésből származik. További szabályok:
Maximum 64 DALI 1.0 előtét és legfeljebb 64 DALI 2.0 vezérlőkészülék buszonként (külön rövid címterek).
Csak fa topológia — nincsenek gyűrűk, nincsenek hurkok.
A tényleges gear darabszám a PSU áramfelvételétől is függ (tipikusan 200 mA a RESI-DALI-PS-en; számoljon ~2 mA-t gear-enként plusz tartalékot).
A RESI-DALI-PS (vagy egyenértékű DALI PSU) kötelező. Nélküle az átjáró nem tudja meghajtani a buszt, és minden gear-enkénti olvasás “Gear not responding!” időtúllépéssel végződik. Ha hosszú vonalon második PSU-t adnak hozzá, helyezzen be egy DALI fojtót, vagy bontsa szét a buszt galvanikusan elválasztott szegmensekre.
A RESI-DALI-SIO host soros paramétereit a modulon lévő 4-pólusú DIP kapcsolóval választja ki. A TapHome sablon fixen 9600 baud 8N1-re van beállítva, ezért a DIP kapcsolóknak meg kell egyezniük.
DIP1
DIP2
Baud rate
OFF
OFF
9600 bd (TapHome által megkövetelt)
ON
OFF
19200 bd
OFF
ON
38400 bd
ON
ON
A FLASH-be programozott baud rate-et használja (gyári alapértelmezés 57600 bd)
DIP4
A Modbus Unit ID forrása
OFF
A H:65221 FLASH regiszter érvényesül — szükséges, ha az üzembe helyezés során nem alapértelmezett Slave ID-t programoztak
ON
Hardver fallback — a Unit ID kényszerítve 255, a FLASH érték figyelmen kívül hagyva
A DIP3 egy termékspecifikus fenntartott bit; hagyja gyári állásban. A paritás None-ra van rögzítve, és a stop bit 1 (8N1 keret formátum) a fent kiválasztott DIP1/DIP2 baud rate kombinációkhoz.
RS-485 lezárás: zárja le a buszt 120 Ω-os ellenállással mindkét végén. A TapHome Core egy lezárást biztosít a BUS sorkapcsain; ha a RESI átjáró az utolsó eszköz a vonalon, adjon hozzá egy diszkrét 120 Ω-os ellenállást az A+ / B- között az RS-485 sorkapcsain.
Slave ID
A gyári alapértelmezett Modbus Unit ID 255 (a H:65221 FLASH regiszter 0xFFFF-et olvas, amit az átjáró 255-re klampoz). A sablon egy modul szintű szerviz attribútumot Slave ID néven biztosít, amely visszaolvassa ezt a regisztert, így a beállított cím importálás után ellenőrizhető.
A Slave ID módosítása üzembe helyezési feladat, amelyet a Resi Dali - Konfiguráció testvér sablon kezel — ez a futásidejű sablon szándékosan nem ír a H:65221-be, és nem indít szoftveres resetet, így a projektben aktív maradhat anélkül, hogy véletlen átjáró-átkonfigurálás kockázata fenyegetne.
RTU-over-TCP beállítás
Mivel a sablon Modbus RTU kapcsolatot használ, egy IpAddress import paraméter is felkínálva van olyan telepítésekhez, ahol a TapHome soros-IP hídon (Moxa NPort, USR-TCP232) vagy RESI-DALI-ETH-en transzparens RTU-over-Ethernet módban keresztül éri el az átjárót. Ebben az esetben mutasson az IpAddress a híd / ETH egység IP-jére, és minden más beállítást tartson azonosan az RS-485 változattal. Tiszta Modbus/TCP-hez egy TCP alapú sablon természetesebb lenne — ez a Modbus RTU sablon kifejezetten keretezett RTU forgalmat vár.
Egyszerre csak egy Modbus master. Sem a DALI, sem a Modbus RTU nem arbitrál egyidejű masterek között. Ha egy PLC, BMS vagy PC eszköz (például MODBUSConfigurator) is pollozza az átjárót, a gear lekérdezések ütköznek, és a TapHome sporadikus “Gear not responding!” hibákat fog jelenteni.
Ugyanaz a Dali.xml definíció a RESI átjáróval két komplementer TapHome sablonként szállítódik, amelyek ugyanazon hardver különböző életciklus-fázisain működnek:
Sablon
Fázis
Mit csinál
Mikor használjuk
Resi Dali - Konfiguráció (resi-dali-daliconfig)
Egyszeri üzembe helyezés
DALI 2.0 véletlenszerű címzési varázsló, címenkénti device-type próba, broadcast ON/OFF tesztek, Rövid címek visszaállítása / Rövid cím törlése / Rövid cím módosítása, Set Slave ID, Reset Gateway
Új telepítés: rendeljen rövid címeket 0–63 vezérlőkészülékekhez, ellenőrizze, mely címek vannak betöltve
Resi DALI (resi-dali-dali, ez a sablon)
Napi futásidejű vezérlés
Gear-enkénti tompítás (64 gear), csoport tompítás (16 csoport), gear-enkénti DALI 1.0 diagnosztika, csoporttagság kezelése
Kösse be és táplálja a DALI buszt (RESI-DALI-PS) és az átjárót.
Importálja a Resi Dali - Konfiguráció sablont, futtassa a Rövid címek visszaállítása modulműveletet (Confirm = Yes), majd válassza az Indítás állapotot az Új eszközök keresése varázslón — a varázsló magától végighalad a Rövid cím keresése → Set SEARCHADDR → Ellenőrzés → PROGRAM SHORT ADDRESS lépéseken, amíg meg nem áll a Befejezés állapoton, ezután zárja le a munkamenetet a TERMINATE állapottal. Ellenőrizze a Gear 0..63 és a Turn On / Off All Lamps segítségével.
Távolítsa el a Resi Dali - Konfiguráció modult a projektből.
Importálja a Resi DALI (ezt) sablont a futásidejű vezérléshez. Hozzárendeli a Gear N és Group N eszközöket TapHome jelenetekhez, ütemezésekhez és szabályokhoz.
A két sablon átmenetileg együtt is létezhet — pl. új gear hozzáadásakor egy élő telepítéshez —, de egyszerre csak az egyik küldjön Modbus forgalmat. A futásidejű sablon szándékosan kihagyja az átjáró átkonfigurálási akcióit (Reset Gateway, Set Slave ID, broadcast ALL LEVEL), így az üzembe helyezési beállítások felülírásának kockázata nélkül maradhat a projektben.
A gyártó ingyenes MODBUSConfigurator DCA eszköze (Windows, elérhető a RESI weboldaláról) szintén használható az üzembe helyezéshez a Resi Dali - Konfiguráció TapHome sablon helyett. A Resi DALI futásidejű sablon ugyanúgy működik, függetlenül attól, hogy melyik eszközt használták a rövid címek hozzárendelésére.
A sablon 80 DALI eszközt biztosít a TapHome-ban, két párhuzamos csoportba szervezve: 64 Gear tompító (egy minden DALI rövid címre) és 16 Group tompító (egy minden DALI csoportra). Egy modul szintű szerviz attribútum egészíti ki a képet.
Gear-enkénti tompítás — Gear 0 … Gear 63
A 64 szerviz eszköz mindegyike — Gear 0, Gear 1, … Gear 63 — egy TapHome tompító, amely a megfelelő rövid címen lévő egyetlen DALI vezérlőkészüléket célozza meg. A fényerő-írások a H:510 LAMP LEVEL-be mennek (a TapHome 0–100 % lineárisan a DALI arc power tartományba van skálázva, amelyet a gear saját MIN LEVEL és MAX LEVEL értékei határolnak); a tényleges szintet a H:511-ből olvassa vissza a DALI QUERY ACTUAL LEVEL (0xA0) parancson keresztül, és visszaskálázza 0–100 %-ra.
Amikor a sablon importál egy gear-t, az init script először lekérdezi a gear-t a QUERY STATUS (0x90) paranccsal; bármely válaszbájt igazolja, hogy a gear jelen van, és a sablon a gear állapotaként tárolja. Egy 0x8000 „nincs válasz" válasz a gear-t nem válaszolónak jelöli (egy véletlenszerű, 1–60 s közötti időre), és a TapHome logban „Gear not responding!" hibát ad ki. Ha a gear válaszol, az init script ezután kiolvassa a QUERY MIN LEVEL (0xA2) és QUERY MAX LEVEL (0xA1) parancsokat, és az eredményeket belső állapotban tárolja a periodikus readscript számára.
Minden lekérdezés védett az elavult és sérült válaszok ellen: minden lekérdezés előtt a sablon kiolvassa és eldobja a H:511-ben maradt, ki nem olvasott választ, hogy azt ne tekintse az új lekérdezés válaszának. Az a szintválasz, amely nem érvényes szint (0xFF, 0x20FF buszütközés, 0x8000 nincs válasz), vagy 1 és a gear MIN LEVEL értéke közé esik, elutasításra kerül, és az utolsó szint megmarad; a megváltozott szintet a sablon csak egy második, azonos olvasás után fogadja el. A szint szerviz attribútumai érvénytelen érték helyett ---t mutatnak.
Minden gear 12 szerviz attribútumot biztosít, amelyek igény szerint olvassák a DALI 1.0 / 2.0 lekérdező parancsokat:
Szerviz attribútum
DALI parancs
Jelenti
Short Address
(belső)
A rövid cím (0–63), amelyet ez az eszköz céloz — fix sablon importálásakor
Device Type
QUERY DEVICE TYPE (0x99)
DT{n} (pl. DT0 fluoreszcens, DT6 LED, DT8 szín / tunable white) vagy -- ha nincs válasz. A több eszköztípusú gear 0xFF (MASK) választ ad; a sablon ekkor a QUERY NEXT DEVICE TYPE (0xA7) paranccsal sorolja fel őket, pl. DT6, DT8, vagy MASK-ot mutat, ha nem érkezik típus
Konfigurált felső határ a 0–100 % DALI arc power-re skálázáshoz
Min Level
QUERY MIN LEVEL (0xA2)
Konfigurált alsó határ a 0–100 % DALI arc power-re skálázáshoz
Power Up Level
QUERY POWER ON LEVEL (0xA3)
Fényerő, amely a DALI busz tápellátás visszaállása után visszaáll
System Failure Level
QUERY SYSTEM FAILURE LEVEL (0xA4)
Fényerő, amelyet a busz több mint 500 ms-ig tartó kommunikációs vesztés esetén vesz fel
Groups
QUERY GROUPS 0-7 (0xC0) + QUERY GROUPS 8-15 (0xC1)
Vesszővel elválasztott lista a DALI csoportokról, amelyekhez a gear tartozik (None vagy pl. 0,3,7)
DALI Status
QUERY STATUS (0x90)
Dekódolt állapotbájt a nyers értékével: OK, ha egyetlen bit sincs beállítva, egyébként a beállított flag-ek — gear failure, lamp failure, lamp on, limit error, fade running, reset state, missing short address, power cycle —, pl. lamp on (0x04). A gear első válasza óta fennálló hibát a not raised: … reported since start jelölés mutatja
fade time {n} ({t} s), fade rate {n}; az áttűnési idő off, ha értéke 0, vagy extended 0x.., ha a gear helyette kiterjesztett áttűnési időt használ
DALI Version
QUERY VERSION NUMBER (0x97)
DALI-1 vagy DALI-2 {major}.{minor}, utána zárójelben a nyers érték
Bus statistics
(belső számlálók)
Számlálók az indulás óta: lekérdezések, kiolvasott és eldobott elavult válaszok, válasz hiánya, ütközések, elutasított szintek
A periodikus readscript minden gear-en olvassa az aktuális arc szintet (0xA0), és legalább 60 olvasási ciklusonként egyszer lekérdezi a QUERY STATUS (0x90) parancsot. Az állapotbájt 0. bitje „Control gear failure!", 1. bitje „Lamp failure!" hibát vált ki — TapHome figyelmeztetésként/hibaként jelennek meg, így egy meghibásodott fluoreszcens cső vagy egy kioldott LED meghajtó manuális pollozás nélkül megjelenik az aktivitási logban. A megváltozott hibabitet a sablon csak egy második, azonos olvasás után veszi át, az elveszett választ pedig még egyszer lekérdezi, mielőtt a gear-t „Gear not responding!" üzenettel jelentené. Azokat a hibabiteket, amelyeket a gear az első válaszában jelent, a sablon a gear tartós állapotaként kezeli: megjelennek a DALI Status attribútumban, de nem váltanak ki hibát, amíg a bit nem törlődik — egy későbbi hiba ezután ismét hibát vált ki. A tápellátási hiba nem vált ki hibát; az állapotbit a DALI Status attribútumban power cycle formában jelenik meg.
Gear-enkénti konfigurációs akciók
Öt szerviz akció minden Gear N eszközön DALI konfigurációs parancsokat ír (auto-ismételve 100 ms-on belül a H:512 LAMP COMMAND + REPEAT regiszteren keresztül, a nem-illékony DALI parancsokhoz szükséges módon):
Add to Group (Group ID 0–15 paraméter) — ADD TO GROUP (0x60+grp) parancsot küld, így a gear csatlakozik a kiválasztott DALI csoporthoz, és követi a következő broadcast csoport-írásokat.
Remove from Group (Group ID 0–15 paraméter) — REMOVE FROM GROUP (0x70+grp) parancsot küld.
Reset to Default Settings — DALI RESET (0x20) parancsot küld; visszaállítja a gear minden NVM paraméterét (max/min/power-on/system-failure szint, csoporttagság, jelenetek) gyári alapértelmezésre.
Set Startup Levels — rögzíti az aktuális arc power-t, és Power On Level-ként és System Failure Level-ként tárolja, sorrendben: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D), 10 ms szünettel mindegyik között.
Disable fading (paraméter nélkül) — 0-t tölt a DALI adatátviteli regiszterbe (0xA300 a H:541-be írva), és a gear-ben áttűnési időként (0x2E) és kiterjesztett áttűnési időként (0x30) tárolja, mindkettőt 100 ms szünettel, így a szintváltozások áttűnés nélkül lépnek érvénybe. Az aktuális értékeket a Fade attribútum mutatja.
Csoport tompítás — Group 0 … Group 15
A 16 szerviz eszköz mindegyike — Group 0, Group 1, … Group 15 — egy csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek, amely az adott DALI csoporthoz tartozik, a H:520 GROUP LEVEL használatával (a TapHome 0–100 % 0xFE-vel szorzódik → DALI arc power 0–254). A DALI nem engedi az átjárónak visszaolvasni a csoport szintet — a busz csak a broadcast írást viszi —, így a TapHome az utoljára írt értéket tartja „aktuális" szintként. A csoport eszközökön nincs init vagy read script.
Minden Group N eszköz két szerviz akciót biztosít a tagság tömeges kezeléséhez:
Add All Lamps to Group — ADD TO GROUP (0x60+grp) broadcast-et küld a H:532 ALL COMMAND + REPEAT-en keresztül. A buszon lévő minden gear csatlakozik a csoporthoz, függetlenül az aktuális rövid címétől.
Remove All Lamps from Group — REMOVE FROM GROUP (0x70+grp) broadcast-et küld. Minden gear elhagyja a csoportot.
Használja a csoport tompítást „konyha világítás", „nappali downlights" vagy bármely zónához, ahol több gear-nek egyetlen tompítót kell követnie. A csoport-írások sokkal hatékonyabbak, mint az egyes gear-ek párhuzamos vezérlése — egyetlen Modbus tranzakció akár 64 gear-t is elérhet egyszerre.
Modul szintű diagnosztika
A modul egyetlen szerviz attribútumot biztosít:
Slave ID — kiolvassa a H:65221 FLASH regiszterben tárolt Modbus Unit ID-t. Csak akkor aktív, ha DIP4 = OFF; DIP4 = ON esetén az átjáró 255-re kényszeríti a címet, függetlenül a FLASH értéktől. Használja az átjáró címének ellenőrzésére további eszközök hozzáadása előtt, különösen olyan üzembe helyezési kör után, amely nem-alapértelmezett ID-t írt.
Ellenőrizze a DALI busz feszültségét a gear-en: 11,5–22,5 V (tipikusan 14–16 V). Az alacsonyabb értékek általában zárlatra vagy a kábel keresztmetszethez túl hosszú buszra utalnak (lásd DALI busz topológia).
Ellenőrizze az ERR LED-et a RESI-DALI-PS-en — ha világít, a busz zárlatos, túlterhelt vagy maga a PSU hibás.
Futtassa újra a Gear N lekérdezést a testvér Resi Dali - Konfiguráció sablonban — a futásidejű sablon csak egy legfeljebb 60 s-os véletlenszerű szünet után próbálkozik újra, a konfigurációs sablon azonnali pass/fail eredményt ad címenként.
Ellenőrizze, hogy a gear-nek egyáltalán van-e rövid címe. Ha kicserélték vagy gyári alaphelyzetbe állították a buszon, akkor címzetlen lesz, és újra üzembe kell helyezni a Resi Dali - Konfiguráció sablonon keresztül.
A csoport tompításnak nincs hatása
Ellenőrizze, hogy legalább egy gear tagja a csoportnak — nyissa meg a Gear N → Groups-ot minden gyanús tagon, és ellenőrizze, hogy a csoport ID megjelenik-e a vesszővel elválasztott listában.
Ha a tagság hiányzik, indítsa el az Add to Group akciót minden gear-en egyenként, vagy használja az Add All Lamps to Group-ot a csoport eszközön egy busz-szintű broadcast-hez.
Ne feledje, hogy a Group N csak-író — a tompító csúszka a TapHome-ban tárolja az utoljára írt értéket, de nem tükrözi a busz tényleges állapotát. Ha a gear-ek ki vannak kapcsolva, a csoport szint parancsnak nincs hatása rájuk.
A lámpa hiba / tápellátási hiba nincs jelentve
Nyissa meg a gear DALI Status attribútumát. Ha az értéke not raised: … reported since start szöveggel végződik, a hiba már a gear első válaszában jelen volt, és a sablon a gear tartós állapotaként kezeli — megjeleníti, de nem vált ki hibát, amíg a bit egyszer nem törlődik.
A tápellátási hiba egyáltalán nem vált ki hibát; az állapotbit a DALI Status attribútumban power cycle formában jelenik meg.
Új hiba csak azután jelenik meg, hogy a sablon lekérdezte az állapotot (legalább 60 olvasási ciklusonként egyszer), és kétszer azonosan olvasta, így a hibabit rövid felvillanását nem jelenti.
Sporadikus Modbus hibák üzembe helyezés után
Győződjön meg arról, hogy nincs más Modbus master (MODBUSConfigurator, PLC, BMS), amely egyidejűleg pollozza az átjárót. A DALI és a Modbus nem arbitrál masterek között. Minden gear Bus statistics attribútuma az indulás óta számolja a kiolvasott és eldobott elavult válaszokat, a hiányzó válaszokat, az ütközéseket és az elutasított szinteket — a folyamatosan növekvő értékek egyidejű forgalomra utalnak az átjárón vagy a DALI buszon.
Ellenőrizze, hogy az RS485 GND össze van-e kötve az átjáró és a TapHome tápegység közös földje között — a hiányzó GND a leggyakoribb RS-485 hiba hosszú vonalakon.
RTU-over-TCP esetén soros hídon keresztül erősítse meg, hogy a híd keretezett RTU módban fut (nem nyers TCP socket), és hogy a soros oldali karakterek közötti rés tiszteletben tartja a 9600 baud 8N1 időzítést.
Ha a tünetek a Slave ID Resi Dali - Konfiguráció sablonon keresztüli módosítása után jelentek meg, importálja újra ezt a futásidejű sablont az új SlaveId import paraméterrel — a korábban importált modul még mindig a régi címen pollozik.
Elérhető eszközök 80
Ezek az eszközök az importálás után jelennek meg a TapHome-ban.
Resi DALIModul
Szerviz attribútumok
Slave ID
Kiolvassa a H:65221 FLASH regiszterben tárolt Modbus Unit ID-t — csak akkor aktív, ha DIP4=OFF (gyári alapértelmezés 255). Használja az átjáró címének ellenőrzésére további eszközök hozzáadása előtt.
Resi Dali
Szerviz attribútumok
${xml_slave_id}
modbusr(H,65221,uint16)
Gear 0FényerőszabályzóOlvasás és írás
DALI vezérlőkészülék a 0 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 0
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 1 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 1
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 2 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 2
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 3 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 3
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 4 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 4
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 5 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 5
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 6 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 6
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 7 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 7
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 8 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 8
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 9 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 9
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 10 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 10
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 11 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 11
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 12 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 12
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 13 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 13
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 14 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 14
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 15 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 15
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 16 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 16
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 17 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 17
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 18 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 18
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 19 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 19
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 20 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 20
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 21 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 21
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 22 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 22
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 23 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 23
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 24 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 24
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 25 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 25
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 26 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 26
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 27 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 27
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 28 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 28
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 29 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 29
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 30 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 30
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 31 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 31
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 32 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 32
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 33 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 33
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 34 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 34
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 35 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 35
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 36 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 36
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 37 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 37
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 38 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 38
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 39 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 39
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 40 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 40
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 41 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 41
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 42 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 42
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 43 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 43
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 44 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 44
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 45 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 45
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 46 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 46
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 47 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 47
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 48 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 48
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 49 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 49
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 50 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 50
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 51 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 51
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 52 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 52
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 53 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 53
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 54 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 54
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 55 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 55
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 56 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 56
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 57 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 57
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 58 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 58
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 59 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 59
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 60 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 60
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 61 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 61
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 62 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 62
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI vezérlőkészülék a 63 rövid címen — TapHome tompító a DALI arc power 0–100 %-ra leképezve a H:510 LAMP LEVEL (írás) és a QUERY ACTUAL LEVEL a H:511-en keresztül (olvasás), a gear saját MIN / MAX LEVEL értékei által határolt.
Regiszter: H:511 → H:510UInt16Egység: %numeric
Szerviz attribútumok
Rövid cím
Ez az eszköz által célzott DALI rövid cím (0–63) — fix sablon importálásakor, és minden Modbus írás felső byte-jában használt.
Device Type
A QUERY DEVICE TYPE (0x99) által visszaadott DALI device-type byte — jelenti DT0 (fluoreszcens), DT6 (LED meghajtó), DT8 (szín / tunable white) stb., vagy -- ha nincs válasz.
Physical Min Level
A gear által jelentett, hardveresen kényszerített minimális tompítási szint — a QUERY PHYSICAL MIN LEVEL (0x9A) parancsból olvasva, százalékban.
Max Level
Konfigurált DALI MAX LEVEL — a QUERY MAX LEVEL (0xA1) parancsból olvasva; felső határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Min Level
Konfigurált DALI MIN LEVEL — a QUERY MIN LEVEL (0xA2) parancsból olvasva; alsó határként használt a TapHome 0–100 % DALI arc power-re skálázásakor.
Power Up Level
Fényerő, amely a DALI busz tápellátásának helyreállítása után visszaáll — a QUERY POWER ON LEVEL (0xA3) parancsból olvasva.
System Failure Level
Fényerő, amelyet a DALI busz akkor vesz fel, ha több mint 500 ms-ig elveszti a kommunikációt — a QUERY SYSTEM FAILURE LEVEL (0xA4) parancsból olvasva.
Csoportok
Vesszővel elválasztott lista a DALI csoportokról (0–15), amelyekhez a gear tartozik — a QUERY GROUPS 0-7 (0xC0) és QUERY GROUPS 8-15 (0xC1) parancsokból dekódolva; None vagy pl. 0,3,7 jelenik meg.
Support Lamp Failure
Hogy a lámpa / meghajtó támogatja-e a lámpa-hiba érzékelést — Yes / No / --. A Lamp failure! hibát kapuzza a periodikus readscriptben.
Support Power Failure
Hogy a lámpa / meghajtó támogatja-e a tápellátási-hiba érzékelést — Yes / No / --. A Power failure! hibát kapuzza a periodikus readscriptben.
DALI Version
Bus statistics
Szerviz műveletek
Add to Group
Hozzáadja ezt a gear-t egy DALI csoporthoz (0–15) az ADD TO GROUP (0x60+grp) paranccsal — 100 ms-on belül automatikusan ismételve, ahogy a DALI konfigurációs parancsok megkövetelik.
Remove from Group
Eltávolítja ezt a gear-t egy DALI csoportból (0–15) a REMOVE FROM GROUP (0x70+grp) paranccsal.
Reset to Default Settings
DALI RESET (0x20) parancsot küld — visszaállítja a gear minden NVM paraméterét (max / min / power-on / system-failure szint, csoporttagság, jelenetek) a gyári alapértelmezésre.
Set Startup Levels
Rögzíti az aktuális arc power-t és Power On Level-ként és System Failure Level-ként tárolja — sorrend: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 63
Olvasás (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializálás
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Szint olvasása
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI broadcast csoport 0 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 0;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 0;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 1FényerőszabályzóOlvasás és írás
DALI broadcast csoport 1 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 1;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 1;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 2FényerőszabályzóOlvasás és írás
DALI broadcast csoport 2 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 2;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 2;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 3FényerőszabályzóOlvasás és írás
DALI broadcast csoport 3 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 3;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 3;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 4FényerőszabályzóOlvasás és írás
DALI broadcast csoport 4 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 4;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 4;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 5FényerőszabályzóOlvasás és írás
DALI broadcast csoport 5 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 5;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 5;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 6FényerőszabályzóOlvasás és írás
DALI broadcast csoport 6 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 6;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 6;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 7FényerőszabályzóOlvasás és írás
DALI broadcast csoport 7 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 7;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 7;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 8FényerőszabályzóOlvasás és írás
DALI broadcast csoport 8 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 8;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 8;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 9FényerőszabályzóOlvasás és írás
DALI broadcast csoport 9 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 9;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 9;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 10FényerőszabályzóOlvasás és írás
DALI broadcast csoport 10 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 10;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 10;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 11FényerőszabályzóOlvasás és írás
DALI broadcast csoport 11 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 11;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 11;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 12FényerőszabályzóOlvasás és írás
DALI broadcast csoport 12 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 12;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 12;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 13FényerőszabályzóOlvasás és írás
DALI broadcast csoport 13 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 13;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 13;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 14FényerőszabályzóOlvasás és írás
DALI broadcast csoport 14 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
var GroupAddress := 14;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 14;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 15FényerőszabályzóOlvasás és írás
DALI broadcast csoport 15 (0–15) — csak-író TapHome tompító, amely egyetlen arc-power értéket broadcastel minden gear-nek ebben a csoportban a H:520 GROUP LEVEL használatával. A busz nem visszhangoz csoport szinteket, így a TapHome az utoljára írt értéket tartja.
UInt16Egység: %numeric
Szerviz műveletek
Add All Lamps to Group
ADD TO GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon csatlakozik ehhez a csoporthoz, az aktuális rövid címétől függetlenül.
Remove All Lamps from Group
REMOVE FROM GROUP broadcastot küld a H:532 ALL COMMAND + REPEAT-en keresztül — minden gear a buszon elhagyja ezt a csoportot.
H:531ALL COMMAND (broadcast DALI command) — Single-shot broadcast DALI command (no repeat). Template uses H:532 (ALL COMMAND + REPEAT) for group membership but never exposes plain ALL OFF / ALL ON / ALL ARC POWER as a service action — turn-on/off-all are not present (sibling daliconfig template has them via H:530)
H:530ALL LEVEL (broadcast arc power) — Sets brightness for every gear in one Modbus write. Convenient 'turn off all lamps' / 'turn on all lamps' shortcut — implemented in the sibling daliconfig template, missing in this operational template
H:521GROUP COMMAND (per-group DALI command) — Per-group DALI command (single-shot). Could expose group-level OFF / RECALL MIN / RECALL MAX / GO TO SCENE as service actions on each Group device, but template only writes H:520 GROUP LEVEL
H:522GROUP COMMAND + REPEAT — Per-group DALI configuration command (auto-repeated within 100 ms). Required for STORE DTR AS GROUP SCENE etc. — not exposed as a service action
H:541DIRECT 16-BIT FRAME — Raw DALI 1.0 frame send. Used by sibling daliconfig template for the DALI 2.0 random-addressing algorithm; not needed for runtime brightness control
I:10020-I:10027DALI 24-BIT FRAME — DALI 2.0 24-bit frames — required for DT8 colour control (XY, colour temperature, RGBW), DALI 2.0 control gear queries, and DALI-2 input devices (push-buttons, presence detectors). Template exposes only DALI 1.0 brightness layer per gear
I:10030-I:10047DALI 25-BIT eDALI FRAME — Lunatone-proprietary 25-bit eDALI frames (auto and user redundant-bit variants). Not used by any DALI 1.0 gear
I:10050-I:10067DALI 28-BIT / 32-BIT FRAME — Extended DALI 2.0 frames (memory bank access, DALI-2 application controllers). Template scope is single-channel arc power per gear
H:500 (DSI VALUE)DSI 8-bit value send — Send a raw 8-bit DSI/DALI value with no addressing (bus-level diagnostics). Bypassed by every TapHome script
C:0 / H:551DALI Bus Error — 1 = DALI bus fault / short circuit / missing PSU. Useful diagnostic — could be added as a module-level service attribute. Currently bus errors only surface indirectly through 'Gear not responding!' errors emitted by per-gear readscripts
H:100DALI PRIORITY SLOT — 0..4 → 12-16 ms forward-frame timing. Default 2 (configuration). Bus-tuning parameter; template runs at default
H:6000DIP SWITCH / SOFTWARE RESET — Read returns the 4 DIP switch values; write 1 reboots the gateway. Sibling daliconfig template exposes Reset Gateway / Set Slave ID; this runtime template intentionally does not (commissioning concern)
H:65222 / H:65224 / H:65225BAUD_RATE / PARITY / STOP_BITS (FLASH) — FLASH-stored serial parameters. Template hard-codes 9600 8N1 in connection_details, so these are out of scope
I:0 / I:50-I:53 / scenesDALI 1.0 scenes (recall / store / query) — DALI 1.0 standard supports 16 stored scenes per gear/group recallable via GO TO SCENE (0x10..0x1F) and storable via STORE DTR AS SCENE (0x40..0x4F). Template exposes per-gear ADD/REMOVE FROM GROUP and RESET, but no scene recall/store/remove/query actions
H:512 (RECALL MAX/MIN/GOTO LAST/UP/DOWN/STEP)DALI 1.0 high-level commands per gear — RECALL MAX LEVEL (0x05), RECALL MIN LEVEL (0x06), UP (0x01), DOWN (0x02), STEP UP (0x03), STEP DOWN (0x04), GO TO LAST ACTIVE LEVEL (0x0A) — useful as service actions for visual feedback / smooth dimming. Not exposed; brightness goes only through linear scaling
H:512 (STORE DTR AS MAX/MIN/POWER ON/SYSTEM FAILURE LEVEL)Per-gear configuration write commands — STORE DTR AS MAX LEVEL (0x2A), STORE DTR AS MIN LEVEL (0x2B), STORE DTR AS POWER ON LEVEL (0x2C), STORE DTR AS SYSTEM FAILURE LEVEL (0x2D), STORE DTR AS FADE TIME / FADE RATE — template has 'Set Startup Levels' (combines 0x21, 0x2C, 0x2D) but does NOT expose individual writes for max/min/fade-time/fade-rate
H:511 (QUERY FADE TIME / FADE RATE / RANDOM ADDRESS / EXT VERSION)Additional DALI queries — QUERY FADE TIME / FADE RATE (0xA5), QUERY VERSION NUMBER (0x97), QUERY RANDOM ADDRESS H/M/L (0x98/0xC2/0xC3), QUERY CONTENT DTR/DTR1/DTR2 — not exposed in service attributes, only the 10 attributes listed per gear are populated
H:511 (QUERY CONTROL GEAR / RESET STATE / LIMIT ERROR / LAMP POWER ON / MISSING SHORT ADDRESS)DALI gear health / topology queries — QUERY CONTROL GEAR (0x90), QUERY RESET STATE (0x95), QUERY LIMIT ERROR (0x94), QUERY LAMP POWER ON (0x93), QUERY MISSING SHORT ADDRESS (0x96, broadcast) — diagnostic queries. Could be useful as module-level diagnostics; template exposes only QUERY STATUS / LAMP FAILURE / POWER FAILURE / DEVICE TYPE / MIN-MAX-PHYSICAL MIN-POWER UP-SYSTEM FAILURE LEVEL / GROUPS
H:511 (READ MEMORY LOCATION 0xC5)DALI memory bank read — READ MEMORY LOCATION (0xC5) is required to read DALI 2.0 memory banks (Bank 0 device GTIN, FW version, serial number; Bank 1 for emergency lighting). Not used
ASCII protocol commandsParallel ASCII text protocol — RESI gateway also exposes a CR-terminated text protocol (#LARC, #GARC, #AARC, #LGS, #LCMD, #LCMDA, #DALI CMDxx etc.). Template uses Modbus exclusively — ASCII would only matter for diagnostics/terminal access
DT6 fade time / fade rate / DAPC sequenceSmooth dimming primitives — DAPC (Direct Arc Power Control) sequence allows fast continuous level updates for smooth dimming. Each gear has stored fade time / fade rate that affect transitions. Template writes raw arc power without configuring fade behaviour
DT8 colour control (XY, colour temperature, RGBW)DALI DT8 tunable white / RGB / RGBW — DT8 colour control gears (tunable white CCT, XY colour, RGBW) require DALI 2.0 24-bit frames sent via H:541 / I:10020. Template exposes plain ModbusDimmer per gear — for DT8 lamps use a dedicated DT8 template
DT1 emergency lightingDALI DT1 self-contained emergency lights — Emergency-luminaire device type with periodic self-tests (function/duration test) and battery state queries. Out of scope — template is general-purpose dimming
Importálási paraméterek
Ezeket az értékeket az XML importálásakor adja meg.
A WhatsApp-üzenet 60 percen belül nem lett elküldve.
✓
A kérés a támogatásnál van
Béta · TapHome 2026.1
Az új verzió tesztelőit keressük
Az első partnerek között vagy, akik a 2026.1-et telepíthetik az ügyfeleknél. Az átállást helyetted a támogatási asszisztens végzi el WhatsAppon vagy e-mailben — az egység ellenőrzésével és a módosítás előtti biztonsági mentéssel.
Próbáld ki a 2026.1-et mindenki más előtt. Az átállást helyetted a támogatási asszisztens végzi el WhatsAppon vagy e-mailben — az egység ellenőrzésével és a módosítás előtti biztonsági mentéssel.