This is the tool change component I wrote for the Enshu at MPM in Wichita.
The Enshu's tool changer is a side mounted chain matrix that moves the tool
pot into position by counting the pots, overrunning the correct pot to
allow a stop dog to fall into place, the chain rotates backward until the
stop dog stops the chain, the hyraulics drops pressure to just maintain the
chain in position, the pot rotates from horizontal to vertical. the Z axis
retracts to tool change position, the arm rotates to engage the tool in the
tool changer pot and the spindle at the same time, the tool changer pot and
the spindle both release the tools at the same time, the arm drops and
rotates and rises to exchange the tools, the pot and spindle clamp the
tools, the arm returns to ready position and the pot rotates up to
horizontal position. The tool changer is random so the tool numbers and pot
numbers are always changing. LinuxCNC keeps track of which tool is in which
pot.
Restarting the control will recover from any tool changer error except when
the tool arm is in its bottom position and the arm is partially rotated.
I am not an official programmer so if this looks clunky or cludgy so be it
- it works for me. :)
I know it is not the official manner to include a long response in the
reply but this is not very long.

component enshutoolchange "tool change";
// This is for a random automatic tool changer that requires all components
to be individually controlled

// from EMC
pin in bit reqToolChange "EMC2 tool change request";            //
iocontrol.0.tool-change
pin in s32 CurrentToolNumber "current tool number";             //
iocontrol.0.tool-number
pin in s32 NextPocketNumber "next pocket number";               //
iocontrol.0.tool-prep-pocket
pin in bit reqPocketPrepare "do tool select";                   //
iocontrol.0.tool-prepare
pin in bit ToolChangePosition "tool change position";           //
wcomp.0.out
pin in float MaxPocketNumber "highest pocket number allowed";   // setp
enshutoolchange.0.MaxPocketNumber 30
pin in bit reqTLCHome "tool changer home signal";               //
axis.2.homed

// I/Os
pin in bit ManualMagazineRotate "rotate magazine";              //
ppmc.0.din.28.in-not
pin in bit ToolUnClampButton "tool change button";              //
ppmc.0.din.29.in-not
pin in bit SpindleAtZero "spindle at zero rpm";                 //
ppmc.0.din.42.in-not
pin in bit SpindleOriented "spindle oriented";                  //
ppmc.0.din.44.in-not
pin in bit ToolClamped "tool clamped";                          //
ppmc.0.din.50.in-not
pin in bit ToolUnClamped "tool unclamped";                      //
ppmc.0.din.51.in-not
pin in bit Arm60Set "tool change arm 60 at 60";                 //
ppmc.0.din.52.in-not
pin in bit Arm60Reset "tool change arm 60 at 0";                //
ppmc.0.din.53.in-not
pin in bit Arm180Set "tool change arm 180 at 180";              //
ppmc.0.din.54.in-not
pin in bit Arm180Reset "tool change arm 180 at 0";              //
ppmc.0.din.55.in-not
pin in bit PotDown "tool change pot down";                      //
ppmc.0.din.56.in-not
pin in bit PotUp "tool change pot up";                          //
ppmc.0.din.57.in-not
pin in bit PotUnClamped "tool change pot unclamped";            //
ppmc.0.din.58.in-not
pin in bit ArmUp "tool change arm up";                          //
ppmc.0.din.59.in-not
pin in bit ArmDown "tool change arm down";                      //
ppmc.0.din.60.in-not
pin in bit PotCount "tool pot count";                           //
ppmc.0.din.61.in-not
pin in bit PotZero "tool pot zero";                             //
ppmc.0.din.62.in-not
pin in bit MagazineReverse "tool magazine reverse";             //
ppmc.0.din.63.in-not

//  OUTPUTS
//    to emc
pin out bit ToolChanged "tool change done";                     //
iocontrol.0.tool-changed
pin out bit ToolPrepared "tool selected";                       //
iocontrol.0.tool-prepared

// to gear2
pin out bit reqSpindleOrient "request Spindle Orient";          //
gear2.0.reqSpindleOrient

// to ppmc I/O
pin out bit TLCArmUp "tool change arm up";                      //
ppmc.0.dout.19.out
pin out bit TLCArmDown "tool change arm down";                  //
ppmc.0.dout.20.out
pin out bit TLCArm60Set "tool change arm 60 to 60";             //
ppmc.0.dout.21.out
pin out bit TLCArm60Reset "tool change arm 60 to 0";            //
ppmc.0.dout.22.out
pin out bit TLCArm180Set "tool change arm 180 to 180";          //
ppmc.0.dout.23.out
pin out bit TLCArm180Reset "tool change arm 180 to 0";          //
ppmc.0.dout.24.out
pin out bit TLCPotDown "tool change pot down";                  //
ppmc.0.dout.25.out
pin out bit TLCPotUp "tool change pot up";                      //
ppmc.0.dout.26.out
pin out bit TLCPotUnClamp "pot unclamp";                        //
ppmc.0.dout.27.out
pin out bit TLCChainForward "tool change magazine forward";     //
ppmc.0.dout.28.out
pin out bit AirBlast "tool change air blast";                   //
ppmc.0.dout.29.out
pin out bit ToolUnClamp "unclamp spindle tool";                 //
ppmc.0.dout.30.out
pin out bit TLCChainReverse "tool change magazine reverse";     //
ppmc.0.dout.31.out
pin out bit TLCChainDecel "tool change magazine slow";          //
ppmc.0.dout.32.out

// internal for debug
pin out float dbOUTPUT;
pin out bit dbmask1;
pin out bit dbmask2;
pin out bit dbmask3;
pin out bit dbmask4;
pin out bit dbmask5;
pin out bit dbmask6;
pin out bit dbmask7;
pin out bit dbmask8;
pin out bit dbmask9;
pin out bit dbmask10;

function _;
license "GPL";
;;

FUNCTION(_) {
   static int toolpotcount = 0, currentpotcount, oldPotCount = 0,
oldPotZero = 0, toolchangehomed = 0, dotoolchange, nexttool, initialstate =
0, mask1, mask2, mask3, mask4, mask5, mask6, mask7, mask8, mask9, mask10;

// set tool change initial state
if ( ! initialstate ) {
    TLCArm60Set = false;
    TLCArm60Reset = true;
    TLCPotDown = false;
    TLCPotUp = true;
    TLCArmDown = false;
    TLCArmUp = true;
    TLCArm180Set = false;
    TLCArm180Reset = true;
    TLCPotUnClamp = false;
    reqSpindleOrient = false;
    initialstate = true;
}

// detect falling edge of count
if ( ! PotCount && oldPotCount && ! TLCChainReverse && toolchangehomed ) {
   toolpotcount = toolpotcount + 1;
}
//detect rising edge of zero
if ( PotZero && ! oldPotZero ) {
   toolpotcount = 1;
}
// remember current state of inputs for next time
oldPotCount = PotCount;
oldPotZero = PotZero;

// magazine rotation and tool prep
if ( reqPocketPrepare ) {
        if ( currentpotcount == NextPocketNumber ) {
            ToolPrepared = true;
            ToolChanged = false;
            mask1 = false;
        } else {
            TLCChainReverse = false;
            TLCChainDecel = false;
            TLCChainForward = true;
            ToolPrepared = false;
                if ( ! toolchangehomed ) {
                        if ( ! PotZero ) {
                            toolchangehomed = true;
                            toolpotcount = 1;
                        }
                }
                if ( toolpotcount == NextPocketNumber ) {
                    TLCChainDecel = true;
                        if ( MagazineReverse ) {
                            TLCChainForward = false;
                            TLCChainReverse = true;
                                if ( PotCount ) {
                                    ToolPrepared = true;
                                    ToolChanged = false;
                                    currentpotcount = NextPocketNumber;
                                    mask1 = false;
                                }
                        }
                }
        }
}

// manual tool change
if ( ToolUnClampButton && ! reqToolChange ) {
    AirBlast = true;
    ToolUnClamp = true;
} else if ( ! reqToolChange ) {
    AirBlast = false;
    ToolUnClamp = false;
}

// cycle through the tool change procedure
if ( reqToolChange ) {
        if ( ToolChangePosition && ! mask1 ) {
                if ( ToolChangePosition ) {
                    ToolChanged = false;
                    TLCPotUp = false;
                    TLCPotDown = true;
                    reqSpindleOrient = true;
                    mask1 = true;
                    mask2 = false;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask2 ) {
                if ( SpindleOriented && PotDown ) {
                    TLCArm60Reset = false;
                    TLCArm60Set = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = false;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask3 ) {
                if ( SpindleOriented && PotDown && Arm60Set ) {
                    TLCPotUnClamp = true;
                    ToolUnClamp = true;
                    AirBlast = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = false;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask4 ) {
                if ( SpindleOriented && PotDown && Arm60Set && PotUnClamped
&& ToolUnClamped ) {
                    TLCArmUp = false;
                    TLCArmDown = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = false;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask5 ) {
                if ( SpindleOriented && PotDown && Arm60Set && PotUnClamped
&& ToolUnClamped && ArmDown ) {
                    TLCArm180Reset = false;
                    TLCArm180Set = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = false;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask6 ) {
                if ( SpindleOriented && PotDown && Arm60Set && PotUnClamped
&& ToolUnClamped && ArmDown && Arm180Set ) {
                    TLCArmDown = false;
                    TLCArmUp = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = false;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask7 ) {
                if ( SpindleOriented && PotDown && Arm60Set && PotUnClamped
&& ToolUnClamped && Arm180Set && ArmUp ) {
                    ToolUnClamp = false;
                    TLCPotUnClamp = false;
                    AirBlast = false;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = false;
                    mask9 = true;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask8 ) {
                if ( SpindleOriented && PotDown && Arm60Set && Arm180Set &&
ArmUp && ! PotUnClamped && ToolClamped ) {
                    TLCArm60Set = false;
                    TLCArm60Reset = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = false;
                    mask10 = true;
                }
        }
        if ( ToolChangePosition && ! mask9 ) {
                if ( SpindleOriented && PotDown && Arm180Set && ArmUp && !
PotUnClamped && ToolClamped && Arm60Reset ) {
                    TLCArm180Set = false;
                    TLCArm180Reset = true;
                    TLCPotDown = false;
                    TLCPotUp = true;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = false;
                }
        }
        if ( ToolChangePosition && ! mask10 ) {
                if ( SpindleOriented && ArmUp && ! PotUnClamped &&
ToolClamped && Arm60Reset && Arm180Reset && PotUp ) {
                    ToolChanged = true;
                    dotoolchange = false;
                    ToolPrepared = false;
                    reqSpindleOrient = false;
                    mask1 = true;
                    mask2 = true;
                    mask3 = true;
                    mask4 = true;
                    mask5 = true;
                    mask6 = true;
                    mask7 = true;
                    mask8 = true;
                    mask9 = true;
                    mask10 = true;
                }
        }
        dbmask1 = mask1;
        dbmask2 = mask2;
        dbmask3 = mask3;
        dbmask4 = mask4;
        dbmask5 = mask5;
        dbmask6 = mask6;
        dbmask7 = mask7;
        dbmask8 = mask8;
        dbmask9 = mask9;
        dbmask10 = mask10;
} else {
// Z axis is not in tool change position message
}
        dbOUTPUT = toolpotcount;

}

have fun
Stuart

On Fri, Jun 5, 2015 at 12:01 PM, Sebastian Kuzminsky <s...@highlab.com>
wrote:

> On 6/5/15 10:59 AM, Rick Lair wrote:
> > I do build from source,
> >
> > So should I have the VMC folder be in my
> > "home/testpc/linuxcnc-dev/configs directory,
> >
> > Then from the command line be in the
> > "testpc@testpc:~/linuxcnc-dev/configs$" directory,
> >
> > Then do " sudo halcompile --install --install-doc carousel.comp"
> >
> > Does that sound right?
>
> That sounds right.
>
> Do you have 2.7 or later checked out in ~/linuxcnc-dev?
>
> You must have compiled the source tree in ~/linuxcnc-dev, and in the
> shell that you run halcompile you must first have run "source
> ~/linuxcnc-dev/scripts/rip-environment".
>
>
> --
> Sebastian Kuzminsky
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Emc-users mailing list
> Emc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/emc-users
>



-- 
Addressee is the intended audience.
If you are not the addressee then my consent is not given for you to read
this email furthermore it is my wish you would close this without saving or
reading, and cease and desist from saving or opening my private
correspondence.
Thank you for honoring my wish.
------------------------------------------------------------------------------
_______________________________________________
Emc-users mailing list
Emc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/emc-users

Reply via email to