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é. -
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í: -
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:
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