/** 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 = "Autodesk"; vendorUrl = "http://www.max-computer.de"; legal = "Copyright (C) 2012-2016 by Autodesk, Inc."; certificationLevel = 2; minimumRevision = 24000; longDescription = "This is a generic post for the KOSY CNC. Manual tool change is required after the M1 command. The first tool must be selected prior to running the program. Spindle speeds are ignored in the original toolpath as these are not supported by KOSY."; 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"} }; 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 function convertAndCheckRpmToVoltage(rpm){ if (rpm<0) error("RPM value must be positive!"); if (rpm>properties.maxRpm) error("rpm value above maximum machine limit!"); return rpmUFormat.format(rpm/properties.maxRpm*(25.0-4.2)+4.2); } var xyzFormat = createFormat({decimals:(unit == MM ? 2 : 3), forceDecimal:true}); var feedFormat = createFormat({decimals:(unit == MM ? 1 : 2),scale:1.0/6.0, forceDecimal:true}); // feed is in per minute in wabeco var toolFormat = createFormat({prefix:"T",decimals:0}); var rpmFormat = createFormat({decimals:2,scale:1}); // convert rpm to voltage var m30Format = createFormat({decimals:0}); // 1/18th seconds var taperFormat = createFormat({decimals:1, scale:DEG}); var xOutput = createVariable({prefix:"X"}, xyzFormat); var yOutput = createVariable({prefix:"Y"}, xyzFormat); var zOutput = createVariable({prefix:"Z"}, xyzFormat); var feedOutput = createVariable({prefix:"F"}, feedFormat); var sOutput = createVariable({prefix:"U", force:true}, rpmFormat); // circular output var iOutput = createReferenceVariable({prefix:"I", force:true}, xyzFormat); var jOutput = createReferenceVariable({prefix:"J", force:true}, xyzFormat); var gMotionModal = createModal({force:true}, gFormat); // modal group 1 // G0-G3, ... var gAbsIncModal = createModal({}, gFormat); // modal group 3 // G90-91 var gCycleModal = createModal({force:true}, gFormat); // modal group 9 // G81, ... var WARNING_WORK_OFFSET = 0; // collected state var currentWorkOffset; /** Writes the specified block. */ function writeBlock() { writeWords(arguments); } function formatComment(text) { return "; " + String(text).replace(/[\(\)]/g, ""); } /** Output a comment. */ function writeComment(text) { if (properties.writeComments) { writeln(formatComment(text)); } } function onOpen() { if (!properties.separateWordsWithSpace) { setWordSeparator(""); } // required header writeBlock("_"); writeBlock("_"); if (programName) { writeComment(programName); } if (programComment) { writeComment(programComment); } // dump machine configuration var vendor = machineConfiguration.getVendor(); var model = machineConfiguration.getModel(); var description = machineConfiguration.getDescription(); if (properties.writeMachine && (vendor || model || description)) { writeComment(localize("Machine")); if (vendor) { writeComment(" " + localize("vendor") + ": " + vendor); } if (model) { writeComment(" " + localize("model") + ": " + model); } if (description) { writeComment(" " + localize("description") + ": " + description); } } // dump tool information if (properties.writeTools) { var zRanges = {}; 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 (zRanges[tool.number]) { zRanges[tool.number].expandToRange(zRange); } else { zRanges[tool.number] = zRange; } } } var tools = getToolTable(); if (tools.getNumberOfTools() > 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); } } } // writeBlock(gFormat.format(76)); // 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() { 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(06),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!.")); } if (tool.spindleRPM > 7500) { alert("rpm speed",localize("Spindle speed exceeds maximum value. reduced to 7500 RPM")); tool.spindleRPM=7500; } 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), "B" + xyzFormat.format(r)]; } 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) { // 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 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:01, COMMAND_OPTIONAL_STOP:5 }; function onCommand(command) { 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"); return; // case COMMAND_SPINDLE_COUNTERCLOCKWISE: // not supported // return; case COMMAND_STOP_SPINDLE: 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; } var stringId = getCommandStringId(command); var mcode = mapCommand[stringId]; if (mcode != undefined) { writeBlock(mFormat.format(mcode)); } else { onUnsupportedCommand(command); } } function onSectionEnd() { 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 }