Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

EPsolar + ESP8266 - vyčitaní dat přes Modbus

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: so květen 13 2023, 10:50    Předmět: EPsolar + ESP8266 - vyčitaní dat přes Modbus Citovat

Nazdar.
Není tu někdo kdo to řešil?
Tady jsem našel a funguje.
https://forum.arduino.cc/t/ground-problem-modbus-communication/853508
https://forum.arduino.cc/t/reading-solar-charger-com-via-modbus-max485-problem/697035

Přes ten Modbus se však da vyčitat vice informaci.
Jsem našel toto, ale je to nějak poplantane.

Baterie stav: 6771.00
Baterie max: 97.62
Baterie teplota: 1.38


kód:

 resultMain = node.readInputRegisters(0x3100, 16);
  if (resultMain == node.ku8MBSuccess)
  {
   

Serial.println(" - - - - - - - - - - - - - - ");
 
    //----------------------------------------------------------------------------------------
    pn=node.getResponseBuffer(0x00)/ 100.0f;
    Serial.print("Panely napeti: " ); // PV Voltage
    Serial.println(pn);
     //----------------------------------------------------------------------------------------
    pp=node.getResponseBuffer(0x01)/ 100.0f;
    Serial.print("Panely proud: ");  // PV Current
    Serial.println(pp);
    //----------------------------------------------------------------------------------------
    pv=(node.getResponseBuffer(0x02) | node.getResponseBuffer(0x03) << 16)/ 100.0f;
    Serial.print("Panely vykon: ");
    Serial.println(pv);
    //----------------------------------------------------------------------------------------
    bn=node.getResponseBuffer(0x04)/ 100.0f;
    Serial.print("Baterie napeti: "); // Battery Voltage
    Serial.println(bn);
    //----------------------------------------------------------------------------------------
    bp=node.getResponseBuffer(0x05)/ 100.0f;
    Serial.print("Baterie proud: "); // Battery Charge Current
    Serial.println(bp);
    //----------------------------------------------------------------------------------------
    bv=(node.getResponseBuffer(0x06) | node.getResponseBuffer(0x07) << 16)/ 100.0f;
    Serial.print("Baterie vykon: ");
    Serial.println(bv);
  //----------------------------------------------------------------------------------------
    bstatus=node.getResponseBuffer(0x00);
    Serial.print("Batery stav: ");
    Serial.println(bstatus);
  //----------------------------------------------------------------------------------------
    bmax=node.getResponseBuffer(0x02)/ 100.0f;
    Serial.print("Baterie max: ");
    Serial.println(bmax);
   //----------------------------------------------------------------------------------------
    bmin=node.getResponseBuffer(0x03)/ 100.0f;
    Serial.print("Baterie min: ");
    Serial.println(bmin);
    //----------------------------------------------------------------------------------------
    btemp=node.getResponseBuffer(0x0)/ 100.0f;
    Serial.print("Baterie teplota: ");
    Serial.println(dtemp);
    //----------------------------------------------------------------------------------------
    dtemp=node.getResponseBuffer(0x1)/ 100.0f;
    Serial.print("Teplota zarízeni: ");
    Serial.println(btemp);
    //----------------------------------------------------------------------------------------
    bsoc=node.getResponseBuffer(0xa)/ 100.0f;
    Serial.print("Baterie soc: ");
    Serial.println(bsoc);
    //----------------------------------------------------------------------------------------
    ednes=(node.getResponseBuffer(0x00) | node.getResponseBuffer(0x01) << 16)/ 100.0f;
    Serial.print("Baterie - energie dnes: ");
    Serial.println(ednes);
    //----------------------------------------------------------------------------------------
    Serial.print("Baterie - energie mesic: ");
    emesic=(node.getResponseBuffer(0x02) | node.getResponseBuffer(0x03) << 16)/ 100.0f;
    Serial.println(emesic);
    //----------------------------------------------------------------------------------------
    erok=(node.getResponseBuffer(0x04) | node.getResponseBuffer(0x05) << 16)/ 100.0f;
    Serial.print("Baterie - energie rok: ");
    Serial.println(erok);
    //----------------------------------------------------------------------------------------
    etotal=(node.getResponseBuffer(0x06) | node.getResponseBuffer(0x07) << 16)/ 100.0f;
    Serial.print("Baterie - energie celkem: ");
    Serial.println(etotal);
     //----------------------------------------------------------------------------------------
    cstatus=node.getResponseBuffer(0x01);
    Serial.print("Stav nabijeni: ");
    Serial.println(cstatus);
    //----------------------------------------------------------------------------------------
    dstatus=node.getResponseBuffer(0x02);
    Serial.print("Stav zarizeni: ");
    Serial.println(dstatus);
 //----------------------------------------------------------------------------------------
   
  }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2646

PříspěvekZaslal: so květen 13 2023, 11:33    Předmět: Citovat

Máš k tomu měniči (nebo co to je) nějaký manuál s popisem registrů? Ta informace v registrech může mít různou délku (1-4 byty), navíc byty mohou být mezi sebou prohozené a i dvoubajty mohou být prohozené.
Tohle je daň za jednoduchost čtení pomocí nějaké knihovny - to, že to funguje na jednom zařízení neznamená, že vyčteš i jiné.
Co se týče modbusu, detaily najdeš třeba zde.

PF
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: so květen 13 2023, 12:04    Předmět: Citovat

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2646

PříspěvekZaslal: po květen 15 2023, 6:50    Předmět: Citovat

Já bych to řešil (prozatím) přes PC. Převodník USB/485 bych použil buď ten co nabízejí nebo mám osvědčený tento - včetně bezvadné podpory.
Jako SW mi výrobce kabelu Fiedler doporučil Qmodbus.
Jak píší v manuálu k registrům, všechny jsou 4bytové, tj. 32 bitů. A na straně 10 máš pak příklady čtení. Takže když pomocí aplikace QModBus odešleš 01 03 90 00 00 0F 28 CE, měl bys dostat odpověď 01 03 1E 00 00 00 C8 01 2C 06 40 05 DC 05 DC 05 B4 05 A0 05 64 05 28 04 EC 04 C4 04 B0 04 56 04 24 72 A5, resp. něco podobného.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Valdano



Založen: Jan 01, 2023
Příspěvky: 1692
Bydliště: Česká Lípa

PříspěvekZaslal: po květen 15 2023, 16:27    Předmět: Citovat

petrfilipi napsal(a):
Jak píší v manuálu k registrům, všechny jsou 4bytové, tj. 32 bitů. A na straně 10 máš pak příklady čtení. Takže když pomocí aplikace QModBus odešleš 01 03 90 00 00 0F 28 CE, měl bys dostat odpověď 01 03 1E 00 00 00 C8 01 2C 06 40 05 DC 05 DC 05 B4 05 A0 05 64 05 28 04 EC 04 C4 04 B0 04 56 04 24 72 A5, resp. něco podobného.

Všechna data rozhodně nejsou 32-bitová.

V manuálu s popisem registrů na který zde dal odkaz Le_Ze
https://cdck-file-uploads-europe1.s3.dualstack.eu-west-1.amazonaws.com/arduino/original/4X/d/8/1/d81eea7bf1f7d13f2ad95c453512f6926d3f756b.pdf
je pouze uvedeno, že všechna 32-bitová data zabírají dva modbus registry za sebou, ale to rozhodně neznamená, že všechna data jsou 32-bitová. Na data jako teploty, napětí a proud není nutné používat 32-bitové datové položky a také se ani v tom popisu nepoužívají.

Je to viditelné z příkladu v odkazovaném manuálu na str. 6 kde v odpovědi na požadavek čtení aktuálního napětí baterie je hodnota pouze 16-ti bitová a přenáší se jako celé číslo v setinách voltu.

0x04CE (hexa) je dekadicky 1230 a jelikož je v tabulce pro položku "A36 Battery voltage" uveden dělitel 100 tak výsledná hodnota je 12,30V.

Stejně tak i na straně 10 ve zmíněné odpovědi viz níže vyseparovaná data registrů z paketu odpovědi
kód:
00 00 00 C8 01 2C 06 40 05 DC 05 DC 05 B4 05 A0 05 64 05 28 04 EC 04 C4 04 B0 04 56 04 24
ani jedna z hodnot není 32-bitová. Jedná se o patnáct samostatných 16-ti bitových registrů.

32-bitových datových položek je v tom popisu registrů od Le_Ze naprosté minimum
Pouze viz 3 níže uvedené dvojice 16-ti bitových registrů mají význam jako 32-bitové hodnoty.

F3 Array rated power L, 3002, dolních 16 bitů hodnoty
F4 Array rated power H, 3003, horních 16 bitů hodnoty

F7 Battery rated power L, 3006, dolních 16 bitů hodnoty
F8 Battery rated power H, 3007, horních 16 bitů hodnoty

F11 Rated load power to L, 300F, dolních 16 bitů hodnoty
F12 Rated load power to H, 3010, horních 16 bitů hodnoty

Endianita
Endianita je uspořádání bajtů u 16 a 32 bitových hodnot v paměti tj. i v bafrech tedy i v komunikačních paketech. Podrobnější popis jak jsou uloženy bajty vícebajtových položek v paketu podle Big-Endian a Little-Endian je viz tento odkaz.

Dle standardu Modbus jsou data přenášena jako Big-Endian tj. všechny specifikace 16 a 32 bitových položek, a to včetně adres registrů jsou Big-Endian. V odkazovaném popisu registrů od Le_Ze není zmíněno, že by endianita datových položek dle standardu Modbus nebyla dodržena. Pokud jde o nějakou knihovnu určenou specificky pro komunikaci protokolem Modbus tak tam závisí převod endianity na tom, pro jakou cílovou platformu je knihovna určena a jak to má řešeno. Pokud se jedná o knihovnu pro Arduino nebo pro PC s Windows tak tam je v obou zmíněných případech cílová endianita Little-Endian, ale záleží na té či oné knihovně zda tento převod provádí automaticky nebo na základě nastavení nějakého konfiguračního parametru a nebo jen prostřednictvím nějakých samostatných funkcí k převodu 16 a 32 bitových datových položek z jednoho typu endianity na druhý.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2646

PříspěvekZaslal: po květen 15 2023, 18:15    Předmět: Citovat

Jj, máš pravdu, nečetl jsem ten manuál tak podrobně.
Prostě je třeba zkoušet a číst raději kratší úseky a zaměřit se na jasné veličiny (napětí, teplota, výrobní číslo, ...). Když mi na 12V Aku vyjde (po dělení 100) třeba 50V, tak je něco špatně. A doporučuji to opravdu vyčíst jako surová data a pak je dle specifikace ModBusu ořezat od režijních dat. A až budeš vědět co číst a jak byty řadit, tak není problém to vyčítat knihovnou a ESP.

Petr
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: so květen 20 2023, 7:33    Předmět: Citovat

Tak s registry jsem uplna lama a spiš jsem našel par tutorialu a zkoušim a přidavam.
Ale spiš řešim jiný problem.
https://forum.arduino.cc/t/arduino-modbus-issues/470715
https://forum.arduino.cc/t/serial-port/648783
https://forum.arduino.cc/t/epever-registers/1097048

Všichni tam řeši čtení a vypisovaní přes jeden ser.port.
Netušim co na to ten EPsolar, když se do něj cpou jide data.
Chtěl jsem to pořešit přes SoftwareSerial, ale nějak to nefunguje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.25 sekund