Пишу программу для управлением ЧПУ через ЮСБ

создание собственных программ управления станком, управление LPT

Модераторы: Ruz_and, Master-VRI, al-drw, Мастак

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Вт авг 05, 2014 04:43

Очередная обновка для программы.
Из-за срабатывания спам-бота и сайта по борьбе с киберпреступностью на всякий случай заливаю на другой файлообменник:
ссылка
Срок хранения выставил на две недели.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Ср авг 20, 2014 05:39

Обновление до 1.9.1.
Из наиболее заметных изменений - частичная поддержка HPGL и незначительное SSE-ускорение для 3d части (по умолчанию отключено в настройках).
Срок хранения - две недели.
http://rghost.ru/57564234

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Ср авг 20, 2014 11:57

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

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Чт авг 21, 2014 04:32

Можно и поподробнее.
Краткая тема ветки: Они хотят подключить станок через последовательный порт. В идеале USB, но сгодится и COM-порт (правда на многих современных платах он либо вовсе отсутствует, либо требует переходника со внутренних штырьков, как на старых платах).
Преимущества последовательного порта в целом очевидны: он меньше заточен под определённое устройство (поэтому ему не нужен драйвер и можно обращаться файловым вводом даже под форточками), его можно использовать для подключения удалённых устройств и терминалов (например можно отдавать команды ведомым компьютерам и построить полноценную АСУ (или как теперь говорят SCADA)).
Подвох в том, что нужен не просто переходник, а полноценный контроллер, который сам будет формировать нужные сигналы приводу двигателей. То есть нужна какая-то программа из которой можно выдернуть алгоритмы формирования сигналов движкам и приделать их микроконтроллеру.

На эту роль я и сбросил данную программу. Строго говоря она должна была в значительной мере повторять Mach3, хотя впоследствии я познакомился с другими программами и думаю она больше походит на KCAM. (вообще я не станочник и даже не программист, для меня это лишь побочно-попутная разработка при решении совсем других задач). Пока подключается только через параллельный порт, разработка под COM только началась. Настройки в целом схожи с Mach3.
Основным предназначением были попытки изготовления печатных плат. Поэтому она довольно неплохо поддерживает формат GBR полученный как от SprintLayout, так и от Multisim (но обязательно с апертурами). Хотя очень многое в ней до сих пор толком не работает. Например если взять готовый файл для станков с числовым управлением (numeric control *.nc), то весьма вероятно будут коды, которые программа не поймёт.
Вообще, среди множества форматов именно под ЧПУ, я нашёл лишь одно полное внятное описание под формат ngc (Linux CNC), с примерами самих программ, использующих данные команды. Поэтому (возможно), со временем я добавлю поддержу именно этого формата, хоть он и не совсем совместим с другими программами (включая Mach3).
Сейчас моя программа состоит из основной формы ввода рисунков, озаглавленной как "пока главная форма". Можно забросить в неё чёрно-белый рисунок или чертёж, ввести диагональные точки, указать число проходов, плотность прорисовки и создать программу для гравировки. После нажатия большой кнопки "гравировка" появляется окно с трёхмерным видом и кнопками управления.
Это окно содержит дополнительные функции из которых пока толком работают лишь три: перемещение каретки станка посредством перетягивания ползунков мышью, перемещение каретки тыканьем мыши в определённую координату трёхмерного вида (при обзоре под углом до сих пор неправильно вычисляется координата) и функция разворота системы координат по двум точкам (то есть нужно выбрать две точки на трёхмерном виде и сопоставить их двум положениям каретки, где они должны находиться, при этом пути гравировки развернутся и отмасштабируются до нужных размеров). То есть работают именно те задачи, которые требовались при попытках изготовления двухсторонних печатных плат с совмещением слоёв.

Не трудно понять, что в данном виде программа является своего рода полигоном для отработки будущих решений. Скажем версии 0.3 или 0.4 уже должны содержать встроенный интерпретатор и быть разбиты на модули, добавляющие инструменты. Такими инструментами могут быть модули импорта различных форматов, редакторы, средства диагностики . Например векторный редактор непосредственно рисующий не только на экране, но и повторяющий эти действия над заготовкой в реальном времени.
Пока же создание интерпретатора сталкивается со множеством трудностей. В целом он должен работать с русским языком. Его программы представляют книги, состоящие из параграфов вместо процедур и функций. На данное время его прототип выброшен и пишется более простой.

