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

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

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

#1 Příspěvek od Le_Ze »

Nazdar.
Není tu někdo kdo to řešil?
Tady jsem našel a funguje.
https://forum.arduino.cc/t/ground-probl ... ion/853508
https://forum.arduino.cc/t/reading-sola ... lem/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: Vybrat vše

 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);
 //----------------------------------------------------------------------------------------
   
  }

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#2 Příspěvek od petrfilipi »

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

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#3 Příspěvek od Le_Ze »

Je to Epever mppt s vystupem rs 485
https://vmshop.cz/index.php?search_string=EPEVER

manuál s popisem registrů
https://cdck-file-uploads-europe1.s3.du ... 3f756b.pdf

Jde mi jen o čtení.

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#4 Příspěvek od petrfilipi »

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.

Uživatelský avatar
Valdano
Příspěvky: 695
Registrován: 01 led 2023, 01:00
Bydliště: Česká Lípa

#5 Příspěvek od Valdano »

petrfilipi píše: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.du ... 3f756b.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: Vybrat vše

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

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#6 Příspěvek od petrfilipi »

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

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#7 Příspěvek od Le_Ze »

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.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“