Forum

Forum

Notifications
Clear all

LOXONE - MODBUS

Page 13 / 16

budulinek
(@budulinek)
Reputable Member
Documentator
Joined: 5 years ago
Posts: 274
 

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í 🙂


ReplyQuote
killeriq
(@killeriq)
Honorable Member
Documentator
Joined: 6 years ago
Posts: 686
 
Posted by: @smotek7

Ja sa tiez cudujem preco takto. Ved USR prevodnik stoji 25$ a uz je aj na DIN.

mas link plz? dik


ReplyQuote
smotek7
(@smotek7)
Noble Member Moderator
Documentator
Joined: 5 years ago
Posts: 1452
 

https://www.aliexpress.com/item/4000521660045.html?spm=a2g0s.9042311.0.0.27424c4d6CWdTT
Len pozor nema profil istica, vpredu je vacsi.


ReplyQuote
killeriq
(@killeriq)
Honorable Member
Documentator
Joined: 6 years ago
Posts: 686
 

@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


ReplyQuote
kajmaj
(@kajmaj)
Active Member
Joined: 5 years ago
Posts: 12
 

@killeriq 

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

This post was modified 1 year ago by kajmaj

ReplyQuote
smotek7
(@smotek7)
Noble Member Moderator
Documentator
Joined: 5 years ago
Posts: 1452
 

@kajmaj maju tam aj PE-11 ten je len LAN a je lacnejsi ako ten USR.


ReplyQuote
killeriq
(@killeriq)
Honorable Member
Documentator
Joined: 6 years ago
Posts: 686
 
Posted by: @kajmaj

@killeriq 

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 🙄 😬 🤔 


ReplyQuote
smotek7
(@smotek7)
Noble Member Moderator
Documentator
Joined: 5 years ago
Posts: 1452
 

@killeriq

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.


ReplyQuote
kajmaj
(@kajmaj)
Active Member
Joined: 5 years ago
Posts: 12
 

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

 

This post was modified 1 year ago 2 times by kajmaj

ReplyQuote
budulinek
(@budulinek)
Reputable Member
Documentator
Joined: 5 years ago
Posts: 274
 

@killeriq

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.

 

 


killeriq liked
ReplyQuote
budulinek
(@budulinek)
Reputable Member
Documentator
Joined: 5 years ago
Posts: 274
 

@killeriq

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".

ReplyQuote
jimyjims
(@jimyjims)
Trusted Member
Joined: 3 years ago
Posts: 97
 
Posted by: @budulinek

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!


ReplyQuote
budulinek
(@budulinek)
Reputable Member
Documentator
Joined: 5 years ago
Posts: 274
 

@jimyjims

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

 


ReplyQuote
jimyjims
(@jimyjims)
Trusted Member
Joined: 3 years ago
Posts: 97
 

@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 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
C:\Users\xxx\Documents\Adruino\arduino-nightly\libraries\Ethernet\src/Ethernet.h 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
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 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 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.


ReplyQuote
msk
 msk
(@dusanmsk)
Noble Member Moderator
Donator
Joined: 6 years ago
Posts: 1642
 

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?

 


ReplyQuote
Page 13 / 16
Share: