Pavka Programování Mosaic 3. 12. 2024 10:49 4. 12. 2024 15:12

Dobrý den,

měl bych dotaz k modbus TCP slave.

mám fb nastaven, offset adres, funguje. Potřebuji simulovat určité zařízení a musím dodržet čísla registrů.

40000-40350

212-217

500-515

Mám pro holding registry pole UINT o velikosti 350 a offset mi nastaví adresy do prvního rozsahu. To funguje.

Jenže nevím jak na stejném slavu adresovat i registry pod offsetem.  Napadlo mě vyzoušet udělat pole o délce 1..40350 což asi není ideální ale jde to, ale nejde to již adresovat.

Když dám Suns_holding_regs[40001] := 0; tak index hlásí že je mimo rozsah

Tušíte jak toto udělat?

 

Díky 

Pavel

Odpovědi 2

M.B. 3. 12. 2024 11:29

Dobrý den,

bohužel v aktuální verzi překladači je konstatní index pole omezen rozsah typu INT a při použití indexu na 32767 překladač hlásí chybu. Omezení je čistě historický relikt, kdy díky velikosti paměti PLC neměly větší pole smysl. Do budoucna omezení zrušíme.

Než bude nová verze připravena, lze problém obejít tím, že přistoupí do pole přes index definovaný proměnnou, tedy:

i := 40001;
Suns_holding_regs[i] := 0;


Druhá možnost je nadefinovat pole jako strukturu dvou polí, tedy:
TYPE
  TModu​​​​​​busHoldingRegStruct : STRUCT
    Reg0_39999 : ARRAY [0..39999] OF WORD;
    Reg40000   : ARRAY[0..350] OF WORD;
  END_STRUCT;
END_TYPE

a pro přístup k registrům nad 40 tisíc použít přístup:

 Suns_holding_regs.Reg40000[1] := 0; //pristup na registr 40001

Pavka 4. 12. 2024 15:12

pomohlo přes proměnnou.

 

Děkuji

Vaše odpověď

Pro vložení odpovědi je nezbytné být přihlášený. Pokračujte na přihlášení.