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
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
a 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á)
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
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ý.