Возвращаясь к алгоритмам, больше всего (насколько я понял) трудностей возникает с плавным разгоном и торможением. В моей программе оно выполняется посредством управляемых стабилизаторов скорости. Причём сами стабилизаторы не вырабатывают импульсы, а лишь влияют на возможность их вывода с заданной скоростью. Шаг скорости преобразуется к периоду времени (то есть буквально эталоном времени является период из частоты ядра T=1/f). С аппаратной точки зрения это можно отдалённо представить в виде программируемых таймеров, которые модулируют прохождение импульсов.

В качестве же основной платформы для исполнения контроллера на COM-порте пока рассматривается восьмиразрядный микроконтроллер 8031 (без встроенных ПЗУ и ОЗУ), даже если качество выдаваемых импульсов будет "не очень". В качестве резервного варианта рассматривается исполнение на 16-разрядной разновидности PIC семейства 24F. Применение ПЛИС пока не рассматривается, но может быть задействовано.

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Чт авг 21, 2014 10:04

Спасибо! ...очень даже детально объяснил 8O

Заточка под работу с платами мне по душе, для этого и собираю станок.

С ПИКами не работал, хотелось бы на АВРках.

ЛПТ и КОМ имеются и это видимо и проще в программировании и надежнее, но хотелось бы на ЮСБ (типа ардуинке, тут всем удобно будет)

А такие помощнее МК возможно ли использовать. http://www.atmel.com/ru/ru/products/mic ... vruc3.aspx , тут нехватки ресурсов МК уже небудет

Как планируется подключать твой контроллер к контроллерам станков ( по степ, дир?)

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Чт авг 21, 2014 14:48

Посмотрел, очень удобная для изготовления плат. Надеюсь, что доделаешь прогу.

На станке проверить не удалось(может кто еще попробует)...прога на компе с ЛПТ подвисает на выборе файла обработки.
На другом без ЛПТ по .gbr делает Gкод...начать...далее затыки.
Есть еще ноут с ЛПТ ...позже на нем попробую.

Ненашел ввода значения диаметра фрезы!!!
Пока все, но думаю вопросов еще масса будет :D
Последний раз редактировалось igvv Чт авг 21, 2014 16:01, всего редактировалось 1 раз.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Чт авг 21, 2014 15:47

Ну, с платами у меня особо не вышло. Слишком уж мелкий шаг мне нужен. Вдвое меньше чем у обычных SOIC-ов. Без хорошего лазера, дающего узкий луч тут не обойтись.
Поэтому кроме сверления пока ни под что не используется.

Что же касается AVR, то прямым предком восьмиразрядных tiny были как раз интеловские 8031/8051, с которыми они полностью, либо почти полностью совместимы.
У PIC-ов и их подобий (вроде PICO-blaze) всегда была иная идеология. В них очень мало команд. Например нет условных переходов. Для любых переходов используется безусловный goto. Две команды btfss, btfsc могут запретить выполнение последующей команды при каком-либо установленном или сброшенном флаге указанной переменной или регистра (например флагового).
Такой подход сохранялся в MIPS-ах вплоть до самых последних 32-разрядных поколений, применявшихся в Sony PS и 64-разрядных, в рабочих станциях Silicon Graphics (в начале 90-х). Но при этом разные поколения обладали достаточно слабой совместимостью.

16-разрядные пики вообще удачны по цене и часто встречаются в готовых устройствах. У меня есть почти готовый блок управления весами на подъёмный кран, собранный на PIC24. Если удастся его перешить, то будет оптимальным решением.

Данные же Atmel32 не совсем понятно на какой архитектуре собраны. При беглом взгляде на описания они лишь отчасти напоминают ARM гибкостью своих команд, есть и векторные вычисления (могут пригодиться скажем для оптимизации рисования линии). Но на чём под них писать программы непонятно, да и образцы для разработки найти сложно.

Если же говорить о нехватке ресурсов, то гарантировано её не будет именно на ПЛИС. Однако одно лишь описание главного модуля для синтеза схемы рисующей линию занимает на верилоге 11 кб.

Небольшой кусок как это выглядит:
--------------
// провода программного микрокода

