Меню
Блог Гридина Семёна

Автоматизация и логические контроллеры

Рубрики блога

Указатели в Codesys. Пытаемся разобраться

Указатели в Codesys. Пытаемся разобраться

Про указатели.

Указатель по версии Codesys

Указатели хранят адреса переменных, программ, функциональных блоков, методов и функций во время выполнения прикладной программы. Указатель указывает на один из упомянутых объектов или на переменную с любым типом данных.

Синтаксис достаточно простой:

<identifier>: POINTER TO <data type | function block | program | method | function>;

Но чтобы поместить туда адрес нам надо будет его взять с помощью команды ADR ()

Вот и пришла пора посмотреть как это будет работать

Берем указатель

Первым делом создадим файл с глобальными переменными. И запишем туда парочку.

Я думаю. что столько вполне хватит.

Дальше я создам функциональный блок, дабы посмотреть адреса наших переменных.

Функциональный блок с тремя указателями на разные переменные.

Не забудьте добавить данный ФБ в программу и запускаем в эмуляции.

Полученные адреса наших переменных.

Отлично адреса вроде как есть. Теперь мы можем немного разыменовать указатели, чтобы посмотреть что там есть за значения.

Немного изменяем наш ФБ

Добавляем просто три переменные. И смотрим что там есть… Разумеется ничего. Мы же их не инициализировали. Так что предлагаю что-то туда записать.

Инициализировали значение.

Прогружаем наше творение и созерцаем.

Результат выполнения программы.

По адресу в памяти хранятся те же значения.

Перекидываем адреса ячеек

Теперь есть предложение немного перемешать адреса ячеек, чтобы полностью запутаться.

Мы передадим наш адрес обычной переменной типа DWORD. Зачем? Ну потому что можем. Потом передадим эту переменную в указатель, потом разыменуем указатель и зададим значение и посмотрим, что же у нас останется в переменных.

Очередная версия

Результат выполнения

Вот мы и передали значение, совершая переход по адресам.

Ну раз мы такие молодцы, что можем ходить по адресам из ячейки в ячейку давайте попробуем кое что…

Мы инициализируем три переменных типа INT, зная адрес лишь одной ячейки.

Перерабатываем наш файл с глобальными переменными. И вот тут уже последовательность важна.

Глобальные переменные

Все целочисленные переменные находятся первыми в списке.(А вот тут я не знаю правильно ли думаю. Давайте смотреть)

Что нам надо взять адрес, присвоить значение, потом к адресу прибавить новый адрес и опять присвоить значение. И вот тут у меня начались проблемы с адресацией. Оказывается адресация глобальных переменных сохраняется. Не знаю насколько это будет верным утверждением относительно реального ПЛК, но на эмуляторе первоначальный фокус не прокатил(да у нас тут не все с первого раза работает). Пришлось создать новый файл с глобальными переменными и там по порядку написать три целочисленные переменные.

И вот тут все заработало.

Вот наш код с ручным обходом по адресам.

Глобальные переменные

Результат выполнения

Как мы и планировали. Значения записались туда куда мы и хотели.

Записываем в Input

А дальше у нас увлекательное шоу. Мне не особо нравятся переменные типа IN_OUT. Так вот, попробуем записать в переменную в блоке Input. Возможно ли такое?

Стираем все что было до этого и оставляем одну переменную с плавающей точкой в инпутах.

В ФБ такое работает…

Не ожидал такого.

Но вспомнил, что ФБ имеет очень интересную вещь, как экземпляр, а значит все данные дублируются. Попробуем с обычной функцией.

Результат с функцией

А вот с обычно функцией результат, вроде как работает. Теперь передадим за место переменной указатель на нее.

Результат с указателем

Как видно теория работает.

ВЫВОДЫ

На простых примерах мы поняли, что указатели работают, помогают нам преодолеть кое какие ограничения системы. Открывают чудесный мир работы с памятью, но в то же время — это очень опасно.

Пост от Алексадра Судалина.

Первоисточник на ЯндексДзене.

Вам так же может быть интересно