Well, here's an approach.
Map your buttons on your HMI to four consecutive %M addresses that start on a byte boudary (%M001, %M009, %M017, etc). In your ladder logic program, move just those four bits into a %R register. You can do this by using a MOVE instruction with data type BIT and length 4, or you can use an AND function where you AND %M001 with hex 000F with the result going to the %R register.
Next, use a NE function to compare the %R value with zero. Put a one-shot coil at the output of the NE function. This coil will be true every time the operator pushes one of the buttons.
Each time the one-shot is true, add the value in the %R register to a running total, and use a Shift Register function to move the running total into a stack. The top value in the stack will have a single bit true corresponding to the motor you want to start first. The next lower addressed register will have two bits set corresponding to the two motors that should be running next, etc.
This is bare-bones. You'll need to include logic to ignore the operator pressing the same button more than once and any other non-standard commands. You'll also need logic to move the values from the stack to the outputs in proper order, but you should be able to make it work.
Good luck.
Just curious, but what is the reason for varying the order of starting the motors?