wire res_pro;
wire res_clc;
wire delta_pro;
wire delta_clc;
wire delta_clc2;
wire cmpdel_clc;
wire absdel_pro;
wire absdel_clc;
wire absdel_clc2;
wire cmpdx_dy_clc;
wire inc_pro;
wire inc_clc;
wire inc_wr;
wire cmperr_pro;
wire cmperr_clc;
wire cmperr_clc2;

//

//wire [11:0] x_bus_acc_out;
//wire [11:0] y_bus_acc_out;

bus_a_acc x_bus_a(.inp1(deltax_bus), .inp2(errorx_bus), .out(x_alu_a), .sel(sel_a));
bus_a_acc y_bus_a(.inp1(deltay_bus), .inp2(errory_bus), .out(y_alu_a), .sel(sel_a));

bus_a_acc x_bus_acc(.inp1(x_alu_acc), .inp2(coordx1), .out(x_bus_acc_out), .sel(sel_acc));
bus_a_acc y_bus_acc(.inp1(y_alu_acc), .inp2(coordy1), .out(y_bus_acc_out), .sel(sel_acc));

bus_b x_bus_b(.inp1(coordx), .inp2(deltax_copy_bus), .inp3(12'hfff), .inp4(dist), .out(x_alu_b), .sel(sel_b));
bus_b y_bus_b(.inp1(coordy), .inp2(deltay_copy_bus), .inp3(12'hfff), .inp4(dist), .out(y_alu_b), .sel(sel_b));

vericomp_alu x_alu(.A(x_alu_a), .B(x_alu_b), .Q(x_alu_acc), .C_IN(x_alu_c_in), .OPR(x_alu_opr), .WR(alu_wr), .C_OUT(x_alu_c_out), .Z_FLG(x_alu_z_out));
vericomp_alu y_alu(.A(y_alu_a), .B(y_alu_b), .Q(y_alu_acc), .C_IN(y_alu_c_in), .OPR(y_alu_opr), .WR(alu_wr), .C_OUT(y_alu_c_out), .Z_FLG(y_alu_z_out));

// блок подключения к тактам микропрограммы

microprog micro1(.CLC(clc_line),
.RES(res),
.BUSY(busy),

.RES_PRO(res_pro),
.RES_CLC(res_clc),
.DELTA_PRO(delta_pro),
.DELTA_CLC(delta_clc),
.DELTA_CLC2(delta_clc2),
.CMPDEL_CLC(cmpdel_clc),
.ABSDEL_PRO(absdel_pro),
.ABSDEL_CLC(absdel_clc),
.ABSDEL_CLC2(absdel_clc2),

.CMPDX_DY_CLC(cmpdx_dy_clc),

.INC_PRO(inc_pro),
.INC_CLC(inc_clc),
.INC_WR(inc_wr),
.CMPERR_PRO(cmperr_pro),
.CMPERR_CLC(cmperr_clc),
.CMPERR_CLC2(cmperr_clc2),

// другие подключения к микропрограмме

.DX(deltax_bus),
.DY(deltay_bus),
.DIST(dist));

//
//bus_a_acc x_inp_bus(.inp1(crd_inp), .inp2(errorx_bus), .out(x_alu_a), .sel(sel_a));
//bus_a_acc y_inp_bus(.inp1(crd_inp), .inp2(errory_bus), .out(y_alu_a), .sel(sel_a));
/*
always @(posedge(wr))
begin
case (regsel)
0: coordx <= crd_inp;
1: coordy <= crd_inp;
2: coordx1 <= crd_inp;//deltax <= crd_inp; // запись конечной координаты x1
3: coordy1 <= crd_inp;//deltay <= crd_inp; // запись конечной координаты y1
endcase
end
*/
--------------

Поскольку в таком кромешном ужасе мало кто разберётся ПЛИС и не рассматривается. Хотя, конечно, можно зашить в неё схему собственного микроконтроллера или ещё чего в этом роде, но всё это не имеет особого смысла.
При совсем плохом раскладе проще сделать дополнительную обвязку к микроконтроллеру на ВИ-шках, например.

Что же касается USB, то вообще COM-порт мало чем отличается от обычной витой пары. Вообще RS-485 и его потомки являются прямыми наследниками COM-порта. Данные в них передаются тем же способом, с разницей в электрическом исполнении. Так что можно прилепить и к разъёму локальной сети. Однако возникнут трудности программной части.
Что же касается USB, то существуют готовые переходники, создающие COM-порт из USB. Во многих случаях работа микроконтроллеров через USB сводится именно к проброске последовательного порта через него. Правда не стоит забывать, что USB в силу аппаратных особенностей нельзя использовать без гальванической развязки скажем для соединения двух компьютеров. Тогда как COM это делать умеет через простой нуль-модемный кабель (в разумных пределах, конечно).
Поэтому COM-порт - это огромный плюс. Из минусов за ним лишь низкая скорость.

По части способов подключения, никаких других, кроме шагов и направления в программе пока нет. Включение гидравлики и фазирования в настройках ни на что не влияют. Если соберу плату на ТМ-ках для опытов, то можно будет добавить и фазирование. Гидравликой и ДПТ возможно потом займусь.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Чт авг 21, 2014 16:01

igvv писал(а):На станке проверить не удалось(может кто еще попробует)...прога на компе с ЛПТ подвисает на выборе файла обработки.
На другом без ЛПТ по .gbr делает Gкод...начать...далее затылки.
Есть еще ноут с ЛПТ ...позже на нем попробую.


Вообще она должна хотя бы по экрану кареткой бегать при "виртуальной" обработке. Я отключил в ней проверку кнопки остановки.
Но возможно всё же нужно ввести хоть какие-то настройки.

Ненашел ввода значения диаметра фрезы!!!


А его как такового нет. Есть поле плотности печати. Оно не влияет на конечный геометрический размер. То есть сантиметр останется сантиметром в окне гравировки.
Но зато оно увеличивает плотность разбиения площади. И при увеличении, в главном окне рисунок станет больше. Соответственно, для повышения плотности нужно увеличить это число и открыть файл.

Чтобы фреза не спилила лишнее, используется поле "защитный радиус". То есть эта величина добавляет к размеру рисуемых элементов данную цифру. Увеличивается ширина дорожек, площадок и т.д. Но если расстояние между ними слишком мало, существенно расширить их не удастся.

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Чт авг 21, 2014 16:27

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

Особо некогда пробовать, когда будет больше времени и настройки введу и т.д.

Тебе стоит свою тему открыть...а то эта про ЮСБ.

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Чт авг 21, 2014 19:22

Вобщем на моем компе прога виснет каждый раз на 8-й секунде (две последний версии). Может и мой комп тупит.

На ноуте с ЛПТ такая же проблема на 10сек происходит зависание.

Так что я в пролете пока... может кто еще проверит для статистики.

KUDRINNI
Сообщения: 32
Зарегистрирован: Пн апр 30, 2012 01:57

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение KUDRINNI » Пт авг 22, 2014 01:04

Я тоже пробовал, повисла прога, рамка с подписям стоит и всё.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Пт авг 22, 2014 04:47

По-умолчанию 10 секунд - это время калибровки. В это время подсчитывается число тактов процессора. Число тактов делённое на 10 секунд даёт среднюю частоту процессора.
Относительно этой величины и вычисляется период для работы ядра программы. Данный период времени можно менять в настройках. Чем оно больше, тем точнее подсчёт интервала и скорости движения, но больше время ожидания.

Соответственно через это время и начинает работать процесс, выдающий (или не выдающий) сигналы в порт. Это именно отдельный многозадачный процесс, которому назначен наивысший приоритет: THREAD_PRIORITY_TIME_CRITICAL.
Если скорости компьютера не достаточно, то такой высокий приоритет может остановить программу. Я добавил в неё выбор приоритета, но под рукой нет компьютера на котором можно проверить этот выбор в действии.
По умолчанию теперь выставляется обычный приоритет THREAD_PRIORITY_NORMAL. Сама таблица приоритетов описана в модуле global для величин от 0 до 6:
prioritety: array [0..6] of integer = (THREAD_PRIORITY_TIME_CRITICAL,
THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_ABOVE_NORMAL,
THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_BELOW_NORMAL,
THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_IDLE);
В реестре номер приоритета сохраняется под именем prior в ключе HKEY_CURRENT_USER\Software\CNC-Stanok. Для удаления ключа в случае неудачных настроек забросил рег-файл "удаление ключа". Он удаляет лишь его, не трогая других настроек.

Тем не менее нужно напомнить, что низкий приоритет будет приводить к рывкам в работе станка. Их можно частично уменьшить некоторыми настройками в БИОС-е. Скажем повысив задержки шины PCI (PCI Latency).
Но всё же чудес не бывает. Архитектура компьютера ни программно, ни аппаратно под это дело не заточена. Для уменьшения рывков на программном уровне нужен либо особый драйвер, специально написанный для выработки импульсов (как на Mach), либо вовсе работать через rtApi на ОС реального времени как LinuxCNC.

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

В ходе опытов я также очистил всю ветку HKEY_CURRENT_USER\Software\CNC-Stanok, чтобы посмотреть как поведёт себя программа при первом запуске. Несмотря на то, что я убрал поддержку внешней кнопки аварийной остановки, в окне обработки постоянно горит авария и ничего не выполняется.
С этим вопросом особо не разбирался, поэтому нужно обязательно указывать номер контакта для входа кнопки и установить флажок использования в первой колонке. В моём станке 3020TDJ используется 13 контакт (по некоторым описаниям должен быть 10)

PS После некоторых раздумий убрал из программы выбор приоритета в зависимости он найденного LPT-порта. Ранее, если он не обнаруживался, устанавливался обычный приоритет. Теперь, при наличии установки особо не требуется.
Располагался в строчках
// if Out_en then
SetThreadPriority(tred.Handle, {THREAD_PRIORITY_TIME_CRITICAL}prioritety[priorgrav]);// else
// SetThreadPriority(tred.Handle, THREAD_PRIORITY_NORMAL);
главного модуля (SDIMAIN).

Ссылка на изменённую программу http://rghost.ru/57602062

PPS Снова сработал блокировщик адреса. Приходится прятаться через проки.

multihobbyt
Сообщения: 2
Зарегистрирован: Сб июл 27, 2013 09:15

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение multihobbyt » Пт авг 22, 2014 07:56

Здравствуйте!
Очень заинтересован в программе для ЧПУ работающей через USB.
Использовать планирую для изготовления печатных плат и рисования.
Серьезных нагрузок не предусматриваю.
Наткнулся на вашу тему в форуме.Очень рад.
Желаю Вам успехов.

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Пт авг 22, 2014 20:47

Попробовал, новая версия не виснет.

Сейчас буду разбираться!!!

Итак: (быстро пробежавшись)
1. нету стабильной работы моторов как в Mach3. Оси жутко пропускают! Чаще всего просто встают после окончания разгона и встают жужа. закономерности пока не нашел.

2. слетают настройки(может и я не разобрался) скорости и ускорения в вкладке по настройки моторов (встают на дефолтные). Иногда улетали и "число шагов на мм"

3. по интерфейсу много мелочей...но это сейчас не главное.

В работу станок все-же запустился, но ШД жутко жужали выполняя Gкод (но до нормальной отработки шагов это еще очень далеко), виртуально тоже отображалось...

Все это результаты 10мин испытаний...может даже что и не так настроил.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Сб авг 23, 2014 03:00

Их стабильность как раз напрямую зависит от уровня приоритета задачи. Искать закономерность бессмысленно: винда может отобрать у программы управление в любое время.
Запрещать прерывания или полноценно их использовать, выполнять любые другие привилегированные действия, могут лишь драйверы. В этом и подвох. Кроме написания специального драйвера как Mach или выкручиванием приоритета до предела в форточках плавной работы не получить.

Собственно это стало основной причиной разработки внешнего контроллера. На мой взгляд это разумней, чем придумывать специальные сборки линухов.
Из трёх компьютеров, на которых я испытывал программу, всегда хорошо и без рывков программа работала лишь на одном. Причём не самом мощном Core 2. Может сказывалась высокая частота, может ещё что, это большая загадка.

Настройки осей там не слетают. Просто так и были заброшены в недописанном виде. Их можно настраивать только ползунками. Если просто цифры вписать они не запомнятся.

Кстати звук был одним из критериев правильности программы. У меня он схож с Mach. По крайней мере был схож. Мной программа давно не испытывалась. Не к чему пока подключить.


Вернуться в «програмирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость