JiriK SW ostatní 12. 6. 2024 12:15 10. 5. 2024 8:57

Dobrý den,

měl bych prosím na Vás dva dotazy:

1) příkaz GETMEM:

Existuje nějaký způsob, jak se ptát na data pomocí přímé adresy v paměti PLC, která je získána pomocí "PTR_TO"? Nechám-li si zjistit adresu nějaké proměnné pomocí "PTRTO", je vždy posunuta o nějaký offset, vůči tomu v jakém registru je umístěna (registrX - 0x00000, registerY - 0x10000, registerS - 0x20000, registerR - 0x60000). Čili pak při dotazování pomocí příkazu "GETMEM:%<register><adresa> <velikost>" musím vždy tento offset odečítat podle toho v jakém registru se daná proměnná nachází. Takovéto rozložení registru bude u všech PLC stejné? Nebo se může měnit? Existuje příkaz kterým se mohu zeptat přímo na adresu získanou z "PTR_TO"?

2) SETMEM: ... - nějaká obdoba příkazu GETMEM ale pro zápis

Existuje nějaká obdoba příkazu "GETMEM:", která je určena pro zápis bloku dat? Při použití příkazu ve formátu, kdy bych chtěl pracovat s adresou a ne s názvem proměnné v PLC, pomocí příkazu "SET:%<register><adresa>, <hodnota>" jsem schopen nastavit pouze jeden bajt.

Děkuji za odpověd a případné rady.

 

 

Odpovědi 3

M.B. 30. 4. 2024 16:45

Dobrý den,

funkce typu SETMEM v PLCComS serveru implementována není. Přes funkci SET s absolutní adresou je možné využít kromě bajtového přístupu přes %Rxxx následující formáty:

  • %RW - integer 2 bajty - UINT
  • %RL - integer 4 bajty - DINT
  • %RQ - integer 8 bajtů
  • %RF - float 4 bajty - REAL
  • %RD - double 8 bajtů - LREAL

Formáty fungují i pro ostatní zóny (např. %XW1 apod.).

Offsety zón jsou dány řadou CPM. Offsety které uvádíte platí pro CPM řady I, kterou využívají PLC Foxtrot 2 a TC800. V rámci modernizace počítáme s tím, že některé nové modely Foxtrot 2 a TC800 budou používat novou řadu CPM s větší a jinak rozdělenou pamětí.

V uživatelském programu je pro převod pointeru na zónu a offset v rámci zóny možné použít funkce GetVarAbsLoc GetVarAbsLocBool, které vrací jak číselnou tak textovou informaci o pozici proměnné.

V rámci PLCComS podobný příkaz není. Komunikační protokol nepracuje s hodnotami pointerů, ale s offsety v rámci zón.

Obecně doporučujeme se absolutní adresaci vyhnout a přistupovat k datům přes symbolická jména. Hodnoty pointerů se mohou během běhu programu měnit a jejich vyčtená hodnota nemusí být v době jejího použití platná (komunikace o hodnotu pointeru proběhne v jiném cyklu PLC než komunikace, kde se použije adresa z pointeru vyčtená)

JiriK 1. 5. 2024 21:22

Dobrý den, 

děkuji za vysvětlení a možné řešení. 

Mohl byste prosím více rozvést poslední odstavec? Hodnota pointeru se během programu může změnit? I pokud je to pointer na globální proměnnou? 

Děkuji 

M.B. 10. 5. 2024 8:57

Dobrý den,

bylo to myšleno obecně. Pointer jako proměnná může měnit hodnotu. Samozřejmě pokud pointer ukazuje na stále stejnou proměnnou jeho hodnota bude konstatní, dokud nedojde k přehrání programu.

Tento dotaz je vyřešený.