Страница 18 из 19

Re: Смена инструмента на токарнике

Добавлено: 09 ноя 2022, 13:42
tokarka63
xenon-alien писал(а): Каков алгоритм работы?
Поставил стальной диск с вырезами, получил двоичный код!)
Где то на форуме выкладывал чертеж и чутка не доделанный компонент)

Re: Смена инструмента на токарнике

Добавлено: 09 ноя 2022, 14:09
xenon-alien
tokarka63 писал(а): 09 ноя 2022, 13:42
xenon-alien писал(а): Каков алгоритм работы?
Поставил стальной диск с вырезами, получил двоичный код!)
Где то на форуме выкладывал чертеж и чутка не доделанный компонент)
Это типа абсолютного энкодера, если верно понимаю...

Re: Смена инструмента на токарнике

Добавлено: 09 ноя 2022, 14:21
tokarka63
tokarka63 писал(а): 14 окт 2020, 12:32 Можно считать, что револьверку победил!)
Тест в несколько часов, не выявил глюков!)
СИ_шный код
(для просмотра содержимого нажмите на ссылку)
component revolverka;

pin out bit delaystart = 0; //0,15сек
pin in bit delaydone = 0;
pin out bit delaystart2 = 0; //1сек
pin in bit delaydone2 = 0;
pin out bit delaystart3 = 0; //2сек
pin in bit delaydone3 = 0;

pin in bit toolchange ; // смена инструмент tool-change команда на смену инстркмента 1 или 0 >> от чпу
pin in s32 toolnumber ; // установленный инструмент tool-number >> от чпу
pin out bit toolchanged ; // окончание смены инструмента tool-changed << в чпу
pin in s32 old; // установленный инструмент tool-oldnumber >> от чпу
pin out s32 position = 0; // инструмент по датчикам
pin out s32 tool = 0;
pin out float e = 0;
pin out float a = 0;



pin out bit moto=0; //out02 крутим назад, если 1 крутим вперед

pin in bit opto1 = 0; // датчик1 in10
pin in bit opto2 = 0; // датчик2 in11
pin in bit opto3 = 0; // датчик3 in12
pin in bit metka = 0; // датчик4 in13


option singleton yes;
function _;
author "WV";
license "GPL";
;;

// rtapi_print_msg(RTAPI_MSG_ERR, "Error - opto inputs do not match truth table");

