PLC + LinuxCNC for industrial machine with simple HMI (non-G-code operators)

More
02 Feb 2026 23:39 #342332 by NWE

@NWE
Thanks for the explanation. In our case, the PLC cannot be a “drive-by-wire” remote control for LinuxCNC. The PLC must be the authority of machine state, sequencing, and safety, independent of the PC. LinuxCNC is treated as a subordinate motion controller, similar to how a PLC supervises an industrial robot controller.

That is the key architectural requirement we are trying to address.

I meant the other way around. PLC driving linuxcnc

Please Log in or Create an account to join the conversation.

  • Marcos DC
  • Marcos DC's Avatar Topic Author
  • Away
  • Junior Member
  • Junior Member
More
03 Feb 2026 00:17 #342333 by Marcos DC
@NWE

Thanks — that clears it up. I now understand that you meant the PLC driving LinuxCNC, not LinuxCNC driving the PLC.
That is exactly the architecture we are aiming for: PLC as the authority for machine state, sequencing, and operator workflow, with LinuxCNC acting as a subordinate motion controller responsible for trajectory planning, interpolation, and coordinated motion.

Where we are still looking for practical guidance is the shape of the interface between the PLC and LinuxCNC — in other words, what has proven to be a clean, maintainable, industrial-friendly command/status boundary without turning into a large custom integration project.

From your experience, do you see this working best as:

Discrete I/O + handshaking
(cycle start, feed hold, abort/reset, mode select, jog enable, plus status bits like ready/running/done/fault), with parameters passed via registers; or

A fieldbus/protocol approach
(e.g. EtherCAT, Modbus TCP/RTU, etc.) with a defined command/status register map.

For safety, we fully agree with your description: E-stop, STO, door interlocks, and power isolation are all handled by dedicated hardwired safety hardware, independent of both PLC and LinuxCNC. Software only receives “safety OK / safety tripped” status and never has authority to energize the safety chain.

If you have examples of a minimal but robust command/status block that has worked well for you (which bits/words you expose, how you handle “busy/done/fault”, parameter latching, etc.), that would be extremely helpful.

Please Log in or Create an account to join the conversation.

  • Marcos DC
  • Marcos DC's Avatar Topic Author
  • Away
  • Junior Member
  • Junior Member
More
03 Feb 2026 00:35 - 03 Feb 2026 00:36 #342334 by Marcos DC
@NWE
Following up on the interface question above:Given that LinuxCNC does not currently provide a standardized, PLC-facing external API, I’m trying to understand what has proven to be the least fragile approach in real production systems.In your experience, when LinuxCNC is treated as a subordinate motion controller, what has held up better long-term:
• discrete I/O with explicit handshaking, or
• a register-based interface (e.g. Modbus TCP/RTU or similar)?I’m mainly interested in maintainability and field robustness rather than theoretical capability.
Last edit: 03 Feb 2026 00:36 by Marcos DC.

Please Log in or Create an account to join the conversation.

More
03 Feb 2026 00:57 #342335 by NWE
For keeping it simple, I think I would look at discrete signals using Mesa cards or maybe ethercat. Ethercat is somewhat more complicated to get started, but you get to replace all that discrete wiring with one robust ethernet connection, which you can not route through an ethernet switch, but I saw Beckhoff has ethercat hubs for this purpose.

I used to like modbus but the more I use it, the more I despise it. Compared to the other options, modbus seems slower and less reliable. Probably depends on the application. I am moving away from modbus entirely.

If you want RS232 or RS485, ask someone else, my opinion is it can be done (I use them if I have to interface with something that gives me no other choice) but... its a pain. Except... Mesa has what I think runs on RS422 called SSerial (SmartSerial) which I think is a joy to use. It is stable and it is plug-and-play. To use that, you start with a Mesa board that has SSerial host, then you can connect additional I/O SSerial daughter cards to it via SSerial.

