Mori sl-4 turret location decode
Any ideas?
################
# Decode for turret locations
################
# Turret ..1 2 3 4 5 6 7 8 9 10
# LS8 ......1 0 0 0 0 1 0 0 0 1
# LS9 ......1 1 0 0 0 0 1 0 0 0
# LS10 ....0 1 1 0 0 0 0 1 0 0
# LS11 ....0 0 1 1 0 0 0 0 1 0
# LS12 ....0 0 0 1 1 0 0 0 0 1
# LS13 ....0 0 0 0 1 1 1 1 1 0
################
Thanks
Cory
Please Log in or Create an account to join the conversation.
I guess I would be tempted to write hal comp that just used a big case statement to encode these into location numbers. If you can just use a few numbers (not sure if thats safe) then bits 7,8, and 9 encode all the states
Please Log in or Create an account to join the conversation.
It is a 10 position turret and those are the factory 6 limit switches that determine turret position.
Please Log in or Create an account to join the conversation.
so theres a unique 6 bit code for each of the 10 turret positions
(with perhaps some other codes in in between positions)
I still think the case statement HAL comp is probably the simplest
way to decode/encode this
Please Log in or Create an account to join the conversation.
Thanks
Cory
Please Log in or Create an account to join the conversation.
git.linuxcnc.org/gitweb?p=linuxcnc.git;a...fs/heads/v2.5_branch
Please Log in or Create an account to join the conversation.
This toolchanger component I wrote for an Orac lathe shows one way of doing it.
wiki.linuxcnc.org/cgi-bin/wiki.pl?Contri...oolchanger_component
It decodes a truth table from a 3 optic switch greyscale disk to arrive at the tool position
Using a similar conditional structure starts to get a bit clunky however with 6 switches to check,
it will take longer the higher the tool position.
But on the plus side, nothing else happens during a tool change and clunky is probably just a split second more in computing time on a rt thread.
eg.
if(LS8 && LS9 && !LS10 && !LS11 && !LS12 && !LS13)
position = 1;
else if(!LS8 && LS9 && LS10 && !LS11 && !LS12 && !LS13)
position = 2;
else if(!LS8 && !LS9 && LS10 && LS11 && !LS12 && !LS13)
position = 3;
....
.... etc
else
position = 0;
regards
Please Log in or Create an account to join the conversation.
I went ahead and modified the comp you provided. Can someone see if this is even close?
turret is all hydraulic. I have clamp, unclamp, forward, reverse, and high outputs to the machine
I also need to add the turret clamped prox switch somewhere to the code.
Right now im only working with forward rotation. here is the order of functions i would like to happen
1. turret unclamp
2. wait for delayturretdone
3. rotate with high and forward until one position away from requested tool
4. rotate with forward until requested tool
5. turret clamp
6. wait for delayturretdone
7. output toolchange completed
I'm not sure with the way this is written how high will work with changing one tool in the direction of rotation.
Once i get this figured out ill work on determining forward or reverse by requested vs current tool
Thanks
Cory
FUNCTION(_)
{
switch (progress_level)
{
case 0: // idle waiting for toolchange request
// axis does not remember the current tool number, so prompt for it once homed
if((!currenttoolnumber && !bWarn)&&(ishomedX)&&(ishomedZ))
{
bWarn = true; // just warn once, its not an error as such but INFO won't display unless debugging is set 3+
rtapi_print_msg(RTAPI_MSG_ERR, "No tool selected. Use M6Tx to set current tool");
break;
}
if(toolchange && !toolchanged) // prevent cycling after change done
{
if(currenttoolnumber && toolnumber != currenttoolnumber && toolnumber > 0 && toolnumber < 11) // if a valid number
{
forward = false; // switch off motor if already on
reverse = false;
tnumber = toolnumber - 1;
if(tnumber = 1) // subtract 1 for turrest slow condition
tnumber = tnumber + 10;
high = false;
sleeptime = 0;
progress_level = 1;
break;
}
else // if tool requested is out of range set the toolchanged flag and exit
// should only get this if tool table has more tools than ATC can have
// otherwise emc will error the M6 command
{
progress_level = 5;
forward = false; // switch off motor if already on
reverse = false;
high = false;
}
}
if(!toolchange && toolchanged)
toolchanged = false; // reset once toolchange flag reset by system
if(toolchange && !currenttoolnumber) // if no tool is set in axis - set axis to tool requested so that can work next time
{
forward = false;
reverse = false;
high = false;
progress_level = 5;
}
break;
case 1: // programmed delay to allow relays time to change over
if(sleeptime < times)
{
sleeptime++;
break;
}
clampturret = false;
unclampturret = true;
delayturret = true;
if(delayturretdone) // wait for turret delay
{
high = true;
forward = true;
progress_level = 2;
}
break;
case 2: // Forward move - read the truth table to determine position
if(LS8 && LS9 && !LS10 && !LS11 && !LS12 && !LS13)
position = 1;
else if(!LS8 && LS9 && LS10 && !LS11 && !LS12 && !LS13)
position = 2;
else if(!LS8 && !LS9 && LS10 && LS11 && !LS12 && !LS13)
position = 3;
else if(!LS8 && !LS9 && !LS10 && LS11 && LS12 && !LS13)
position = 4;
else if(!LS8 && !LS9 && !LS10 && !LS11 && LS12 && LS13)
position = 5;
else if(LS8 && !LS9 && !LS10 && !LS11 && !LS12 && LS13)
position = 6;
else if(!LS8 && LS9 && !LS10 && !LS11 && !LS12 && LS13)
position = 7;
else if(!LS8 && !LS9 && LS10 && !LS11 && !LS12 && LS13)
position = 8;
else if(!LS8 && !LS9 && !LS10 && LS11 && !LS12 && LS13)
position = 9;
else if(LS8 && !LS9 && !LS10 && !LS11 && LS12 && !LS13)
position = 10;
else
position = 0;
if(!position) // if returning 0 something is wrong
{
rtapi_print_msg(RTAPI_MSG_ERR, "Error - opto inputs do not match truth table");
progress_level = 12; // doesn't exist so will go to default, output msg and then sit in level 10
break;
}
if(position != tnumber) // wait for next tool - 1 to come around
break;
high = false;
forward = true;
if(position != toolnumber) // wait for toolnumber to come around
break;
high = false;
forward = false;
sleeptime = 0;
delaystart = true;
progress_level = 3;
break;
case 3: // programmed delay to allow relays time to change over
if(sleeptime < times)
{
sleeptime++;
break;
}
unclampturret = false;
clampturret = true;
delayturret = true;
if(delayturretdone) // wait for turret delay
{
delaystart = true;
progress_level = 5; // after first toolchange or update of tool number this is default
}
break;
case 5: // clean up ready for next toolchang
toolchanged = true; // signal finished
break;
case 10: break; // should never get here but if we do then loop endlessly doing nothing
default:
progress_level = 10;
rtapi_print_msg(RTAPI_MSG_ERR, "Error state in oracchanger - now disabled - unload oracchanger");
break;
}
}
Please Log in or Create an account to join the conversation.
At a quick glance, the delayturretdone sections need to go into separate progress states.
They use the timedelay component which outputs once counted down, so it can idle awaiting that.
It's evening here, I will have a proper look tomorrow and get back to you.
regards
Please Log in or Create an account to join the conversation.
# Turret ..1 2 3 4 5 6 7 8 9 10
# LS8 ......1 0 0 0 0 1 0 0 0 1
# LS9 ......1 1 0 0 0 0 1 0 0 0
# LS10 ....0 1 1 0 0 0 0 1 0 0
# LS11 ....0 0 1 1 0 0 0 0 1 0
# LS12 ....0 0 0 1 1 0 0 0 0 1
# LS13 ....0 0 0 0 1 1 1 1 1 0
That's just plain strange.
try:
www.linuxcnc.org/docs/html/hal/comp.html
and
component mori "decode mori turret";
pin in bit in-#[6] "input bits";
pin out signed out "output position";
pin out unsigned i;
license "GPL";
author "Andy Pugh";
function _ ;
;;
FUNCTION(_){
i = in(0) + 2*in(1) + 4*in(2) + 8*in(3) + 16*in(4) + 32*in(5);
switch(i){
case 3:
out = 1;
break;
case 6:
out = 2;
break;
case 12:
out = 3;
break;
case 24:
out = 4;
break;
case 48:
out = 5;
break;
case 33:
out = 6;
break;
case 34:
out = 7;
break;
case 36:
out = 8;
break;
case 40:
out = 9;
break;
case 21:
out = 10;
break;
default:
out = -1;
}
}
Please Log in or Create an account to join the conversation.