КОТ++
Прикладное программирование
Системное программирование
Программирование микроконтроллеров

Если вы дадите человеку программу, то займете его на один день. Если вы научите человека программировать, то займете его на всю жизнь. (с) Васим Латиф

Поиск по тегам

Опубликовано
Комментарии 0

Splinter Jump – вторая игра моего авторства. Вдохновлённый игрой Doodle Jump, а она была очень популярная почти 8 лет назад, я решил сделать свою игру с похожей механикой. Кроме паскаля я тогда ничего не знал, соответственно, и эта игра была написана на паскале, в среде PascalABC.NET. Суть игры заключается в том, чтобы прыгать по платформам и добраться до верха и найти телевизор. На уровне разбросаны сыр и напитки. Сыр нужно собирать для зарабатывания очков, напитки дают улучшенный прыжок на ограниченное время. Игра полностью завершённая, в ней реализованы все задуманные уровни, в игре 10 уровней, в некоторых уровнях присутствуют боссы. Персонаж игры может атаковать, соответственно механика не ограничена только прыжками по платформам.

Через пару лет, когда изучил flash, то я решил переписать эту же игру на нём и загрузить её во ВК. Но к сожалению, ВК больше не поддерживают flash игры и они отключили мою игру. Первые четыре скрина – версия для windows, написанная на pascal, последние четыре скрина – flash версия для ВК, написанная в среде FlashDevelop, как видно по скрину была добавлена возможность поставить игру на паузу.

Исходный код pascal версии: https://bitbucket.org/Eg0r/splinter-jump




Теги , , , ,
Автор

Опубликовано
Комментарии 0

Не так давно мне поступил заказ на написание программы для windows, которая будет управлять по Ethernet ЧПУ контроллером PLCM от purelogic. Нужно было сделать не готовый софт, а все основные модули для работы с контроллером. Обязательно на Borland Delphi 7, что меня не могло не расстроить – это же старьё, ну так как человек, который после будет работать с моим кодом ничего другого не знает, то куда деваться то.

Протокол для работы с устройством был предоставлен. Связь по UDP, соответственно отслеживание потери пакетов перекладывается на мои плечи, для этого в протоколе предусмотрена нумерация каждого пакета, контроллер периодически говорит какой номер у последнего принятого пакета. Первые и последние байты – длина пакета, второй – нумерация, остальное – команда и данные.

Научив программу считать контрольную сумму (CRC16), уже удалось убедиться что контроллер принимает и понимает отправленные ему пакеты. Но, конечно, не обошлось без Wireshark, так как документация по протоколу не была полной, пришлось смотреть некоторые каверзные моменты протокола вживую, я изучал то что шлёт программа Mach3. Были реализованы команды: управление пинами, сброс (для обозначения начала связи), ручное перемещение осей, поиск базы, остановка, авария, траекторные данные, установка текущих координат, настройка ограничений перемещений, настройка портов ввода-вывода, умножитель скорости.

Команда управления пинами подразумевает управление пинами на трёх портах, по историческим причинам ЧПУ станков эти порты повторяют LPT, что изначально я не знал, поэтому были сложности. Ручное перемещение осей сделал с управлением клавиатурой, нажимая клавиши можно перемещать оси. Самое главное нужно было сделать интерпретацию G кода. И большим разочарованием для меня стало то, что контроллер этого делать оказывается не умеет. Поэтому пришлось сделать парсер G кодов, класс математических расчётов траекторий и интерпретатор (который посылал расчитанные траектории контроллеру и следил за выполнением каждой строчки кода).

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

Итог в этой публикации.

В заключении хотел сказать, что на рынке сейчас очень много различных ЧПУ контроллеров и ПО к ним, о чём я раньше не знал. Из этого можно сделать вывод, что всевозможные бесплатные решения на arduino, raspberry pi с grbl, LinuxCNC не покрывают все требования к ЧПУ.
И ещё: LPT порт пережиток прошлого (на мой взгляд), но всё равно от него есть следы в современных контроллерах ЧПУ. Как я понимаю раньше драйверы шаговых двигателей подключали к компьютеру через LPT порт, и теперь когда люди подключают драйверы уже в отдельный контроллер, то видимо всем удобней, чтобы входы-выходы на этих контроллерах повторяли LPT порты.

