Diameter x pi is your circumference, and the distance the wheel will travel to make a full rotation.
All the wheels, I assume, are moving in unison, so you could just use the trains position to calculate the rotation and apply it on update.
In a pseudo attempt here,
currentPosition - lastPosition = distTraveled
(distTraveled / circumference) * 360 = addRotation
At the end up Update, add addRotation to each wheel, then store the trains currentPosition and the currentRotation.
I'm having a hard time making sense from my phone but I hope it helps? If I can get home to test this I'll share if it works.
Could also have a threshold or a state for atMaxSpeed so once the train is done accelerating the wheels just maintain a rotational velocity without calculating anything. Same for. If it's at rest.