Pomoc s Modbus mapou Energy meter QI Power



  • Jsem tu opět.
    Pokouším se sestavit modbus mapu pro měřící transformátor QI-POWER-485.
    Zařízení mám připojené, komunikace funguje.
    Problém jsou adresy. Bohužel Italové nechtějí komunikovat a v jejich mapě mě pár info chybí.
    Mám již nastaveny elměry od Erniky, tam jede vše v pohodě.
    Může mě někdo pomoci? Jde mě o spodní pravou část v nastavení jednotlivé adresy,m jak se dělají posuny od té první v grupě. Pokoušel jsem se náhodně něco trefit (hledal jsem napětí či frekvenci, abych to dle toho celé pak posunul), ale zatím za dva dny ani ťuk.
    Link na mapu je zde http://www.qeed.it/wp-content/uploads/2014/05/QI-POWER-REGISTER-MAP-05132014.pdf

    Děkuju



  • Zkus tohle 40073 a 40074 je logická adresa napětí ve voltech...fyzická adresa bude 72 a 73. Číst funkcí 0x3 - Read Multiple Registers



  • @jiri-zejbrdlich No já jsem na elmeru od Erniky to dělal tak, že jsem si založil skupinu, zadal počáteční adresu (po převodu z hex na dec) a nastavil počet prvků.
    Následně jsem přidával datové body u kterých jsem nastavil délku MultiByte (většinou 4) a Ofsset (podle rozdílu mezi adresou skupiny a adresou bodu). Vždycky to takto šlo.
    Píšeš o logické a fyzické adrese - tedy mám dát do skupiny logickou či fyzickou?
    Funkci Read Multiple Registers v rozbalovači nemám - viz. screen.

    A děkuji.

    0_1547321797369_Read_Holding.jpg



  • Zajímavé to je od logické adresy(číslování pro odlišení - číst můžeš několika funkcemi, takto se to rozliší, proto logická adresa) 40073-napětí, nastav si počáteční adresu(fyzická-skutečný registr a počítáno od nuly) na 72 a začni si funkcí F03 vyčítat napětí, proud výkon atd.



  • @jiri-zejbrdlich Stále mám číselné nesmysly.
    Nastavil jsem počáteční adresu skupiny na 72, počet prvků 50. Vlastnosti datového bodu mám typ ST dint (zkouším i jiné - tady vidím možný problém proč to nejde). V parametrech datového bodu mám délku 4 a offset 0 (pro napětí).



  • Hodnoty jsou dle manuálu posílány jako real...



  • V případě potřeby lze také nastavit bytové pořadí, v případě jinak-endianového kódování které používají některé vzácnější zařízení.



  • Děkuji za info.
    real jsem měl také nastaven, ale i tak se nedařilo. Jsem již ve spojení s panem Kudláčkem a budu mu dnes posílat celý projekt a možná že i popřípadě jedno trafo ma odzkoušení.


  • administrators

    Dobrý den @beny44,
    projekt jsem dostal, ale vyžaduje si ucelenější odpověď, kterou Vám připravím zítra.


  • administrators

    @beny44

    Díval jsem se na Váš projekt a začal bych trochu ze široka.

    1) Zjistit, jak je to skutečně s adresováním
    Adresování v Modbusu není jednoduché. Existují pojmy jako adresa registru/coilu a číslo registru/coilu. Adresy registrů začínají od 0, kdežto čísla registrů začínají od 1. Tedy registr na adrese 72 je má číslo 73.
    Výrobce zařízení nebo SW si pak vybírá, jestli v bude používat pro označování registrů adresy, nebo čísla, případně obojí. Pro detailní informací o adresování doporučuji přečíst tento tutorial: https://www.csimn.com/CSI_pages/Modbus101.html

    Mervis používá čísla registrů/coilů v desítkové soustavě. Tedy Starting Element v nastavení skupiny je číslo prvního registru/coilu, od kterého se budou data do skupiny načítat.

    Dle modbusové mapy Vašeho elektroměru (http://www.qeed.it/wp-content/uploads/2015/08/QI-POWER-485-Register-Map-082015.pdf) má první registr adresu 40001. Z výše uvedené stránky jste se mohl dočíst, že označování registrů od 40000 a výše znamená, že daný registr je Holding Register a tedy je potřeba využít příslušné Modbusové funkce pro jeho vyčítání.
    Adresy ale typicky začínají od 0, tedy správně by adresa 1. registru měla být 40000. Je tedy dost dobře možné, že to co Qeed ve své dokumentaci nazývá adresou je ve skutečnosti číslo registru. A je také více než pravděpodobné, že nemusíte vyčítat registr číslo 40001 ale jenom 1... Tak komplikovaný je celý Modbus a je tedy potřeba se na jednoduchých a jednoznačných datech zorientovat.

    Jednoduchá data jsou ta, které jsou pouze v jednom registru. Např. hodnota "V RMS" (400073) je složitá - obsahuje číslo s pohyblivou řádkou a je roztažena přes několik registrů. Hodnota Delay (40003) sice obsahuje celé číslo, ale jeho výchozí hodnota je 1, tedy stejná jako předchozí a následující registr. Pokud se omylem trefíte s adresou do vedlejšího registru, pak to z jeho hodnoty nemusíte okamžitě poznat.

    Z dané mapy je na testování vhodný registr "DC Filter" (40007), který by měl obsahovat hodnotu 10. Předchozí registr "Parity" by měl obsahovat hodnotu 1 a následující registr "Flag Measurement" hodnotu 16 (0x10 je zápis v šestnáckové soustavě, tedy 16 v desítkové).

    Začněte tedy tak, že vytvoříte v Modbusovém zařízení skupinu pro vyčítání Holding Registerů (F03). Počáteční element je to, co nám následně řekne, jak to s adresováním v tomto konkrétním případě vlastně je. Z předchozího rozboru začneme zkoušet několik hodnot:

    7 - Předpokládáme, že 40007 je ve skutečnosti registr číslo 7
    8 - Předpokládáme, že 40007 je opravdu adresa, tedy registr číslo 8
    40007 - Předpokládáme, že 40007 je ve skutečnosti registr číslo 40007
    40008 - Předpokládáme, že 40007 je opravdu adresa a tedy registr číslo 40008

    Můj soukromý typ je, že Starting element = 7 by mohl zafungovat. Takto by mělo vypadat nastavení skupiny:

    0_1547733153682_bd3d2e3f-600d-49c7-b30d-d943cdd0682f-image.png

    Do této skupiny vytvořte Datapoint, který převede první dva byty do datového typu INT:

    0_1547733208069_cdeeb21d-ed13-4c11-bc55-ee1dd4ff73d2-image.png

    A s tímto nastavením zkuste vyčíst hodnotu 10. Pokud se nepodaří, změňte Starting Element u skupiny na další hodnotu ze seznamu, dokud nenarazíte na fungující variantu.

    Zde bych zatím skončil, dokud nezjistíte, jak to s adresováním je. Poté bychom se podívali na vyčítání více čísel s pohyblivou čárkou a jak ji případně transformovat.

    S pozdravem,
    Martin Kudláček



  • @martin-kudláček
    Odzkoušeno na všech hodnotách od začátku mapy. Je to tedy tak, že se začíná od 1. Hodnoty jsou následovné a správné.
    Machine ID QI power 485 - hodnota 7
    Firmware version - 34
    Modbus adress - 1
    Delay - 1
    Baudrate - 9600 - 3
    Parity - NO - 0
    DC filter - 5 (není 10 jak jste říkal - ikdyž default tak je dle manualu)

    Tady info o zařízení se ukazuje dobře. Zkoušel jsem i 73 a dále, ale tam se hodnoty mění na obě strany i za mínus znamínko. To bude tou pohyblivou čárkou.0_1547746155308_Qeeed.jpg



  • @martin-kudláček Aby nedošlo k špatnému pochopení - 40001 mám nastaveno 1.


  • administrators

    Dobrý den @beny44,
    zkuste pro vyčítání Vrms vyrobit tuto skupinu:

    0_1547818668980_eb442f86-787c-45bf-a9d2-ddefa067eca9-image.png

    A k ní tento datapoint:

    0_1547818705694_b3b9f637-9ae7-4f22-829a-b5de6016ad1f-image.png



  • @martin-kudláček Bohužel toto nejde, hodnoty lítají s použitím real od mínusových hodnot po hodnoty s E na konci. V screenu označené jako DC _filter. Zkoušel jsem i jiné ST, ale i tak jsem hodnotu, kterou jsem hledal nenašel Pokoušel jsem se najít frekvenci. Samozřejmě s jiným počátečním bodem skupiny. 0_1547822531998_DC-Filter.jpg


  • administrators

    @beny44 Typ REAL je určitě správně, ten tam nechte. Zkuste ještě změnit pořadí MultiByte Parseru:

    0_1547823632592_468d77aa-bc64-437c-a4f3-c147e22602d5-image.png



  • @martin-kudláček Perfektní! Tedy pořadí bylo jiné. Děkuji za radu. Sestavím mapu potřebných hodnot a popřípadě transformuji nějaké desetinné čárky, to už dám. Ještě jednou děkuji.
    Já se stejně asi ještě ozvu, budu připojovat přes Modbus TCP měnič od SolarEdge (ten bude server). Doufám, že po zadání IP, portu se všechny proměné načtou.

    https://www.solaredge.com/sites/default/files/sunspec-implementation-technical-note.pdf

    0_1547824034583_Frekvence.jpg


  • administrators

    @beny44 Ona o tom prohození, resp. pořadí prvků je zmínka v dokumentaci: "Float (LSW First)". To znamená, že datový typ je float - tedy 32bitové číslo s plovoucí desetinnou čárkou, které se v Mervisu používá pod názvem "real". Jelikož je to 32bitů, tak jsou potřeba dva registry. A jelikož specifikace Modbusu nezná pojem datový typ, tak je na výrobci zařízení, jak data "nalije" do 16ti bitových registrů. Zde je to jednoduché - 32bitů přesně sedí na dva registry, takže je rozdělili na dva tzv. wordy (word = 16 bitů). Ty poloviny se označují jako LSW - least significant word, tedy nižší polovina 32bitů a MSW - most significant word, tedy vyšší polovina 32bitů. A poznámkou uvedli, že nižší polovina je v registru 73 a vyšší je v registru 74. Data naparsovaná do skupiny jsou ale v opačném pořadí, tedy je potřeba využít funkci přehazování bajtů.

    Modbus je jednoduchý tím, že dává velkou volnost v implementaci. Ale vybere si daň na složitosti při nastavování...

    Letmo jsem proběhl dokumentaci ale vypadá to, že zařízení jsou opět Modbus Slave a je možno k nim přistupovat jak přes RS485 tak přes TCP. Nic to ale nemění na tom, že opět budete muset vytvořit obecné modbus zařízení a v něm nakonfigurovat mapu registrů.



  • @martin-kudláček Ano zmínka v manuálu o tom byla, já sám sem si říkal, že by to mohlo být prohozené, ale nikde jsem nenašel, jak má to pořádí být zaspané v Mervisu :-(
    A pokud jde o SolarEdge, nemyslím si že máte pravdu.
    Modbus TCP je označená měnič, jako server - na straně 7, kde se píše, že server čeká dvě minuty na odezvu klienta a pak se vypne.
    U 485 je možnost dvou konektorů, kdy je jeden master a druhý sleve. Já budu mít na 485 pověšený elměr od SolarEdge, tak bych chtěl využít Modbus TCP k vyčítání hodnot z měniče do Axona.