You can't. It's been asked starting 4 years ago. And here is why.
C2 uses an JS call called "requestAnimationFrame" from the browser. The browser is the final gatekeeper renderer and will never render above 60fps. Also the browser only ever renders based on the moniter/hardware syncing.
C2 internal game loop was not written from the ground up to render cleanly at 30fps. Ashley tried to do a quick version. It didn't work out so well. For a proper controller FPS rendering would require a large re-write to the game loop. Stacked with the fact that Ashley doesn't believe that it's worth it there will never be controller FPS rendering.
The only option is to let the game render at 60fps and instead control your logic to 30fps. Infact due to Ashley going over the technical reasons why C2 can't have controller FPS. I've been pushing for an advanced model of logic updates to use 30FPS.
Truth is logic doesn't need to be updated 60fps. you can do 30fps logic updates and still play silky smooth. The benefit of this is that if the FPS drops below 50fps then you never notice. Ashley makes claims other wise that even at below 50fps games run smoothly. This is not true, but doesn't matter.
So here are yoru options than asking for FPS controll.
use Len suggested Every 0.033 tick. And stick all your logic into a new logic kernel. This is your best option.
Your other option is to use R0j0Hounds Canvas plugin.
Make 1 visible layer with Canvas. Make 1 visible layer for HUD(SpriteFonts dont render on Canvas).
All other layers on invisible. If C2 has no changes to show then C2 won't render the scene.
Every 0.033 tick. Make all other layers visible. Then render all layers to canvas. Turn all layers back to invisible(except HUD and Canvas).
This will result in your 30fps rendering.