Просмотр полной версии : Доступ к гллбальным переменным через абсолютные адреса
appmagnetics
17.09.2014, 12:25
Добрый день, коллеги,
требуется помощь с пониманием внутренней логики распределения памяти - если я определяю глобальный масив так
VAR_GLOBAL
GLOBAL_VAR: ARRAY [0..2000] OF DINT;
END_VAR
но мне нужно обращаться к нему через абсолютный адрес, я могу в приниципе сделать так - все компилируется:
GLOBAL_VAR AT %MW200 : ARRAY [0..2000] OF DINT;
Но, что происходит при этом в самом контроллере? Где будет лежать массив физически, в какой памяти в первом случае и во втором?
GLOBAL_VAR: ARRAY [0..2000] OF DINT;Сегмент глобальных данных.
GLOBAL_VAR AT %MW200 : ARRAY [0..2000] OF DINT;Флаговый сегмент с 200-го по 8200-й байты (плюс позиция начала сегмента, если речь о «физическом» адресе). Адреса эти абсолютные только в пределах сегмента.
appmagnetics
17.09.2014, 14:16
Ок, то есть моя догадка была верна - при декларации AT данные реально помещаются в другое место памяти.
То есть скорее всего (см. прикрепленный скриншот), в моем случае
GLOBAL_VAR - в "Global"
GLOBAL_VAR AT - в "Retain" ?
А есть еще ключевое слово RETAIN для глобальных переменных - как оно работает - просто помещает опять таки переменные в другую область, только адрес компилятор определяет сам?
Переменные объявляются реманентными именно ключевыми словами PERSISTENT и RETAIN. Да, в этом случае они попадают в ту область оперативной памяти, которая копируется в энергонезависимую память перед выключением и считывается оттуда при включении. Можно ли сделать переменную реманентной указав адрес через AT - я не проверял. Само по себе объявление через AT не обеспечивает попадание переменной именно в ритэйн-сегмент.
appmagnetics
17.09.2014, 16:52
Ок, спасибо, все стало гораздо яснее. Я протестирую чтобы подтвердить.
appmagnetics
18.09.2014, 10:49
Протестировал - дело в том что абсолютные адреса нужны для доступа извне, через веб-сервер
192.168.2.100/WRITEPI?ADR1=MW200&VALUE1=1234&FORMAT1=%d
Запрос вроде выполняется, но значение переменной не меняется. Может я чего-то не понимаю как смотреть значения?
П.С. И да, это не ОВЕН ПЛК, другой (WAGO), но работает также через CoDeSys
С этого надо было начинать. В Овнах просто нет такого сервера.
Вот здесь кто-то d в конце на x заменил, например: http://www.oscat.de/community/index.php?topic=1940.0
appmagnetics
18.09.2014, 11:13
Все равно спасибо за помощь, многое прояснило. Я даже уже видел этот топик на OSCAT но он там не формат заменил, а у него просто в коде переменная переписывалась другим модулем.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot