Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.
Showing results for
Show only
|
Search instead for
Did you mean:
This page has been translated for your convenience with an automatic translation service. This is not an official translation and may contain errors and inaccurate translations. Autodesk does not warrant, either expressly or implied, the accuracy, reliability or completeness of the information translated by the machine translation service and will not be liable for damages or losses caused by the trust placed in the translation service.Translate
I would like to see an official post processor as well however I found my own solution today to get the job done in the mean time. I have found/made a post processor which works for my AXYZ router with A2MC controller. I took the post processor provided for the similar Pacer model (found in fusion 360 post processor library) and only had to make a couple changes to get it working. The only changes I had to make were to disable coolant in user-defined properties and then add "M03" to the spindle speed prefix so the spindle will start. Lastly I changed the output format to NC instead of g00.
Code to ignore coolant: (No computer controlled coolant)
// user-defined properties
properties = {
writeMachine: true, // write machine
writeTools: true, // writes the tools
// preloadTool: true, // preloads next tool on tool change if any
showSequenceNumbers: true, // show sequence numbers
sequenceNumberStart: 10, // first sequence number
sequenceNumberIncrement: 1, // increment for sequence numbers
optionalStop: true, // optional stop
outPutCoolant: false, // optional stop
separateWordsWithSpace: true // specifies that the words should be separated with a white space
};
Code to allow spindle speed control: (originally missing "M03" and outputting to NC file as S####)
var sOutput = createVariable({prefix:"M03 S", force:true}, rpmFormat);
Code to change file format to NC:
extension = "NC";
Disclaimer: I have tested this to work on our specific machine only! While this should work for most A2MC AXYZ routers there is no guarantee that it will. Use this information and post processor at your own risk. I recommend running a practice run with a high Z stock offset with your hand on the stop button in case anything goes wrong. Please be safe!
If this helps you please spread the wealth, don't forget to give kudos so others know it helped!
-Chris
Here is the complete code:
/**
Copyright (C) 2012-2015 by Autodesk, Inc.
All rights reserved.
Pacer post processor configuration.
$Revision: 40867 35e2fa0e44311f8ec2402506bd3b1a20330640b2 $
$Date: 2015-10-14 17:29:32 $
FORKID {2FF1FC57-DB38-47aa-B9A5-2AA8E9A8158C}
*/
description = "Pacer";
vendor = "AXYZ International";
vendorUrl = "http://www.axyz.com";
legal = "Copyright (C) 2012-2015 by Autodesk, Inc.";
certificationLevel = 2;
minimumRevision = 24000;
extension = "NC";
programNameIsInteger = true;
setCodePage("ascii");
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
// preloadTool: true, // preloads next tool on tool change if any
showSequenceNumbers: true, // show sequence numbers
sequenceNumberStart: 10, // first sequence number
sequenceNumberIncrement: 1, // increment for sequence numbers
optionalStop: true, // optional stop
outPutCoolant: false, // optional stop
separateWordsWithSpace: true // specifies that the words should be separated with a white space
};
var numberOfToolSlots = 9999;
var mapCoolantTable = new Table(
[9, 8, 7],
{initial:COOLANT_OFF, force:true},
"Invalid coolant mode"
);
var gFormat = createFormat({prefix:"G", decimals:0});
var mFormat = createFormat({prefix:"M", decimals:0});
var xyzFormat = createFormat({decimals:(unit == MM ? 3 : 4)});
var feedFormat = createFormat({decimals:(unit == MM ? 1 : 2)});
var toolFormat = createFormat({decimals:0});
var rpmFormat = createFormat({decimals:0});
var secFormat = createFormat({decimals:3, forceDecimal:true}); // seconds - range 0.001-1000
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:"M03 S", force:true}, rpmFormat);
// circular output
var iOutput = createVariable({prefix:"I"}, xyzFormat);
var jOutput = createVariable({prefix:"J"}, xyzFormat);
var gMotionModal = createModal({}, gFormat); // modal group 1 // G0-G3, ...
var gAbsIncModal = createModal({}, gFormat); // modal group 3 // G90-91
var gUnitModal = createModal({}, gFormat); // modal group 6 // G20-21 or G70-71
var gCycleModal = createModal({}, gFormat); // modal group 9 // G81, ...
// collected state
var sequenceNumber;
/**
Writes the specified block.
*/
function writeBlock() {
if (properties.showSequenceNumbers) {
writeWords2("N" + sequenceNumber, arguments);
sequenceNumber += properties.sequenceNumberIncrement;
} else {
writeWords(arguments);
}
}
function formatComment(text) {
return "(" + String(text).replace(/[\(\)]/g, "") + ")";
}
/**
Output a comment.
*/
function writeComment(text) {
writeln(formatComment(text));
}
function onOpen() {
if (!properties.separateWordsWithSpace) {
setWordSeparator("");
}
sequenceNumber = properties.sequenceNumberStart;
writeln("%");
if (programName) {
var programId;
try {
programId = getAsInt(programName);
} catch(e) {
error(localize("Program name must be a number."));
}
if (!((programId >= 1) && (programId <= 9999))) {
error(localize("Program number is out of range."));
return;
}
var oFormat = createFormat({width:4, zeropad:true, decimals:0});
writeln(":O" + oFormat.format(programId));
} else {
error(localize("Program name has not been specified."));
return;
}
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);
}
}
}
// absolute coordinates and feed per min
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, A, B, C, 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 newWorkPlane = isFirstSection() ||
!isSameDirection(getPreviousSection().getGlobalFinalToolAxis(), currentSection.getGlobalInitialToolAxis());
if (insertToolCall || newWorkPlane) {
// stop spindle before retract during tool change
// if (insertToolCall && !isFirstSection()) {
// onCommand(COMMAND_STOP_SPINDLE);
// }
// retract to safe plane
retracted = true;
writeBlock(gFormat.format(28), gAbsIncModal.format(91), "Z" + xyzFormat.format(0)); // retract
writeBlock(gAbsIncModal.format(90));
zOutput.reset();
}
if (hasParameter("operation-comment")) {
var comment = getParameter("operation-comment");
if (comment) {
writeComment(comment);
}
}
if (insertToolCall) {
retracted = true;
onCommand(COMMAND_COOLANT_OFF);
if (!isFirstSection() && properties.optionalStop) {
onCommand(COMMAND_OPTIONAL_STOP);
}
if (tool.number > numberOfToolSlots) {
warning(localize("Tool number exceeds maximum value."));
}
writeBlock("T" + toolFormat.format(tool.number)/*, mFormat.format(6)*/);
if (tool.comment) {
writeComment(tool.comment);
}
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 (properties.preloadTool) {
var nextTool = getNextTool(tool.number);
if (nextTool) {
writeBlock("T" + toolFormat.format(nextTool.number));
} else {
// preload first tool
var section = getSection(0);
var firstToolNumber = section.getTool().number;
if (tool.number != firstToolNumber) {
writeBlock("T" + toolFormat.format(firstToolNumber));
}
}
}
*/
}
if (insertToolCall ||
isFirstSection() ||
(rpmFormat.areDifferent(tool.spindleRPM, sOutput.getCurrent()))) {
if (tool.spindleRPM < 1) {
error(localize("Spindle speed out of range."));
return;
}
if (tool.spindleRPM > 99999) {
warning(localize("Spindle speed exceeds maximum value."));
}
writeBlock(sOutput.format(tool.spindleRPM)); // spindle starts at program start
}
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);
}
// set coolant after we have positioned at Z
{
var c = mapCoolantTable.lookup(tool.coolant);
if (c) {
writeBlock(mFormat.format(c));
} else {
warning(localize("Coolant not supported."));
}
}
forceAny();
var initialPosition = getFramePosition(currentSection.getInitialPosition());
if (!retracted) {
if (getCurrentPosition().z < initialPosition.z) {
writeBlock(gMotionModal.format(0), zOutput.format(initialPosition.z));
}
}
if (insertToolCall || retracted) {
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 = clamp(0.001, seconds, 99999.999);
writeBlock(gFormat.format(4), "P" + secFormat.format(seconds));
}
function onSpindleSpeed(spindleSpeed) {
writeBlock(sOutput.format(spindleSpeed));
}
function onCycle() {
}
function getCommonCycle(x, y, z, r) {
forceXYZ();
return [xOutput.format(x), yOutput.format(y),
zOutput.format(z),
"R" + xyzFormat.format(r)];
}
function onCyclePoint(x, y, z) {
if (isFirstCyclePoint()) {
repositionToCycleClearance(cycle, x, y, z);
var F = cycle.feedrate;
var P = (cycle.dwell == 0) ? 0 : clamp(0.001, cycle.dwell, 99999.999); // in seconds
switch (cycleType) {
case "drilling":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(81),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
);
break;
case "counter-boring":
if (P > 0) {
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(82),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
);
} else {
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(81),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
);
}
break;
case "deep-drilling":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(83),
getCommonCycle(x, y, z, cycle.retract),
"Q" + xyzFormat.format(cycle.incrementalDepth),
"P" + secFormat.format(P),
feedOutput.format(F)
);
break;
case "reaming":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(85),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
);
break;
case "boring":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(85),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
);
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(_x, _y);
}
}
}
function onCycleEnd() {
if (!cycleExpanded) {
writeBlock(gCycleModal.format(80));
zOutput.reset();
}
}
function onRadiusCompensation() {
if (radiusCompensation != RADIUS_COMPENSATION_OFF) {
error(localize("Radius compensation is not supported."));
}
}
function onRapid(_x, _y, _z) {
var x = xOutput.format(_x);
var y = yOutput.format(_y);
var z = zOutput.format(_z);
if (x || y || z) {
writeBlock(gMotionModal.format(0), x, y, z);
feedOutput.reset();
}
}
function onLinear(_x, _y, _z, feed) {
var x = xOutput.format(_x);
var y = yOutput.format(_y);
var z = zOutput.format(_z);
var f = feedOutput.format(feed);
if (x || y || z) {
writeBlock(gMotionModal.format(1), x, y, z, f);
} else if (f) {
if (getNextRecord().isMotion()) { // try not to output feed without motion
feedOutput.reset(); // force feed on next line
} else {
writeBlock(gMotionModal.format(1), f);
}
}
}
function onCircular(clockwise, cx, cy, cz, x, y, z, feed) {
if (isHelical()) {
linearize(tolerance);
return;
}
switch (getCircularPlane()) {
case PLANE_XY:
writeBlock(gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), iOutput.format(cx), jOutput.format(cy), feedOutput.format(feed));
break;
default:
linearize(tolerance);
}
}
var mapCommand = {
COMMAND_STOP:0,
COMMAND_OPTIONAL_STOP:1,
// COMMAND_STOP_SPINDLE:5, // do not use since we cannot enable spindle again
COMMAND_LOAD_TOOL:6,
COMMAND_COOLANT_ON:8,
COMMAND_COOLANT_OFF:9
};
function onCommand(command) {
switch (command) {
case COMMAND_START_SPINDLE:
// onCommand(tool.clockwise ? COMMAND_SPINDLE_CLOCKWISE : COMMAND_SPINDLE_COUNTERCLOCKWISE);
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_COOLANT_OFF);
writeBlock(gFormat.format(28), gAbsIncModal.format(91), "Z" + xyzFormat.format(0)); // retract
zOutput.reset();
writeBlock(gFormat.format(28)); // return to home
onImpliedCommand(COMMAND_END);
onImpliedCommand(COMMAND_STOP_SPINDLE);
writeBlock(mFormat.format(30)); // stop program, spindle stop, coolant off
writeln("%");
}
Has anyone been using this post for 3D surfacing tool paths? Our axyz router will randomly drop lines of code while 3D surfacing, and I'm trying to pinpoint the exact problem. I've run the same toolpaths on other machines without issue, and the toolpaths look great in Fusion, so the issue is somewhere between the post processor and AMC2 motion controller from what I can see.
I had some troubles with CMCDermi's code, so I played around with the "generic AXYZ" post until it matched a sample that AXYZ provided from Aspire. below is the code I've been using on our AXYZ A2MC 4008 series for a few weeks now without issue.
* note : one issue I did have was using our internal job numbers for the "Program name or number" which led to an issue exceeding some arbitrary numerical limit that Fusion has for that field, as a result, I've just been using 1001 for all program name/numbers to avoid this error. Not totally related, just thought I'd include for anyone having issues getting their new post/router up and running.
/**
Copyright (C) 2012-2018 by Autodesk, Inc.
All rights reserved.
AXYZ post processor configuration.
$Revision: 42145 3ef6ef136f68132df4d932bf16f29ac1ec1b893b $
$Date: 2018-09-28 16:13:20 $
FORKID {56909A11-6573-4922-8519-4E95E0E06197}
*/
description = "AXYZ";
vendor = "AXYZ International";
vendorUrl = "http://www.axyz.com";
legal = "Copyright (C) 2012-2018 by Autodesk, Inc.";
certificationLevel = 2;
minimumRevision = 40783;
longDescription = "Generic milling post for AXYZ CNCs like Pacer.";
extension = "nc";
programNameIsInteger = true;
setCodePage("ascii");
capabilities = CAPABILITY_MILLING;
tolerance = spatial(0.002, MM);
minimumChordLength = spatial(0.25, MM);
minimumCircularRadius = spatial(0.01, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(0.01);
maximumCircularSweep = toRad(90);
allowHelicalMoves = false;
allowedCircularPlanes = (1 << PLANE_XY); // allow XY plane only
// user-defined properties
properties = {
writeMachine: true, // write machine
writeTools: true, // writes the tools
// preloadTool: true, // preloads next tool on tool change if any
showSequenceNumbers: true, // show sequence numbers
sequenceNumberStart: 10, // first sequence number
sequenceNumberIncrement: 10, // increment for sequence numbers
optionalStop: false, // optional stop
separateWordsWithSpace: true, // specifies that the words should be separated with a white space
outputCoolantCommands: false, // specifies to output coolant commands
useM6: true // specifies to use M6 for tool changes
};
// 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"},
//preloadTool: {title:"Preload tool", description:"Preloads the next tool at a tool change (if any).", type:"boolean"},
showSequenceNumbers: {title:"Use sequence numbers", description:"Use sequence numbers for each block of outputted code.", group:1, type:"boolean"},
sequenceNumberStart: {title:"Start sequence number", description:"The number at which to start the sequence numbers.", group:1, type:"integer"},
sequenceNumberIncrement: {title:"Sequence number increment", description:"The amount by which the sequence number is incremented by in each block.", group:1, type:"integer"},
optionalStop: {title:"Optional stop", description:"Outputs optional stop code during when necessary in the code.", type:"boolean"},
separateWordsWithSpace: {title:"Separate words with space", description:"Adds spaces between words if 'yes' is selected.", type:"boolean"},
outputCoolantCommands: {title:"Output coolant commands", description:"Specfies if coolant commands should be used or disabled.", type:"boolean"},
useM6: {title:"Use M6", description:"Specifies if M6 should be used for tool changes.", type:"boolean"}
};
var numberOfToolSlots = 9999;
// samples:
// throughTool: {on: 88, off: 89}
// throughTool: {on: [8, 88], off: [9, 89]}
var coolants = {
flood: {on: 8},
mist: {on: 7},
throughTool: {},
air: {},
airThroughTool: {},
suction: {},
floodMist: {},
floodThroughTool: {},
off: 9
};
var gFormat = createFormat({prefix:"G", decimals:0});
var mFormat = createFormat({prefix:"M", decimals:0});
var xyzFormat = createFormat({decimals:(unit == MM ? 3 : 4)});
var feedFormat = createFormat({decimals:(unit == MM ? 1 : 2)});
var toolFormat = createFormat({decimals:0});
var rpmFormat = createFormat({decimals:0});
var secFormat = createFormat({decimals:3, forceDecimal:true}); // seconds - range 0.001-1000
var taperFormat = createFormat({decimals:1, scale:DEG});
var xOutput = createVariable({prefix:"X"}, xyzFormat);
var yOutput = createVariable({prefix:"Y"}, xyzFormat);
var zOutput = createVariable({onchange:function () {retracted = false;}, prefix:"Z"}, xyzFormat);
var feedOutput = createVariable({prefix:"F"}, feedFormat);
var sOutput = createVariable({prefix:"M3 S", force:true}, rpmFormat);
// circular output
var iOutput = createVariable({prefix:"I"}, xyzFormat);
var jOutput = createVariable({prefix:"J"}, xyzFormat);
var gMotionModal = createModal({}, gFormat); // modal group 1 // G0-G3, ...
var gAbsIncModal = createModal({}, gFormat); // modal group 3 // G90-91
var gUnitModal = createModal({}, gFormat); // modal group 6 // G20-21 or G70-71
var gCycleModal = createModal({}, gFormat); // modal group 9 // G81, ...
// collected state
var sequenceNumber;
var retracted = false; // specifies that the tool has been retracted to the safe plane
/**
Writes the specified block.
*/
function writeBlock() {
if (!formatWords(arguments)) {
return;
}
if (properties.showSequenceNumbers) {
writeWords2("N" + sequenceNumber, arguments);
sequenceNumber += properties.sequenceNumberIncrement;
} else {
writeWords(arguments);
}
}
function formatComment(text) {
return "(" + String(text).replace(/[()]/g, "") + ")";
}
/**
Output a comment.
*/
function writeComment(text) {
writeln(formatComment(text));
}
function onOpen() {
if (!properties.separateWordsWithSpace) {
setWordSeparator("");
}
sequenceNumber = properties.sequenceNumberStart;
writeln("%");
if (programName) {
var programId;
try {
programId = getAsInt(programName);
} catch(e) {
error(localize("Program name must be a number."));
}
if (!((programId >= 1) && (programId <= 9999))) {
error(localize("Program number is out of range."));
return;
}
var oFormat = createFormat({width:4, zeropad:true, decimals:0});
writeln(":O" + oFormat.format(programId));
} else {
error(localize("Program name has not been specified."));
return;
}
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);
}
}
}
// absolute coordinates and feed per min
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, A, B, C, and F on next output. */
function forceAny() {
forceXYZ();
feedOutput.reset();
}
function isProbeOperation() {
return hasParameter("operation-strategy") && (getParameter("operation-strategy") == "probe");
}
function onSection() {
var insertToolCall = isFirstSection() ||
currentSection.getForceToolChange && currentSection.getForceToolChange() ||
(tool.number != getPreviousSection().getTool().number);
retracted = false;
var newWorkPlane = isFirstSection() ||
!isSameDirection(getPreviousSection().getGlobalFinalToolAxis(), currentSection.getGlobalInitialToolAxis()) ||
(currentSection.isOptimizedForMachine() && getPreviousSection().isOptimizedForMachine() &&
Vector.diff(getPreviousSection().getFinalToolAxisABC(), currentSection.getInitialToolAxisABC()).length > 1e-4) ||
(!machineConfiguration.isMultiAxisConfiguration() && currentSection.isMultiAxis()) ||
(!getPreviousSection().isMultiAxis() && currentSection.isMultiAxis() ||
getPreviousSection().isMultiAxis() && !currentSection.isMultiAxis()); // force newWorkPlane between indexing and simultaneous operations
if (insertToolCall || newWorkPlane) {
// stop spindle before retract during tool change
// if (insertToolCall && !isFirstSection()) {
// onCommand(COMMAND_STOP_SPINDLE);
// }
// retract to safe plane
writeRetract(Z);
zOutput.reset();
}
if (hasParameter("operation-comment")) {
var comment = getParameter("operation-comment");
if (comment) {
writeComment(comment);
}
}
if (insertToolCall) {
setCoolant(COOLANT_OFF);
if (!isFirstSection() && properties.optionalStop) {
onCommand(COMMAND_OPTIONAL_STOP);
}
if (tool.number > numberOfToolSlots) {
warning(localize("Tool number exceeds maximum value."));
}
writeBlock(conditional(properties.useM6, mFormat.format(6)),"T" + toolFormat.format(tool.number));
if (tool.comment) {
writeComment(tool.comment);
}
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 (properties.preloadTool) {
var nextTool = getNextTool(tool.number);
if (nextTool) {
writeBlock("T" + toolFormat.format(nextTool.number));
} else {
// preload first tool
var section = getSection(0);
var firstToolNumber = section.getTool().number;
if (tool.number != firstToolNumber) {
writeBlock("T" + toolFormat.format(firstToolNumber));
}
}
}
*/
}
if (insertToolCall ||
isFirstSection() ||
(rpmFormat.areDifferent(spindleSpeed, sOutput.getCurrent()))) {
if (spindleSpeed < 1) {
error(localize("Spindle speed out of range."));
return;
}
if (spindleSpeed > 99999) {
warning(localize("Spindle speed exceeds maximum value."));
}
writeBlock(sOutput.format(spindleSpeed));
}
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);
}
// set coolant after we have positioned at Z
setCoolant(tool.coolant);
forceAny();
var initialPosition = getFramePosition(currentSection.getInitialPosition());
if (!retracted && !insertToolCall) {
if (getCurrentPosition().z < initialPosition.z) {
writeBlock(gMotionModal.format(0), zOutput.format(initialPosition.z));
}
}
if (insertToolCall || retracted) {
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 = clamp(0.001, seconds, 99999.999);
writeBlock(gFormat.format(4), "P" + secFormat.format(seconds));
}
function onSpindleSpeed(spindleSpeed) {
writeBlock(sOutput.format(spindleSpeed));
}
function onCycle() {
}
function getCommonCycle(x, y, z, r) {
forceXYZ();
return [xOutput.format(x), yOutput.format(y),
zOutput.format(z),
"R" + xyzFormat.format(r)];
}
function onCyclePoint(x, y, z) {
expandCyclePoint(x, y, z);
return;
if (!isSameDirection(getRotation().forward, new Vector(0, 0, 1))) {
expandCyclePoint(x, y, z);
return;
}
if (isFirstCyclePoint()) {
repositionToCycleClearance(cycle, x, y, z);
expandCyclePoint(x, y, z);
return;
var F = cycle.feedrate;
var P = !cycle.dwell ? 0 : clamp(0.001, cycle.dwell, 99999.999); // in seconds
switch (cycleType) {
case "drilling":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(81),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
);
break;
case "counter-boring":
if (P > 0) {
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(82),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
);
} else {
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(81),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
);
}
break;
case "deep-drilling":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(83),
getCommonCycle(x, y, z, cycle.retract),
"Q" + xyzFormat.format(cycle.incrementalDepth),
"P" + secFormat.format(P),
feedOutput.format(F)
);
break;
case "reaming":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(85),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
);
break;
case "boring":
writeBlock(
gAbsIncModal.format(90), gCycleModal.format(85),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
);
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(_x, _y);
}
}
}
function onCycleEnd() {
if (!cycleExpanded) {
writeBlock(gCycleModal.format(80));
zOutput.reset();
}
}
function onRadiusCompensation() {
if (radiusCompensation != RADIUS_COMPENSATION_OFF) {
error(localize("Radius compensation is not supported."));
}
}
function onRapid(_x, _y, _z) {
var x = xOutput.format(_x);
var y = yOutput.format(_y);
var z = zOutput.format(_z);
if (x || y || z) {
writeBlock(gMotionModal.format(0), x, y, z);
feedOutput.reset();
}
}
function onLinear(_x, _y, _z, feed) {
var x = xOutput.format(_x);
var y = yOutput.format(_y);
var z = zOutput.format(_z);
var f = feedOutput.format(feed);
if (x || y || z) {
writeBlock(gMotionModal.format(1), x, y, z, f);
} else if (f) {
if (getNextRecord().isMotion()) { // try not to output feed without motion
feedOutput.reset(); // force feed on next line
} else {
writeBlock(gMotionModal.format(1), f);
}
}
}
function onCircular(clockwise, cx, cy, cz, x, y, z, feed) {
if (isHelical()) {
linearize(tolerance);
return;
}
switch (getCircularPlane()) {
case PLANE_XY:
writeBlock(gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), iOutput.format(cx), jOutput.format(cy), feedOutput.format(feed));
break;
default:
linearize(tolerance);
}
}
var currentCoolantMode = undefined;
var coolantOff = undefined;
function setCoolant(coolant) {
if (!properties.outputCoolantCommands) {
return undefined;
}
var coolantCodes = getCoolantCodes(coolant);
if (Array.isArray(coolantCodes)) {
for (var c in coolantCodes) {
writeBlock(coolantCodes[c]);
}
return undefined;
}
return coolantCodes;
}
function getCoolantCodes(coolant) {
if (!coolants) {
error(localize("Coolants have not been defined."));
}
if (!coolantOff) { // use the default coolant off command when an 'off' value is not specified for the previous coolant mode
coolantOff = coolants.off;
}
if (isProbeOperation()) { // avoid coolant output for probing
coolant = COOLANT_OFF;
}
if (coolant == currentCoolantMode) {
return undefined; // coolant is already active
}
var multipleCoolantBlocks = new Array(); // create a formatted array to be passed into the outputted line
if ((coolant != COOLANT_OFF) && (currentCoolantMode != COOLANT_OFF)) {
multipleCoolantBlocks.push(mFormat.format(coolantOff));
}
var m;
if (coolant == COOLANT_OFF) {
m = coolantOff;
coolantOff = coolants.off;
}
switch (coolant) {
case COOLANT_FLOOD:
if (!coolants.flood) {
break;
}
m = coolants.flood.on;
coolantOff = coolants.flood.off;
break;
case COOLANT_THROUGH_TOOL:
if (!coolants.throughTool) {
break;
}
m = coolants.throughTool.on;
coolantOff = coolants.throughTool.off;
break;
case COOLANT_AIR:
if (!coolants.air) {
break;
}
m = coolants.air.on;
coolantOff = coolants.air.off;
break;
case COOLANT_AIR_THROUGH_TOOL:
if (!coolants.airThroughTool) {
break;
}
m = coolants.airThroughTool.on;
coolantOff = coolants.airThroughTool.off;
break;
case COOLANT_FLOOD_MIST:
if (!coolants.floodMist) {
break;
}
m = coolants.floodMist.on;
coolantOff = coolants.floodMist.off;
break;
case COOLANT_MIST:
if (!coolants.mist) {
break;
}
m = coolants.mist.on;
coolantOff = coolants.mist.off;
break;
case COOLANT_SUCTION:
if (!coolants.suction) {
break;
}
m = coolants.suction.on;
coolantOff = coolants.suction.off;
break;
case COOLANT_FLOOD_THROUGH_TOOL:
if (!coolants.floodThroughTool) {
break;
}
m = coolants.floodThroughTool.on;
coolantOff = coolants.floodThroughTool.off;
break;
}
if (!m) {
onUnsupportedCoolant(coolant);
m = 9;
}
if (m) {
if (Array.isArray(m)) {
for (var i in m) {
multipleCoolantBlocks.push(mFormat.format(m[i]));
}
} else {
multipleCoolantBlocks.push(mFormat.format(m));
}
currentCoolantMode = coolant;
return multipleCoolantBlocks; // return the single formatted coolant value
}
return undefined;
}
var mapCommand = {
COMMAND_STOP:0,
COMMAND_OPTIONAL_STOP:1,
// COMMAND_STOP_SPINDLE:5, // do not use since we cannot enable spindle again
COMMAND_LOAD_TOOL:6
};
function onCommand(command) {
switch (command) {
case COMMAND_START_SPINDLE:
// onCommand(tool.clockwise ? COMMAND_SPINDLE_CLOCKWISE : COMMAND_SPINDLE_COUNTERCLOCKWISE);
return;
}
var stringId = getCommandStringId(command);
var mcode = mapCommand[stringId];
if (mcode != undefined) {
writeBlock(mFormat.format(mcode));
} else {
onUnsupportedCommand(command);
}
}
function onSectionEnd() {
forceAny();
}
/** Output block to do safe retract and/or move to home position. */
function writeRetract() {
if (arguments.length == 0) {
error(localize("No axis specified for writeRetract()."));
return;
}
var words = []; // store all retracted axes in an array
for (var i = 0; i < arguments.length; ++i) {
let instances = 0; // checks for duplicate retract calls
for (var j = 0; j < arguments.length; ++j) {
if (arguments[i] == arguments[j]) {
++instances;
}
}
if (instances > 1) { // error if there are multiple retract calls for the same axis
error(localize("Cannot retract the same axis twice in one line"));
return;
}
switch (arguments[i]) {
case X:
words.push("X" + xyzFormat.format(machineConfiguration.hasHomePositionX() ? machineConfiguration.getHomePositionX() : 0));
break;
case Y:
words.push("Y" + xyzFormat.format(machineConfiguration.hasHomePositionY() ? machineConfiguration.getHomePositionY() : 0));
break;
case Z:
words.push("Z" + xyzFormat.format(machineConfiguration.getRetractPlane()));
retracted = true; // specifies that the tool has been retracted to the safe plane
break;
default:
error(localize("Bad axis specified for writeRetract()."));
return;
}
}
if (words.length > 0) {
gMotionModal.reset();
gAbsIncModal.reset(); //commenting incremental line
// writeBlock(gFormat.format(28), gAbsIncModal.format(91), words)
writeBlock(gAbsIncModal.format(90));
}
zOutput.reset();
}
function onClose() {
setCoolant(COOLANT_OFF);
writeRetract(Z);
writeBlock(gFormat.format(28)); // return to home
onImpliedCommand(COMMAND_END);
onImpliedCommand(COMMAND_STOP_SPINDLE);
writeBlock(mFormat.format(30)); // stop program, spindle stop, coolant off
writeln("%");
}
Hi There, Yes it would be good to get an official Post Processor for the A2MC Controller.
I have tried the OP's version and it worked fine for me. Drilling, Pocketing etc. The drilling wasnt recognised as a shape by the Controller however, so if you had to stop part way through the program, you would have to go through it all again. It did however recognise the pockets, as individuals, so I could pause it and come back to it the next day.
Very Helpful.
One tip, which may be obvious to some, but coming from an AXYZ machine, I believe it has a software limit near Z-5mm. This is possibly because it wants to stop you going through the sacrificial boards commonlty used with Vac-Table Routers. This means when you model, your origin needs to be on the bottom of your job (ie most geometry is positive Z-Values.) This seems foreign to me coming from a traditional CNC Machine background, but is a simply modification when setting up your jobs. You can then use the heights section to set your bottom to Origin less 1mm if you need to go right through. Bit of fiddling, but it worked eventually.
Many Thanks to the OP, Id have hit a wall this week without that Post Proccessor!! Muchos Gracias!!