I have rigged train wheels, and it works, except when you rotate the train. The piston's "Copy Location" is using world space instead of local space, which causes it to go all wonky.
I tried every combination of "Local Space" and "World Space" on the "Copy Location" constraint, but nothing works.
blend file: https://drive.google.com/open?id=0B9fajYcxL7pvUWF4T0tRZHdLcFU