FUNCTION(_)
{



if(!opto1 && !opto2 && opto3 && metka==0)
position = 1;
else if(!opto1 && opto2 && !opto3 && metka==0)
position = 2;
else if(!opto1 && opto2 && opto3 && metka==0)
position = 3;
else if(opto1 && !opto2 && !opto3 && metka==0)
position = 4;
else if(opto1 && !opto2 && opto3 && metka==0)
position = 5;
else if(opto1 && opto2 && !opto3 && metka==0)
position = 6;


if (toolchange)
{tool=toolnumber;}

switch ( tool )
{

case 1:

if(position !=1 )
{
moto = 1; toolchanged = 0; //вперед
}


if (position==1 && metka==1 && e==0) //реверс
{
delaystart = 1; //0,15 sec антидребезг
if(delaydone==1)
{
delaystart = 0;
if (position==1 && metka==1)
{ moto = 0; e=1; }

}
}

if (e==1)
{
if (position==1 && metka==0 ) //проверка после реверса
{
if (a==0)
{
delaystart2 = 1; //1sec
a=1;
}
if(delaydone2)
{
delaystart2 = 0;
}
if (position==1 && metka==0 && delaydone2==0 )
{
delaystart3 = 1; //2sec

if(delaydone3)
{
delaystart3 = 0;
toolchanged = 1; //инструмент готов на чпу
e=0;
a=0;
}
}
}
}


break;

case 2:

if(position !=2 )
{
moto = 1; toolchanged = 0; //вперед
}


if (position==2 && metka==1 && e==0) //реверс
{
delaystart = 1; //0,15 sec антидребезг
if(delaydone==1)
{
delaystart = 0;
if (position==2 && metka==1)
{ moto = 0; e=1; }

}
}

if (e==1)
{
if (position==2 && metka==0 ) //проверка после реверса
{
if (a==0)
{
delaystart2 = 1; //1sec
a=1;
}
if(delaydone2)
{
delaystart2 = 0;
}
if (position==2 && metka==0 && delaydone2==0 )
{
delaystart3 = 1; //2sec

if(delaydone3)
{
delaystart3 = 0;
toolchanged = 1; //инструмент готов на чпу
e=0;
a=0;
}
}
}
}


break;

case 3:

if(position !=3 )
{
moto = 1; toolchanged = 0; //вперед
}


if (position==3 && metka==1 && e==0) //реверс
{
delaystart = 1; //0,15 sec антидребезг
if(delaydone==1)
{
delaystart = 0;
if (position==3 && metka==1)
{ moto = 0; e=1; }

}
}

if (e==1)
{
if (position==3 && metka==0 ) //проверка после реверса
{
if (a==0)
{
delaystart2 = 1; //1sec
a=1;
}
if(delaydone2)
{
delaystart2 = 0;
}
if (position==3 && metka==0 && delaydone2==0 )
{
delaystart3 = 1; //2sec

if(delaydone3)
{
delaystart3 = 0;
toolchanged = 1; //инструмент готов на чпу
e=0;
a=0;
}
}
}
}


break;

case 4:

if(position !=4 )
{
moto = 1; toolchanged = 0; //вперед
}


if (position==4 && metka==1 && e==0) //реверс
{
delaystart = 1; //0,15 sec антидребезг
if(delaydone==1)
{
delaystart = 0;
if (position==4 && metka==1)
{ moto = 0; e=1; }

}
}

if (e==1)
{
if (position==4 && metka==0 ) //проверка после реверса
{
if (a==0)
{
delaystart2 = 1; //1sec
a=1;
}
if(delaydone2)
{
delaystart2 = 0;
}
if (position==4 && metka==0 && delaydone2==0 )
{
delaystart3 = 1; //2sec

if(delaydone3)
{
delaystart3 = 0;
toolchanged = 1; //инструмент готов на чпу
e=0;
a=0;
}
}
}
}


break;

case 5:

if(position !=5 )
{
moto = 1; toolchanged = 0; //вперед
}


if (position==5 && metka==1 && e==0) //реверс
{
delaystart = 1; //0,15 sec антидребезг
if(delaydone==1)
{
delaystart = 0;
if (position==5 && metka==1)
{ moto = 0; e=1; }

}
}

if (e==1)
{
if (position==5 && metka==0 ) //проверка после реверса
{
if (a==0)
{
delaystart2 = 1; //1sec
a=1;
}
if(delaydone2)
{
delaystart2 = 0;
}
if (position==5 && metka==0 && delaydone2==0 )
{
delaystart3 = 1; //2sec

if(delaydone3)
{
delaystart3 = 0;
toolchanged = 1; //инструмент готов на чпу
e=0;
a=0;
}
}
}
}


break;

case 6:

if(position !=6 )
{
moto = 1; toolchanged = 0; //вперед
}


if (position==6 && metka==1 && e==0) //реверс
{
delaystart = 1; //0,15 sec антидребезг
if(delaydone==1)
{
delaystart = 0;
if (position==6 && metka==1)
{ moto = 0; e=1; }

}
}

if (e==1)
{
if (position==6 && metka==0 ) //проверка после реверса
{
if (a==0)
{
delaystart2 = 1; //1sec
a=1;
}
if(delaydone2)
{
delaystart2 = 0;
}
if (position==6 && metka==0 && delaydone2==0 )
{
delaystart3 = 1; //2sec

if(delaydone3)
{
delaystart3 = 0;
toolchanged = 1; //инструмент готов на чпу
e=0;
a=0;
}
}
}
}


break;

}
}
custom.hal
(для просмотра содержимого нажмите на ссылку)
loadrt revolverka
addf revolverka servo-thread

loadrt timedelay count=4
addf timedelay.0 servo-thread
setp timedelay.0.on-delay 0.15

net delaystart timedelay.0.in <= revolverka.delaystart
net delaydone timedelay.0.out => revolverka.delaydone


addf timedelay.2 servo-thread
setp timedelay.2.on-delay 1

net delaystart2 timedelay.2.in <= revolverka.delaystart2
net delaydone2 timedelay.2.out => revolverka.delaydone2

addf timedelay.3 servo-thread
setp timedelay.3.on-delay 2

net delaystart3 timedelay.3.in <= revolverka.delaystart3
net delaydone3 timedelay.3.out => revolverka.delaydone3







net tool-change iocontrol.0.tool-change => revolverka.toolchange
net tool-changed iocontrol.0.tool-changed <= revolverka.toolchanged
net tool-number iocontrol.0.tool-prep-number => revolverka.toolnumber
net tool-oldnumber iocontrol.0.tool-number => revolverka.old
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

net moto revolverka.moto => parport.0.pin-06-out

