Forum
Jo, ze začátku Modbus vypadá složitě ale člověk zjistí, že je to docela primitivní protokol. Akorát mě sere, že RS485 (tj. Modbus RTU) je half-duplex (tj. jednosměrný).
Já jsem s Modbusem úspěšný tak napůl. Arduino brána funguje pěkně, ale u jednoho zařízení mě zlobí MAX485 modul, problém bude podle mě právě v tom přepínání směru dat (pošlu požadavek, vím že zařízení odpoví přes RS485, ale odpověď už na sériový port Arduina nedorazí).
Proto zrovna objednávám moduly s automatickým přepínáním směru dat
https://www.aliexpress.com/item/1005001992729937.html
https://www.aliexpress.com/item/1005001631650868.html
Za měsíc a půl dám vědět, jak fungují 🙂
Ja sa tiez cudujem preco takto. Ved USR prevodnik stoji 25$ a uz je aj na DIN.
mas link plz? dik
https://www.aliexpress.com/item/4000521660045.html?spm=a2g0s.9042311.0.0.27424c4d6CWdTT
Len pozor nema profil istica, vpredu je vacsi.
@smotek7 dik 😉 mi to pride rozmerom lepsie ako arduino ...vela miesta to berie
Funkcie zapojenie vsetko easy? pripravujem na FVE aby som vedel data citat a komunikovat...
Uz Uz som chcel loxone kupit ale toto vyhovuje tiez.
EDIT: je to Modbus aj RS485 v jednom? s tym ze Modbus ma LAN port a pouzije len niektore zily? chapem spravne?
@budulinek nejake negativa k tomu ci preco by bol lepsi Arduino modul?
Dik
Toto má profil stejný jako jistič, LAN i WiFi, mám ho už přes rok a žádný problém 😉
alternativně tento ten má pouze WiFi
Dik za tip este lepsie ked sa to vojde...ale stale nechapem ako to vlastne funguje
Loxone ponuka Modul na ModBus a dalsi na RS485
Pri oboch z ciny pisu ze je to RS485 aj Modbus 🙄 😬 🤔
Loxone ModBus a RS485 je ten isty HW, len SW v ModBus ext. podporuje ModBus komunikaciu. Takisto Loxone podporuje TCP ModBus.
Tie cinske veci ti robia len fyzicky prevod LAN to RS485.
Ak som to napisal zle opravte ma.
Jak napsal @smotek7 je to převodník 🙂
Připojíš "MODBUS" zařízení do svorek RS485 PW21 a to převede po LAN/WiFi "jedničky a nuly" do zařízení "LOXONE" které ty 1/0 zpracuje. A zpětně "LOXONE" tou samou cestou řídí "modbus zařízení" (těch může být víc, pokud je máš na stejném drátě, mají stejnou přenosovou rychlost atd.)
tady je to v diagramu co se týče SW
tady zase HW
RS485 je fyzická vrstva (tj. dva dráty, halfduplex). Modbus jsou pravidla jak má vypadat zpráva posílaná po nějaké fyzické vrstvě (na kolikátém bajtu je adresa otroka, jestli má být na konci kontrolní součet atd). Takže Loxone RS485 Extension je pouhá fyzická vrstva (po které můžeš posílat cokoliv, teoreticky asi i Modbus, ale musel by sis odesílané Modbus požadavky sám skládat a přijímané zprávy sám parsovat). Loxone Modbus Ext. je to samé a navíc to umí skládat/parsovat Modbus zprávy díky "klikačce" v Lox config.
"Pod" Modbusem je vždy nějaká fyzická vrstva, máš de facto 3 možnosti kudy (jak) se bude Modbus zpráva posílat:
- RS485
- Ethernet TCP
- Ethernet UDP
Samotný Modbus má 3 varianty (3 podoby Modbus zprávy):
- Modbus RTU (podle standardu určený pouze pro RS485 vrstvu, ale můžeš ji nestandardně poslat i přes ethernet TCP nebo UDP, pak se tomu říká "Modbus RTU over TCP" nebo "Modbus RTU over UDP", ale třeba taky "transparent mode")
- Modbus ASCII (data se místo v HEX posílají v ASCII, pokud vím tak pouze po RS485 vrstvě - nepoužívá se, nezajímá nás...)
- Modbus TCP (určený pouze pro ethernet TCP vrstvu a ethernet UDP vrstvu, oproti Modbus RTU je vepředu zprávy 6 bytů navíc a na konci chybí CRC). "Modbus UDP" je vlastně standardní Modbus TCP zpráva poslaná po ethernet UDP vrstvě (tj. UDP packetem).
Suma sumárum, brána nedělá jenom fyzický převod RS485 - Ethernet, ale taky mění zprávy, respektive jejich hlavičky na začátku a CRC na konci (Modbus RTU <-> Modbus TCP).
Poslední věc důležitá pro nováčky: v Modbus protokolu jedno zařízení poslouchá a odpovídá na požadavky (slave = server) a druhé posílá požadavky (master = client). Moje Arduino se na RS485 lince chová vždy jako master (client) a na ethernetu vždy jako slave (server). Komerční Modbus brány to umí i obráceně, tak se tím nenechte zmást.
Jinak ten Protoss-PE11 vypadá dobře, asi se nechám zlákat i já držgrešle 🙂 Hmm, nenechám (viz níže). Mají i web, kde je ke stažení manuál, což se cení http://www.hi-flying.com/pe11
Koukal jsem na návod a PE11 umí všechno. Samozřejmě šoupání z jedné fyzické vrstvy na druhou (RS485 na ethernet TCP ale i UDP) ale mělo by to umět i změnu zprávy (Modbus RTU - Modbus TCP). Chybí tomu snad jenom to skenování Modbus RTU otroků. Jenom pozor pro nováčky, je to plnohodnotné průmyslové zařízení, tak se v tom neztraťe. Proto jsem sem vypsal aspoň ty základní věci.
Ještě jedno shrnutí po prohlédnutí manuálů:
USR-DR302 a HF Protoss-PE11 jsou univerzální převodníky RS485 <-> Ethernet (TCP, UDP, případně i HTTP request, websocket, MQTT....), které jednoduše přeposílají data mezi oběma rozhraními a jako "bonus" umí i změnu zprávy Modbus RTU <-> Modbus TCP. Jsou to univerzální průmyslové RS485 <-> Ethernet převodníky a mají proto i víc "granulární" (= BFU unfriendly) web interface. Mohou fungovat jako Modbus brána a svoji práci odvedou a nahradí Loxone Modbus Extension.
USR-M511 je přímo určená jako Modbus gateway a tomu má i uzpůsobené web interface (umí třeba sama posílat dotazy na RS485 linku, bohužel je dražší, není na DIN a neumí Modbus UDP).
Arduino si musíte poskládat sami ze 3 komponent (Arduino + Ethernet shield + RS485 modul), za to dostanete navíc:
- User friendly web interface. Je to tak, Arduino umí být víc "user friendly" než hotové zařízení (USR-DR302 a HF Protoss-PE11).
- Diagnostická stránka, kde máte čítače dat na obou rozhraních (RS485 a ETH) a přehled připojených Modbus RTU slaves (jejich Modbus adresa) a Modbus TCP/UDP masters (jejich IP adresa). K čemu se to hodí? Viz hledání problémů a zprovozňování Modbusu s @jimyjims
- Skener Modbus RTU slaves. Hodí se na testování drátů a RS485 nastavení a na hledání otroků s neznámou / zapomenutou adresou.
- Optimalizovanou frontu Modbus požadavků. Arduino pošle Modbus požadavek na RS485, čeká na odpověď z RS485, udělá X opakovaných pokusů (mezitím všechny požadavky přicházející po ethernetu ukládá do fronty). Teprve pokud všech X opakovaných požadavků selže (vyprší jim timeout), pošle na RS485 nový požadavek uložený ve frontě (takto by se to podle Modbus standardu mělo dělat). Výše zmíněné RS485 <-> Ethernet převodníky podle mě jenom přeposílají data mezi oběma rozhraními (a mění zprávy Modbus RTU <-> Modbus TCP). Jednoduše pošlou na RS485 další požadavek a nezajímá je, jestli dostaly odpověď na předcházející požadavek.
- Reportování chyb. Arduino pošle zpátky zpátky na Modbus TCP/UDP mastera zprávu s chybou pokud je Modbus RTU slave nedostupný (Modbus exception kód 0xB0) nebo pokud je fronta na Arduinu plná (Modbus exception kód 0x06 - viz https://en.wikipedia.org/wiki/Modbus#Main_Modbus_exception_codes). U těch RS485 <-> ETH převodníků se podle mě ničeho takového nedočkáte. Dovolím si tvrdit, že Arduino je plně "Modbus compliant".
Z programu na Modbus Gateway jsem povyhazoval nějaké knihovny, aby byl použitelný na různých typech Arduin a různých typech ethernet čipů:
Arduino desky: Nano, Uno, Mega (a možná další)
Ethernet shieldy postavené na: W5100 (= ty nejběžnější ethernet shieldy pro Uno), W5200, W5500. Ethenet čip ENC28J60 není a nebude podporovaný.
Pokud byste chtěli program použít na jiných strojích (ESP32 atd), můžete to zkusit, ale vězte, že tam jsou dvě místa, která jsou Arduino (AVR) specific (viz readme na github).
Vrátil jsem se zpátky k defaultní knihovně Ethernet.h, která je větší (tj. na Nano se mi už nevejde ta diagnostika na jednotlivé sockety) a hlavně z nějakého mě nepochopitelného důvodu určuje Ethernet.h počet použitých socketů podle RAM dostupné na MCU (nikoliv podle typu eth. čipu). Tj. pokud máte Nano s W5500, tak knihovna použije jen 4 místo 8 dostupných socketů. Vzhledem k tomu, že samotné připojení na web UI si vezme většinou 2 sockety, tak je to poznat.... Více na github.
https://github.com/budulinek/arduino-modbus-rtu-tcp-gateway
Mohl bych Tě poprosit, abys mi rozvedl návod, jak donutit aby arduino použilo 8 socketů? Už mám W5500.
Vím, že máš na githubu odkaz na knihovnu ethernetu, tak jsem si otevřel tuto knihovnu přes poznámkový blok a přijde mi, že to mám stejné jako v tom odkazu. Zkusil jsem změnit na:
#if defined(RAMEND) && defined(RAMSTART) && ((RAMEND - RAMSTART) <= 2048)
#define MAX_SOCK_NUM 8
#else
#define MAX_SOCK_NUM 8
#endif
Ale ani to nešlo zkompilovat.
Mohl bys mi to prosím nějak konkrétizovat, jak bych měl postupovat?
Díky moc!
Ano, je potřeba změnit
#define MAX_SOCK_NUM 4
na
#define MAX_SOCK_NUM 8
Je potřeba editovat přímo vestavěnou knihovnu, která se nainstalovala společně s Arduino IDE. Nestahuj Ethernet knihovnu znovu, házelo by ti to chybu kvůli duplicitní knihovně. V mém případě je ta knihovna tady:
c:\Program Files (x86)\Arduino\libraries\Ethernet\src\Ethernet.h
@budulinek dnes jsem si k tomu zase po dlouhé době konečně sedl a při ověřování má program víc bytů, je možné že ten program s knihovnou ethernet.h je až příliš velký, nebo dělám něco špatně?
Díky za zpětnou vazbu!
Arduino: 1.8.14 Hourly Build 2020/06/24 01:33 (Windows 10), Vývojová deska: "Arduino Nano, ATmega328P"
C:\Users\xxx\Documents\Arduino\novy_Modbus_Nano_1.2\arduino-modbus-rtu-tcp-gateway\arduino-modbus-rtu-tcp-gateway.ino:113:0: warning: "UDP_TX_PACKET_MAX_SIZE" redefined
#define UDP_TX_PACKET_MAX_SIZE modbusSize
In file included from C:\Users\xxx\Documents\Arduino\novy_Modbus_Nano_1.2\arduino-modbus-rtu-tcp-gateway\arduino-modbus-rtu-tcp-gateway.ino:31:0:
C:\Users\xxx\Documents\Adruino\arduino-nightly\libraries\Ethernet\src/Ethernet.h:148:0: note: this is the location of the previous definition
#define UDP_TX_PACKET_MAX_SIZE 24
In file included from C:\Users\xxx\Documents\Adruino\arduino-nightly\libraries\Ethernet\src\Dns.cpp:8:0:
C:\Users\xxx\Documents\Adruino\arduino-nightly\libraries\Ethernet\src\Dns.cpp: In member function 'uint16_t DNSClient::BuildRequest(const char*)':
C:\Users\xxx\Documents\Adruino\arduino-nightly\libraries\Ethernet\src\utility/w5100.h:457:25: warning: result of '(256 << 8)' requires 18 bits to represent, but 'int' only has 16 bits [-Wshift-overflow=]
#define htons(x) ( (((x)<<8)&0xFF00) | (((x)>>8)&0xFF) )
~~~^~~
C:\Users\xxx\Documents\Adruino\arduino-nightly\libraries\Ethernet\src\Dns.cpp:164:18: note: in expansion of macro 'htons'
twoByteBuffer = htons(QUERY_FLAG | OPCODE_STANDARD_QUERY | RECURSION_DESIRED_FLAG);
^~~~~
text section exceeds available space in board
Projekt zabírá 30726 bytů (100%) úložného místa pro program. Maximum je 30720 bytů.
Globální proměnné zabírají 1469 bytů (71%) dynamické paměti, 579 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
Projekt je moc velký; na http://www.arduino.cc/en/Guide/Troubleshooting#size naleznete typy jak projekt zmenšit.
Nastala chyba při kompilaci u desky Arduino Nano.
Cau, pomohol by mi niekto prosim s nastavenim modbus tcp na tej zelenej sracke?
Mam modbus rele (adresa 255) pripojene na prevodniku eth->rtu. Mam otestovane, ze ked poslem FF 05 00 00 FF 00 99 E4, tak rele zopne.
Pomocou https://npulse.net/en/online-modbus
som to dekompiloval na:
Request: [FF] [05] [0000] [FF00] [99E4] | | | | |-> CRC16 (58521) | | | |-> Number Of Registers (65280) | | |-> Register Offset (0 = ) | |-> Function Code (5) |-> Slave ID (-1)
Potreboval by som teraz pomoct s nastavenim aktora v loxone.
Pridal som nove modbus zariadenie, adresa 255. Na nom digitalny aktor, IO adresa 65280, prikaz 5. Nefunguje. Snazil som sa odchytit co loxone posiela a vyzera ze posiela namiesto 8 bajtov len 6, a to FF 05 FF 00 FF 00 .
WTF?