- PVSM.RU - https://www.pvsm.ru -
День добрый, читатели!
Здесь недавно жаловались, что тема “промышленного программирования” раскрыта недостаточно. Попытаюсь это исправить.
Для наглядности разберем как написать классическую змейку для контроллера семейства Siemens s7-300.

Если стало интересно – добро пожаловать под кат.
Внимание – картинки и много кода на подобном ассемблеру языке!
Вся программа выполняется в организационном блоке OB1, состоит из двух функциональных блоков FB10 и FB11, имеющих экземплярные блоки данных DB10 и 11.

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

Для работы нашей змейки нужно решить небольшую проблему – нам необходим точный импульс, возникающий по времени. Можно использовать “Мигание битов”, это встроенная фича контроллера, но мы создадим свой пульс генератор FB10 с меркерами и структурами.
Во временных переменных OB1 можно найти много всего интересного, в этот раз нам пригодится время предыдущего цикла программы. За это время контроллер “переваривает” все, что скажут и выдает значения на выходы, затем считывает входы. Измеряется оно с довольно таки высокой точностью, и мы ему верим.

Как только набранное время становится больше или равно, генерируется импульс (он будет действовать только один цикл), по нему из накопленного значения отнимаем 1000 (вдруг у нас получится чуть больше 1000, обнулять поэтому нельзя) и в течение одного цикла контроллера у нас имеется положительный импульс.

Из этих импульсов очень просто можно сложить большие величины, например, 5 секунд.

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

Входные переменные – команды движения влево, вправо, вверх, вниз и команда начала игры.
Если под рукой есть контроллер и модуль дискретного входа – можете повесить на эти переменные входы, к которым присоединены кнопки без фиксации. Получите полноценный игровой автомат. При особом желании и массив можно сделать из лампочек, но у меня за такое сразу же уволят =)
Первый пример – команда движения влево.
Если мы подали ее, не двигаемся вправо, это произошло только в данном цикле, то мы сбрасываем все предыдущие команды и объявляем движение влево.
Освобождается он простым заполнением нулями с 0 по 99ый элемент. Дело в том, что в STL нет работы с двумерными массивами при косвенной адресации, так что будем представлять этот массив в виде одномерного с 0 по 99ый элемент.
По старту мы переносим голову змеи в прямой адресации на элемент 9.5, делаем ее длину 2, даем команду ползти вверх, сбрасываем game over и даем команду на выброс еды в случайную точку игрового поля.
Далее нам нужно сгенерировать еду для змейки. Каюсь, сам алгоритм генерации был мной подсмотрен на одной из первых ссылок гугля, на сайте «плк для добра».
Заключается он в том, что контроллер считает миллисекунды системного времени. Если взять это число, сложить со случайным, а потом отбросить лишнее — получаем генератор псевдослучайных чисел от 0 до заданной величины.
Далее, когда у нас выпали случайным образом Х и Y мы берем их и вычисляем номер элемента массива. Каждый шаг по X означает, что нужно передвинуться на следующий ряд элементов, то есть на 10, а каждый по Y означает движение от 0-элемента на 1.
В итоге элемент массива X[4]Y[7] превращается в 47ой элемент одномерного массива. Даем ему статус 7 — еда.
На случай если элемент занят — запускаем генератор снова.
После удачного выброса еды змейка начинает свое движение, рассмотрим алгоритм на основе движения влево.
В этом алгоритме мы сразу выполняем несколько проверок. Делим на 10 — получаем остаток — номер в строке текущего элемента. Если мы двигаемся налево, находясь в нулевом элементе — конец игры.

То же самое произойдет, если на пути движения будет что-то кроме еды. Если наткнулись на еду — взводим бит, что только что поели, он запустит генератор, удлинняем хвост на 1.
Далее идет последний алгоритм — «Хвосторез». Он берет за основу последнюю координату, считывает команду на этой координате и идет в обратном порядке от головы змеи к хвосту. Если клетка выходит за пределы длинны — удаляем ее обнулением величины
Большое спасибо за внимание всем, кто дошел до конца статьи, надеюсь, было интересно.
Ссылка на скачивание проекта [1]
Автор: Basyavr
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/49466
Ссылки в тексте:
[1] Ссылка на скачивание проекта: http://vk.com/doc82018390_244455557?hash=339fd669c3ba83097b&dl=205642b12ba3620dc3
[2] Источник: http://habrahabr.ru/post/203964/
Нажмите здесь для печати.