Most coded software is created to complete set tasks: write a letter, perform a calculation, edit pictures, accounting and billing or some other such task. Software requires nothing more than an operating system or framework to operate, making it easy to add more features and distribute updates.
But software developed for a machine gives it life. Very often this software is unique, just like the machine. But even specific, particular software can have components that can be reused in different settings, such as servo drives, cylinders, sensors, etc., though of course a given software cannot be applied universally to all machines.
What happens when machines are very similar? When two machines produce the same product, but the steps for making the product differ according to the requirements of the customer, the number of mechanical parts needed can vary.
When this is the case, software engineers very often tend to take of software from a similar machine and alter it to develop unique software for the new machine.
That’s just fine. Well done. Next machine please.
But software is never perfect. When an engineer finds bugs in the twentieth copy of this software, it slowly but surely becomes harder to maintain previous versions of the software.