Теги , , ,
Автор

Опубликовано
Комментарии 0

Классы были написаны на Delphi 7. Имеют в функционале: интерпретацию G-кода, расчёт траекторий для совместного движения осей (траектории строятся с учётом ускорений и торможений), низкоуровневый обмен пакетами с контроллером PLCM через UDP.

Основные классы в проекте:
TPLCM – обмен пакетами с контроллером
TMathTrajectory – расчёт траекторий
TCRC – вспомогательный класс для расчёта контрольной суммы пакета
TGCodeInterpreter – класс, который интерпретирует G-код
TPackageBuffer – буфер пакетов
TTrajBuffer – буфер траекторий

Так как расчёт траекторий процесс довольно не простой, то для класса, который считает траектории были написаны unit тесты, а также дополнительная программа для визуального отображения траекторий на графиках.
Так как связь по UDP, то было реализовано отслеживание потери пакетов и повторная отправка в случае потери. Документация протокола от разработчика контроллера не включала всех деталей, поэтому некоторые детали протокола были выяснены самостоятельно через программу Wireshark. С помощью Wireshark был пронализирован трафик, который шлёт ПО Mach3.
На скринах представлены небольшие программы, которые демонстрируют работу с данным набором классов.

Теги , , ,
Автор

Опубликовано
Комментарии 0

TMNT Nightmare Dreams – самая первая игра, которую я сделал, была написана ещё в школьные годы, а это примерно 8 лет назад с момента написания поста. Игра написана в среде PascalABC.NET. Для вывода графики использовались стандартные PascalABC и .NET Framework наборы классов. Для проигрывания аудио была использована библиотека Bass.NET. Именно в процессе работы над этой игрой я узнал и освоил ООП.
Игра содержит всего два уровня, 4 персонажа, 3 вида врагов, 3 удара, прыжки. Жанр игры – beat em up. До конца доделана она не была, я лишь написал основной функционал.




Теги , , ,
Автор

Опубликовано
Комментарии 0

Сейчас я вам расскажу как сделать, чтобы ваша программа автоматически заносила в буфер данные из консоли. Зачем это нужно? Вдруг ваша программа делает какие-то безумно большие расчёты, а потом весь вывод вам нужно скопировать и использовать где-либо ещё для дальнейшей обработки.

Чтобы реализовать данную задачу будем использовать возможности платформы .NET

Как это работает: используем класс System.Diagnostics.Process для создания нового процесса с командной строкой. В командную строку на вывод перенаправляем простой echo вместе с командой clip.
Например:

echo yo | clip

скопирует в буфер обмена «yo»

Чтобы работать с несколькими строками будем использовать несколько echo (каждый echo переносит строку), чтобы отдать команде clip все наши echo будем использовать скобочки, например:

(echo yo & echo niga) | clip

И в завершение данного поста предлагаю посмотреть как это можно удобно упаковать в отдельные функции и использовать в своих программах:

var strClip: string;

procedure ClipStartOut();
begin
strClip := 'echo ';
end;

procedure ClipWriteLn(s: string);
begin
strClip += s + '& echo ';
end;

procedure ClipWriteLn(s: integer);
begin
strClip += s + '& echo ';
end;

procedure ClipExitOut();
begin
strClip := strClip.Remove(strClip.LastIndexOf('& echo'), 6);
var proc := new System.Diagnostics.Process();
proc.StartInfo := new System.Diagnostics.ProcessStartInfo('cmd', '/C (' + strClip + ') | clip');
proc.Start();
end;

begin
ClipStartOut();
ClipWriteLn(66);
ClipWriteLn(99);
ClipExitOut();
end.

Для начала работы с буфером надо вызвать процедуру ClipStartOut, для отправки текста в буфер - ClipWriteLn, для помещения всех данных отправленных через ClipWriteLn в буфер - ClipExitOut.

Всем clipboard, пасаны!

Теги ,
Автор