Page 1 of 1
Automatic nozzle change, software aspects
Posted: Tue Apr 05, 2016 10:42 am
by JuKu
I'm opening a new thread for this to collect software issues for automatic nozzle change to one thread. Currently, there are a couple of thread about nozzles. Not all have same nozzles, which makes software support a bit more challenging. Also, I don't have an automatic nozzle change system myself (yet), so I don't have a crystal clear idea about how exactly automatic nozzle change should happen. How would you like that integrated to the software?
Some ideas or issues that come to mind:
- Maybe the job file should have a column for the nozzle used? Or would it be better to have an "auto nozzle change" operation with the nozzle as a parameter? The latter would give you clearer view on what will happen in what order when running a job.
- How would the software know what nozzle is attached in the startup?
- A manually triggered automatic change is probably needed. How?
- How to define nozzle change operation? My first idea is to have a table of coordinates defining a sequence of positions:
Code: Select all
nozzle operation position1 position2 position3 (as many positions as needed)
1 release X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... ...
1 attach X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... ...
2 release X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... ...
2 attach X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... X: ... Y: ... Z: ... A: ... ...
...
But first ideas are not necessarily the best ones.
what other issues should be considered?
[Unrelated: The "everything visible" style UI was clean when I started, but isn't so clean anymore. Adding this would be the last straw and likely, result to a traditional menu bar and setup screens. But that is another discussion. Also, unless this turns out to be rather trivial to implement, I'll add first other stuff on my todo list.]
Re: Automatic nozzle change, software aspects
Posted: Tue Apr 05, 2016 3:33 pm
by Pixopax
You should add a field to the tapes, where one can add the needed nozzle-number, that way you do not have to look for the proper nozzle, you define it for every part.
Then you need to have a nozzle-table, where one can add his nozzles, numbered from 1 to x
These numbers stay the same, so the software can see on the nozzle-number in the tape which nozzle is needed.
In the Rmod-fork there is a nozzle changer, you can define your nozzles, together with a camera filter for each nozzle, if you like.
Then each nozzle has a number of movements, which can be taken from needle or camera positions too. As far as I know unlimited positions are possible, it is a list.
This way you can design every possible nozzle changer movement quite easy.
It also has a table where one can enter x1,y1,x2,y2-areas where the nozzle should keep out when changing.
Maybe you should have a look in the rmod-fork for that, it has an own page for the changer.
Louis
Re: Automatic nozzle change, software aspects
Posted: Wed Apr 06, 2016 10:35 am
by Pixopax
I tested my changer yesterday, it really works simple.
I just entered the nozzles (1-5), and then added the movements for every nozzle.
In my case for nozzle 1
x200 y10 z1 Move to nozzle
x200 y10 z28 Go down to insert the nozzle
x200 y20 z28 Slip out of the nozzle holder
x200 y20 z1 Move up to get the nozzle out of the holder
For unloading, this sequense is done in backward direction.
Re: Automatic nozzle change, software aspects
Posted: Fri May 13, 2016 4:38 pm
by Yshiron
in my case i config every needlae movment
by built the 2 function
1: Put_back_Needle();
2: Take_on_Needle();
the code look like this
case "Change needle":
if (Component == "--")
{
ShowMessageBox(
"Please select the correct Needle",
"Data error",
MessageBoxButtons.OK);
return false;
}
if (Component == "Needle1_to_2") {
Put_back_Needle1();
Take_on_Needle2();
// return false;
}
if (Component == "Needle1_to_3")
{
Put_back_Needle1();
Take_on_Needle3();
// return false;
}
if (Component == "Needle2_to_1")
{
Put_back_Needle2();
Take_on_Needle1();
// return false;
}
if (Component == "Needle2_to_3")
{
Put_back_Needle2();
Take_on_Needle3();
// return false;
}
if (Component == "Needle3_to_1")
{
Put_back_Needle3();
Take_on_Needle1();
// return false;
}
if (Component == "Needle3_to_2")
{
Put_back_Needle3();
Take_on_Needle2();
// return false;
}
break;
and the function are:
// Put_back_Needle1
private bool Put_back_Needle1()
{
CNC_Write_m("{\"zsn\":0}");
CNC_Write_m("{\"zsx\":0}");
Thread.Sleep(20);
double Needle1posX = 24.5;
double Needle1posY = 15;
PumpOff();
Zlim_checkBox.Checked = true;
Zhome_checkBox.Checked = true;
Needle.Calibrated = false;
ValidMeasurement_checkBox.Checked = false;
Thread.Sleep(20);
CNC_Z_m(0.0);
CNC_XY_m(Needle1posX, Needle1posY);
Thread.Sleep(20);
CNC_Z_m(35.5);
Cnc.CurrentZ = 0;
CNC_XY_m(Needle1posX, Needle1posY - 12);
Thread.Sleep(20);
Cnc.CurrentZ = 35.5;
CNC_Z_m(0.0);
CNC_Write_m("{\"zsn\":3}");
CNC_Write_m("{\"zsx\":2}");
Thread.Sleep(20);
if (!BuildMachineCoordinateData_m())
{
return false;
}
//PumpOn();
return true;
}
// =================================================================================
// Take_on_Needle1
private bool Take_on_Needle1()
{
CNC_Write_m("{\"zsn\":0}");
CNC_Write_m("{\"zsx\":0}");
Thread.Sleep(20);
double Needle1posX = 24.5;
double Needle1posY = 3;
Zlim_checkBox.Checked = true;
Zhome_checkBox.Checked = true;
Needle.Calibrated = false;
ValidMeasurement_checkBox.Checked = false;
Thread.Sleep(20);
CNC_Z_m(0.0);
CNC_XY_m(Needle1posX, Needle1posY);
Thread.Sleep(20);
CNC_Z_m(38.5);
Thread.Sleep(200);
CNC_Z_m(35.5);
Cnc.CurrentZ = 0;
CNC_XY_m(Needle1posX, Needle1posY + 12);
Thread.Sleep(20);
Cnc.CurrentZ = 35.5;
CNC_Z_m(0.0);
CNC_Write_m("{\"zsn\":3}");
CNC_Write_m("{\"zsx\":2}");
Thread.Sleep(20);
if (!BuildMachineCoordinateData_m())
{
return false;
}
PumpOn();
return true;
}
// =================================================================================
// Put_back_Needle2
private bool Put_back_Needle2()
{
CNC_Write_m("{\"zsn\":0}");
CNC_Write_m("{\"zsx\":0}");
Thread.Sleep(20);
double Needle1posX = 39.8;
double Needle1posY = 15;
PumpOff();
Zlim_checkBox.Checked = true;
Zhome_checkBox.Checked = true;
Needle.Calibrated = false;
ValidMeasurement_checkBox.Checked = false;
Thread.Sleep(20);
CNC_Z_m(0.0);
CNC_XY_m(Needle1posX, Needle1posY);
Thread.Sleep(20);
CNC_Z_m(35.5);
Cnc.CurrentZ = 0;
CNC_XY_m(Needle1posX, Needle1posY - 12);
Thread.Sleep(20);
Cnc.CurrentZ = 35.5;
CNC_Z_m(0.0);
CNC_Write_m("{\"zsn\":3}");
CNC_Write_m("{\"zsx\":2}");
Thread.Sleep(20);
if (!BuildMachineCoordinateData_m())
{
return false;
}
//PumpOn();
return true;
}
// =================================================================================
// Take_on_Needle2
private bool Take_on_Needle2()
{
CNC_Write_m("{\"zsn\":0}");
CNC_Write_m("{\"zsx\":0}");
Thread.Sleep(20);
double Needle1posX = 39.8;
double Needle1posY = 3;
Zlim_checkBox.Checked = true;
Zhome_checkBox.Checked = true;
Needle.Calibrated = false;
ValidMeasurement_checkBox.Checked = false;
Thread.Sleep(20);
CNC_Z_m(0.0);
CNC_XY_m(Needle1posX, Needle1posY);
Thread.Sleep(20);
CNC_Z_m(38.5);
Thread.Sleep(200);
CNC_Z_m(35.5);
Cnc.CurrentZ = 0;
CNC_XY_m(Needle1posX, Needle1posY + 12);
Thread.Sleep(20);
Cnc.CurrentZ = 35.5;
CNC_Z_m(0.0);
CNC_Write_m("{\"zsn\":3}");
CNC_Write_m("{\"zsx\":2}");
Thread.Sleep(20);
if (!BuildMachineCoordinateData_m())
{
return false;
}
PumpOn();
return true;
}
// =================================================================================
// Put_back_Needle3
private bool Put_back_Needle3()
{
CNC_Write_m("{\"zsn\":0}");
CNC_Write_m("{\"zsx\":0}");
Thread.Sleep(20);
double Needle1posX = 54.8;
double Needle1posY = 15;
PumpOff();
Zlim_checkBox.Checked = true;
Zhome_checkBox.Checked = true;
Needle.Calibrated = false;
ValidMeasurement_checkBox.Checked = false;
Thread.Sleep(20);
CNC_Z_m(0.0);
CNC_XY_m(Needle1posX, Needle1posY);
Thread.Sleep(20);
CNC_Z_m(35.5);
Cnc.CurrentZ = 0;
CNC_XY_m(Needle1posX, Needle1posY - 12);
Thread.Sleep(20);
Cnc.CurrentZ = 35.5;
CNC_Z_m(0.0);
CNC_Write_m("{\"zsn\":3}");
CNC_Write_m("{\"zsx\":2}");
Thread.Sleep(20);
if (!BuildMachineCoordinateData_m())
{
return false;
}
//PumpOn();
return true;
}
// =================================================================================
// Take_on_Needle3
private bool Take_on_Needle3()
{
CNC_Write_m("{\"zsn\":0}");
CNC_Write_m("{\"zsx\":0}");
Thread.Sleep(20);
double Needle1posX = 54.8;
double Needle1posY = 3;
Zlim_checkBox.Checked = true;
Zhome_checkBox.Checked = true;
Needle.Calibrated = false;
ValidMeasurement_checkBox.Checked = false;
Thread.Sleep(20);
CNC_Z_m(0.0);
CNC_XY_m(Needle1posX, Needle1posY);
Thread.Sleep(20);
CNC_Z_m(38.5);
Thread.Sleep(200);
CNC_Z_m(35.5);
Cnc.CurrentZ = 0;
CNC_XY_m(Needle1posX, Needle1posY + 12);
Thread.Sleep(20);
Cnc.CurrentZ = 35.5;
CNC_Z_m(0.0);
CNC_Write_m("{\"zsn\":3}");
CNC_Write_m("{\"zsx\":2}");
Thread.Sleep(20);
if (!BuildMachineCoordinateData_m())
{
return false;
}
PumpOn();
return true;
}
the configuration in the Lite placer software is like that:
Re: Automatic nozzle change, software aspects
Posted: Fri May 13, 2016 5:19 pm
by Pixopax
Far too complicated for me,
have a look at the rmod-release:
- nozch.jpg (37.18 KiB) Viewed 28036 times
You just add the nozzle number to the tape, and the software changes the nozzle itself, no need for "change from 1 to 3" in the parts list.
Re: Automatic nozzle change, software aspects
Posted: Fri May 13, 2016 7:45 pm
by Yshiron
cool !!!
can you share the code ?
Re: Automatic nozzle change, software aspects
Posted: Sat May 14, 2016 4:43 pm
by Pixopax
It is in the rmod-fork of the software.
Re: Automatic nozzle change, software aspects
Posted: Sat May 14, 2016 11:14 pm
by Yshiron
can you direct me to it
i am not find it...
Re: Automatic nozzle change, software aspects
Posted: Sun May 15, 2016 11:25 am
by Pixopax
Re: Automatic nozzle change, software aspects
Posted: Sun May 15, 2016 8:39 pm
by Yshiron
Thanks lot friend...but where the installer file
my system is windows7
please your advice