/** Copyright (C) 2012-2016 by Autodesk, Inc. All rights reserved. KOSY post processor configuration. $Revision: 41601 2e6200651f01fad70bd72491303b9729cd57fc6e $ $Date: 2017-09-14 12:02:56 $ FORKID {793B9330-BD83-4d9c-B9A2-DB45CFF321E5} */ description = "KOSY - WABECO"; vendor = "MaxComputer"; vendorUrl = "http://www.max-computer.de"; legal = "Copyright (C) 2012-2016 by Autodesk, Inc."; certificationLevel = 2; minimumRevision = 24000; longDescription = "This is a post for the KOSY CNC-Wabeco CNC. Tuned by and for eirlab, see eirlab.org"; extension = "knc"; setCodePage("ascii"); capabilities = CAPABILITY_MILLING; tolerance = spatial(0.002, MM); minimumChordLength = spatial(0.01, MM); minimumCircularRadius = spatial(0.01, MM); maximumCircularRadius = spatial(1000, MM); minimumCircularSweep = toRad(0.01); maximumCircularSweep = toRad(180); allowHelicalMoves = true; allowedCircularPlanes = undefined; // allow any circular motion // user-defined properties properties = { writeMachine: true, // write machine writeTools: true, // writes the tools separateWordsWithSpace: true, // specifies that the words should be separated with a white space writeComments: true, // enable to write comments disableToolCode: false // // maxRpm: 7500 // }; // user-defined property definitions propertyDefinitions = { writeMachine: {title:"Write machine", description:"Output the machine settings in the header of the code.", group:0, type:"boolean"}, writeTools: {title:"Write tool list", description:"Output a tool list in the header of the code.", group:0, type:"boolean"}, separateWordsWithSpace: {title:"Separate words with space", description:"Adds spaces between words if 'yes' is selected.", type:"boolean"}, writeComments: {title:"Output comments", description:"Enable to allow the usage of comments", type:"boolean"}, disableToolCode: {title:"Disable Tool Change", description:"Disable gcode for autotool change", type:"boolean"}, //maxRpm: {title:"Machine Max RPM", description:"Enter your machine maximum spindle speed", type:"float"} }; isTapping=false; tappingWay= 0 ; // 0 down, 1 is up var gFormat = createFormat({prefix:"G", decimals:0}); var mFormat = createFormat({prefix:"M", zeropad:true, width:2, decimals:0}); rpmUFormat = createFormat({prefix:"U",decimals:2,scale:1}); // convert rpm to voltage rpmRecords= [ [ 89.6 , 1 ], [ 90.6 , 2 ], [ 123 , 3 ], [ 374 , 3.5 ], [ 628 , 4 ], [ 861 , 4.5 ], [ 1150 , 5 ], [ 1400 , 5.5 ], [ 1635 , 6 ], [ 1880 , 6.5 ], [ 2120 , 7 ], [ 2370 , 7.5], [ 2620 , 8 ], [ 3090 , 9 ], [ 3625 , 10], [ 4125 , 11], [ 4590 , 12 ], [ 5090 , 13 ], [ 5570 , 14 ], [ 6109 , 15 ], [ 6588 , 16 ], [ 7040 , 17 ], [ 7490 , 18 ], [ 7500 , 25 ] ]; function convertAndCheckRpmToVoltage(rpm){ if (rpmmachineConfiguration.getMaximumSpindleSpeed()) error("rpm value above maximum machine limit!"); i=0 while(rpmRecords[i][0] 0) { for (var i = 0; i < tools.getNumberOfTools(); ++i) { var tool = tools.getTool(i); var comment = "T" + toolFormat.format(tool.number) + " " + "D=" + xyzFormat.format(tool.diameter) + " " + localize("CR") + "=" + xyzFormat.format(tool.cornerRadius); if ((tool.taperAngle > 0) && (tool.taperAngle < Math.PI)) { comment += " " + localize("TAPER") + "=" + taperFormat.format(tool.taperAngle) + localize("deg"); } if (zRanges[tool.number]) { comment += " - " + localize("ZMIN") + "=" + xyzFormat.format(zRanges[tool.number].getMinimum()); } comment += " - " + getToolTypeName(tool.type); writeComment(comment); } } } // check tool come from eirlab library if (is3D()) { var numberOfSections = getNumberOfSections(); for (var i = 0; i < numberOfSections; ++i) { var section = getSection(i); var zRange = section.getGlobalZRange(); var tool = section.getTool(); if (tool.getComment()!="eirlab") alert("tool","warning: tool "+tool.number+" is not from eirlab library!"); } } // writeBlock(gFormat.format(76)); // this go to home position... // absolute coordinates writeBlock(gAbsIncModal.format(90)); /* switch (unit) { case IN: writeBlock(gUnitModal.format(20)); break; case MM: writeBlock(gUnitModal.format(21)); break; } */ } function onComment(message) { writeComment(message); } /** Force output of X, Y, and Z. */ function forceXYZ() { xOutput.reset(); yOutput.reset(); zOutput.reset(); } /** Force output of X, Y, Z, and F on next output. */ function forceAny() { forceXYZ(); feedOutput.reset(); } function onSection() { if (tool.type==TOOL_TAP_RIGHT_HAND){ if (tool.getHolderProductId()!="JSN7-B16") error("don't know how to tap with this older! Please check your tap tool"); isTapping=true; tappingWay=0; } else isTapping=false; if (tool.coolant == COOLANT_MIST){ writeBlock(mFormat.format(10), "O2.1"); // activate coolant switch } var insertToolCall = isFirstSection() || currentSection.getForceToolChange && currentSection.getForceToolChange() || (tool.number != getPreviousSection().getTool().number); var retracted = false; // specifies that the tool has been retracted to the safe plane var newWorkOffset = isFirstSection() || (getPreviousSection().workOffset != currentSection.workOffset); // work offset changes var newWorkPlane = isFirstSection() || !isSameDirection(getPreviousSection().getGlobalFinalToolAxis(), currentSection.getGlobalInitialToolAxis()); if (insertToolCall || newWorkOffset || newWorkPlane) { /* // stop spindle before retract during tool change if (insertToolCall && !isFirstSection()) { onCommand(COMMAND_STOP_SPINDLE); } */ // retract to safe plane /* retracted = true; writeBlock(gFormat.format(76)); // retract zOutput.reset(); */ } if (hasParameter("operation-comment")) { var comment = getParameter("operation-comment"); if (comment) { writeComment(comment); } } if (insertToolCall) { writeComment("T" + toolFormat.format(tool.number)); if (tool.comment) { writeComment(tool.comment); } if (properties.disableToolCode == false) { writeBlock(mFormat.format(6),toolFormat.format(tool.number)); } else { writeComment("gcode M06 "+toolFormat.format(tool.number)+" disable by property"); } var showToolZMin = false; if (showToolZMin) { if (is3D()) { var numberOfSections = getNumberOfSections(); var zRange = currentSection.getGlobalZRange(); var number = tool.number; for (var i = currentSection.getId() + 1; i < numberOfSections; ++i) { var section = getSection(i); if (section.getTool().number != number) { break; } zRange.expandToRange(section.getGlobalZRange()); } writeComment(localize("ZMIN") + "=" + zRange.getMinimum()); } } if (!isFirstSection()) { writeComment("Please check the right tool is in the spindle before hitting enter"); onCommand(COMMAND_STOP); // allow manual tool change or check tool change is correctly done! } } if (insertToolCall || isFirstSection() || (rpmFormat.areDifferent(tool.spindleRPM, sOutput.getCurrent())) || (tool.clockwise != getPreviousSection().getTool().clockwise)) { if (tool.spindleRPM < 1) { error(localize("Spindle speed out of range: too low!.")); } sOutput.format(tool.spindleRPM); writeBlock( mFormat.format(tool.clockwise ? 25 : 0), convertAndCheckRpmToVoltage(tool.spindleRPM) ); } onCommand(COMMAND_START_SPINDLE); /* // wcs if (insertToolCall) { // force work offset when changing tool currentWorkOffset = undefined; } var workOffset = currentSection.workOffset; if (workOffset == 0) { warningOnce(localize("Work offset has not been specified. Using G54 as WCS."), WARNING_WORK_OFFSET); workOffset = 1; } if (workOffset > 0) { if (workOffset > 6) { var code = workOffset - 6; if (code > 3) { error(localize("Work offset out of range.")); return; } if (workOffset != currentWorkOffset) { writeBlock(gFormat.format(59) + "." + code); currentWorkOffset = workOffset; } } else { if (workOffset != currentWorkOffset) { writeBlock(gFormat.format(53 + workOffset)); // G54->G59 currentWorkOffset = workOffset; } } } */ forceXYZ(); { // pure 3D var remaining = currentSection.workPlane; if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) { error(localize("Tool orientation is not supported.")); return; } setRotation(remaining); } forceAny(); var initialPosition = getFramePosition(currentSection.getInitialPosition()); if (!retracted) { if (getCurrentPosition().z < initialPosition.z) { writeBlock(gMotionModal.format(0), zOutput.format(initialPosition.z)); } } if (insertToolCall || retracted) { gMotionModal.reset(); if (!machineConfiguration.isHeadConfiguration()) { writeBlock( gAbsIncModal.format(90), gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y) ); writeBlock(gMotionModal.format(0), zOutput.format(initialPosition.z)); } else { writeBlock( gAbsIncModal.format(90), gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y), zOutput.format(initialPosition.z) ); } } else { writeBlock( gAbsIncModal.format(90), gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y) ); } } function onDwell(seconds) { if (seconds > 99999.999) { warning(localize("Dwelling time is out of range.")); } seconds = Math.ceil(seconds * 18); writeBlock(mFormat.format(30), "P" + m30Format.format(seconds)); } //function onSpindleSpeed(spindleSpeed) { // // writeBlock( // mFormat.format(tool.clockwise ? 25 : 0), sOutput.format(spindleSpeed) // ); // //} function onCycle() { } function getCommonCycle(z, r) { forceXYZ(); return [ zOutput.format(-z), // NCCAD expect Z as a positive number for G81 drilling cycle "B" + xyzFormat.format(r)]; // NCCAD expect B as a positive number! } function onCyclePoint(x, y, z) { if (isFirstCyclePoint()) { repositionToCycleClearance(cycle, x, y, z); // return to initial Z which is clearance plane and set absolute mode switch (cycleType) { case "drilling": var _z = zOutput.format(0); writeBlock(gFormat.format(0), _z ); writeBlock( gAbsIncModal.format(90), gCycleModal.format(81), getCommonCycle(z, cycle.retract), feedOutput.format(cycle.feedrate) ); var _x = xOutput.format(x); var _y = yOutput.format(y); writeBlock(gFormat.format(79), _x, _y); break; default: expandCyclePoint(x, y, z); } } else { if (cycleExpanded) { expandCyclePoint(x, y, z); } else { var _x = xOutput.format(x); var _y = yOutput.format(y); if (!_x && !_y) { xOutput.reset(); // at least one axis is required _x = xOutput.format(x); } writeBlock(gFormat.format(79), _x, _y); } } } function onCycleEnd() { if (!cycleExpanded) { zOutput.reset(); } } var pendingRadiusCompensation = -1; function onRadiusCompensation() { pendingRadiusCompensation = radiusCompensation; } function onRapid(_x, _y, _z) { var x = xOutput.format(_x); var y = yOutput.format(_y); var z = zOutput.format(_z); if (x || y || z) { if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation mode cannot be changed at rapid traversal.")); return; } writeBlock(gMotionModal.format(0), x, y, z); feedOutput.reset(); } } function onLinear(_x, _y, _z, feed) { //writeComment("onLinear"+_x+";"+_y+";"+_z+" : feed:"+feed); if (isTapping){ feed=tool.getThreadPitch() * tool.getSpindleRPM(); if (tappingWay==1){ feed=feed*1.6; } } // check feed is into admissible machine capacity if (feed > machineConfiguration.getMaximumFeedrate()){ error("request for a feed of "+feed+" that is above machine limit ("+machineConfiguration.getMaximumFeedrate()+")"); } // at least one axis is required if (pendingRadiusCompensation >= 0) { // ensure that we end at desired position when compensation is turned off xOutput.reset(); yOutput.reset(); } var x = xOutput.format(_x); var y = yOutput.format(_y); var z = zOutput.format(_z); var f = feedOutput.format(feed); if (x || y || z) { if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation mode is not supported by CNC machine.")); pendingRadiusCompensation = -1; switch (radiusCompensation) { case RADIUS_COMPENSATION_LEFT: writeBlock(gMotionModal.format(1), gFormat.format(41), x, y, z, f); break; case RADIUS_COMPENSATION_RIGHT: writeBlock(gMotionModal.format(1), gFormat.format(42), x, y, z, f); break; default: writeBlock(gMotionModal.format(1), gFormat.format(40), x, y, z, f); } } else { writeBlock(gMotionModal.format(1), x, y, z, f); } } else if (f) { if (getNextRecord().isMotion()) { // feed is not allowed without motion feedOutput.reset(); // force feed on next line } else { writeBlock(gMotionModal.format(1), f); } } } function onParameter(name,value){ //writeComment("param "+name+" has value "+value); } function onRapid5D(_x, _y, _z, _a, _b, _c) { error(localize("Multi-axis toolpath is not supported by CNC machine.")); } function onLinear5D(_x, _y, _z, _a, _b, _c, feed) { error(localize("Multi-axis toolpath is not supported by CNC machine.")); } function onCircular(clockwise, cx, cy, cz, x, y, z, feed) { // force both X/Y for G2/G3 if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation cannot be activated/deactivated for a circular move.")); return; } var start = getCurrentPosition(); if (isFullCircle()) { if (isHelical()) { linearize(tolerance); return; } switch (getCircularPlane()) { case PLANE_XY: xOutput.reset(); yOutput.reset(); writeBlock(gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), iOutput.format(cx - start.x, 0), jOutput.format(cy - start.y, 0), feedOutput.format(feed)); break; default: linearize(tolerance); } } else { switch (getCircularPlane()) { case PLANE_XY: xOutput.reset(); yOutput.reset(); var _z=zOutput.format(z); if (_z){ writeBlock(gMotionModal.format(1), _z, feedOutput.format(feed)); } writeBlock(gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y) , iOutput.format(cx - start.x, 0), jOutput.format(cy - start.y, 0), feedOutput.format(feed)); break; default: linearize(tolerance); } } } var mapCommand = { COMMAND_STOP:1, COMMAND_OPTIONAL_STOP:5 }; function onCommand(command) { //writeComment("new command "+getCommandStringId(command)); ignore=false; switch (command) { case COMMAND_START_SPINDLE: onCommand(tool.clockwise ? COMMAND_SPINDLE_CLOCKWISE : COMMAND_SPINDLE_COUNTERCLOCKWISE); return; case COMMAND_SPINDLE_CLOCKWISE: writeBlock(mFormat.format(10), "O6.1"); if (isTapping) tappingWay=0; return; // case COMMAND_SPINDLE_COUNTERCLOCKWISE: // not supported // return; case COMMAND_STOP_SPINDLE: if (tool.spindleRPM>3000){ writeBlock( mFormat.format(tool.clockwise ? 25 : 0), convertAndCheckRpmToVoltage(2500) ); onDwell(3); } writeBlock(mFormat.format(10), "O6.0"); return; case COMMAND_LOCK_MULTI_AXIS: return; case COMMAND_UNLOCK_MULTI_AXIS: return; case COMMAND_BREAK_CONTROL: return; case COMMAND_TOOL_MEASURE: return; case COMMAND_ACTIVATE_SPEED_FEED_SYNCHRONIZATION: if (isTapping) { onCommand(COMMAND_STOP_SPINDLE); writeComment("check tapping tool and hit enter"); onCommand(COMMAND_STOP); onCommand(COMMAND_START_SPINDLE); ignore=true; } else ignore=False; break; case COMMAND_DEACTIVATE_SPEED_FEED_SYNCHRONIZATION: if (isTapping) { ignore=true; } else ignore=False; break; case COMMAND_SPINDLE_COUNTERCLOCKWISE: // not supported if (isTapping) { tappingWay=1; onDwell(2); ignore=true; } else ignore=False; break; } if(ignore) return; var stringId = getCommandStringId(command); var mcode = mapCommand[stringId]; if (mcode != undefined) { writeBlock(mFormat.format(mcode)); } else { onUnsupportedCommand(command); } } function onSectionEnd() { if (tool.coolant == COOLANT_MIST){ writeBlock(mFormat.format(10), "O2.0"); // activate coolant switch } forceAny(); } function onClose() { onCommand(COMMAND_STOP_SPINDLE); // writeBlock(gFormat.format(76)); // retract // zOutput.reset(); if (!machineConfiguration.hasHomePositionX() && !machineConfiguration.hasHomePositionY()) { //writeBlock(gFormat.format(77)); // return to home } else { var homeX; if (machineConfiguration.hasHomePositionX()) { homeX = "X" + xyzFormat.format(machineConfiguration.getHomePositionX()); } var homeY; if (machineConfiguration.hasHomePositionY()) { homeY = "Y" + xyzFormat.format(machineConfiguration.getHomePositionY()); } //writeBlock(gAbsIncModal.format(90), gMotionModal.format(0), homeX, homeY); } writeBlock(gFormat.format(99)); // end of program }