If going with ethercat, LinuxCNC does only master that I'm aware or. You would want to use a PLC that exposes an ethercat slave to LinuxCNC for transferring data/commands between PLC and ethercat. What I mean, is the ethercat link would be LinuxCNC = master, PLC = slave, however, linuxcnc would be listening on this connection for commands from its real master, the PLC. I admit I'm a bit of a newby with ethercat, been using it barely a year. Been tinkering with linuxcnc 10+ years and just recently majorly included it in my toolset.

Whether discrete or ethercat, this would amount to hal pins that you would connect to control signals in the hal configuration text file(s). How clean the implementation would be would probably depend a lot on how well you organize the hal files.

When I'm programming my LinuxCNC "plc" controllers, I'm doing most of it in a linux program that looks and works a lot like notepad with some additional bells and whistles.

Please Log in or Create an account to join the conversation.

More
03 Feb 2026 01:00 #342336 by NWE

@NWE
Following up on the interface question above:Given that LinuxCNC does not currently provide a standardized, PLC-facing external API, I’m trying to understand what has proven to be the least fragile approach in real production systems.In your experience, when LinuxCNC is treated as a subordinate motion controller, what has held up better long-term:
• discrete I/O with explicit handshaking, or
• a register-based interface (e.g. Modbus TCP/RTU or similar)?I’m mainly interested in maintainability and field robustness rather than theoretical capability.

I consider discrete I/O or ethercat similarly less fragile, and modbus has been quite fragile from my experience.

Please Log in or Create an account to join the conversation.

More
03 Feb 2026 01:24 #342337 by NWE

@NWE
Following up on the interface question above:Given that LinuxCNC does not currently provide a standardized, PLC-facing external API, 

Sorry, I was misunderstanding you in this respect. I was on a different page, thinking low level I/O.

Please Log in or Create an account to join the conversation.

More
03 Feb 2026 01:43 - 03 Feb 2026 01:59 #342338 by NWE

@NWE
In your experience, when LinuxCNC is treated as a subordinate motion controller,
 

 

I can see potentially doing it this way, and I agree, for your use case, this must be necessary, however, I have not used LinuxCNC as subordinate to a PLC in any project. I have used LinuxCNC controlling 6 PLCs via mqtt messaging on a larger project. Above all that in the chain of command I have the safety system, and due to the nature of the system, we have one single discrete signal wired from an output in the safety system to an input on one of the PLC's, through which LinuxCNC reads whether the safety system has disabled the entire plant. During most abnormalities, the program running in LinuxCNC initiates a controlled shutdown of the plant. If the safety system has tripped, it is a foregone conclusion, the plant is already shut down.

Most of the machines on that project are interdependent in various ways, so we have not included the capability to disable part of the system while other parts are in operation, except for the fact that each machine has individual lockout switches. However, It is not possible to complete the automatic startup sequence programmed in LinuxCNC when the locked-out machine fails to start. It does have a service mode where the repair tech has start/stop control of each individual machine during down time.

I can see doing it the other way, where the PLC commands LinuxCNC, but I have not done it that way yet.
Last edit: 03 Feb 2026 01:59 by NWE.

Please Log in or Create an account to join the conversation.

  • Marcos DC
  • Marcos DC's Avatar Topic Author
  • Away
  • Junior Member
  • Junior Member
More
03 Feb 2026 02:17 #342340 by Marcos DC
@NWE
Thanks for the clarification — that helps a lot, and I appreciate you explicitly calling out the difference in perspective.Your comments are very helpful in terms of transport robustness (discrete I/O vs EtherCAT vs Modbus), and that’s valuable input for narrowing down implementation options.Just to make sure the discussion is clear for readers: when we talk about a PLC supervising LinuxCNC, we’re referring to logical authority over machine state, sequencing, and operator workflow, rather than mastership of the physical communication layer.As you noted, with EtherCAT today LinuxCNC often ends up as the technical bus master, even in architectures where the PLC is the higher-level controller issuing commands and consuming status. These two roles tend to get conflated, but they’re separate concerns in industrial systems.Your insight on which transports have proven more or less fragile in practice is very useful, even though the PLC→LinuxCNC authority model itself is something we’ll have to implement largely on our side.
The following user(s) said Thank You: NWE