net opto1 revolverka.opto1 <= parport.0.pin-11-in
net opto2 revolverka.opto2 <= parport.0.pin-12-in
net opto3 revolverka.opto3 <= parport.0.pin-13-in
net metka revolverka.metka <= parport.0.pin-15-in
Диск позиции
Изображение
Изображение
Изображение
Изображение
Испытательный стенд)
Изображение
Изображение
Ели нашел)

Re: Смена инструмента на токарнике

Добавлено: 09 ноя 2022, 14:22
tokarka63
xenon-alien писал(а): Это типа абсолютного энкодера, если верно понимаю...
Даже и не думал так), но, да, получается так)

Re: Смена инструмента на токарнике

Добавлено: 09 ноя 2022, 22:28
xenon-alien
tokarka63 писал(а): Ели нашел)
Я мельком по теме пробежался. Видел этот код, но так и не понял, что с ним делать...
Идея интересная, только нужно подумать, как реализовать "подсчёт" в самом hal, или CL.
Да хоть в ручную прописать, что три сигнала дают следующее значение:
000 = 1 (tool-1 true)
001 = 2 (tool-2 true)
010 = 3 (tool-3 true)
011 = 4 (tool-4 true)
100 = 5 (tool-5 true)
101 = 6 (tool-6 true)
110 = 7 (tool-7 true)
111 = 8 (tool-8 true)
"кодовый диск" для нужного количества инструментов "вырезать", или в диск тупо болтов накрутить, если датчик индуктивный.
Получается 3-х битный абсолютный энкодер максимум на 8 инструментов.
А потом остается только связи сделать, как-будто это 8 физических входов и дальше в ладдере "стандартный" алгоритм.

MUX8, как я понимаю должно подойти, или что-то другое?
Это получается, что мне их 8 шт. нужно, или я не понял сути?
Или я на выходе могу сразу номер инструмента получить, если на входы пропишу от 1 до 8...? :think:

Re: Смена инструмента на токарнике

Добавлено: 10 ноя 2022, 09:46
ex71
в стандартном компоненте это называется "код грея"
можно сделать через этот компонент, соединив его ноги с реальным железом

а вообще
BIN2GRAY
GRAY2BIN

Re: Смена инструмента на токарнике

Добавлено: 10 ноя 2022, 11:29
tokarka63
xenon-alien писал(а): как реализовать "подсчёт" в самом hal
Подсчет осуществлен в компоненте
Этот кусочек

if(!opto1 && !opto2 && opto3 && metka==0)
position = 1;
else if(!opto1 && opto2 && !opto3 && metka==0)
position = 2;
else if(!opto1 && opto2 && opto3 && metka==0)
position = 3;
else if(opto1 && !opto2 && !opto3 && metka==0)
position = 4;
else if(opto1 && !opto2 && opto3 && metka==0)
position = 5;
else if(opto1 && opto2 && !opto3 && metka==0)
position = 6;

Re: Смена инструмента на токарнике

Добавлено: 10 ноя 2022, 11:33
tokarka63
ex71 писал(а): 10 ноя 2022, 09:46 в стандартном компоненте это называется "код грея"
можно сделать через этот компонент, соединив его ноги с реальным железом

а вообще
BIN2GRAY
GRAY2BIN
Пытался разобраться с чужими компонентами, но оказалось, написать свой проще!)

Re: Смена инструмента на токарнике

Добавлено: 10 ноя 2022, 13:57
xenon-alien
ex71 писал(а): в стандартном компоненте это называется "код грея"
можно сделать через этот компонент, соединив его ноги с реальным железом

а вообще
BIN2GRAY
GRAY2BIN
Благодарю, ознакомлюсь. Но для меня пока что кажется проще MUX8 использовать. Там есть как раз три сигнала, которые подаются в качестве трёх бит - с каждого отдельного физического входа. А от 0-7 входы назначить сигнал с конкретным номером положения.
tokarka63 писал(а): Подсчет осуществлен в компоненте
Этот кусочек
Я не силён в программировании, так что
tokarka63 писал(а): написать свой проще!)
Мне не проще. Что там и там нужно понимать основы - как и чем это делать.
Если есть нужный компонент, то почему бы него не использовать...
Попробую прикинуть пример на MUX8 и гляну, как он работает.

Примерно

Сюда дитчики
mux8.N.sel0 bit in (к физическим входам платы)
mux8.N.sel1 bit in (к физическим входам платы)
mux8.N.sel2 bit in (к физическим входам платы)

