Bravo John! That was not only the best description I've read of EMC's workings but also one of the more thoughtful and well constructed rants I've heard on this or any other forums. As my own rant I have to say that I've shaken my head several times after reading some of the demanding posts lately. I am a "noobie" at this but I'm astounded at the functionality of this free software as well as the level of support available from its developers and users. The biggest limitations I've encountered thus far are my own. It's my hope to continue to learn and become a contributor to this wonderful software myself.
________________________________ From: John Kasunich <jmkasun...@fastmail.fm> To: Enhanced Machine Controller (EMC) <emc-users@lists.sourceforge.net> Sent: Mon, May 17, 2010 1:50:44 AM Subject: Re: [Emc-users] Jog under PAUSE / tool cnange On Mon, 17 May 2010 02:40 +0100, "Steve Blackmore" <st...@pilotltd.net> wrote: > look at the wiki page, nobody is asking that it works during > macros, canned cycles, loops or any other excuse that can be > made to not implement it. How about this excuse: (Note: to understand this, you will have to think like a developer for a while. That means you need to understand the basic internal architecture of EMC2, and you need to think in detail about how to implement what you want, not just what you want the machine to do.) First: Basic EMC2 architecture. EMC consists of several levels. From the top down, it goes GUI, Interpreter, Motion Controller, HAL. (I'm leaving out a lot, but this is still going to be too long, so forgive any oversimplification.) The first two levels are normal "user space" programs. Like all normal programs, they are at the mercy of the operating system and any other programs that are running at the same time. When the computer gets busy, regular programs temporarily stop or slow down while the operating system or another program does something else. Everybody has experienced that with everyday programs. You click on something that normally happens instantly, but it takes a half-second or a couple of seconds instead. That kind of thing happens all the time, usually for a tenth of a second, or a hundredth, and you never notice, but it is there. Not a big deal with normal computer programs, and not even a big deal for the GUI of a machine tool. But not acceptable for the low-level motion control. To avoid this problem, EMC runs the motion controller (and HAL) as realtime processes. When a realtime process is configured to run every 1000th of a second, that is exactly what you get, no matter how busy the rest of the computer gets. (There is still a small amount of variation, measured in microseconds, but we're ignoring that). The motion controller runs 1000 times a second. Most of the time, all it does is calculate a new position a little farther along the line or arc described by the current line of g-code. But sooner or later that line or arc ends, and a new one starts. When that happens, the info about the next line of g-code MUST be available. That info comes from the g-code interpreter. But what if the interpreter happens to be right in the middle of a 1/10 second delay? EMC solves this problem with the motion queue. The queue holds a couple hundred motions (lines, arcs, etc). The interpreter runs as fast as it can, turning g-code into simple motions and putting them in the queue. The motion controller takes them out of the queue and moves the tool. What this means is that the interpreter is usually many lines ahead of the motion controller. The interpreter applies work offsets to each move. It translates units from whatever the program uses (inches or mm) to machine units. It applies cutter compensation and tool length offset. It breaks canned cycles down into individual lines and arcs. After doing all of that, it puts the lines and arcs into the motion queue. The motion controller pulls lines and arcs out of the queue and makes the tool move along that path. A particular line or arc might sit in the queue for a couple tenths of a second, if you have a program that consists of many short moves. It also might be in the queue for minutes or even hours, if the program has very long, very slow moves. A short program can be completely interpreted and in the queue before the tool ever touches metal. All of the above information is background - a very simplified version of what happens as EMC runs a program, just enough to explain what the motion queue is and why we have it. Now lets think about implementing "pause/jog/run". Steve has put his thoughts into the wiki page at http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?ManualWhilePaused He says "EMC need only remember the axis positions it stopped at and on resume should always do a combined move back to that position." So, how can we do that? I assume he doesn't want to wait till the end of a line or arc to stop. If the tool breaks or swarf wraps 1 inch into a 10 inch long cut, you need to stop now. So that means we MUST do this in the motion controller, since the interpreter simply queues up complete moves and doesn't know anything about the middle of a move. It might be practical to implement pause/jog/resume entirely in the motion controller. Jogging is currently done there, so it isn't out of the question for the controller to remember the current position, let you jog away, then do a move back to the remembered position. There are plenty of messy details, but no fundamental problems - as long as ALL you want to do is jog. Steve also writes: "The only requirements are to jog, toggle spindle and coolant on/off and touch off current tool. MDI may be useful to allow accurate axis positioning." Already said jogs can probably be done. Next is spindle and coolant. Normally, when the interpreter encounters a spindle state change (on/off/speed) or a coolant change (on/off), it stops queuing movement commands. When the motion controller finishes processing all the moves in the queue, the interpreter see that, sends the spindle or coolant command, and starts queuing motions again. We refer to such events as "queue busters". (And as an aside, the fact that spindle speed changes are queue busters might explain why the guy who is trying to change laser intensity on the fly with S words sees motion pause briefly for each change.) So - here we are, with the motion controller paused in the middle of an arc, and another 2 or 20 or 200 lines and/or arcs sitting in the queue. We can't wait for the queue to empty, because it won't. So we need another method to get the spindle and coolant commands to the motion controller. This is not impossible, but it adds complexity and might introduce bugs - when you have two channels that can send commands to the motion controller, you need to carefully coordinate them to make sure the controller is listening to the right one at the right time. Let's assume that we can deal with all those nasty details - spindle and coolant control is possible, just tricky. Next on the requirements list is touch-off. Here it gets very nasty. Touch-off changes a coordinate system offset. But the interpreter applies offsets before any line or arc goes into the motion queue. When we stopped the motion controller, there were still 2 or 20 or 200 lines and arcs in the queue using the old offsets. Those motions will happen after we resume with the new tool, so they will be wrong. We must throw away all the queued motions, back the interpreter up, and re-queue with the new offsets. This is NOT just a matter of nasty details. There are fundamental problems with "backing up" the interpreter. You can't just hand-wave away the complexity of canned cycles, subroutines, etc. for this problem. Just because you paused in the middle of a very ordinary move doesn't mean that the queue doesn't contain motions that were part of a canned cycle that happens later in the program. You have absolutely no control over what got discarded from the queue. After the touch-off requirement, Steve said that MDI "may be useful". Consider that MDI uses the exact same interpreter as normal program execution. If you've ever noticed that you can type several lines of MDI while the first one is running, that is because MDI lines are interpreted and stuffed into the motion queue just like regular lines. So, to do MDI we not only have to throw away every programmed motion that is in the queue, we also have to use the interpreter to process the MDI commands. That means that any of the internal data used by the interpreter might change as the operator uses MDI. This makes it even harder to "back up" the interpreter when it is time to resume the g-code program. The above is simple facts about how EMC works, and some of the reasons why what you want is somewhere between "very hard" and "impossible". It took me over an hour to think it through and write it up, and I've barely scratched the surface of the problem. Although I've contributed thousands of lines of code to EMC2, I'm mostly focused on HAL and the motion controller, and I don't know enough about the interpreter to understand all the issues involved in this feature. It would take several more hours and input from other programmers before I could even begin to estimate the amount of work needed, or have any confidence that all "show-stopper" issues have been identified. Now we get to the reason I spent the time writing the above. Warning, this is a rant: > No new features get "developed" unless one of them > (the developers) wants it for himself. There is a lot of truth to this. You seem to have a problem with the idea, but it is fundamental to free software. In a business, the customers wave money and say what they want, the employees do the work, and the bosses hope that they can get more from the customers than they have to pay the employees. That is how they make a profit. In an open source project, there are no bosses and no profit. The customers do not wave money and the "employees" don't get paychecks. At first glance, there is no reason it should work at all. Why should programmers spend thousands of hours thinking through complex technical issues and writing and debugging tens of thousands of lines of code, for nothing? But it does work. It works because programming can be fun. It works because some programmers are craftsmen who get satisfaction from creating something that they can be proud of. It works because some programmers simply like to make people happy. It works best when the programmers are also the customers. They don't have to wave money at themselves - they just write the code to do what they need. Sometimes they know it will be easy, and just do it. Sometimes they know it will be hard, but they want it bad enough to do it anyway. Sometimes they think it will be easy, but it winds up hard. In business, those are the projects that get canceled due to cost overruns. In free software, the boss is also the programmer is also the customer, and if he wants it bad enough it happens in spite of "overruns". So yes - most features get developed when a developer wants that feature for himself. Such is life. > Where do these features come from, who is tasked to > write them This is not a business, where programmers are paid to do whatever the boss wants done. You don't "task" free software developers, you ask them. They will do the work because they want to make you happy, or because they consider the feature a technically "elegant" addition to the program, or because it is fun, or for whatever other reason motivates them to contribute to the project. In a business, nothing gets done unless it is expected to be profitable, and that means having a good idea of exactly what the job is going to cost. You wouldn't quote a machining job until you sit down and estimate the cost of doing it. Now imagine a customer who cannot do the work himself, does not have a good understanding of exactly how much work is needed, refers to the opinions of those are familiar with the type of work as "excuses", and suggests that they don't know much about the "real world". Would you as a business owner want to serve this customer? > Discussing would be a start! Consider the first 2/3 of this message my contribution to the discussion. The last third is a rant - I'll freely admit that. But I don't think the discussion can be useful unless everyone involved understands what motivates people to work on free software. Feel free to chop the last part, and reply to the technical issues - they are the issues that need to be solved if this feature is ever going to happen. John Kasunich -- John Kasunich jmkasun...@fastmail.fm ------------------------------------------------------------------------------ _______________________________________________ Emc-users mailing list Emc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/emc-users ------------------------------------------------------------------------------ _______________________________________________ Emc-users mailing list Emc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/emc-users