Pavka Programování Mosaic 11. 8. 2024 14:19 12. 8. 2024 22:54

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

Luboš Urban 12. 8. 2024 13:03

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.

Pavka 12. 8. 2024 14:50

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?

 

 

Pavka 12. 8. 2024 17:48

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

Pavka 12. 8. 2024 17:58

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. 

Pavka 12. 8. 2024 18:08

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. 

Pavka 12. 8. 2024 22:54

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