SVP писал(а):Чукча вижу не читатель, ну не найден, и не найден, дело чукчи.
Ну я читал предложенные версии, и предложенный скрипт
Код: Выделить всё
'VBScript поиск центра оси вращения "A" ощупыванием цилиндра.
'MasrerLomaster [12.03.2015]
'Скрипт работает в метрической системе координат
'=== Declaraciones ===
Dim CurrentFeed ' Для запоминания текущей скорости подачи
Dim CurrentZ ' Начальная высота по Z
Dim R_probe ' радиус щупа
Dim R_Cyl ' радиус цилиндра
Dim FeedProbe ' скорость подачи щупа
Const DRO_Y = 1
Const DRO_Z = 2
CR = Chr(13) : LF = Chr(10) : CRLF = CR + LF : CRLF2 = CRLF+CRLF ' new line
RightNow = Now() ' читаем текущую дату и время
RightNowStr = Format(RightNow,"Medium Date") & " " & Format(RightNow,"Long Time")
Title$ = "Поиск нуля (Y,Z) оси-А по цилиндру"
PromptDprobe$ = "Введите диаметр щупа ( D ) в мм"
PromptDcyl$ = "Измерьте штангелем и введите диаметр цилиндра ( D ) в мм"
PromptFeedprobe$ = "Введите желаемую скорость подачи щупа"
Default_Dprobe$ = "4" ' текущий диаметр щупа
Default_Dcyl$ = "20" ' текущий диаметр цилиндра
Default_Feedprobe$ = "100" ' текущая скорость подачи щупа
R_probe = (InputBox$(PromptDprobe$, Title$, Default_Dprobe$))/2
R_Cyl = (InputBox$(PromptDcyl$, Title$, Default_Dcyl$))/2
FeedProbe = InputBox$(PromptFeedprobe$, Title$, Default_Feedprobe$)
If MsgBox ("Если вы не забыли вручную разместить щуп примерно по центру" & CRLF & _
"оси А на расстояние 3-5 мм над цилиндром, нажмите OK" & CRLF & _
"иначе нажмите Отмена" & CRLF2 & _
"Диаметр щупа = " & R_probe*2 & " mm" & CRLF & _
"Диаметр цилиндра = " & R_Cyl*2 & "mm" & CRLF & _
"Скорость подачи щупа = " & FeedProbe & CRLF, _
65, Title$) = 1 _
Then ' 1=OK
Message "Осуществлен запус скрипта поиска центра оси А: " & RightNowStr
Code "G90" ' перейдем в абсолютную систему координат
CurrentFeed = FeedRate 'Запомнить текущюю скорость, для того чтобы восстановить после коррекции.
CurrentZ = GetDRO(DRO_Z)'Запоминаем текущее значение по Z
'-------------------------------------------------------------------------------
' Опускание до касания
'-------------------------------------------------------------------------------
Code "F" &FeedProbe 'Задать скорость подачи до касания инструментом
Code "G91" ' перейдем в относительную систему координат
Code "G31Z" & -R_Cyl
While IsMoving() 'Подождать пока произойдет касание.
Wend
Code "G0 Z" & R_probe 'отьехать вверх на радиус пробника от точки касания
While IsMoving ()
Wend
'-------------------------------------------------------------------------------
' Отъезд по Y и опускание с одной стороны цилиндра
'-------------------------------------------------------------------------------
Code "G0 Y" & -(R_Cyl+R_probe+2)
Code "G0 Z" & -(R_Cyl+R_probe)
'-------------------------------------------------------------------------------
' Движение по Y до касания
'-------------------------------------------------------------------------------
Code "G31Y" & R_Cyl
While IsMoving() 'Подождать пока произойдет касание.
Wend
YPos1 = GetVar(2001) 'Считать 1-e значение касания по Y
Code "G0 Y" & -R_probe 'отьехать назад на радиус пробника от точки касания
While IsMoving ()
Wend
'-------------------------------------------------------------------------------
' Поднятие переезд на другую сторону и опускание
'-------------------------------------------------------------------------------
Code "G0 Z" & (R_Cyl+R_probe)'вверх
Code "G0 Y" & (R_Cyl*2+R_probe*2+R_probe)
Code "G0 Z" & -(R_Cyl+R_probe) ' вниз
'-------------------------------------------------------------------------------
' Движение по Y до касания
'-------------------------------------------------------------------------------
Code "G31Y" & -R_Cyl
While IsMoving() 'Подождать пока произойдет касание.
Wend
YPos2 = GetVar(2001) 'Считать 2-e значение касания по Y
Code "G0 Y" & R_probe 'отьехать назад на радиус пробника от точки касания
While IsMoving ()
Wend
'-------------------------------------------------------------------------------
' Движение наверх и в центр
'-------------------------------------------------------------------------------
Code "G0 Z" & (R_Cyl+R_probe)'вверх
' Code "G0 Y" & -(R_Cyl+R_probe*2)
YCenter = (YPos1 + YPos2) / 2 'центр находится между YPos1 и YPos2
Code "G90" ' перейдем в абсолютную систему координат
Code "G0 Y" &YCenter ' Быстрое перемещение в центр
While IsMoving ()
Wend
SetDro(DRO_Y,0) ' Обнулить Y
'-------------------------------------------------------------------------------
' Опускание до касания
'-------------------------------------------------------------------------------
Code "G31Z" & GetDRO(DRO_Z)-R_Cyl
While IsMoving() 'Подождать пока произойдет касание.
Wend
SetDro(DRO_Z,R_Cyl) ' присвоить Z радиус цилиндра
Code "G0 Z" & R_Cyl+R_probe 'отьехать вверх на радиус пробника от точки касания
While IsMoving ()
Wend
Else
Message "Скрипт отменен!!!"
End If
Message "Обнуление YZ завершено"
впринципе тех условия удовлетворяет, но он подходит только к поиску центра маленьких заготовок, то есть чтобы к примеру резать большую начиная от 50 придется сначала зажимать маленькую искать центр потом вынимать и зажимать большую. лучше конечно в качестве маленькой кусок полированного вала от направляющей юзать. Если же к примеру сразу на большой заготовке искать центр там надо искать по 3м точкам и вписанной между ними окружностью, то есть алгоритм следующий: диаметр заготовки измерять не нужно центроискатель ставится примерно по центру потом опускается до касания, потом уходит влево на 20 опускается до касания отьежжает еще влево на 1мм меняет скорость проводит точные измерения потом вверх и тоже самое делает справа. делим пополам, получаем центр едем наверх и в центр опускаем до касания, получаем три точки вычисляем центр, обнуляем.
плюс такого скрипта ненужно каждую заготовку мерить, ибо за точность поиска в основном отвечает как точно мы измерили диаметр цилиндра, машина обычно делает более точные измерения чемчеловек.
а можно даже определить центр вообще по любым трем точкам, даже необязательно сначала искать центр по У . примерно в центр ставим ищем любые три точки запоминаем координаты
далее вычисляем центр опираясь на уравнение окружности :
Уравнение окружности
r^2 = (x — h)^2 + (y — k)^2
где,
h,k — координаты центра Окружности
x,y — координаты точки окружности
r — радиус
Пример
Найдите координаты точки центра окружности, радиус и уравнение окружности, если известны координаты трех точек A (2,2), B (2,4) и C (5,5)
Решение :
Шаг:1
Подставляем координаты точек в формулу
(2 — h)^2 + (2 — k)^2 = r^2
(2 — h)^2 + (4 — k)^2 = r^2
(5 — h)^2 + (5 — k)^2 = r^2
Шаг :2
Найдем значение k упрощая 1 и 2 уравнения
(2 — h)^2 + (2 — k)^2 = (2 — h)^2 + (4 — k)^2
4 — 4h + h^2+ 4 — 4k + k^2 = 4 — 4h + h^2+16 — 8k + k^2
8 — 4k = 20 — 8k
k=3
Шаг :3
Найдем значение h упрощая уравнения 2 и 3
(2 — h)^2 + (2 — k)^2 = (5 — h)^2 + (5 — k)^2
4 — 4h + h^2+ 4 — 4k + k^2 = 25 — 10h + h^2+ 25 — 10k + k^2
8 — 4k — 4h = 50 — 10h — 10k
6k + 6h = 42
Подставив значение k=3 в уравнение
6h = 24
h=4
Получаем координаты точки центра (h,k) = (4,3)
Шаг :4
Подставим значения h,k в формулу
r^2 = (x — h)^2 + (y — k)^2
r^2 = (2 — 4)^2 + (2 — 3)^2
r^2 = (-2)^2 + (-1)^2
r^2 = 5
r = 2.24
Шаг :5
Подставим значения h, k в уравнение окружности
(x — h)^2 + (y — k)^2
Уравнение окружности = (x — 4)^2 + (y — 3)^2
Ответ :
Координаты точки центра окружности c(h,k) = c(4,3)
Радиус окружности r = 2.24
Уравнение окружности = (x — 4)^2 + (y — 3)^2 = (2.24)^2
после нахождения координат центра обнуляем просто вот и все
Жалко я программирование не любил никогда а тобы написал давно
По поворотной оси в принципе даже проще Если известно точное расстояние от центра вращения до поверхности стола или патрона, то делаем так:
выставляем ось примерно параллельно столу, зажимаем в патрон трубку, определяем по ней примерный центр, далее касаемся краев патрона и исходя из разницы поворачиваем ось параллельно столу, едем мерить цетр оси точно, далее повторяем операцию с парралельностью и цетром еще раз последнеей операцией будет поиск центра трубы, пяти измерений будет достаточно чтобы точно отыскать центр оси, единственное что это довольно долго. Как по другому определить центр я пока не знаю. Точность измерений в данном случае будет зависеть только от количества проведенных замеров.
это все пока пустой треп, никакого кода мной пока не предложено, только концепции