Please Log in or Create an account to join the conversation.

More
05 Feb 2026 07:18 - 05 Feb 2026 08:00 #342448 by hhscott
I did an industrial project 5 years ago with the same control model as you are describing. I am by trade an industrial controls/mechanical engineer and I was contacted by a medical company seeking to automate the production of one of their products. After evaluation of the system requirements it was clear that one aspect of the system would need a CNC controller to run a 4 axis ultrasonic cutter while the bulk of the machine would require standard PLC controller elements. In addition to the CNC cutter section, the machine has 4 servo driven custom conveyors, a heat press laminator, various air cylinders, and a PID temp controlled 10KW heater platen.  It also uses an overhead projector that loads recipe driven images to direct the machine operator where to locate the raw materials on a circulating pallet.

The single most important requirement of the customer was that they wanted a machine that would be simple to operate so that the training to run the machine would be minimal.

I  reached out to this forum to help me understand what would be the best method to "blend" traditional industrial controls (PLCs, VFDs, HMIs, sensors, etc.) with LinuxCNC. Eventually, I landed on using Python as a "bridge" between LinuxCNC and the PLC/HMI. Python has an excellent and stable module called pymodbusTCP. With that module, python can reliably talk to virtually any industrial PLC or device that speaks modbus. The second module that makes it all work is the python linuxCNC module. It talks to a running instance of LinuxCNC and can get status information and it can command LinuxCNC . Using this custom python script that I wrote the system works without the machine operator having any knowledge of how to run a CNC machine or any G code whatsoever. When the system starts up, the python software bridge homes the CNC system and checks it for ready status. The operator simply selects which product code to run via the HMI. From there, the PLC tag with the product code is read by python through ModbusTCP. Then, the correct G-Code file for that cut pattern is automatically loaded into LinuxCNC. When the product leaves the laminator and arrives at the CNC cutter the PLC sets a bit that python reads. Python then tells LinuxCNC to run the G-Code file and it cuts the parts out. When LinuxCNC completes the cut cycle python gets the complete status bit and then it sets a bit in the PLC that lets the PLC know it's time to move the pallet to the next station.  The operator has zero direct interaction with LinuxCNC. This system has been running now for over 4 years and it runs every day producing thousands and thousands of parts. The customer is totally satisfied with the machine and they are now starting to talk to me about the need for a second one. Based on my experience, blending LinuxCNC with standard industrial controls methods and devices is an excellent way to achieve advanced machine control systems. I would highly recommend using Mesa Ethernet cards to offload the pulse generation from your LinuxCNC installation. The Mesa card I installed on this system has been flawless.

Edit: Modbus (TCP) may not be the most "modern" approach that is available but I would say that it is the most universal, well understood, and common Industrial protocol. When it comes to system support it would be hard to argue against Modbus just because so many industrial control techs know it and use it. Simple system architecture typically translates to reliability. In an industrial application, reliability is king.
Last edit: 05 Feb 2026 08:00 by hhscott.
The following user(s) said Thank You: rodw, NWE

Please Log in or Create an account to join the conversation.

More
05 Feb 2026 17:14 #342483 by NWE


Edit: Modbus (TCP) may not be the most "modern" approach that is available but I would say that it is the most universal, well understood, and common Industrial protocol. When it comes to system support it would be hard to argue against Modbus just because so many industrial control techs know it and use it. Simple system architecture typically translates to reliability. In an industrial application, reliability is king.

good point

I have been suspicious my bad experiences with modbus was mostly related to some inexpensive hardware I used.

Please Log in or Create an account to join the conversation.

Time to create page: 0.097 seconds
Powered by Kunena Forum