СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Добрый день. Подскажите такой момент. При создании экземпляра структуры с помощью оператора __NEW по условию, возможно ли обращение к предыдущему экземпляру, если условия срабатывает повторно? Нужно ли для этого создавать отдельную переменную или массив? Что происходит с зарезервированной для экземпляра памятью, если я создаю ещё один экземпляр, но не сохраняю адрес предыдущего в отдельный указатель?
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
alixx Попробую ответить схематически (не до конца уверен в точности ответов).
Если тут всё работает так же, как в СИ-подобных языках, то __NEW просто всегда выделяет новую память. Старая остаётся выделенной до тех пор, пока программа не закончит работу (то есть, ПЛК не выключат). Это будет приводить к утечкам памяти. Например, через какое-то время свободная память кончится - и программа в ПЛК даст сбой.
Поэтому так обычно не делают. Обычно, если надо просто указать какой-то адрес чего-то для буфера - то этот буфер объявляют как переменную и потом при помощи оператора ADR() указывают её адрес (для приёма данных, например).
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net
То есть если использовать только один указатель, непосредственно для сохранения адреса, то при повторном срабатывании условия он перепишется и его значение будет утеряно навсегда...А не будет ли ошибкой создать в самой структуре переменную типа DWORD и сохранять адрес в ней же?
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Чтобы ответить, нужно понимать, зачем вообще создавать новые блоки памяти и указатели для них. Расскажи полностью всю идею, потому что ВСЕ стандартные идеи укладываются в стандартный ADR(), а именно:
* Создание буферов для приёма данных из портов.
* Создание буферов для склеивания и перестановки всяких байт в памяти.
* Передача или обработка (подсчёт CRC, например) данных и буферов памяти.
* Передача структур или буферов в разные куски программы или FB.
Всё-всё это работает через ADR прям вот прекрасно (я перешёл с СИ на ПЛК и привык с адресами, указателями и буферами работать).
Для чего нужен __NEW?
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net