Hi Tom,
I have tool 8 that i typed into text file and saved. When i do a tool change, say M6T5, the print out says "Tool Changed to Tool 8"
Just had a quick search, and this is the kind of valve I'm thinking off - https://www.airlines-pneumatics.co.u...ush-in/S070132
They work by allowing a free flow of air into the cylinder, but restrict the exhausting, so the venting air acts as a cushion, however too high a pressure could also cause the problem you're having, so probably wise to check the pressure first.
Hi Tom,
I have tool 8 that i typed into text file and saved. When i do a tool change, say M6T5, the print out says "Tool Changed to Tool 8"
www.tsjobshop.com, www.homecncstuff.elementfx.com
Hi m_c,
My gauge is only off about 5psi maybe. So it wasnt the issue. I would think that the cylinders are designed to work off of 90 psi. The manufacture sticker is worn off so i dont know for sure.
Thanks for the link, if i cant get the built in air cushion to work i will try that valve.
Troy
www.tsjobshop.com, www.homecncstuff.elementfx.com
Hi Troy,
Obviously it should print 5 not 8.I have tool 8 that i typed into text file and saved. When i do a tool change, say M6T5, the print out says "Tool Changed to Tool 8"
Please post the M6 Tool change C program that you are using with all the latest changes.
Also show us how you have the M6 Action configured.
Regards
TK http://dynomotion.com
Hi Tom,
So when i was trouble shooting i had these 2 lines commented out in the M6 tool change C code keeping it from writing to text file.
Now tool change is writing to text file as it should. In KMotionCNC Tool Setup the M6 is set to Exec./Wait.Code:persist.UserData[157] = persist.UserData[6]; // Update current tool number persist.UserData[161] = 0; // toolchanger finished
Also have a working C code for Referencing machine axis and the Tool Changer. The Tool Changer reference sequence rotates carousel to limit switch which is at tool 16 slot. Then it opens a text file called Tool_16.txt that has tool 16 saved in it and sets KmotionCNC as active tool 16. After this, Ccode opens the KFlopData.txt file that has last used tool, and sets KMCNC active tool to whats in this file, then rotates TC carousel to this tool slot. So far it seems to be working correctly.
Attached are the C codes iam currently using. Iam sure its fairly sloppy coding but thats the extent of my understanding of Ccode.
Troy
www.tsjobshop.com, www.homecncstuff.elementfx.com
Glad to hear you got it all working!
FWIW most CNC's simply save the last position of the toolchanger and thats it, no referencing the toolchanger on each start up. Id probably set that up as an M code to recover from possible lost position rather then have the toolchanger going nuts every time you start the machine. But im sure what you have will work fine too if you dont mind the extra toolchanges every morning.
The only point of saving the tool number to file was for the next start up. Since your using referencing the tool changer, you really didnt need to mess with saving or loading files at all. Just do your thing to find pocket 16, then set persist.UserData[157] = 16 and your good to go.
Hi mmurray,
I thought of this, but the sort of redundancy eliminates more human error on my part. It doesnt actually do a tool change, just rotates carousel to position.The limit switch on carousel is Hurco's original setup. They still calibrate there tool changer today, at least on there swing arm style. Haas carousel does a calibration at first machine start up also.The only point of saving the tool number to file was for the next start up. Since your using referencing the tool changer, you really didn't need to mess with saving or loading files at all. Just do your thing to find pocket 16, then set persist.UserData[157] = 16 and your good to go.
Was going to ask how i could set tool 16 instead of calling on another text file, thanks, will give this a try. persist.UserData[157] = 16
Troy
www.tsjobshop.com, www.homecncstuff.elementfx.com
Be careful moving carousel only. Things could get messed up if theres a tool left in spindle and it doesnt get put away in the right place. Wouldn't want to end up in some kind of situation where its trying to do a tool change with a tool in spindle, and current carosel pocket too. Might be safer to go through all the toolchange steps while referencing the carousel.
I guess all machines are different. My Fadal has nothing to reference toolchanger, pockets are not even numbered. At my last shop we had a Fanuc with side mount toolchanger and that had nothing to reference as well, just relied on memory. We also had a Mazak 510 but that had a little different, it had a servo driven drum, and the servo drive had a battery backup for position so it always knew where it was. Seemed like the battery would always go dead at worst possible time, and was a pain to recover lol.
This was my thought if machine was shut off with tool in spindle. If TC reference was allowed to do a tool change at position 16 and there is a tool in spindle and carousel that would cause a crash also. At least if it is not actually doing a tool change, just rotating carousel in position, and for some reason tool in spindle and tool slot in carousel did not match up, user would have an opportunity to see that tool slot has a tool in it without a tool change happening.Be careful moving carousel only. Things could get messed up if theres a tool left in spindle and it doesnt get put away in the right place. Wouldn't want to end up in some kind of situation where its trying to do a tool change with a tool in spindle, and current carosel pocket too. Might be safer to go through all the toolchange steps while referencing the carousel.
Ya, i ran some Bridgeports/Fanuc that where a pain to get tool changer back into position if something failed. Sometimes had to reset all the tool locations. If there was a referencing for TC it would have made things a lot easier.
www.tsjobshop.com, www.homecncstuff.elementfx.com
If you know of an issue, better to fix it properly so there cant be any problem. If you leave it to an operator to potentially see the problem and stop it, it will certainly cause a problem eventually. Probably the first or second time it happens lol. You really cant trust us operators with much lol.
It should be really easy to do everything you want to reference safely. Just create a copy of your M6toolchange program, and use this as a starting point. Change step "9. Rotate Carousel" to simply rotate until you find that sensor and locate pocket 16. Then at the end of that program set the current tool, persist.UserData[157] = 16 and you should be good. If theres a tool in the spindle, it will put it in the right place before moving anything else. If its empty, no big deal.
Did some more tests and found some Ccode issues.
1. After i run my machine/ToolChanger reference Ccode.Then do a MDI tool change, the tool change sequence faults out at the point where the tool changer should move out to spindle. After i run my main INIT code to reset fault, the tool change sequence works fine.
2. I did a simple Gcode test like this....
G53G0Z0.
M6T5
G53G0Z-2.
G53G0Z0.
M30
And after tool change i get a Following error on z axis when the G53G0Z-2. trys to execute. So i did a test by commenting out the Z axis position move in my M6ToolChange Ccode. And G code ran fine. Of course Z axis did not position for tool change.
This is the Z axis move in the M6ToolChange code that i commented out....
Code:// 4. Move to toolchange position Z-1.01inches from Reference Position { Move(Z, -20528); while (!CheckDone(2)) WaitNextTimeSlice(); // wait until we are stopped }
Also tried using the below command to move Z axis but still had same issue of Following Error on Z axis.
Code:MoveAtVel(2, -20528, 20000); while (!CheckDone(2)) WaitNextTimeSlice(); // wait until we are stopped
Any ideas what am i missing in my M6Tool change code?
Thanks,Code:#include "KMotionDef.h" #define TMP 10 // which spare persist to use to transfer data #include "KflopToKMotionCNCFunctions.c" //#define Z 2 main() { if (!ReadBit(137)) return 0; // if in Estop, Exit program // 1. Determine how many pockets to rotate int pockets = persist.UserData[6] - persist.UserData[157]; // pockets = requested tool - current tool if (pockets == 0) return 0; // No toolchange needed, End if (pockets >= 8) pockets = -16 + pockets; // If more then halfway CW, reverse if (pockets <= -8) pockets = 16 + pockets; // If more then halfway CCW, reverse persist.UserData[161] = 1; // Toolchanger active disable feedhold button ResumeCoordinatedMotion(); // Clear feedhold // 3. Turn off spindle if (ReadBit(147) || ReadBit(148)) //check if spindle is running forward or reverse { SetBit(147); // turn off spindle clockwise SetBit(148); // turn off spindle counterclockwise while(fast_fabs(Spindle.TrueSpeedRPS)*60.0>5.0);//wait untiless than 5RPM Delay_sec(.2); ClearBit(147); ClearBit(148); } // 4. Move to toolchange position Z-1.01inches from Reference Position { MoveAtVel(2, -20528, 20000); while (!CheckDone(2)) WaitNextTimeSlice(); // wait until we are stopped //Move(Z, -20528); //while (!CheckDone(2)) //WaitNextTimeSlice(); // wait until we are stopped } // 5. Orientate if (!ReadBit(1035) || !ReadBit(1037)) // if toolchanger slide is not home estop { MsgBox("E-Stop TC not Home",MB_OK|MB_ICONEXCLAMATION); printf("E-stop Toolchanger not Home"); DoPC(PC_COMM_ESTOP); // E-stop } { persist.UserData[155] = 1; // Enable orientate speed override SetBit(156); // Kanalog Switch4 to turn on SpindleOrientateProxSensor Delay_sec(0.1); // Delay 0.1s DAC(7, -16); // set motor rpm approx 30 SetBit(147); // spindle on CW Delay_sec(0.2); // wait for spindle to reach speed while (!ReadBit(1038)) WaitNextTimeSlice(); // wait for SpindleOrientateProx signal SetBit(48); // Signal to VFD, set VFD to ZeroServoCommand Delay_sec(0.90); // Delay for spindle to stop at orientation that is set in VFD parameter } { persist.UserData[155] = 0; // Spindle speed normal Delay_sec(0.75); // wait before checking if successfull } while (!ReadBit(1035) || !ReadBit(1037)) WaitNextTimeSlice(); // Check TC is at home position. // 6. Tool Chnager OUT SetBit(63); // TC_OUT solenoid Delay_sec(1.1); ClearBit(63); //TC_OUT solenoid double TF = Time_sec() + 2; // timeout in 2 seconds while (!ReadBit(1034)) // Wait for TC_OUT limit switch { WaitNextTimeSlice(); if (Time_sec() > TF) // Timed out? { if (MsgBox("E-Stop TC Not OUT", MB_OK | MB_ICONEXCLAMATION)) { DoPC(PC_COMM_ESTOP);//Estop persist.UserData[161] = 0; // toolchanger finished return 0; //exit program } else { TF = Time_sec() + 3; // continue and timeout after 3 seconds } } } // 7. Unclamp Tool SetBit(59); //Tool Release Solenoid Delay_sec(.6); double TF = Time_sec() + 2; // timeout in 2 seconds while (!ReadBit(1039)) // Wait for ToolReleaseProxSensor { WaitNextTimeSlice(); if (Time_sec() > TF) // Timed out? { if (MsgBox("E-Stop Tool Unclamp Failed",MB_OK|MB_ICONEXCLAMATION)) { DoPC(PC_COMM_HALT); persist.UserData[161] = 0; // toolchanger finished DoPC(PC_COMM_ESTOP);//Estop return 0; //exit program } else { TF = Time_sec() + 3; // continue and timeout after 3 seconds } } } // 8. Move Tool Changer DOWN SetBit(61); // TC_DOWN Solenoid Delay_sec(0.9); ClearBit(61); //TC_DOWN solenoid double TF = Time_sec() + 2; // timeout in 2 seconds while (!ReadBit(1036)) // Wait for TC_DOWN Limit Switch { WaitNextTimeSlice(); if (Time_sec() > TF) // Timed out? { if (MsgBox("E-Stop TC not DOWN",MB_OK|MB_ICONEXCLAMATION)) { DoPC(PC_COMM_HALT); persist.UserData[161] = 0; // toolchanger finished DoPC(PC_COMM_ESTOP); //Estop return 0; //exit program } else { TF = Time_sec() + 3; // continue and timeout after 3 seconds } } } // 9. Rotate Carousel while (pockets >= 1) // Rotate Turret CW whatever number of pockets { SetBit(49); // TC Carousel Motor On CW while (!ReadBit(1033)) WaitNextTimeSlice(); // Wait for CarouselMotorProxSensor Delay_sec(.4); ClearBit(49); // TC_Carousel CW Motor Off pockets = pockets - 1; } while (pockets <= -1) // Rotate Turret CCW whatever number of pockets { SetBit(50); // TC Carousel Motor On CCW while (!ReadBit(1033)) WaitNextTimeSlice(); // Wait for CarouselMotorProxSensor Delay_sec(.4); ClearBit(50); // TC_Carousel CCW Motor Off pockets = pockets + 1; } // 10. Move Tool Changer UP SetBit(60); // TC_UP Solenoid Delay_sec(0.9); ClearBit(60); //TC_UP solenoid double TF = Time_sec() + 2; // timeout in 2 seconds while (!ReadBit(1037)) // Wait for TC_UP Limit Switch { WaitNextTimeSlice(); if (Time_sec() > TF) // Timed out? { if (MsgBox("E-Stop TC not UP",MB_OK|MB_ICONEXCLAMATION)) { DoPC(PC_COMM_HALT); persist.UserData[161] = 0; // toolchanger finished DoPC(PC_COMM_ESTOP);//Estop return 0; //exit program } else { TF = Time_sec() + 3; // continue and timeout after 3 seconds } } } // 11. Clamp tool ClearBit(59); //Tool Release Solenoid double TF = Time_sec() + 2; // timeout in 2 seconds while (ReadBit(1039)) // Wait for Tool Release Proximity Sensor { WaitNextTimeSlice(); if (Time_sec() > TF) // Timed out? { if (MsgBox("E-Stop Tool Clamp Failed",MB_OK|MB_ICONEXCLAMATION)) { DoPC(PC_COMM_HALT); persist.UserData[161] = 0; // toolchanger finished DoPC(PC_COMM_ESTOP);//Estop return 0; //exit program } else { TF = Time_sec() + 3; // continue and timeout after 3 seconds } } } // 12. Tool Changer IN SetBit(62); // TC_IN solenoid Delay_sec(0.7); ClearBit(62); // TC_IN solenoid double TF = Time_sec() + 2; // timeout in 2 seconds while (!ReadBit(1035)) // Check TC_IN limit switch { WaitNextTimeSlice(); if (Time_sec() > TF) // Timed out? { if (MsgBox("E-Stop TC not IN",MB_OK|MB_ICONEXCLAMATION)) { DoPC(PC_COMM_HALT); persist.UserData[161] = 0; // toolchanger finished DoPC(PC_COMM_ESTOP);//Estop return 0; //exit program } else { TF = Time_sec() + 3; // continue and timeout after 3 seconds } } } // 13. Set Variables persist.UserData[157] = persist.UserData[6]; // Update current tool number persist.UserData[161] = 0; // toolchanger finished printf("Tool changed to T%d\n", persist.UserData[157]); // send message to console // 14. Write current tool # disk FILE *f; char s[256]; float CTool = persist.UserData[157]; // s value from g code f=fopen("c:\\KMotionFiles\\KFlopData.txt","wt"); fprintf(s,"%f\n",CTool); fclose(f); //15. ClearBit(156); ClearBit(48); ClearBit(147); ClearBit(148); //SetBit(147); //SetBit(148); Delay_sec(.3); }
Troy
www.tsjobshop.com, www.homecncstuff.elementfx.com
Setting to Exec/Wait/Sync fixed the issue when running Gcode. Thanks.
Still looking at what is causing first tool change fail after running my referencing program.
www.tsjobshop.com, www.homecncstuff.elementfx.com
Found problem to tool change fail after referencing. For some reason the IN and UP solenoid bits are not clearing. It is in the code after the limit switch for each solenoid is active then i ClearBit for each solenoid. Work around i found was simply adding the ClearBit for each solenoid at end of referencing program. Tests ok so far.
www.tsjobshop.com, www.homecncstuff.elementfx.com
Here is a video of tool changer. Still need to fine tune the pneumatics.
www.tsjobshop.com, www.homecncstuff.elementfx.com
Thats awesome, nice work! I like how your toolchanger has an up and down movement too. I thought that was odd at first, why not just use Z axis?? But your machine stores the tools up higher, and out of the way. And I like how the toolchange position is at the end of the travel, not 4 inches away from it like mine. I almost crashed once because of that.
Pneumatics seem fine to me. I love those iscar ER32 holders with the flush bearing nut too, my favorite holders
Hi Troy,
Love the video. Tool change in ~ 5sec! Excellent work as always for you.
Regards
TK http://dynomotion.com
Hello all again,
Next on my mill project list after i make my control panel, is a 4th axis. It has a Fanuc red cap AC servo.
Wondering if i should replace it with another servo and drive set. Trying to avoid replacing it as whatever i buy i will have to disassemble the servo so i can machine a taper, cut od thread and a woodruff key on shaft.
Currently dont have a drive for the Fanuc and was wondering if anyone has used a compatible drive that is not the overpriced Fanuc drive? Read where Granite Devices makes a drive that should work? Anyhow any info much appreciated.
Here is a couple pics of it.
www.tsjobshop.com, www.homecncstuff.elementfx.com
I went through this last year with a Yaskawa motor on my 4th axis. I also needed a drive and seemed like the simplest and cheapest option for me was to swap it out. If you have a strange mounting setup for the gear you may be able to modify it to use something simpler on the new motor. Might be worth measuring up the gear. Lots of times they end up being standard sizes. Might be able to buy a blank gear for cheap and just bore and broach it for the new motor and call it a day.
You probably can reuse the motor if you really want. You will most likely need to fit your own encoder as Fanuc encoders probably wont work with anything else. I think Tom told me last year that snap amp would work. But the max voltage would have limited speed and I would have needed a separate power supply. Also theres something about finding the commutation angle with AC servos, seemed a little complicated to me. I decided it was easier to sleeve my gear and mount a DMM motor and drive. Been working great. Running parts on the 4th as I type this.
Your Fanuc motor may be commutated by the main computer. It is a crazy system. I faced the same thing when I did the retrofit on my lathe. I finally gave up on the idea of trying to use the Fanuc servos & drives and went with all DMM servos. I just simply bored my original taper bore timing belt sprockets and shrunk them onto the DMM shafts, I'm sure you could do the same thing with whatever your 4th axis drive requires.
Jim Dawson
Sandy, Oregon, USA