tokarka63 писал(а): ↑09 ноя 2022, 14:21
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
Ели нашел)
Скомпилировал компонент.
Дополнил custom.hal
При запуске управляющей программы ошибки:
(для просмотра содержимого нажмите на ссылку)
Print file information:
RUN_IN_PLACE=no
LINUXCNC_DIR=
LINUXCNC_BIN_DIR=/usr/bin
LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
LINUXCNC_SCRIPT_DIR=
LINUXCNC_RTLIB_DIR=/usr/lib/linuxcnc/modules
LINUXCNC_CONFIG_DIR=
LINUXCNC_LANG_DIR=/usr/lib/tcltk/linuxcnc/msgs
INIVAR=inivar
HALCMD=halcmd
LINUXCNC_EMCSH=/usr/bin/wish8.6
LINUXCNC - 2.9.3
Machine configuration directory is '/home/cnc/linuxcnc/configs/revolverka'
Machine configuration file is 'revolverka.ini'
INIFILE=/home/cnc/linuxcnc/configs/revolverka/revolverka.ini
VERSION=1.1
PARAMETER_FILE=linuxcnc.var
TPMOD=
HOMEMOD=
TASK=milltask
HALUI=
DISPLAY=axis
COORDINATES=X Z
KINEMATICS=trivkins coordinates=XZ
Starting LinuxCNC...
Starting LinuxCNC server program: linuxcncsvr
Loading Real Time OS, RTAPI, and HAL_LIB modules
Starting LinuxCNC IO program: io
libnml/buffer/shmem.cc 320: Shared memory buffers toolCmd and toolCmd may conflict. (key=1004(0x3EC))
libnml/buffer/shmem.cc 320: Shared memory buffers toolSts and toolSts may conflict. (key=1005(0x3ED))
libnml/buffer/shmem.cc 320: Shared memory buffers emcError and emcError may conflict. (key=1003(0x3EB))
linuxcnc TPMOD=tpmod HOMEMOD=homemod EMCMOT=motmod
Found file(REL): ./revolverka.hal
Found file(REL): ./custom.hal
Shutting down and cleaning up LinuxCNC...
config string '0 out'
Removing HAL_LIB, RTAPI, and Real Time OS modules
Removing NML shared memory segments
Debug file information:
Note: Using POSIX realtime
Unexpected realtime delay on task 0 with period 100000
This Message will only display once per session.
Run the Latency Test and resolve before continuing.
./custom.hal:19: Signal 'tool-changed' can not add OUT pin 'revolverka.toolchanged', it already has OUT pin 'hal_manualtoolchange.changed'
15046
Stopping realtime threads
Unloading hal components
Note: Using POSIX realtime
Наверное я к тому же еще не подключил созданный компонент.
В программировании мало что смыслю.
Занимаюсь в основном электрикой\электроникой.
Совместно с токарем перебрали китайскую револьверную головку HAK31 на 8 инструментов.
Предназначена в основном для токарного с ЧПУ.
Выбросили червяк, блокировка муфты Хирта осуществляется пружинами, разблокировка муфты - пневмоцилиндром.
Контроль состояния муфты заблокирована\разблокирована осуществляется 2-мя датчиками Холла.
Револьвер вращается в обе стороны серводвигателем по Step/Dir.
Датчик выбора инструмента на основе 8 датчиков Холла + диск с магнитом.
Собрал на дискретной логике аппаратный перекодировщик десятичного кода в двоичный Грея.
Итого на выходе револьверки:
1. 8-ми разрядный десятичный код (8pins);
2. 3-х разрядный двоичный код (3pins);
3. Муфта заблокирована (1pin);
4. Муфта разблокирована (1pin).
Итого на входе револьверки:
1. Dir (1pin);
2. Step (1pin);
3. Включение пневмоцилиндра (для разблокировки муфты) (1pin).
Сделана полная гальваническая развязка по питанию и опторазвязка входов\выходов.
Механика, пневматика и электроника отлажены.
Последовательностью G-кодов проводили тесты:
- пневмоцилиндр сжимает пружины и тем самым разблокирует муфту Хирта,
- датчик
"разблокирована" срабатывает,
- револьвер вращается в обе стороны серводвигателем до нужной позиции, останавливается в позициях для зацепления муфты,
- пневмоцилиндр отпускает пружины и они разжимаясь тем самым блокируют муфту Хирта,
- датчик
"заблокирована" срабатывает.
Задача: - чтобы управление револьвером и контроль выбора инструмента осуществлялись от LinuxCNC.