LinuxCNC (formerly Enhanced Machine Controller or EMC2) is a free, open-source Linux software system that implements numerical control capability using general purpose computers to control CNC machines. Designed by various volunteer developers at linuxcnc.org, it is typically bundled as an ISO file with a modified version of 32-bit Ubuntu Linux which provides the required real-time kernel.
Due to the tight real-time operating system integration, a standard Ubuntu Linux desktop PC without the real-time kernel will only run the package in demo mode.
LinuxCNC is a software system for numerical control of machines such as milling machines, lathes, plasma cutters, routers, cutting machines, robots and hexapods. It can control up to 9 axes or joints of a CNC machine using G-code (RS-274NGC) as input. It has several GUIs suited to specific kinds of usage (touch screen, interactive development).
Currently it is almost exclusively used on x86 PC platforms, but has been ported to other architectures. It makes extensive use of a real time-modified kernel, and supports both stepper- and servo-type drives.
It does not provide drawing (CAD - Computer Aided Design) or G-code generation from the drawing (CAM - Computer Automated Manufacturing) functions.
The EMC Public Domain software system was originally developed by NIST, as the next step beyond the National Center for Manufacturing Sciences / Air Force sponsored Next Generation Controller Program[NGC 1989] /Specification for an Open Systems Architecture[SOSAS]. It was called the EMC [Enhanced Machine Controller Architecture 1993]. Government sponsored Public Domain software systems for the control of milling machines were among the first projects developed with the digital computer in the 1950s. It was to be a "vendor-neutral" reference implementation of the industry standard language for numerical control of machining operations, RS-274D (G-code).
The software included the RS274 interpreter driving the motion trajectory planner, real-time motor/actuator drivers and a user interface. It demonstrated the feasibility of an advanced numerical control system using off the shelf PC hardware running FreeBSD or Linux, interfacing to various hardware motion control systems. Additional development continues using current and additional architectures (e.g. ARM architecture devices).
The demonstration project was very successful and created a community of users and volunteer contributors. Around June 2000, NIST relocated the source code to SourceForge under the Public Domain license in order to allow external contributors to make changes. In 2003, the community rewrote some parts of it, reorganized and simplified other parts, then gave it the new name, EMC2. EMC2 is still being actively developed. Licensing is now under the GNU General Public License.
The adoption of the new name EMC2 was prompted by several major changes. Primarily, a new layer known as HAL (Hardware Abstraction layer) was introduced to interconnect functions easily without altering C code or recompiling. This split trajectory and motion planning from motion hardware, making it easier to generate control programs to support gantry machine, lathe threading and rigid tapping, SCARA robot arms and a variety of other adaptations. HAL comes with some interactive tools to examine signals and connect and remove links. It also includes a virtual oscilloscope to examine signals in real time. Another change with EMC2 is Classic Ladder, (an open-source ladder logic implementation) adapted for the real time environment to configure complex auxiliary devices like automatic tool changers.
Around 2011, the name was changed officially from EMC2 to LinuxCNC. This was done at the insistence of EMC Corporation and the agreement of the project leadership. Internally some refer to LinuxCNC by EMC or EMC2 as it was historically known. EMC Corporation proposed that the LinuxCNC project, as previously named, would be confusing for customers or potential customers with their (mainly) storage related products.
Due to the need of fine grained, precise real-time control of machines, LinuxCNC requires a platform with real-time computing capabilities. Early versions of LinuxCNC (EMC) ran under a real-time version of Windows NT, but later version of Windows did not have good real-time support so Linux with real-time extensions became the preferred platform. Currently LinuxCNC uses the RTAI kernel or PREEMPT-RT with LinuxCNC's 'uspace' flavour of the RTAPI.
Installing LinuxCNC and the underlying real-time kernel patches on a base Linux system can be a daunting task. Paul Corner came to the rescue with the BDI (Brain Dead Install) which was a CD from which a complete working system (Linux, real-time patches, and LinuxCNC) could be installed. This made LinuxCNC accessible to a much larger user community. Today Paul's BDI has evolved into a bootable (live) ISO that can be burned to a CD or USB and run on most any PC style computer to test drive LinuxCNC without having to install the system. Bootable LinuxCNC ISOs are available for Debian wheezy (RTAI kernel) and Debian stretch (RT-PREEMPT kernel).
LinuxCNC uses the model of 'sense, plan, act' in its interactions with hardware. For instance, it reads the current axis position, calculates a new target position/voltage, and then writes that to the hardware. There is no buffering of commands nor are externally initiated reads or writes allowed. This no-buffering approach gives the most freedom to adding or changing capabilities of LinuxCNC. By using relatively "dumb" external hardware and programming the capabilities in the host computer, LinuxCNC is not locked to any one piece of hardware. It also allows an interested user to easily change behaviour/capabilities/hardware.
This model tends to lend itself to specific types of external interfaces---PCI, PCIE, Parallel port (in SPP or EPP mode), ISA, and Ethernet have been used for motor control. USB and RS232 serial are not good candidates; USB having bad realtime capabilities and RS232 being too slow for motor control.
LinuxCNC has basic "realtime" requirements because of this model. The interval between reading and writing must be consistent and reasonably fast. A typical machine does realtime calculations in a 1 millisecond repeating thread. The reading and writing to hardware must be a small part of this time, e.g. 200 microseconds, otherwise the phase shift makes tuning more difficult and there is less time available for the non-realtime programs, which may make the screen controls less responsive.
LinuxCNC "employs a trapezoidal velocity profile generator."
LinuxCNC uses a software layer called HAL (Hardware Abstraction Layer).
HAL allows a multitude of configurations to be built  while being flexible: one can mix & match various hardware control boards, output control signals through the parallel port or serial port - while driving stepper or servo motors, solenoids and other actuators.
LinuxCNC also includes a software programmable logic controller (PLC) which is usually used in extensive configurations (such as complex machining centres). The software PLC is based on the open source project Classicladder, and runs within the real-time environment.
- Machinekit, an open source project to port and extend EMC2/LinuxCNC to run efficiently on the BeagleBone and related hardware.
- "EMC History". Linuxcnc Board of Directors. September 12, 2018. Retrieved 2018-09-14.
- "EMC History". Linuxcnc Board of Directors. September 12, 2018. Retrieved 2018-09-14.
- "Getting LinuxCNC". linuxcnc.org. February 19, 2018. Retrieved 2018-09-14.
- "Linuxcnc hardware design requirements".
- "Simple Tp Notes".
- "EMC2's Hardware Abstraction Layer". Linuxcnc Board of Directors. Retrieved 2010-09-30.
- "A couple case studies". Retrieved 2010-09-30.
- "ClassicLadder". Retrieved 2014-03-06.
- Proctor, F. M., and Michaloski, J., "Enhanced Machine Controller Architecture Overview," NIST Internal Report 5331, December 1993. Available online at ftp://18.104.22.168/pub/NISTIR_5331.pdf[permanent dead link]
- Albus, J.S.; Lumia, R. (1994). "The Enhanced Machine Controller (EMC): An Open Architecture Controller for Machine Tools". Journal of Manufacturing Review. 7 (3): 278–280.
- Lumia, "The Enhanced Machine Controller Architecture", 5th International Symposium on Robotics and Manufacturing, Maui, HI, August 14–18, 1994, https://www.nist.gov/customcf/get_pdf.cfm?pub_id=820483
- Fred Proctor et al., "Simulation and Implementation of an Open Architecture Controller", Simulation, and Control Technologies for Manufacturing, Volume 2596, Proceedings of the SPIE, October 1995, https://web.archive.org/web/20100527174141/http://www.isd.mel.nist.gov/documents/proctor/sim/sim.html
- Fred Proctor, John Michaloski, Will Shackleford, and Sandor Szabo, "Validation of Standard Interfaces for Machine Control", Intelligent Automation and Soft Computing: Trends in Research, Development, and Applications, Volume 2, TSI Press, Albuquerque, NM, 1996, https://web.archive.org/web/20100527165142/http://www.isd.mel.nist.gov/documents/proctor/isram96/isram96.html
- Shackleford and Proctor, "Use of open source distribution for a Machine tool Controller", Sensors and controls for intelligent manufacturing. Conference, Boston MA, 2001, vol. 4191, pp. 19–30, https://web.archive.org/web/20100820224129/http://www.isd.mel.nist.gov/documents/shackleford/4191_05.pdf or doi:10.1117/12.417244
- Morar et al., "ON THE POSSIBILITY OF IMPROVING THE WIND GENERATORS", International Conference on Economic Engineering and Manufacturing Systems, Brasov, 25–26 October 2007, https://web.archive.org/web/20120313054238/http://www.recentonline.ro/021/Morar_L_01a.pdf
- Zhang et al., "Development of EMC2 CNC Based on Qt", Manufacturing Technology & Machine Tool, 2008, http://en.cnki.com.cn/Article_en/CJFDTOTAL-ZJYC200802046.htm
- Leto et al., "CAD/CAM INTEGRATION FOR NURBS PATH INTERPOLATION ON PC BASED REAL-TIME NUMERICAL CONTROL", 8th INTERNATIONAL CONFERENCE ON ADVANCED MANUFACTURING SYSTEMS AND TECHNOLOGY JUNE 12–13, 2008 UNIVERSITY OF UDINE - ITALY, https://web.archive.org/web/20110703113248/http://22.214.171.124/amst08/papers/art837759.pdf
- Xu et al., "Mechanism and Application of HAL in the EMC2", Modern Manufacturing Technology and Equipment 2009–05, http://en.cnki.com.cn/Article_en/CJFDTOTAL-SDJI200905037.htm
- Zivanovic et al., "Methodology for Configuring Desktop 3-axis Parallel Kinematic Machine"[permanent dead link], FME Transactions (2009) 37, 107–115,
- Glavonjic; et al. (2009). "Desktop 3-axis parallel kinematic milling machine". The International Journal of Advanced Manufacturing Technology. 46 (1–4): 51–60. doi:10.1007/s00170-009-2070-3. S2CID 60640709.
- Staroveski et al., "IMPLEMENTATION OF A LINUX-BASED CNC OPEN CONTROL SYSTEM", 12th INTERNATIONAL SCIENTIFIC CONFERENCE ON PRODUCTION ENGINEERING –CIM2009, Croatian Association of Production Engineering, Zagreb 2009,
- Li et al., "Control system design and simulation of parallel kinematic machine based on EMC2", Machinery Design & Manufacture 2010–08, http://en.cnki.com.cn/Article_en/CJFDTOTAL-JSYZ201008074.htm
- Li; et al. (2010). "Kinematics Analysis and Control System Design of 6-DOF Parallel Kinematic Machine with Matlab and EMC2". Advanced Materials Research. 102–104: 363–367. doi:10.4028/www.scientific.net/AMR.102-104.363. S2CID 62700779.
- Klancnik et al., "Computer-Based Workpiece Detection on CNC Milling Machine Tools Using Optical Camera and Neural Networks", Advances in Production Engineering & Management 5 (2010) 1, 59–68, 
- Milutinovic; et al. (2010). "Reconfigurable robotic machining system controlled and programmed in a machine tool manner". The International Journal of Advanced Manufacturing Technology. 55 (9–12): 555. doi:10.1007/s00170-010-2888-8. S2CID 109149203.