Сигналам назначаем каждому свой номер (ну или через параметр setp и тогда будет меньше строк)
sets m8-1 1
sets m8-2 2
sets m8-3 3
sets m8-4 4
sets m8-5 5
sets m8-6 6
sets m8-7 7
sets m8-8 8

Восемь входов подключаем к сигналам
mux8.N.in0 float in -> m8-1
mux8.N.in1 float in -> m8-2
mux8.N.in2 float in -> m8-3
mux8.N.in3 float in -> m8-4
mux8.N.in4 float in -> m8-5
mux8.N.in5 float in -> m8-6
mux8.N.in6 float in -> m8-7
mux8.N.in7 float in -> m8-8

Получаем
mux8.N.out float out - выход номер инструмента

Если: sel2=FALSE, sel1=FALSE, sel0=FALSE , то out = 1
Если: sel2=FALSE, sel1=FALSE, sel0=TRUE ,то out = 2
Если: sel2=FALSE, sel1=TRUE, sel0=FALSE ,то out = 3
Если: sel2=FALSE, sel1=TRUE, sel0=TRUE ,то out = 4
Если: sel2=TRUE, sel1=FALSE, sel0=FALSE ,то out = 5
Если: sel2=TRUE, sel1=FALSE, sel0=TRUE ,то out = 6
Если: sel2=TRUE, sel1=TRUE, sel0=FALSE ,то out = 7
Если: sel2=TRUE, sel1=TRUE, sel0=TRUE ,то out = 8

Не проще ли так?
Но ещё проверю, даст ли нужный результат.

https://youtu.be/vIKXddDbcWA

Ну про свою револьверку он чуток пояснил.
https://youtu.be/9ktCfyFRpd4

Re: Смена инструмента на токарнике

Добавлено: 10 ноя 2022, 21:57
rage
С mux8 все правильно, у меня работает:

Код: Выделить всё

# Револьверка
net rev-en <= hm2_7i96.0.gpio.000.in_not
net rev-b1 <= hm2_7i96.0.gpio.001.in
net rev-b2 <= hm2_7i96.0.gpio.002.in
net rev-b3 <= hm2_7i96.0.gpio.003.in

net rev-b1 => mux8.0.sel0
net rev-b2 => mux8.0.sel1
net rev-b3 => mux8.0.sel2

setp mux8.0.in0 6
setp mux8.0.in1 8
setp mux8.0.in2 2
setp mux8.0.in3 5
setp mux8.0.in4 4
setp mux8.0.in5 3
setp mux8.0.in6 1
setp mux8.0.in7 7

net tool-number-current-f <= mux8.0.out => conv-float-s32.0.in
net tool-number-current <= conv-float-s32.0.out => revolt.0.current-tool

Re: Смена инструмента на токарнике

Добавлено: 19 ноя 2022, 13:38
kang2k
aftaev писал(а): 29 апр 2015, 01:20 За основу был взят Re: Смена инструмента на токарнике #20, потом мне его допиливал nkp. за что спасибо!

в архиве вся папка с конфигурацией.
arhiv 16k20t1.rar
Прикрутил к станку конфиг на базе этой конфигурации. Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?

Re: Смена инструмента на токарнике

Добавлено: 20 ноя 2022, 14:40
aftaev
kang2k писал(а): Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?
А мне это нравится, так как при запуске станка слышно как револьверка зажимается.

Re: Смена инструмента на токарнике

Добавлено: 21 ноя 2022, 12:12
kang2k
aftaev писал(а): 20 ноя 2022, 14:40
kang2k писал(а): Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?
А мне это нравится, так как при запуске станка слышно как револьверка зажимается.
Проблема в том, что когда несколько раз перегружаю комп (отлаживал), зажало так, что тепловое реле выбило

Re: Смена инструмента на токарнике

Добавлено: 22 ноя 2022, 16:09
kang2k
kang2k писал(а): 21 ноя 2022, 12:12
aftaev писал(а): 20 ноя 2022, 14:40
kang2k писал(а): Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?
А мне это нравится, так как при запуске станка слышно как револьверка зажимается.
Проблема в том, что когда несколько раз перегружаю комп (отлаживал), зажало так, что тепловое реле выбило
Как подсказали в соседней теме, надо из основного hal перенести в postgui.hal и все будет ок.

Re: Смена инструмента на токарнике

