Vyčítání dat z Axon Modbus server - datové typy



  • Dobrý den,

    řídím Axonem FVE - přetoky do bojleru a vyčítám s ním data z jednotlivých elměrů a měniče.
    Mám jej i jako Modbus server na posílání dat do své databáze - přes Weintek cMT-SVR-100. Data v typu uint se zobrazují všude dobře - velikost údajů ve vždy menší než typ uint 65536.
    Potřebuji ale zobrazit číslo větší, řekněme 105000. Hrál jsem si s všemy datovými typy, ale vždy je číslo jiné než ve skutečnosti. Zajímavé je, že v mein v ladění se vždy číslo ukazuje dobře. Myslel jsem si, že je chyba na straně klienta, ale připojil jsem se na Axona Mudbu scanerem a hodnota byla stejná, jako na straně klienta, tedy jiá než ve skutečnosti.
    Přikládám scren, typ na výstupu je dint, stejně jako u proměné na serveru.
    Díky za možné rady.

    Vysvětlení:
    tři hodnoty typu uint sčítám a následně potřebuji toto číslo odečíst od 160000. Určitě budou chyby v těch jednotlivých převodech. Tady na screenu mě zůstal real, ale teď jsem jej nahradil a stále je číslo na výstupu jiné.

    0_1554880609910_dint.jpg


  • administrators

    Dobrý den @beny44,
    Modbus nedefinuje datové typy, takže je na obou stranách - slavu a masteru - aby se dohodli, v jakém formátu si data pomocí 16ti bitových registrů budou vyměňovat. Pro celočíselné hodnoty > 65535, nebo pro čísla s desetinnou čárkou je potřeba využít více registrů. Je tedy potřeba zajistit, aby se např. 32bitová hodnota rozdělila na dvě 16ti bitové a na druhé straně se zase správně složila. Ale správný systém neexistuje a jednotlivý výrobci si to řeší po svém. Někdy je nižší word uložený v nižším registru a vyšší ve vyšším, někdy je to naopak a někdy se prohazují i jednotlivé byty. Zkuste pořadí wordů, pokud máte možnost, na masteru přehodit. V EasyBuilderu pro displeje Weintek se to dělá v dialogu nastavení Modbus zařízení:

    0_1555310288245_1d06c15d-d896-4ba7-9b89-4c7b921a2be0-image.png


  • administrators

    A ještě dovětek @beny44. Pokud přidáváte do Modbus server zařízení proměnné, které jsou větší jak 16 bitů, musíte jim ručně udělat místo na dva registry:

    0_1555314353324_ad20c98b-fcf9-427b-b793-8bea2546f76b-image.png

    cislo16bit zabírá pouze jeden registr, proto cislo32bit může být na registru č. 2.
    cislo32bit_2 musí být až na registru č. 4, protože předchozí cislo32bit si zabere registry 2 a 3.
    cislo16bit_2 musí být až na registru č. 5, protože předchozí cislo32bit_2 si zabere registry 4 a 5.

    S pozdravm,
    Martin Kudláček