modbus RS485 --> modbus TCP
Moderátor: Moderátoři
modbus RS485 --> modbus TCP
Najprv popisem o co mi ide.
Momentlane mam spraveny emulator RS485 elektromera k menicu, ktoremu podstrkavam udaje, ktore citam z roznych elektromerov (shelly) - podla toho aku cast spotreby chcem pokryvat menicom.
Momentalne mam tento emulator spraveny cez ESP32 s ESPhome a home assistant, kde mam modbus server a odtial si menic cita cez RS485 RTU modbus udaje.
Toto vsetko mi funguje.
Ale chcel by som vynechat ESP32, a pouzit rovno prevodnik RS485/Modbus RTU na Modbus/TCP (ospravedlnujem sa ak som doplietol presne oznacenia)
Na PC mam rozbehnuty cez node red Modbus server, na ktory sa s PC bezproblem pripojim a viem citat registre.
Ked vsak pouzijem prevodnik, ten sa na server pripoji, ale ked si cez RS485 chcem precitat hodnotu registra tak nedostanem ziadnu odpoved. (pouzivam USB -> RS485 prevodnik)
Skusal som spravit cisty TCP server a pozerat aky request pride z prevodnika, ale ziadny dotaz nedojde (TCP pripojenie si to drzi stale)
Pouzivam prevodnik waveshare RS485 to POE ETH (B). Nastaveny ako TCP client. Skusal som v nom uz vsekty nastavenia co ma napadli ale nedokazal som rozbehat kmunikaciu.
Je vobec mozna komunikacia tymto smerom? Resp aky iny prevodnik pouzit?
Dakujem
já používám toto: https://vi.aliexpress.com/item/1005006848590441.html
Jestli jsem to správně pochopil tak měnič (zřejmě k FVE), který má komunikovat přes svůj sériový port RS485 posílá dotazy protokolem Modbus RTU a vy chcete, aby se tyto dotazy přes zmíněný převodník waveshare převáděly na protokol Modbus TCP a přenášely přes ethernet na zařízení, které plní funkci Modbus TCP serveru (tj. poskytuje data na vyžádání). Odpověď z Modbus TCP serveru by měla být převodníkem waveshare zase zpět převedena na protokol Modbus RTU a přenesena na port RS485 do měniče.mikollar píše:Pouzivam prevodnik waveshare RS485 to POE ETH (B). Nastaveny ako TCP client. Skusal som v nom uz vsekty nastavenia co ma napadli ale nedokazal som rozbehat kmunikaciu.
Problém bude zřejmě v nesprávném nastavení zmíněného převodníku waveshare.
Primárně musí být v převodníku waveshare nakonfigurována správná IP adresa zařízení Modbus TCP serveru ať už je to PC nebo cokoli jiného. Modbus TCP server musí podporovat na ethernetu komunikaci datovým protokolem ve formátu Modbus TCP (POZOR formát datových paketů Modbus TCP se liší od Modbus RTU). Pro spojení se implicitně používá TCP port 502. Zařízení, které plní funkci Modbus TCP serveru by tedy mělo přijímat spojení na TCP portu 502. Převodník waveshare by měl být nastaven v režimu TCP client.
Network
IP mode: static
IP Address: IP adresa převodníku waveshare v síti ethernet (žádné jiné zařízení v síti nesmí mít stejnou IP adresu)
Port: 502
Work mode: TCP client
Net mask: maska v podsíti ethernet, ve které je připojen převodník waveshare
Gateway: IP adresa brány v podsíti ethernet, ve které je připojen převodník waveshare
Dest IP: IP adresa zařízení, které plní funkci Modbus TCP serveru tj. poskytuje data na vyžádání (žádné jiné zařízení v síti ethernet nesmí mít stejnou IP adresu)
Dest Port: 502
Na straně portu RS485 musí být správně nakonfigurovány parametry tak, aby odpovídaly parametrům komunikace, které používá měnič při komunikaci přes svůj port RS485 viz v sekci Serial položky Baud Rate, Data Bits, Parity, Stop Bits a Flow Control. Pokud toto nebude správně tak převodník waveshare data od měniče na straně sériového portu RS485 vůbec nepřijme.
Podle tohoto popisu v sekci MODBUS TCP Test přenáší převodník waveshare implicitně data mezi sériovým portem RS485 a ethernetovým portem transparentně.
Transparentně znamená, že data, která převodník waveshare obdrží na straně svého sériového portu RS485 bez jakékoli změny předá na příslušnou IP adresu na straně ethernetu, a to je problém, protože formát datových paketů protokolu Modbus RTU se liší od formátu datových paketů Modbus TCP.MODBUS TCP Test
By default, the data between the serial port and the Ethernet port is transparently transmitted.
1. Datový paket v protokolu Modbus RTU nepoužívá hlavičku Modbus TCP.
2. Datový paket v protokolu Modbus RTU používá na konci zprávy kontrolní součet, který se však v protokolu Modbus TCP vůbec nepoužívá.
Takže, aby to správně fungovalo musí převodník waveshare provádět konverzi datových paketů mezi protokoly Modbus RTU a Modbus TCP. To by měl dělat pokud je nastaveno níže uvedené.
Advanced Settings
Transfer protokol: Modbus TCP protokol
Když převodník přijme datový paket na straně sériového portu RS485 je ve formátu Modbus RTU. Převodník musí pro převod mít celý datový paket tj. nemůže začít provádět převod dokud nemá celý datový paket ve formátu Modbus RTU. Poté musí převodník z datového paketu Modbus RTU odstranit kontrolní součet a na začátek musí vložit hlavičku ve formátu Modbus TCP. Takto upravený datový paket už je převeden do formátu Modbus TCP a tak ho převodník pošle do sítě ethernet na příslušnou IP adresu Modbus TCP serveru.
Odpověď ze sítě ethernet od Modbus TCP serveru je datový paket ve formátu Modbus TCP. Z něj musí převodník nejprve odstranit hlavičku, která se používá jen v Modbus TCP a na konec zbylé části datového paketu musí vypočítat a vložit kontrolní součet, který se používá v Modbus RTU. Takto upravený datový paket už je převeden do formátu Modbus RTU a tak ho pošle na sériový port RS485 převodníku, kterým je připojen k měniči.
Takto to mam nastavene.
Prevodnik indikuje ledkou pripojenie k serveru. Teda pripojenie k serveru funguje.
Skusal som menit rozne parametre v prevodniku. Zapnut konverziu, bez konverzie, asi vsetky klikatka ktore su dostupne (windwos config appka ma viac moznosti ako web rozhranie)
Nakoniec som skusal vytvorit TCP server, kde sa tiez prevodnik pripojil.
Na TCP serveri som si dal vypisovat vsetky dotazy ktore na neho pridu.
Ziadne dotazy ale prevodnik na server neposiela, ked som poslal dotaz z RS485 (ledka aktivity RS485 blikne).
Kontroloval som zapojenie A B liniek, baudrate paritu, vsetko xkrat.
Ak zhodim server tak ledka na prevodniku zhasne, teda pripojenie tam realne prvodnik robi a detekuje ho, aj na serveri vidim pocet aktivnych pripojeni.
To, že LEDka pro RS485 na převodníku waveshare blikne ještě nemusí znamenat, že data převodník přijal ve správné podobě.mikollar píše:Nakoniec som skusal vytvorit TCP server, kde sa tiez prevodnik pripojil. Na TCP serveri som si dal vypisovat vsetky dotazy ktore na neho pridu. Ziadne dotazy ale prevodnik na server neposiela, ked som poslal dotaz z RS485 (ledka aktivity RS485 blikne).
Při tom posílání dat na sériový port RS485 převodníku waveshare jste použil převodník USB/RS485 a z PC jste na něj z nějakého svého programu poslal binární data paketu ve formátu Modbus RTU a nebo jste to dělal jinak?
Můžete sem uvést hexa výpis jednotlivých bajtů toho datového paket Modbus RTU, který jste se snažil poslat na RS485 port převodníku waveshare?
Příklad:
Datový paket Modbus RTU dotazu pro čtení jednoho holding registru z adresy 100 ve slave 1.
Kód: Vybrat vše
SL FU AH AL PH PL CH CL
01 03 00 64 00 01 C5 D5FU = 3 tj. modbus funkce Read Holding Registers
AH = 0 horní bajt adresy holding registru 100
AL = 64 hexa tj. dolní bajt adresy holding registru 100
PH = 0 horní bajt počtu čtených registrů
PL = 1 dolní bajt počtu čtených registrů
C5 = hexa horní bajt kontrolního součtu pro tento datový paket
D5 = hexa dolní bajt kontrolního součtu pro tento datový paket
modbus -b 9600 -v /dev/ttyUSB0 h@2126/I
Vypis z terminalu + timeout chyba
01 03 08 4e 00 02 a6 7c
Rovanky prikaz priamo na ESP32 presiel v pohode s odpovedou.
Ale inak skusal som to napojit aj priamo na menic, ci nahodou nerobim nejaku somarinu ale tam sa to chova rovnako.
Ako stale dufam ze robim ja nejaku somarinu, bol by som velmi rad aby to slo
Jak zmiňujete pokud to uděláte mimo převodník waweshare tak to funguje, ale přes něj to prostě nefunguje i když dle vašich dosavadních popisů to vypadá, že máte vše nastaveno správně.
Pro podrobnější sledování by to chtělo, aby webové rozhraní toho převodníku waweshare poskytovalo nahlížení na příchozí data na portu RS485 s případnou diagnostikou toho zda je něco špatně a co konkrétně a zda vůbec byla provedena konverze RTU > TCP nebo ne a také proč případně nebyla data odeslána na cílovou IP adresu. Neznám diagnostické možnosti toho převodníku. Pokud tam však nějaké takové možnosti nejsou tak se obávám, že bude velký problém přijít na to proč to nefunguje.
Dost se divím proč chcete nahradit vlastní převodník realizovaný s ESP32, který vám funguje nějakým cizím převodníkem, který bude vždy do nějaké míry pro vás "černou skříňkou", nad kterou prostě nemusíte mít plnou kontrolu.
V práci pokud potřebuji realizovat převody mezi Modbus RTU a TCP tak to vždy řeším uvnitř PLC tj. v takovém případě je převodníkem PLC se specifickým programem pro daný účel, který zrovna potřebuji což je v podstatě také vlastní forma převodníku. Takže nemám doporučení na žádný ověřený hotový převodník vhodný pro váš účel.
Popravdě nejlepší bude když se na žádný cizí převodník spoléhat nebudete a použijete vlastní realizovaný třeba s tím ESP32, který vám ostatně už funguje jak jste zmínil. Proč tedy měnit něco co funguje?
Pokud potřebujete něco na profi úrovni a z toho důvodu pro vaše účely řešení s převodníkem ESP32 nevyhovuje pak použijte nějaké pro daný účel vhodné PLC s ethernet portem a RS485 portem a převod mezi Modbus RTU a TCP vyřešte vhodným naprogramováním toho PLC. Nicméně použít PLC je obvykle dost drahé řešení.
Můžete také zkoušet jiné převodníky, ale jak už jsem zmínil výše žádný pro daný účel vyzkoušený doporučit nemohu a tak to bude asi zkoušení jen formou pokus/omyl a může se tedy stát, že i další převodníky, které vyzkoušíte se mohou ukázat pro váš účel nevhodné.
Skusim objednat este nejkay iny a uvidim ci to pomoze.
Dovod nahradenia je rychlost akou sa aktualizuju udaje v ESP z home assistenta. Je to cca 2x pomalise ako si pyta udaje menic.
Do noveho modbus servera dokazem tlacit udaje castejsie ako si ich pyta menic.
Ak su caste velke zmeny odberu tak mu trva dlshi cas kym to zrovna, ako nejak extra to nevadi, pretoky mam povolene , ale chcel som to mat tip top
Ideální by bylo, pokud by na stejném zařízení, na kterém provozujete Home Assistant běžel současně váš program, který by fungoval jako Modbus TCP server a zároveň také jako Modbus RTU server s vazbou na pro něj vyhrazený RS485 port, který by se doplnil k tomu zařízení, na kterém běží Home Assistant.
Home Assistant, který funguje jen jako Modbus klient by zapisoval data do Modbus TCP serveru, ale vzhledem k tomu, že by to běželo na stejném zařízení tak by to šlo jen přes interní paměť tj. vůbec by to nešlo přes síť. To, že by ten váš program fungoval nejen jako Modbus TCP server, ale současně i jako Modbus RTU server by bylo výhodou pro rychlost, protože by nebylo potřeba používat žádný převodník a data, která by byla zapsána Home Assistantem do Modbus TCP serveru by byla bez zpoždění okamžitě k dispozici v rámci Modbus RTU serveru, který by na svém vyhrazeném portu RS485 přímo reagoval na požadavky od měniče.
Probelm je ze od servera k menicu neviem natiahnut zvlast kabel pre RS485. Preto to potrebujem prehnat cez siet, ktoru tam mam.
Teraz riesenie ktore mam tak esphome v esp32 cita data zo senzorov cez Home assistant API a bezi to cez wifi co nie je idealne.
Ak este je posledna moznost ze si to nakodim cele od zakladu, ale chcel som vyuzit uz nieco existujuce.
Data "musia" pretekat cez home assitant lebo tam sa mi zbiehaju vsetky informacie z elektromerov shelly, spotreby, vyroby, podla ktoreho sa rozhoduje, ake hodnoty poslem menicu.
Objednal som ine prevodniky, jeden z nich je aj tu spomminany, tak uvidim ci to bude k niecomu ci nie.
Este mozno skusim pouzit prevodniky waveshare rs232 na eth (lezia mi v sufliku), ktore by som pouzil 2 jeden ako klient druhy ako server - transparentny most. Pripojim na nich prevodniky RS485 a tym budem mat k dispozicii pri serveri MODBUS RTU z menica a mozem skusit spravit to co navrhujete.