Forum
Je to opravdu o verzi configu.
Měl jsem verzi 12.0.xxxx a v té přetažení nefungovalo.
Dostával jsme hlášku
Ale po aktualizaci na 12.1.xxx už to funguje
Ahoj,
s trochou trápení jsem rozjel modbus - udp gateway od @budulinek
Mám elektroměr od Eniky EM340.
Vytvořím UDP požadavek na vyčtení více registrů, například napětí na všech fázích, odešlu, vrátí se mi odpověď, kterou si parsováním rozhodím na 3 virtuální vstupy. Vše je v pořádku.
Problém přijde když chci vyčíst další hodnoty, třeba proud ve všech fázích. Vytvořím požadavek zase na 3 registry ale od jiné adresy.
Ale na vrácenou odpověď se chytá původní parsování na napětí, ta odpověď vypadá stejně, liší se pouze jinými daty.
Potřebuji v parsování rozlišit ke kterému konkrétnímu požadavku patří ta konkrétní odpověď.
1. a 2. bajt je transaction ID, to se nabízí, protože odpověď přijde i s tímto ID
mám tedy 1. požadavek na napětí
\xO1\xOO\xOO\xOO\xOO\xOO\xO1\xO4...od jakýho a kolik registrů
a pak mám 2. požadavek na proud
\xO2\xOO\xOO\xOO\xOO\xOO\xO1\xO4...od jakýho a kolik registrů
u virtuálního vstupu pro napětí bych měl nějak říct aby si všímal pouze první odpovědi a né tý druhý, a u vstupu pro proud zase obráceně.
Snažil jsem se podle: http://sarnau.info/loxone-udp-http-command-parser-syntax/
rozeznání příkazu vypadalo nějak takto... což mi nefungovalo
xO1|.|.|.|.|.|.|.|.|.|2|1
Periodicky po vteřině chci vyčítat základní údaje, občas si sáhnout na jiné registry a podle toho chci vytěžovat fve.
Nezapomeň, že u rozeznávání příkazu by mělo být na začátku lomítko:
|xO1|.|.|.|.|.|.|.|.|.|2|1
Jinak stejný případ jsme už řešili s @jimyjims:
https://www.vodnici.net/community/loxone-a-arduino/loxone-modbus/paged/12/#post-29379
Aku pouzivate metodu na zmenu adresy a rychlosti modbus zariadeni?
Vytvorite nato aktor, alebo nieco ine?
Modbus zařízení mám připojené přes Modbus TCP/UDP bránu. Na tyhle servisní zásahy a na testování používám
Jednoduchý, umí posílat HEX data (ideální pro Modbus) a hned vidíš, jaká ti přišla odpověď.
@smotek7 Ja pouzivam ModbusPoll, pripojim se kablikem (usb-rs485) a pak zapisu do registru dle manualu pozadovanou zmenu. Nemusim resit HEX, nicmene to jde taky, da se zobrazit komunikace, takze je take videt odpoved.
@jakub ten ModbusPoll je len na 30 dni, mal som ho uz nainstalovany.
@budulinek skusim ten packetsender.
Inak Modbus monitor som vyriesil tak, ze mal som na policke Ext. RS485 dal som ho na modbus zbernicu a vidim v Lox Configu co tam chodi.
A otazka este k datam, co znamena tento znak?
Ci len ma to matie ked to nieje v HEX?
Jo a na Modbus RTU (přes USB-RS485 převodník) jsem párkrát použil
https://realterm.sourceforge.io/
V záložce "Send" a v "+crc" umí sám spočítat CRC pro Modbus. Ale už je to složitější na nastavení.
P.S. ModbusPoll je super, ale nezjistil jsem, jak obejít ten 30 denní trial.
ModbusPoll je super, ale nezjistil jsem, jak obejít ten 30 denní trial.
na to vymysleli peníze a autor to na svém webu podporuje přes stránku "Order" 😎
Jinak já používám QModMaster.
Hmmm, jasně.
A každý normální obchodník má různé cenové politiky (a různé funkcionality) pro různé segmenty zákazníků. Vývojář Modus zařízení (komu je ModbusPoll primárně určený) si to rád zaplatí, protože pro něj je to vypnutí programu po 10 minutách opruz a překážka v práci.
Domácí bastlíř, který si jednou za X měsíců chce něco vyzkoušet nebo nastavit za to ty peníze nedá. Normální (tj. racionálně kalkulující) obchodník má pro tyhle lidi nachystanou osekanou verzi (kterou má nastavenou tak, aby byla pro profi zákazníky nepraktická/nepoužitelná). Ví, že z tohodle segmentu nikdy $ nevytříská, ale chce aby i tenhle segment jeho produkt (čas od času) používal (z různých důvodů - šíření povědomí o produktu, vytěsňování potenciální konkurence, atd).
EDIT
Dík za tip, QModMaster vypadá zajímavě. ModbusPoll nemá cenu řešit, po půl roce od instalace tě nepustí ani na 10 minut něco nastavit. Použijte raději nějaký konkurenční program.
Přes PM jsem tu měl od @jimyjims dotaz na čtení několika Modbus registrů najednou. Dávám odpověď sem pro všechny...
Začnu sepsnutím Loxone Configu. Všichni víme, že Loxone zkurvil Modbus 5 sekundovým limitem na dotazování. Ale je tu ještě jeden průser: klasické loxoní klikátko (tj. Modbus Extension nebo Modbusserver) se neumí dotázat na vícero registrů najednou. Podle mě je to velkej fail, protože dotaz na vícero registrů najednou je standardní vlastnost modbus protokolu.
Co to znamená v praxi? Mám elektroměr s 8 kanály ( https://www.aliexpress.com/item/1005002673919847.html) - dělají se ale i 16 kanálové. Pokud si v Lox naklikám Modbus zařízení s 16 senzory, frekvence dotazování 5s, tak to znamená, že zelená mrcha každých 5 sekund odešle 16 individuálních modbus dotazů na každý registr zvlášť. Úplná debilita...
Řešení: Vlastní modbus brána, která umí protokol Modbus UDP.
Modbus dotaz přes virtuální UDP výstup (zaměňte O za nuly). Frekvenci odesílání dotazu si dejte jakou chcete, já mám 2s:
\xOO\xO1\xOO\xOO\xOO\xO6\xO1\xO3\xOO\xO8\xOO\xO8
složení zprávy viz https://www.vodnici.net/community/loxone-a-arduino/loxone-modbus/paged/14/#post-30170
---------------- MBAP hlavička (poskládám si sám) -------------
1. a 2. bajt: transaction ID (dejte cokoliv, mělo by to být unikátní pro každý virtuální výstup s modbus requestem)
3. a 4. bajt protocol ID (vždy 0000)
5. a 6. bajt délka zbytku zprávy (v tomto přípatě 6)
--------------- další bajty jsou u Modbus UDP protokolu stejné jako v Modbus RTU protokolu, takže je poskládám podle návodu k mému zařízení (ve kterém je popsaný Modbus RTU protkol) -----------------------------
7. bajt: adresa modbus zařízení (můj elektroměr má adresu 1)
8. bajt: modbus funkce (u mě 3, tj. Read Holding Registers)
9. a 10. bajt: adresa prvního registru, který chci číst (v mém případě 8, protože proud prvního kanálu je na registru 0008h)
11. a 12. bajt: kolik po sobě jdoucích registrů chcete číst (v mém případě 8 registrů, páč proudy všech osmi kanálů jsou za sebou na registrech 0008h až 000Fh)
------------ vynechám CRC (v Modbus UDP se nedává)-----------
Pokud kouknete do manuálu ke svýmu zařízení, určitě tam taky najdete zmínku o tom, že je možné číst vícero registrů pomocí jednoho modbus requestu. A samotný dotaz bude u vás vypadat dost podobně.
No a co dostanu zpátky? V UDP monitoru mám:
00,01,00,00,00,13,01,03,10,00,00,00,00,00,4E,00,00,00,00,00,00,00,00,00,00
1. až 6. bajt je zase MBAP hlavička
7. je zase modbus adresa
8. je zase funkce (stejná jako v requestu)
9. bajt: délka zbytku dat (10h, tj 16)
10. a 11. bajt: proud v prvním kanálu
12. a 13. bajt: proud druhého kanálu atd atd (jak vidíte, moc mi toho teď v noci neběží, snad jenom lednice...).
Parsuju přes virtuální UDP vstupy (nahraďte O za nuly). První kanál:
\xOO\xO1\s4\xO1\xO3\s1\2\1
druhý:
\xOO\xO1\s4\xO1\xO3\s3\2\1
třetí:
\xOO\xO1\s4\xO1\xO3\s5\2\1
a tak dále.....
Takže pro shrnutí: posílám jeden modbus dotaz za 2 sekundy. Dostanu zpátky jednu modbus zprávu, ve které jsou hodnoty proudu pro všech 8 kanálů. Ty si parsuju pomocí osmi virtuálních UDP vstupů.
Čus bus
Mám k dispozici Modbus Ethernet bránu (více kusů) Moxa mb3170 a nemám čas se jí zabývat, ale možná by to mohla být cesta, jak přes UDP dostávat odpovědi do Loxone častěji než 1x za 5s. Pokud to někdo chce "obklíčit", tak zašlu na testování a v případě úspěšného detailního popisu řešení ponechám zdarma. Ostatním nabídnu za cenu lepší, než originál Loxone Modbus.
Dokumentace zde, mělo by to být easy, jen prostě nemám čas 🙁
Zájemci do PM pls.
Zdar,
udělal jsem větší upgrade své Modbus brány postavené na Arduinu:
https://github.com/budulinek/arduino-modbus-rtu-tcp-gateway
Konkrétně ve web UI na stránce Modbus Status najdete nově:
- Modbus statistics pro lepší diagnostiku chyb. Pokud na bránu pošlete Modbus TCP/UDP request, vždycky se dozvíte, "jak to dopadlo".
- Request Queue. Můžete vidět, jak hodně je zaplněná fronta. Pokud začnete bránu bombardovat requesty na neexistující zařízení (neexistující slave address), tak se fronta začne plnit. Fronta je ale optimalizovaná (requesty na existující zařízení mají prioritu), takže váš "DoS attack" musí být opravdu brutální, aby frontu zcela zaplnil 🙂
- Modbus masters. IP adresy TCP/UDP masterů...
- Modbus slaves. Poslední status Modbus RTU slejvů. Tentokrát už tam nemáte jenom suché "OK", ale specifičtější info o posledním statusu.
- Modbus Scan. Proskenuje Modbus RTU. Přidal jsem "autoscan" - to znamená, že po (re)startu Arduina se automaticky provede skenování všech platných adres (1-247). Scan je teď rychlejší - u skenu je fixní response timeout 200ms (podle mě to stačí). Na skenování používám funkci 0x03 - podle mě je to dostatečně spolehlivé, snad všechny Modbus zařízení tuto funkci znají.
Upozorňuji, že se jedná o "major revision", pokud tedy už používáte moji bránu, zresetuje se vám do továrního nastavení. Takže musíte znovu nastavit IP adresu a pravděpodobně i RS485 (paritu a stop bity).
Pokud byste měli připomínky, návrhy na zlepšení, můžete buď sem do fóra nebo otevřít issue na githubu.
Enjoy 🙂