Dobrý den,
řeším situaci:
v PLC mám rozjetý modbus RTU slave funguje jak má. Holding registry jsou UINT.
Cílové zařízení které čte z tohoto slavu vyžaduje float formát - nejde to změnit. Mám proměnnou REAL. Potřebuji poradit, jak uložit 2 byty tohoto Realu do jednoho Uint registru a druhé 2 byty do druhého Uint registru. Bez konverzí beze změn.
Díky moc
Pavel
Odpovědi 6
Dobrý den,
v připojeném souboru jsou funkce, které prohodí wordy v proměnné typu REAL. První řešení je s využitím základní funkce shift, druhé řešení pomocí rotace bitů a třetí využívá instrukci SWL (swap), která prohodí wordy ve čtyřbytové proměnné. Funkce jsou komentované, aby bylo vidět, co dělají. Vnitřně pracují s hodnotou na vstupu jako se souborem bitů, bity nemění, jen přesouvají.
Konverzi provádíte průběžně tak, jak se mění hodnota vstupní proměnné a do zóny holding registrů pro Modbus server ukládáte zkonvertovanou hodnotu s prohozenými registry. Ve Foxtrotu takto zkonvertovaná hodnota bude vypadat jako hodně velké nebo hodně malé číslo, na druhé straně pro přečtení Modbus masterem ale bude dávat smysl. To je tím, že Modbus používá ukládání proměnných v paměti podle Motoroly (Big Endian), kdežto Foxtrot podle Intelu (Little Endian). Byty ve wordu prohazují knihovní bloky automaticky, u proměnných, které zabírají více registrů, se o prohození musí postarat uživatel sám.
Dobrý den,
děkuji za odpověď. Něco takto složitého jsem tedy nečekal. čekal jsem nějaký funkční blok :-) protože v knihovně modbus je funkční blok který dělá obrácenou funkci :-)
Abych pravdu řekl vůbec tomu nerozumím. V kódu je IN vstupní hodnota typu real. Ale kde jsou 2 výstupní uint proměnné, které bych vkládal do holding registrů?
Píšete :Konverzi provádíte průběžně tak, jak se mění hodnota vstupní proměnné a do zóny holding registrů pro Modbus server ukládáte zkonvertovanou hodnotu s prohozenými registry.
šlo by to udělat finkčními bloky Real to uint - vložit do prvního registru a real swap bytes - real to uint - a vložit do druhého registru?
Dobrý den,
tak se mi podařilo rozchodit swap. To je ok.
Ale jak z původního realu a pak z otočeného realu vyseparovat ten word do uint proměnné abych ji vložil do holding registru.
vstupní real mám např 231,56 když dám konverzi real to uint tak mi to zaokrouhlí na 231 což je špatně.
děkuji
Pavel
přikládám obrázek.
Výstupní proměnné jsou uint. špatně jsem pojmenoval. u toho otočenýho realu to dokonce ani nepřevede.
ještě jeden obrázek.
dva realy jeden otočený. když manuálně zadám posledních 16bitů zprava do holding registrů tak master čtě přesně 230.565.
otázka tedy je jak překopírovat z každého realu posledncích 16 bitů do uint registru.
vyřešeno, děkuji za nakopnutí správným směrem.
FUNCTION Real_to_int_Lword : UINT
VAR_INPUT
IN : REAL;
END_VAR
VAR
pDW : PTR_TO DWORD;
temp : DWORD ;
END_VAR
VAR_TEMP
END_VAR
pDW := ADR(IN); // nacteme adresu vstupu
pDW^ := SHL(IN := pDW^, N := 16); // shiftem vysuneme spodni word do vrchniho
pDW^ := SHR(IN := pDW^, N := 16);
temp := pDW^;
Real_to_int_Lword := DWORD_TO_UINT(temp); //priradime odkazovanou hodnotu do vystupu
END_FUNCTION
pro druhou část realu pouze 1 posun doprava. Data se již do mastera sypou.
Děkuji
Vaše odpověď
Pro vložení odpovědi je nezbytné být přihlášený. Pokračujte na přihlášení.