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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
tokarka63
Мастер
Сообщения: 393
Зарегистрирован: 10 фев 2020, 18:39
Репутация: 13
Настоящее имя: Виталий
Контактная информация:

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

Сообщение tokarka63 »

xenon-alien писал(а): Каков алгоритм работы?
Поставил стальной диск с вырезами, получил двоичный код!)
Где то на форуме выкладывал чертеж и чутка не доделанный компонент)
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4506
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

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

Сообщение xenon-alien »

tokarka63 писал(а): 09 ноя 2022, 13:42
xenon-alien писал(а): Каков алгоритм работы?
Поставил стальной диск с вырезами, получил двоичный код!)
Где то на форуме выкладывал чертеж и чутка не доделанный компонент)
Это типа абсолютного энкодера, если верно понимаю...
tokarka63
Мастер
Сообщения: 393
Зарегистрирован: 10 фев 2020, 18:39
Репутация: 13
Настоящее имя: Виталий
Контактная информация:

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

Сообщение 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
Диск позиции
Изображение
Изображение
Изображение
Изображение
Испытательный стенд)
Изображение
Изображение
Ели нашел)
tokarka63
Мастер
Сообщения: 393
Зарегистрирован: 10 фев 2020, 18:39
Репутация: 13
Настоящее имя: Виталий
Контактная информация:

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

Сообщение tokarka63 »

xenon-alien писал(а): Это типа абсолютного энкодера, если верно понимаю...
Даже и не думал так), но, да, получается так)
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4506
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

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

Сообщение 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:
ex71
Мастер
Сообщения: 697
Зарегистрирован: 18 май 2019, 13:23
Репутация: 96
Настоящее имя: Андрей
Контактная информация:

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

Сообщение ex71 »

в стандартном компоненте это называется "код грея"
можно сделать через этот компонент, соединив его ноги с реальным железом

а вообще
BIN2GRAY
GRAY2BIN
tokarka63
Мастер
Сообщения: 393
Зарегистрирован: 10 фев 2020, 18:39
Репутация: 13
Настоящее имя: Виталий
Контактная информация:

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

Сообщение 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;
tokarka63
Мастер
Сообщения: 393
Зарегистрирован: 10 фев 2020, 18:39
Репутация: 13
Настоящее имя: Виталий
Контактная информация:

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

Сообщение tokarka63 »

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

а вообще
BIN2GRAY
GRAY2BIN
Пытался разобраться с чужими компонентами, но оказалось, написать свой проще!)
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4506
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

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

Сообщение 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
Аватара пользователя
rage
Мастер
Сообщения: 1002
Зарегистрирован: 13 окт 2014, 09:14
Репутация: 617
Настоящее имя: Константин
Откуда: Новосибирск
Контактная информация:

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

Сообщение 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
kang2k
Новичок
Сообщения: 33
Зарегистрирован: 26 май 2014, 18:46
Репутация: 2
Контактная информация:

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

Сообщение kang2k »

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

в архиве вся папка с конфигурацией.
arhiv 16k20t1.rar
Прикрутил к станку конфиг на базе этой конфигурации. Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6191
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

kang2k писал(а): Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?
А мне это нравится, так как при запуске станка слышно как револьверка зажимается.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
kang2k
Новичок
Сообщения: 33
Зарегистрирован: 26 май 2014, 18:46
Репутация: 2
Контактная информация:

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

Сообщение kang2k »

aftaev писал(а): 20 ноя 2022, 14:40
kang2k писал(а): Резцедержка работает на отлично, но не нравится, то что при каждом запуске linuxcnc кратковременно щелкает контактор, зажатия. Как это победить ?
А мне это нравится, так как при запуске станка слышно как револьверка зажимается.
Проблема в том, что когда несколько раз перегружаю комп (отлаживал), зажало так, что тепловое реле выбило
kang2k
Новичок
Сообщения: 33
Зарегистрирован: 26 май 2014, 18:46
Репутация: 2
Контактная информация:

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

Сообщение kang2k »

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

Вернуться в «LinuxCNC»