Добавлено: 02 апр 2024, 16:06
Misha74
Всем привет! Последние несколько дней упорно читаю про ClassikLadder в Linuxcnc, т.к. у меня встала задача сделать револьверную голову на токарный ЧПУ. Порт LPT. Решил сперва начать с программной части как все это реализовать. Но так и не могу въехать как все это делается. Хочу сделать самый простой механизм. Один индексный датчик (оптический или концевик - не важно). И еще один для каждого положения инструмента (считающий и ищущий нужного положения головы). Голова к примеру на 6 либо на 8 инструментов. Обычный электродвигатель крутит голову только в одну сторону. Храповой механизм. К примеру, в программе у меня указано поменять на инструмент №5. Электродвигатель головы начинает ее крутить пока не сработает датчик и отсчитывает до 5. Подскажите как все это можно реализовать или есть уже именно такой готовый пример. Я не понимаю как вообще взаимодействует код программы,CL и EMC между собой. Как это все и где подключается, прописывается. Размыто понимаю, что через хал файл. Схему в CL сделать для меня, думаю, проблем не составит. Подскажите, если можно.

Re: Смена инструмента на токарнике

Добавлено: 03 апр 2024, 01:06
ex71
я это описывал и код прикладывал

Re: Смена инструмента на токарнике

Добавлено: 03 апр 2024, 11:00
Misha74
ex71 писал(а): 03 апр 2024, 01:06 я это описывал и код прикладывал
К сожалению не нашел Вашего поста с кодом и описанием. Нашел видео на английском по подробному объяснению настройки простой револьверки. С яндекс переводом несколько раз пересмотрел. Видео больше часа. После видео начал понимать.

Re: Смена инструмента на токарнике

Добавлено: 03 апр 2024, 11:09
ex71
Misha74 писал(а): 03 апр 2024, 11:00
ex71 писал(а): 03 апр 2024, 01:06 я это описывал и код прикладывал
К сожалению не нашел Вашего поста с кодом и описанием. Нашел видео на английском по подробному объяснению настройки простой револьверки. С яндекс переводом несколько раз пересмотрел. Видео больше часа. После видео начал понимать.
в профиль пользователя заходишь - показать сообщения пользователя - поиск
https://cnc-club.ru/forum/viewtopic.php ... ap#p621684

добавлю:
M66 P0 L3 Q5 - ожидание поднятия фронта сигнала на 0 входе в течении 5 секунд. То есть ждать когда сигнал поднимется с 0 до высокого уровня (5,12 или 24В), не более 5 секунд.
если уровень не достигнут, то выход скрипта с ошибкой. Как обрабатывать ошибку - я хз. Не делал. И у меня была проблема когда вышел из строя один датчик инструмента, по факту револьверка остановилась на другом инструменте и поехала точить без затяжки.
https://linuxcnc.org/docs/2.7/html/gcod ... #mcode:m66

Re: Смена инструмента на токарнике

Добавлено: 05 апр 2024, 01:20
rage
Misha74 писал(а): 02 апр 2024, 16:06 Всем привет! Последние несколько дней упорно читаю про ClassikLadder в Linuxcnc, т.к. у меня встала задача сделать револьверную голову на токарный ЧПУ. Порт LPT. Решил сперва начать с программной части как все это реализовать. Но так и не могу въехать как все это делается. Хочу сделать самый простой механизм. Один индексный датчик (оптический или концевик - не важно). И еще один для каждого положения инструмента (считающий и ищущий нужного положения головы). Голова к примеру на 6 либо на 8 инструментов. Обычный электродвигатель крутит голову только в одну сторону. Храповой механизм. К примеру, в программе у меня указано поменять на инструмент №5. Электродвигатель головы начинает ее крутить пока не сработает датчик и отсчитывает до 5. Подскажите как все это можно реализовать или есть уже именно такой готовый пример. Я не понимаю как вообще взаимодействует код программы,CL и EMC между собой. Как это все и где подключается, прописывается. Размыто понимаю, что через хал файл. Схему в CL сделать для меня, думаю, проблем не составит. Подскажите, если можно.
Для нормальной работы револьверной головки LPT порта НЕ достаточно. На 8 инструментов нужно минимум 4 входа. 3 бита энкодер + 1 бит, зажата/разжата. Все остальное такое себе решение, если станок более менее серьезный, хватит одного сбоя, что бы свести на нет всю экономию.
Ладдер - для специфических людей. Мне например гораздо проще было написать свой компонент на C для управления револьвером, чем разобраться с ладдером.

Re: Смена инструмента на токарнике

Добавлено: 06 апр 2024, 00:16
Misha74
rage писал(а): 05 апр 2024, 01:20
Спасибо, но для моих задач должно быть достаточно LPT и ладдера.