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.